<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I think this may have broken the module build, could you please take a look?<div class=""><br class=""></div><div class=""><a href="http://green.lab.llvm.org/green/job/clang-stage2-configure-Rthinlto_build/5350/consoleFull#765228809a1ca8a51-895e-46c6-af87-ce24fa4cd561" class="">http://green.lab.llvm.org/green/job/clang-stage2-configure-Rthinlto_build/5350/consoleFull#765228809a1ca8a51-895e-46c6-af87-ce24fa4cd561</a></div><div class=""><br class=""></div><div class="">-- adrian</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 15, 2017, at 12:30 PM, Vivek Pandya via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Author: vivekvpandya<br class="">Date: Fri Sep 15 12:30:59 2017<br class="">New Revision: 313382<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=313382&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=313382&view=rev</a><br class="">Log:<br class="">This patch fixes <a href="https://bugs.llvm.org/show_bug.cgi?id=32352" class="">https://bugs.llvm.org/show_bug.cgi?id=32352</a> <br class="">It enables OptimizationRemarkEmitter::allowExtraAnalysis and MachineOptimizationRemarkEmitter::allowExtraAnalysis to return true not only for -fsave-optimization-record but when specific remarks are requested with<br class="">command line options.<br class="">The diagnostic handler used to be callback now this patch adds a class<br class="">DiagnosticHandler. It has virtual method to provide custom diagnostic handler<br class="">and methods to control which particular remarks are enabled. <br class="">However LLVM-C API users can still provide callback function for diagnostic handler.<br class=""><br class="">Added:<br class="">    llvm/trunk/include/llvm/IR/DiagnosticHandler.h<br class="">    llvm/trunk/lib/IR/DiagnosticHandler.cpp<br class="">Modified:<br class="">    llvm/trunk/include/llvm/Analysis/OptimizationDiagnosticInfo.h<br class="">    llvm/trunk/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h<br class="">    llvm/trunk/include/llvm/IR/DiagnosticInfo.h<br class="">    llvm/trunk/include/llvm/IR/LLVMContext.h<br class="">    llvm/trunk/include/llvm/LTO/Config.h<br class="">    llvm/trunk/include/llvm/LTO/legacy/LTOCodeGenerator.h<br class="">    llvm/trunk/lib/IR/CMakeLists.txt<br class="">    llvm/trunk/lib/IR/Core.cpp<br class="">    llvm/trunk/lib/IR/DiagnosticInfo.cpp<br class="">    llvm/trunk/lib/IR/LLVMContext.cpp<br class="">    llvm/trunk/lib/IR/LLVMContextImpl.cpp<br class="">    llvm/trunk/lib/IR/LLVMContextImpl.h<br class="">    llvm/trunk/lib/LTO/LTOCodeGenerator.cpp<br class="">    llvm/trunk/lib/Transforms/Scalar/GVN.cpp<br class="">    llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp<br class="">    llvm/trunk/test/Transforms/GVN/opt-remarks.ll<br class="">    llvm/trunk/tools/llc/llc.cpp<br class="">    llvm/trunk/tools/llvm-dis/llvm-dis.cpp<br class="">    llvm/trunk/tools/llvm-link/llvm-link.cpp<br class="">    llvm/trunk/tools/llvm-lto/llvm-lto.cpp<br class="">    llvm/trunk/tools/lto/lto.cpp<br class=""><br class="">Modified: llvm/trunk/include/llvm/Analysis/OptimizationDiagnosticInfo.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/OptimizationDiagnosticInfo.h?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/OptimizationDiagnosticInfo.h?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/Analysis/OptimizationDiagnosticInfo.h (original)<br class="">+++ llvm/trunk/include/llvm/Analysis/OptimizationDiagnosticInfo.h Fri Sep 15 12:30:59 2017<br class="">@@ -78,10 +78,9 @@ public:<br class="">   /// use the extra analysis (1) to filter trivial false positives or (2) to<br class="">   /// provide more context so that non-trivial false positives can be quickly<br class="">   /// detected by the user.<br class="">-  bool allowExtraAnalysis() const {<br class="">-    // For now, only allow this with -fsave-optimization-record since the -Rpass<br class="">-    // options are handled in the front-end.<br class="">-    return F->getContext().getDiagnosticsOutputFile();<br class="">+  bool allowExtraAnalysis(StringRef PassName) const {<br class="">+    return (F->getContext().getDiagnosticsOutputFile() ||<br class="">+            F->getContext().getDiagHandlerPtr()->isAnyRemarkEnabled(PassName));<br class="">   }<br class=""><br class=""> private:<br class=""><br class="">Modified: llvm/trunk/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h (original)<br class="">+++ llvm/trunk/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h Fri Sep 15 12:30:59 2017<br class="">@@ -73,7 +73,9 @@ public:<br class=""><br class="">   /// \see DiagnosticInfoOptimizationBase::isEnabled.<br class="">   bool isEnabled() const override {<br class="">-    return OptimizationRemark::isEnabled(getPassName());<br class="">+    const Function &Fn = getFunction();<br class="">+    LLVMContext &Ctx = Fn.getContext();<br class="">+    return Ctx.getDiagHandlerPtr()->isPassedOptRemarkEnabled(getPassName());<br class="">   }<br class=""> };<br class=""><br class="">@@ -97,7 +99,9 @@ public:<br class=""><br class="">   /// \see DiagnosticInfoOptimizationBase::isEnabled.<br class="">   bool isEnabled() const override {<br class="">-    return OptimizationRemarkMissed::isEnabled(getPassName());<br class="">+    const Function &Fn = getFunction();<br class="">+    LLVMContext &Ctx = Fn.getContext();<br class="">+    return Ctx.getDiagHandlerPtr()->isMissedOptRemarkEnabled(getPassName());<br class="">   }<br class=""> };<br class=""><br class="">@@ -121,7 +125,9 @@ public:<br class=""><br class="">   /// \see DiagnosticInfoOptimizationBase::isEnabled.<br class="">   bool isEnabled() const override {<br class="">-    return OptimizationRemarkAnalysis::isEnabled(getPassName());<br class="">+    const Function &Fn = getFunction();<br class="">+    LLVMContext &Ctx = Fn.getContext();<br class="">+    return Ctx.getDiagHandlerPtr()->isAnalysisRemarkEnabled(getPassName());<br class="">   }<br class=""> };<br class=""><br class="">@@ -152,10 +158,10 @@ public:<br class="">   /// that are normally too noisy.  In this mode, we can use the extra analysis<br class="">   /// (1) to filter trivial false positives or (2) to provide more context so<br class="">   /// that non-trivial false positives can be quickly detected by the user.<br class="">-  bool allowExtraAnalysis() const {<br class="">-    // For now, only allow this with -fsave-optimization-record since the -Rpass<br class="">-    // options are handled in the front-end.<br class="">-    return MF.getFunction()->getContext().getDiagnosticsOutputFile();<br class="">+  bool allowExtraAnalysis(StringRef PassName) const {<br class="">+    return (MF.getFunction()->getContext().getDiagnosticsOutputFile() ||<br class="">+            MF.getFunction()->getContext()<br class="">+            .getDiagHandlerPtr()->isAnyRemarkEnabled(PassName));<br class="">   }<br class=""><br class=""> private:<br class=""><br class="">Added: llvm/trunk/include/llvm/IR/DiagnosticHandler.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DiagnosticHandler.h?rev=313382&view=auto" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DiagnosticHandler.h?rev=313382&view=auto</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/IR/DiagnosticHandler.h (added)<br class="">+++ llvm/trunk/include/llvm/IR/DiagnosticHandler.h Fri Sep 15 12:30:59 2017<br class="">@@ -0,0 +1,67 @@<br class="">+//===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -*- C++ ---*-===//<br class="">+//<br class="">+//                     The LLVM Compiler Infrastructure<br class="">+//<br class="">+// This file is distributed under the University of Illinois Open Source<br class="">+// License. See LICENSE.TXT for details.<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+// Base DiagnosticHandler class declaration. Derive from this class to provide<br class="">+// custom diagnostic reporting.<br class="">+//===----------------------------------------------------------------------===//<br class="">+<br class="">+#include "llvm/ADT/StringRef.h"<br class="">+<br class="">+namespace llvm {<br class="">+class DiagnosticInfo;<br class="">+<br class="">+/// \brief This is the base class for diagnostic handling in LLVM.<br class="">+/// The handleDiagnostics method must be overriden by the subclasses to handle<br class="">+/// diagnostic. The *RemarkEnabled methods can be overriden to control<br class="">+/// which remarks are enabled.<br class="">+struct DiagnosticHandler {<br class="">+  void *DiagnosticContext = nullptr;<br class="">+  DiagnosticHandler(void *DiagContext = nullptr)<br class="">+      : DiagnosticContext(DiagContext) {}<br class="">+  virtual ~DiagnosticHandler() = default;<br class="">+<br class="">+  using DiagnosticHandlerTy = void (*)(const DiagnosticInfo &DI, void *Context);<br class="">+<br class="">+  /// DiagHandlerCallback is settable from the C API and base implementation<br class="">+  /// of DiagnosticHandler will call it from handleDiagnostics(). Any derived<br class="">+  /// class of DiagnosticHandler should not use callback but<br class="">+  /// implement handleDiagnostics().<br class="">+  DiagnosticHandlerTy DiagHandlerCallback = nullptr;<br class="">+<br class="">+  /// Override handleDiagnostics to provide custom implementation.<br class="">+  /// Return true if it handles diagnostics reporting properly otherwise<br class="">+  /// return false to make LLVMContext::diagnose() to print the message<br class="">+  /// with a prefix based on the severity.<br class="">+  virtual bool handleDiagnostics(const DiagnosticInfo &DI) {<br class="">+    if (DiagHandlerCallback) {<br class="">+      DiagHandlerCallback(DI, DiagnosticContext);<br class="">+      return true;<br class="">+    }<br class="">+    return false;<br class="">+  }<br class="">+<br class="">+  /// Return true if analysis remarks are enabled, override<br class="">+  /// to provide different implementation.<br class="">+  virtual bool isAnalysisRemarkEnabled(StringRef PassName) const;<br class="">+<br class="">+  /// Return true if missed optimization remarks are enabled, override<br class="">+  /// to provide different implementation.<br class="">+  virtual bool isMissedOptRemarkEnabled(StringRef PassName) const;<br class="">+<br class="">+  /// Return true if passed optimization remarks are enabled, override<br class="">+  /// to provide different implementation.<br class="">+  virtual bool isPassedOptRemarkEnabled(StringRef PassName) const;<br class="">+<br class="">+  /// Return true if any type of remarks are enabled.<br class="">+  bool isAnyRemarkEnabled(StringRef PassName) const {<br class="">+    return (isMissedOptRemarkEnabled(PassName) ||<br class="">+            isPassedOptRemarkEnabled(PassName) ||<br class="">+            isAnalysisRemarkEnabled(PassName));<br class="">+  }<br class="">+};<br class="">+}<br class=""><br class="">Modified: llvm/trunk/include/llvm/IR/DiagnosticInfo.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DiagnosticInfo.h?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DiagnosticInfo.h?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/IR/DiagnosticInfo.h (original)<br class="">+++ llvm/trunk/include/llvm/IR/DiagnosticInfo.h Fri Sep 15 12:30:59 2017<br class="">@@ -604,10 +604,8 @@ public:<br class="">     return DI->getKind() == DK_OptimizationRemark;<br class="">   }<br class=""><br class="">-  static bool isEnabled(StringRef PassName);<br class="">-<br class="">   /// \see DiagnosticInfoOptimizationBase::isEnabled.<br class="">-  bool isEnabled() const override { return isEnabled(getPassName()); }<br class="">+  bool isEnabled() const override;<br class=""><br class=""> private:<br class="">   /// This is deprecated now and only used by the function API below.<br class="">@@ -647,10 +645,8 @@ public:<br class="">     return DI->getKind() == DK_OptimizationRemarkMissed;<br class="">   }<br class=""><br class="">-  static bool isEnabled(StringRef PassName);<br class="">-<br class="">   /// \see DiagnosticInfoOptimizationBase::isEnabled.<br class="">-  bool isEnabled() const override { return isEnabled(getPassName()); }<br class="">+  bool isEnabled() const override;<br class=""><br class=""> private:<br class="">   /// This is deprecated now and only used by the function API below.<br class="">@@ -701,12 +697,8 @@ public:<br class="">     return DI->getKind() == DK_OptimizationRemarkAnalysis;<br class="">   }<br class=""><br class="">-  static bool isEnabled(StringRef PassName);<br class="">-<br class="">   /// \see DiagnosticInfoOptimizationBase::isEnabled.<br class="">-  bool isEnabled() const override {<br class="">-    return shouldAlwaysPrint() || isEnabled(getPassName());<br class="">-  }<br class="">+  bool isEnabled() const override;<br class=""><br class="">   static const char *AlwaysPrint;<br class=""><br class=""><br class="">Modified: llvm/trunk/include/llvm/IR/LLVMContext.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LLVMContext.h?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LLVMContext.h?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/IR/LLVMContext.h (original)<br class="">+++ llvm/trunk/include/llvm/IR/LLVMContext.h Fri Sep 15 12:30:59 2017<br class="">@@ -16,6 +16,7 @@<br class=""> #define LLVM_IR_LLVMCONTEXT_H<br class=""><br class=""> #include "llvm-c/Types.h"<br class="">+#include "llvm/IR/DiagnosticHandler.h"<br class=""> #include "llvm/Support/CBindingWrapping.h"<br class=""> #include "llvm/Support/Options.h"<br class=""> #include <cstdint><br class="">@@ -167,11 +168,6 @@ public:<br class="">   using InlineAsmDiagHandlerTy = void (*)(const SMDiagnostic&, void *Context,<br class="">                                           unsigned LocCookie);<br class=""><br class="">-  /// Defines the type of a diagnostic handler.<br class="">-  /// \see LLVMContext::setDiagnosticHandler.<br class="">-  /// \see LLVMContext::diagnose.<br class="">-  using DiagnosticHandlerTy = void (*)(const DiagnosticInfo &DI, void *Context);<br class="">-<br class="">   /// Defines the type of a yield callback.<br class="">   /// \see LLVMContext::setYieldCallback.<br class="">   using YieldCallbackTy = void (*)(LLVMContext *Context, void *OpaqueHandle);<br class="">@@ -194,26 +190,43 @@ public:<br class="">   /// setInlineAsmDiagnosticHandler.<br class="">   void *getInlineAsmDiagnosticContext() const;<br class=""><br class="">-  /// setDiagnosticHandler - This method sets a handler that is invoked<br class="">-  /// when the backend needs to report anything to the user.  The first<br class="">-  /// argument is a function pointer and the second is a context pointer that<br class="">-  /// gets passed into the DiagHandler.  The third argument should be set to<br class="">+  /// setDiagnosticHandlerCallBack - This method sets a handler call back<br class="">+  /// that is invoked when the backend needs to report anything to the user.<br class="">+  /// The first argument is a function pointer and the second is a context pointer<br class="">+  /// that gets passed into the DiagHandler.  The third argument should be set to<br class="">   /// true if the handler only expects enabled diagnostics.<br class="">   ///<br class="">   /// LLVMContext doesn't take ownership or interpret either of these<br class="">   /// pointers.<br class="">-  void setDiagnosticHandler(DiagnosticHandlerTy DiagHandler,<br class="">-                            void *DiagContext = nullptr,<br class="">+  void setDiagnosticHandlerCallBack(<br class="">+      DiagnosticHandler::DiagnosticHandlerTy DiagHandler,<br class="">+      void *DiagContext = nullptr, bool RespectFilters = false);<br class="">+<br class="">+  /// setDiagnosticHandler - This method sets unique_ptr to object of DiagnosticHandler<br class="">+  /// to provide custom diagnostic handling. The first argument is unique_ptr of object<br class="">+  /// of type DiagnosticHandler or a derived of that.   The third argument should be<br class="">+  /// set to true if the handler only expects enabled diagnostics.<br class="">+  ///<br class="">+  /// Ownership of this pointer is moved to LLVMContextImpl.<br class="">+  void setDiagnosticHandler(std::unique_ptr<DiagnosticHandler> &&DH,<br class="">                             bool RespectFilters = false);<br class=""><br class="">-  /// getDiagnosticHandler - Return the diagnostic handler set by<br class="">-  /// setDiagnosticHandler.<br class="">-  DiagnosticHandlerTy getDiagnosticHandler() const;<br class="">+  /// getDiagnosticHandlerCallBack - Return the diagnostic handler call back set by<br class="">+  /// setDiagnosticHandlerCallBack.<br class="">+  DiagnosticHandler::DiagnosticHandlerTy getDiagnosticHandlerCallBack() const;<br class=""><br class="">   /// getDiagnosticContext - Return the diagnostic context set by<br class="">   /// setDiagnosticContext.<br class="">   void *getDiagnosticContext() const;<br class=""><br class="">+  /// getDiagHandlerPtr - Returns const raw pointer of DiagnosticHandler set by<br class="">+  /// setDiagnosticHandler.<br class="">+  const DiagnosticHandler *getDiagHandlerPtr() const;<br class="">+<br class="">+  /// getDiagnosticHandler - transfers owenership of DiagnosticHandler unique_ptr<br class="">+  /// to caller.<br class="">+  std::unique_ptr<DiagnosticHandler> getDiagnosticHandler();<br class="">+<br class="">   /// \brief Return if a code hotness metric should be included in optimization<br class="">   /// diagnostics.<br class="">   bool getDiagnosticsHotnessRequested() const;<br class=""><br class="">Modified: llvm/trunk/include/llvm/LTO/Config.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/Config.h?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/Config.h?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/LTO/Config.h (original)<br class="">+++ llvm/trunk/include/llvm/LTO/Config.h Fri Sep 15 12:30:59 2017<br class="">@@ -171,20 +171,27 @@ struct Config {<br class="">                      bool UseInputModulePath = false);<br class=""> };<br class=""><br class="">+struct LTOLLVMDiagnosticHandler : public DiagnosticHandler {<br class="">+  DiagnosticHandlerFunction *Fn;<br class="">+  LTOLLVMDiagnosticHandler(DiagnosticHandlerFunction *DiagHandlerFn)<br class="">+      : Fn(DiagHandlerFn) {}<br class="">+  bool handleDiagnostics(const DiagnosticInfo &DI) override {<br class="">+    (*Fn)(DI);<br class="">+    return true;<br class="">+  }<br class="">+};<br class=""> /// A derived class of LLVMContext that initializes itself according to a given<br class=""> /// Config object. The purpose of this class is to tie ownership of the<br class=""> /// diagnostic handler to the context, as opposed to the Config object (which<br class=""> /// may be ephemeral).<br class="">+// FIXME: This should not be required as diagnostic handler is not callback.<br class=""> struct LTOLLVMContext : LLVMContext {<br class="">-  static void funcDiagHandler(const DiagnosticInfo &DI, void *Context) {<br class="">-    auto *Fn = static_cast<DiagnosticHandlerFunction *>(Context);<br class="">-    (*Fn)(DI);<br class="">-  }<br class=""><br class="">   LTOLLVMContext(const Config &C) : DiagHandler(C.DiagHandler) {<br class="">     setDiscardValueNames(C.ShouldDiscardValueNames);<br class="">     enableDebugTypeODRUniquing();<br class="">-    setDiagnosticHandler(funcDiagHandler, &DiagHandler, true);<br class="">+    setDiagnosticHandler(<br class="">+        llvm::make_unique<LTOLLVMDiagnosticHandler>(&DiagHandler), true);<br class="">   }<br class="">   DiagnosticHandlerFunction DiagHandler;<br class=""> };<br class=""><br class="">Modified: llvm/trunk/include/llvm/LTO/legacy/LTOCodeGenerator.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/legacy/LTOCodeGenerator.h?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/legacy/LTOCodeGenerator.h?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/LTO/legacy/LTOCodeGenerator.h (original)<br class="">+++ llvm/trunk/include/llvm/LTO/legacy/LTOCodeGenerator.h Fri Sep 15 12:30:59 2017<br class="">@@ -184,6 +184,7 @@ struct LTOCodeGenerator {<br class="">   LLVMContext &getContext() { return Context; }<br class=""><br class="">   void resetMergedModule() { MergedModule.reset(); }<br class="">+  void DiagnosticHandler(const DiagnosticInfo &DI);<br class=""><br class=""> private:<br class="">   void initializeLTOPasses();<br class="">@@ -204,10 +205,6 @@ private:<br class="">   bool determineTarget();<br class="">   std::unique_ptr<TargetMachine> createTargetMachine();<br class=""><br class="">-  static void DiagnosticHandler(const DiagnosticInfo &DI, void *Context);<br class="">-<br class="">-  void DiagnosticHandler2(const DiagnosticInfo &DI);<br class="">-<br class="">   void emitError(const std::string &ErrMsg);<br class="">   void emitWarning(const std::string &ErrMsg);<br class=""><br class=""><br class="">Modified: llvm/trunk/lib/IR/CMakeLists.txt<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/CMakeLists.txt?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/CMakeLists.txt?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/IR/CMakeLists.txt (original)<br class="">+++ llvm/trunk/lib/IR/CMakeLists.txt Fri Sep 15 12:30:59 2017<br class="">@@ -17,6 +17,7 @@ add_llvm_library(LLVMCore<br class="">   DebugInfo.cpp<br class="">   DebugInfoMetadata.cpp<br class="">   DebugLoc.cpp<br class="">+  DiagnosticHandler.cpp<br class="">   DiagnosticInfo.cpp<br class="">   DiagnosticPrinter.cpp<br class="">   Dominators.cpp<br class=""><br class="">Modified: llvm/trunk/lib/IR/Core.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/IR/Core.cpp (original)<br class="">+++ llvm/trunk/lib/IR/Core.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -85,15 +85,15 @@ LLVMContextRef LLVMGetGlobalContext() {<br class=""> void LLVMContextSetDiagnosticHandler(LLVMContextRef C,<br class="">                                      LLVMDiagnosticHandler Handler,<br class="">                                      void *DiagnosticContext) {<br class="">-  unwrap(C)->setDiagnosticHandler(<br class="">-      LLVM_EXTENSION reinterpret_cast<LLVMContext::DiagnosticHandlerTy>(<br class="">+  unwrap(C)->setDiagnosticHandlerCallBack(<br class="">+      LLVM_EXTENSION reinterpret_cast<DiagnosticHandler::DiagnosticHandlerTy>(<br class="">           Handler),<br class="">       DiagnosticContext);<br class=""> }<br class=""><br class=""> LLVMDiagnosticHandler LLVMContextGetDiagnosticHandler(LLVMContextRef C) {<br class="">   return LLVM_EXTENSION reinterpret_cast<LLVMDiagnosticHandler>(<br class="">-      unwrap(C)->getDiagnosticHandler());<br class="">+      unwrap(C)->getDiagnosticHandlerCallBack());<br class=""> }<br class=""><br class=""> void *LLVMContextGetDiagnosticContext(LLVMContextRef C) {<br class=""><br class="">Added: llvm/trunk/lib/IR/DiagnosticHandler.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DiagnosticHandler.cpp?rev=313382&view=auto" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DiagnosticHandler.cpp?rev=313382&view=auto</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/IR/DiagnosticHandler.cpp (added)<br class="">+++ llvm/trunk/lib/IR/DiagnosticHandler.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -0,0 +1,86 @@<br class="">+//===- DiagnosticHandler.h - DiagnosticHandler class for LLVM -------------===//<br class="">+//<br class="">+//                     The LLVM Compiler Infrastructure<br class="">+//<br class="">+// This file is distributed under the University of Illinois Open Source<br class="">+// License. See LICENSE.TXT for details.<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+//<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+#include "llvm/IR/DiagnosticHandler.h"<br class="">+#include "llvm/Support/CommandLine.h"<br class="">+#include "llvm/Support/RegEx.h"<br class="">+<br class="">+using namespace llvm;<br class="">+<br class="">+namespace {<br class="">+<br class="">+/// \brief Regular expression corresponding to the value given in one of the<br class="">+/// -pass-remarks* command line flags. Passes whose name matches this regexp<br class="">+/// will emit a diagnostic when calling the associated diagnostic function<br class="">+/// (emitOptimizationRemark, emitOptimizationRemarkMissed or<br class="">+/// emitOptimizationRemarkAnalysis).<br class="">+struct PassRemarksOpt {<br class="">+  std::shared_ptr<Regex> Pattern;<br class="">+<br class="">+  void operator=(const std::string &Val) {<br class="">+    // Create a regexp object to match pass names for emitOptimizationRemark.<br class="">+    if (!Val.empty()) {<br class="">+      Pattern = std::make_shared<Regex>(Val);<br class="">+      std::string RegexError;<br class="">+      if (!Pattern->isValid(RegexError))<br class="">+        report_fatal_error("Invalid regular expression '" + Val +<br class="">+                               "' in -pass-remarks: " + RegexError,<br class="">+                           false);<br class="">+    }<br class="">+  }<br class="">+};<br class="">+<br class="">+static PassRemarksOpt PassRemarksPassedOptLoc;<br class="">+static PassRemarksOpt PassRemarksMissedOptLoc;<br class="">+static PassRemarksOpt PassRemarksAnalysisOptLoc;<br class="">+<br class="">+// -pass-remarks<br class="">+//    Command line flag to enable emitOptimizationRemark()<br class="">+static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarks(<br class="">+    "pass-remarks", cl::value_desc("pattern"),<br class="">+    cl::desc("Enable optimization remarks from passes whose name match "<br class="">+             "the given regular expression"),<br class="">+    cl::Hidden, cl::location(PassRemarksPassedOptLoc), cl::ValueRequired,<br class="">+    cl::ZeroOrMore);<br class="">+<br class="">+// -pass-remarks-missed<br class="">+//    Command line flag to enable emitOptimizationRemarkMissed()<br class="">+static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarksMissed(<br class="">+    "pass-remarks-missed", cl::value_desc("pattern"),<br class="">+    cl::desc("Enable missed optimization remarks from passes whose name match "<br class="">+             "the given regular expression"),<br class="">+    cl::Hidden, cl::location(PassRemarksMissedOptLoc), cl::ValueRequired,<br class="">+    cl::ZeroOrMore);<br class="">+<br class="">+// -pass-remarks-analysis<br class="">+//    Command line flag to enable emitOptimizationRemarkAnalysis()<br class="">+static cl::opt<PassRemarksOpt, true, cl::parser<std::string>><br class="">+    PassRemarksAnalysis(<br class="">+        "pass-remarks-analysis", cl::value_desc("pattern"),<br class="">+        cl::desc(<br class="">+            "Enable optimization analysis remarks from passes whose name match "<br class="">+            "the given regular expression"),<br class="">+        cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired,<br class="">+        cl::ZeroOrMore);<br class="">+}<br class="">+<br class="">+bool DiagnosticHandler::isAnalysisRemarkEnabled(StringRef PassName) const {<br class="">+  return (PassRemarksAnalysisOptLoc.Pattern &&<br class="">+          PassRemarksAnalysisOptLoc.Pattern->match(PassName));<br class="">+}<br class="">+bool DiagnosticHandler::isMissedOptRemarkEnabled(StringRef PassName) const {<br class="">+  return (PassRemarksMissedOptLoc.Pattern &&<br class="">+          PassRemarksMissedOptLoc.Pattern->match(PassName));<br class="">+}<br class="">+bool DiagnosticHandler::isPassedOptRemarkEnabled(StringRef PassName) const {<br class="">+  return (PassRemarksPassedOptLoc.Pattern &&<br class="">+          PassRemarksPassedOptLoc.Pattern->match(PassName));<br class="">+}<br class=""><br class="">Modified: llvm/trunk/lib/IR/DiagnosticInfo.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DiagnosticInfo.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DiagnosticInfo.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/IR/DiagnosticInfo.cpp (original)<br class="">+++ llvm/trunk/lib/IR/DiagnosticInfo.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -13,6 +13,7 @@<br class=""> //===----------------------------------------------------------------------===//<br class=""><br class=""> #include "llvm/IR/DiagnosticInfo.h"<br class="">+#include "LLVMContextImpl.h"<br class=""> #include "llvm/ADT/StringExtras.h"<br class=""> #include "llvm/ADT/Twine.h"<br class=""> #include "llvm/ADT/iterator_range.h"<br class="">@@ -41,61 +42,6 @@<br class=""><br class=""> using namespace llvm;<br class=""><br class="">-namespace {<br class="">-<br class="">-/// \brief Regular expression corresponding to the value given in one of the<br class="">-/// -pass-remarks* command line flags. Passes whose name matches this regexp<br class="">-/// will emit a diagnostic via ORE->emit(...);<br class="">-struct PassRemarksOpt {<br class="">-  std::shared_ptr<Regex> Pattern;<br class="">-<br class="">-  void operator=(const std::string &Val) {<br class="">-    if (!Val.empty()) {<br class="">-      Pattern = std::make_shared<Regex>(Val);<br class="">-      std::string RegexError;<br class="">-      if (!Pattern->isValid(RegexError))<br class="">-        report_fatal_error("Invalid regular expression '" + Val +<br class="">-                               "' in -pass-remarks: " + RegexError,<br class="">-                           false);<br class="">-    }<br class="">-  }<br class="">-};<br class="">-<br class="">-} // end anonymous namespace<br class="">-<br class="">-static PassRemarksOpt PassRemarksOptLoc;<br class="">-static PassRemarksOpt PassRemarksMissedOptLoc;<br class="">-static PassRemarksOpt PassRemarksAnalysisOptLoc;<br class="">-<br class="">-// -pass-remarks<br class="">-//    Command line flag to enable optimization remarks<br class="">-static cl::opt<PassRemarksOpt, true, cl::parser<std::string>><br class="">-PassRemarks("pass-remarks", cl::value_desc("pattern"),<br class="">-            cl::desc("Enable optimization remarks from passes whose name match "<br class="">-                     "the given regular expression"),<br class="">-            cl::Hidden, cl::location(PassRemarksOptLoc), cl::ValueRequired,<br class="">-            cl::ZeroOrMore);<br class="">-<br class="">-// -pass-remarks-missed<br class="">-//    Command line flag to enable missed optimization remarks<br class="">-static cl::opt<PassRemarksOpt, true, cl::parser<std::string>> PassRemarksMissed(<br class="">-    "pass-remarks-missed", cl::value_desc("pattern"),<br class="">-    cl::desc("Enable missed optimization remarks from passes whose name match "<br class="">-             "the given regular expression"),<br class="">-    cl::Hidden, cl::location(PassRemarksMissedOptLoc), cl::ValueRequired,<br class="">-    cl::ZeroOrMore);<br class="">-<br class="">-// -pass-remarks-analysis<br class="">-//    Command line flag to enable optimization analysis remarks<br class="">-static cl::opt<PassRemarksOpt, true, cl::parser<std::string>><br class="">-PassRemarksAnalysis(<br class="">-    "pass-remarks-analysis", cl::value_desc("pattern"),<br class="">-    cl::desc(<br class="">-        "Enable optimization analysis remarks from passes whose name match "<br class="">-        "the given regular expression"),<br class="">-    cl::Hidden, cl::location(PassRemarksAnalysisOptLoc), cl::ValueRequired,<br class="">-    cl::ZeroOrMore);<br class="">-<br class=""> int llvm::getNextAvailablePluginDiagnosticKind() {<br class="">   static std::atomic<int> PluginKindID(DK_FirstPluginKind);<br class="">   return ++PluginKindID;<br class="">@@ -283,9 +229,10 @@ OptimizationRemark::OptimizationRemark(c<br class="">                                    RemarkName, *Func, Func->getSubprogram(),<br class="">                                    &getFirstFunctionBlock(Func)) {}<br class=""><br class="">-bool OptimizationRemark::isEnabled(StringRef PassName) {<br class="">-  return PassRemarksOptLoc.Pattern &&<br class="">-         PassRemarksOptLoc.Pattern->match(PassName);<br class="">+bool OptimizationRemark::isEnabled() const {<br class="">+  const Function &Fn = getFunction();<br class="">+  LLVMContext &Ctx = Fn.getContext();<br class="">+  return Ctx.getDiagHandlerPtr()->isPassedOptRemarkEnabled(getPassName());<br class=""> }<br class=""><br class=""> OptimizationRemarkMissed::OptimizationRemarkMissed(<br class="">@@ -303,9 +250,10 @@ OptimizationRemarkMissed::OptimizationRe<br class="">                                    *Inst->getParent()->getParent(),<br class="">                                    Inst->getDebugLoc(), Inst->getParent()) {}<br class=""><br class="">-bool OptimizationRemarkMissed::isEnabled(StringRef PassName) {<br class="">-  return PassRemarksMissedOptLoc.Pattern &&<br class="">-         PassRemarksMissedOptLoc.Pattern->match(PassName);<br class="">+bool OptimizationRemarkMissed::isEnabled() const {<br class="">+  const Function &Fn = getFunction();<br class="">+  LLVMContext &Ctx = Fn.getContext();<br class="">+  return Ctx.getDiagHandlerPtr()->isMissedOptRemarkEnabled(getPassName());<br class=""> }<br class=""><br class=""> OptimizationRemarkAnalysis::OptimizationRemarkAnalysis(<br class="">@@ -330,9 +278,11 @@ OptimizationRemarkAnalysis::Optimization<br class="">                                    *cast<BasicBlock>(CodeRegion)->getParent(),<br class="">                                    Loc, CodeRegion) {}<br class=""><br class="">-bool OptimizationRemarkAnalysis::isEnabled(StringRef PassName) {<br class="">-  return PassRemarksAnalysisOptLoc.Pattern &&<br class="">-         PassRemarksAnalysisOptLoc.Pattern->match(PassName);<br class="">+bool OptimizationRemarkAnalysis::isEnabled() const {<br class="">+  const Function &Fn = getFunction();<br class="">+  LLVMContext &Ctx = Fn.getContext();<br class="">+  return Ctx.getDiagHandlerPtr()->isAnalysisRemarkEnabled(getPassName()) ||<br class="">+         shouldAlwaysPrint();<br class=""> }<br class=""><br class=""> void DiagnosticInfoMIRParser::print(DiagnosticPrinter &DP) const {<br class=""><br class="">Modified: llvm/trunk/lib/IR/LLVMContext.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/IR/LLVMContext.cpp (original)<br class="">+++ llvm/trunk/lib/IR/LLVMContext.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -129,11 +129,17 @@ void *LLVMContext::getInlineAsmDiagnosti<br class="">   return pImpl->InlineAsmDiagContext;<br class=""> }<br class=""><br class="">-void LLVMContext::setDiagnosticHandler(DiagnosticHandlerTy DiagnosticHandler,<br class="">-                                       void *DiagnosticContext,<br class="">-                                       bool RespectFilters) {<br class="">-  pImpl->DiagnosticHandler = DiagnosticHandler;<br class="">-  pImpl->DiagnosticContext = DiagnosticContext;<br class="">+void LLVMContext::setDiagnosticHandlerCallBack(<br class="">+    DiagnosticHandler::DiagnosticHandlerTy DiagnosticHandler,<br class="">+    void *DiagnosticContext, bool RespectFilters) {<br class="">+  pImpl->DiagHandler->DiagHandlerCallback = DiagnosticHandler;<br class="">+  pImpl->DiagHandler->DiagnosticContext = DiagnosticContext;<br class="">+  pImpl->RespectDiagnosticFilters = RespectFilters;<br class="">+}<br class="">+<br class="">+void LLVMContext::setDiagnosticHandler(std::unique_ptr<DiagnosticHandler> &&DH,<br class="">+                                      bool RespectFilters) {<br class="">+  pImpl->DiagHandler = std::move(DH);<br class="">   pImpl->RespectDiagnosticFilters = RespectFilters;<br class=""> }<br class=""><br class="">@@ -159,12 +165,13 @@ void LLVMContext::setDiagnosticsOutputFi<br class="">   pImpl->DiagnosticsOutputFile = std::move(F);<br class=""> }<br class=""><br class="">-LLVMContext::DiagnosticHandlerTy LLVMContext::getDiagnosticHandler() const {<br class="">-  return pImpl->DiagnosticHandler;<br class="">+DiagnosticHandler::DiagnosticHandlerTy<br class="">+LLVMContext::getDiagnosticHandlerCallBack() const {<br class="">+  return pImpl->DiagHandler->DiagHandlerCallback;<br class=""> }<br class=""><br class=""> void *LLVMContext::getDiagnosticContext() const {<br class="">-  return pImpl->DiagnosticContext;<br class="">+  return pImpl->DiagHandler->DiagnosticContext;<br class=""> }<br class=""><br class=""> void LLVMContext::setYieldCallback(YieldCallbackTy Callback, void *OpaqueHandle)<br class="">@@ -215,11 +222,10 @@ LLVMContext::getDiagnosticMessagePrefix(<br class=""><br class=""> void LLVMContext::diagnose(const DiagnosticInfo &DI) {<br class="">   // If there is a report handler, use it.<br class="">-  if (pImpl->DiagnosticHandler) {<br class="">-    if (!pImpl->RespectDiagnosticFilters || isDiagnosticEnabled(DI))<br class="">-      pImpl->DiagnosticHandler(DI, pImpl->DiagnosticContext);<br class="">+  if (pImpl->DiagHandler &&<br class="">+      (!pImpl->RespectDiagnosticFilters || isDiagnosticEnabled(DI)) &&<br class="">+      pImpl->DiagHandler->handleDiagnostics(DI))<br class="">     return;<br class="">-  }<br class=""><br class="">   if (!isDiagnosticEnabled(DI))<br class="">     return;<br class="">@@ -315,3 +321,11 @@ void LLVMContext::setDiscardValueNames(b<br class=""> OptBisect &LLVMContext::getOptBisect() {<br class="">   return pImpl->getOptBisect();<br class=""> }<br class="">+<br class="">+const DiagnosticHandler *LLVMContext::getDiagHandlerPtr() const {<br class="">+  return pImpl->DiagHandler.get();<br class="">+}<br class="">+<br class="">+std::unique_ptr<DiagnosticHandler> LLVMContext::getDiagnosticHandler() {<br class="">+  return std::move(pImpl->DiagHandler);<br class="">+}<br class=""><br class="">Modified: llvm/trunk/lib/IR/LLVMContextImpl.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/IR/LLVMContextImpl.cpp (original)<br class="">+++ llvm/trunk/lib/IR/LLVMContextImpl.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -22,7 +22,8 @@<br class=""> using namespace llvm;<br class=""><br class=""> LLVMContextImpl::LLVMContextImpl(LLVMContext &C)<br class="">-  : VoidTy(C, Type::VoidTyID),<br class="">+  : DiagHandler(llvm::make_unique<DiagnosticHandler>()),<br class="">+    VoidTy(C, Type::VoidTyID),<br class="">     LabelTy(C, Type::LabelTyID),<br class="">     HalfTy(C, Type::HalfTyID),<br class="">     FloatTy(C, Type::FloatTyID),<br class=""><br class="">Modified: llvm/trunk/lib/IR/LLVMContextImpl.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/IR/LLVMContextImpl.h (original)<br class="">+++ llvm/trunk/lib/IR/LLVMContextImpl.h Fri Sep 15 12:30:59 2017<br class="">@@ -1168,8 +1168,7 @@ public:<br class="">   LLVMContext::InlineAsmDiagHandlerTy InlineAsmDiagHandler = nullptr;<br class="">   void *InlineAsmDiagContext = nullptr;<br class=""><br class="">-  LLVMContext::DiagnosticHandlerTy DiagnosticHandler = nullptr;<br class="">-  void *DiagnosticContext = nullptr;<br class="">+  std::unique_ptr<DiagnosticHandler> DiagHandler;<br class="">   bool RespectDiagnosticFilters = false;<br class="">   bool DiagnosticsHotnessRequested = false;<br class="">   uint64_t DiagnosticsHotnessThreshold = 0;<br class=""><br class="">Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)<br class="">+++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -622,12 +622,8 @@ void LTOCodeGenerator::parseCodeGenDebug<br class="">   }<br class=""> }<br class=""><br class="">-void LTOCodeGenerator::DiagnosticHandler(const DiagnosticInfo &DI,<br class="">-                                         void *Context) {<br class="">-  ((LTOCodeGenerator *)Context)->DiagnosticHandler2(DI);<br class="">-}<br class=""><br class="">-void LTOCodeGenerator::DiagnosticHandler2(const DiagnosticInfo &DI) {<br class="">+void LTOCodeGenerator::DiagnosticHandler(const DiagnosticInfo &DI) {<br class="">   // Map the LLVM internal diagnostic severity to the LTO diagnostic severity.<br class="">   lto_codegen_diagnostic_severity_t Severity;<br class="">   switch (DI.getSeverity()) {<br class="">@@ -657,17 +653,29 @@ void LTOCodeGenerator::DiagnosticHandler<br class="">   (*DiagHandler)(Severity, MsgStorage.c_str(), DiagContext);<br class=""> }<br class=""><br class="">+namespace {<br class="">+struct LTODiagnosticHandler : public DiagnosticHandler {<br class="">+  LTOCodeGenerator *CodeGenerator;<br class="">+  LTODiagnosticHandler(LTOCodeGenerator *CodeGenPtr)<br class="">+      : CodeGenerator(CodeGenPtr) {}<br class="">+  bool handleDiagnostics(const DiagnosticInfo &DI) override {<br class="">+    CodeGenerator->DiagnosticHandler(DI);<br class="">+    return true;<br class="">+  }<br class="">+};<br class="">+}<br class="">+<br class=""> void<br class=""> LTOCodeGenerator::setDiagnosticHandler(lto_diagnostic_handler_t DiagHandler,<br class="">                                        void *Ctxt) {<br class="">   this->DiagHandler = DiagHandler;<br class="">   this->DiagContext = Ctxt;<br class="">   if (!DiagHandler)<br class="">-    return Context.setDiagnosticHandler(nullptr, nullptr);<br class="">+    return Context.setDiagnosticHandler(nullptr);<br class="">   // Register the LTOCodeGenerator stub in the LLVMContext to forward the<br class="">   // diagnostic to the external DiagHandler.<br class="">-  Context.setDiagnosticHandler(LTOCodeGenerator::DiagnosticHandler, this,<br class="">-                               /* RespectFilters */ true);<br class="">+  Context.setDiagnosticHandler(llvm::make_unique<LTODiagnosticHandler>(this),<br class="">+                               true);<br class=""> }<br class=""><br class=""> namespace {<br class=""><br class="">Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)<br class="">+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -920,8 +920,7 @@ bool GVN::AnalyzeLoadAvailability(LoadIn<br class="">       Instruction *I = DepInfo.getInst();<br class="">       dbgs() << " is clobbered by " << *I << '\n';<br class="">     );<br class="">-<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (ORE->allowExtraAnalysis(DEBUG_TYPE))<br class="">       reportMayClobberedLoad(LI, DepInfo, DT, ORE);<br class=""><br class="">     return false;<br class=""><br class="">Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)<br class="">+++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -4957,12 +4957,15 @@ bool LoopVectorizationLegality::canVecto<br class="">   // Store the result and return it at the end instead of exiting early, in case<br class="">   // allowExtraAnalysis is used to report multiple reasons for not vectorizing.<br class="">   bool Result = true;<br class="">+  <br class="">+  bool DoExtraAnalysis = ORE->allowExtraAnalysis(DEBUG_TYPE);<br class="">+  if (DoExtraAnalysis)<br class="">   // We must have a loop in canonical form. Loops with indirectbr in them cannot<br class="">   // be canonicalized.<br class="">   if (!TheLoop->getLoopPreheader()) {<br class="">     ORE->emit(createMissedAnalysis("CFGNotUnderstood")<br class="">               << "loop control flow is not understood by vectorizer");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+  if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class="">@@ -4975,7 +4978,7 @@ bool LoopVectorizationLegality::canVecto<br class="">   if (!TheLoop->empty()) {<br class="">     ORE->emit(createMissedAnalysis("NotInnermostLoop")<br class="">               << "loop is not the innermost loop");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class="">@@ -4985,7 +4988,7 @@ bool LoopVectorizationLegality::canVecto<br class="">   if (TheLoop->getNumBackEdges() != 1) {<br class="">     ORE->emit(createMissedAnalysis("CFGNotUnderstood")<br class="">               << "loop control flow is not understood by vectorizer");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class="">@@ -4995,7 +4998,7 @@ bool LoopVectorizationLegality::canVecto<br class="">   if (!TheLoop->getExitingBlock()) {<br class="">     ORE->emit(createMissedAnalysis("CFGNotUnderstood")<br class="">               << "loop control flow is not understood by vectorizer");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class="">@@ -5007,7 +5010,7 @@ bool LoopVectorizationLegality::canVecto<br class="">   if (TheLoop->getExitingBlock() != TheLoop->getLoopLatch()) {<br class="">     ORE->emit(createMissedAnalysis("CFGNotUnderstood")<br class="">               << "loop control flow is not understood by vectorizer");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class="">@@ -5021,7 +5024,7 @@ bool LoopVectorizationLegality::canVecto<br class="">   unsigned NumBlocks = TheLoop->getNumBlocks();<br class="">   if (NumBlocks != 1 && !canVectorizeWithIfConvert()) {<br class="">     DEBUG(dbgs() << "LV: Can't if-convert the loop.\n");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class="">@@ -5030,7 +5033,7 @@ bool LoopVectorizationLegality::canVecto<br class="">   // Check if we can vectorize the instructions and CFG in this loop.<br class="">   if (!canVectorizeInstrs()) {<br class="">     DEBUG(dbgs() << "LV: Can't vectorize the instructions or CFG\n");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class="">@@ -5039,7 +5042,7 @@ bool LoopVectorizationLegality::canVecto<br class="">   // Go over each instruction and look at memory deps.<br class="">   if (!canVectorizeMemory()) {<br class="">     DEBUG(dbgs() << "LV: Can't vectorize due to memory conflicts\n");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class="">@@ -5070,7 +5073,7 @@ bool LoopVectorizationLegality::canVecto<br class="">               << "Too many SCEV assumptions need to be made and checked "<br class="">               << "at runtime");<br class="">     DEBUG(dbgs() << "LV: Too many SCEV checks needed.\n");<br class="">-    if (ORE->allowExtraAnalysis())<br class="">+    if (DoExtraAnalysis)<br class="">       Result = false;<br class="">     else<br class="">       return false;<br class=""><br class="">Modified: llvm/trunk/test/Transforms/GVN/opt-remarks.ll<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/opt-remarks.ll?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/opt-remarks.ll?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/test/Transforms/GVN/opt-remarks.ll (original)<br class="">+++ llvm/trunk/test/Transforms/GVN/opt-remarks.ll Fri Sep 15 12:30:59 2017<br class="">@@ -11,7 +11,7 @@<br class=""> ; CHECK:      remark: <unknown>:0:0: load of type i32 eliminated{{$}}<br class=""> ; CHECK-NEXT: remark: <unknown>:0:0: load of type i32 eliminated{{$}}<br class=""> ; CHECK-NEXT: remark: <unknown>:0:0: load of type i32 eliminated{{$}}<br class="">-; CHECK-NOT:  remark:<br class="">+; CHECK-NEXT: remark: /tmp/s.c:3:3: load of type i32 not eliminated<br class=""><br class=""> ; YAML:      --- !Passed<br class=""> ; YAML-NEXT: Pass:            gvn<br class=""><br class="">Modified: llvm/trunk/tools/llc/llc.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/llc/llc.cpp (original)<br class="">+++ llvm/trunk/tools/llc/llc.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -235,20 +235,24 @@ GetOutputStream(const char *TargetName,<br class="">   return FDOut;<br class=""> }<br class=""><br class="">-static void DiagnosticHandler(const DiagnosticInfo &DI, void *Context) {<br class="">-  bool *HasError = static_cast<bool *>(Context);<br class="">-  if (DI.getSeverity() == DS_Error)<br class="">-    *HasError = true;<br class="">-<br class="">-  if (auto *Remark = dyn_cast<DiagnosticInfoOptimizationBase>(&DI))<br class="">-    if (!Remark->isEnabled())<br class="">-      return;<br class="">-<br class="">-  DiagnosticPrinterRawOStream DP(errs());<br class="">-  errs() << LLVMContext::getDiagnosticMessagePrefix(DI.getSeverity()) << ": ";<br class="">-  DI.print(DP);<br class="">-  errs() << "\n";<br class="">-}<br class="">+struct LLCDiagnosticHandler : public DiagnosticHandler {<br class="">+  bool *HasError;<br class="">+  LLCDiagnosticHandler(bool *HasErrorPtr) : HasError(HasErrorPtr) {}<br class="">+  bool handleDiagnostics(const DiagnosticInfo &DI) override {<br class="">+    if (DI.getSeverity() == DS_Error)<br class="">+      *HasError = true;<br class="">+<br class="">+    if (auto *Remark = dyn_cast<DiagnosticInfoOptimizationBase>(&DI))<br class="">+      if (!Remark->isEnabled())<br class="">+        return true;<br class="">+<br class="">+    DiagnosticPrinterRawOStream DP(errs());<br class="">+    errs() << LLVMContext::getDiagnosticMessagePrefix(DI.getSeverity()) << ": ";<br class="">+    DI.print(DP);<br class="">+    errs() << "\n";<br class="">+    return true;<br class="">+  }<br class="">+};<br class=""><br class=""> static void InlineAsmDiagHandler(const SMDiagnostic &SMD, void *Context,<br class="">                                  unsigned LocCookie) {<br class="">@@ -308,7 +312,8 @@ int main(int argc, char **argv) {<br class=""><br class="">   // Set a diagnostic handler that doesn't exit on the first error<br class="">   bool HasError = false;<br class="">-  Context.setDiagnosticHandler(DiagnosticHandler, &HasError);<br class="">+  Context.setDiagnosticHandler(<br class="">+      llvm::make_unique<LLCDiagnosticHandler>(&HasError));<br class="">   Context.setInlineAsmDiagnosticHandler(InlineAsmDiagHandler, &HasError);<br class=""><br class="">   if (PassRemarksWithHotness)<br class="">@@ -564,8 +569,9 @@ static int compileModule(char **argv, LL<br class=""><br class="">     PM.run(*M);<br class=""><br class="">-    auto HasError = *static_cast<bool *>(Context.getDiagnosticContext());<br class="">-    if (HasError)<br class="">+    auto HasError =<br class="">+        ((const LLCDiagnosticHandler *)(Context.getDiagHandlerPtr()))->HasError;<br class="">+    if (*HasError)<br class="">       return 1;<br class=""><br class="">     // Compare the two outputs and make sure they're the same<br class=""><br class="">Modified: llvm/trunk/tools/llvm-dis/llvm-dis.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dis/llvm-dis.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dis/llvm-dis.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/llvm-dis/llvm-dis.cpp (original)<br class="">+++ llvm/trunk/tools/llvm-dis/llvm-dis.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -122,25 +122,29 @@ public:<br class="">   }<br class=""> };<br class=""><br class="">-} // end anon namespace<br class="">-<br class="">-static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) {<br class="">-  raw_ostream &OS = errs();<br class="">-  OS << (char *)Context << ": ";<br class="">-  switch (DI.getSeverity()) {<br class="">-  case DS_Error: OS << "error: "; break;<br class="">-  case DS_Warning: OS << "warning: "; break;<br class="">-  case DS_Remark: OS << "remark: "; break;<br class="">-  case DS_Note: OS << "note: "; break;<br class="">+struct LLVMDisDiagnosticHandler : public DiagnosticHandler {<br class="">+  char *Prefix;<br class="">+  LLVMDisDiagnosticHandler(char *PrefixPtr) : Prefix(PrefixPtr) {}<br class="">+  bool handleDiagnostics(const DiagnosticInfo &DI) override {<br class="">+    raw_ostream &OS = errs();<br class="">+    OS << Prefix << ": ";<br class="">+    switch (DI.getSeverity()) {<br class="">+      case DS_Error: OS << "error: "; break;<br class="">+      case DS_Warning: OS << "warning: "; break;<br class="">+      case DS_Remark: OS << "remark: "; break;<br class="">+      case DS_Note: OS << "note: "; break;<br class="">+    }<br class="">+<br class="">+    DiagnosticPrinterRawOStream DP(OS);<br class="">+    DI.print(DP);<br class="">+    OS << '\n';<br class="">+<br class="">+    if (DI.getSeverity() == DS_Error)<br class="">+      exit(1);<br class="">+    return true;<br class="">   }<br class="">-<br class="">-  DiagnosticPrinterRawOStream DP(OS);<br class="">-  DI.print(DP);<br class="">-  OS << '\n';<br class="">-<br class="">-  if (DI.getSeverity() == DS_Error)<br class="">-    exit(1);<br class="">-}<br class="">+};<br class="">+} // end anon namespace<br class=""><br class=""> static ExitOnError ExitOnErr;<br class=""><br class="">@@ -166,9 +170,8 @@ int main(int argc, char **argv) {<br class=""><br class="">   LLVMContext Context;<br class="">   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.<br class="">-<br class="">-  Context.setDiagnosticHandler(diagnosticHandler, argv[0]);<br class="">-<br class="">+  Context.setDiagnosticHandler(<br class="">+      llvm::make_unique<LLVMDisDiagnosticHandler>(argv[0]));<br class="">   cl::ParseCommandLineOptions(argc, argv, "llvm .bc -> .ll disassembler\n");<br class=""><br class="">   std::unique_ptr<Module> M = openInputFile(Context);<br class=""><br class="">Modified: llvm/trunk/tools/llvm-link/llvm-link.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/llvm-link.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/llvm-link.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/llvm-link/llvm-link.cpp (original)<br class="">+++ llvm/trunk/tools/llvm-link/llvm-link.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -182,25 +182,30 @@ Module &ModuleLazyLoaderCache::operator(<br class=""> }<br class=""> } // anonymous namespace<br class=""><br class="">-static void diagnosticHandler(const DiagnosticInfo &DI, void *C) {<br class="">-  unsigned Severity = DI.getSeverity();<br class="">-  switch (Severity) {<br class="">-  case DS_Error:<br class="">-    errs() << "ERROR: ";<br class="">-    break;<br class="">-  case DS_Warning:<br class="">-    if (SuppressWarnings)<br class="">-      return;<br class="">-    errs() << "WARNING: ";<br class="">-    break;<br class="">-  case DS_Remark:<br class="">-  case DS_Note:<br class="">-    llvm_unreachable("Only expecting warnings and errors");<br class="">-  }<br class="">+namespace {<br class="">+struct LLVMLinkDiagnosticHandler : public DiagnosticHandler {<br class="">+  bool handleDiagnostics(const DiagnosticInfo &DI) override {<br class="">+    unsigned Severity = DI.getSeverity();<br class="">+    switch (Severity) {<br class="">+    case DS_Error:<br class="">+      errs() << "ERROR: ";<br class="">+      break;<br class="">+    case DS_Warning:<br class="">+      if (SuppressWarnings)<br class="">+        return true;<br class="">+      errs() << "WARNING: ";<br class="">+      break;<br class="">+    case DS_Remark:<br class="">+    case DS_Note:<br class="">+      llvm_unreachable("Only expecting warnings and errors");<br class="">+    }<br class=""><br class="">-  DiagnosticPrinterRawOStream DP(errs());<br class="">-  DI.print(DP);<br class="">-  errs() << '\n';<br class="">+    DiagnosticPrinterRawOStream DP(errs());<br class="">+    DI.print(DP);<br class="">+    errs() << '\n';<br class="">+    return true;<br class="">+  }<br class="">+};<br class=""> }<br class=""><br class=""> /// Import any functions requested via the -import option.<br class="">@@ -347,8 +352,8 @@ int main(int argc, char **argv) {<br class="">   ExitOnErr.setBanner(std::string(argv[0]) + ": ");<br class=""><br class="">   LLVMContext Context;<br class="">-  Context.setDiagnosticHandler(diagnosticHandler, nullptr, true);<br class="">-<br class="">+  Context.setDiagnosticHandler(<br class="">+    llvm::make_unique<LLVMLinkDiagnosticHandler>(), true);<br class="">   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.<br class="">   cl::ParseCommandLineOptions(argc, argv, "llvm linker\n");<br class=""><br class=""><br class="">Modified: llvm/trunk/tools/llvm-lto/llvm-lto.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto/llvm-lto.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto/llvm-lto.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/llvm-lto/llvm-lto.cpp (original)<br class="">+++ llvm/trunk/tools/llvm-lto/llvm-lto.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -235,34 +235,40 @@ static void handleDiagnostics(lto_codege<br class=""> }<br class=""><br class=""> static std::string CurrentActivity;<br class="">-static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) {<br class="">-  raw_ostream &OS = errs();<br class="">-  OS << "llvm-lto: ";<br class="">-  switch (DI.getSeverity()) {<br class="">-  case DS_Error:<br class="">-    OS << "error";<br class="">-    break;<br class="">-  case DS_Warning:<br class="">-    OS << "warning";<br class="">-    break;<br class="">-  case DS_Remark:<br class="">-    OS << "remark";<br class="">-    break;<br class="">-  case DS_Note:<br class="">-    OS << "note";<br class="">-    break;<br class="">-  }<br class="">-  if (!CurrentActivity.empty())<br class="">-    OS << ' ' << CurrentActivity;<br class="">-  OS << ": ";<br class="">-<br class="">-  DiagnosticPrinterRawOStream DP(OS);<br class="">-  DI.print(DP);<br class="">-  OS << '\n';<br class=""><br class="">-  if (DI.getSeverity() == DS_Error)<br class="">-    exit(1);<br class="">-}<br class="">+namespace {<br class="">+  struct LLVMLTODiagnosticHandler : public DiagnosticHandler {<br class="">+    bool handleDiagnostics(const DiagnosticInfo &DI) override {<br class="">+      raw_ostream &OS = errs();<br class="">+      OS << "llvm-lto: ";<br class="">+      switch (DI.getSeverity()) {<br class="">+      case DS_Error:<br class="">+        OS << "error";<br class="">+        break;<br class="">+      case DS_Warning:<br class="">+        OS << "warning";<br class="">+        break;<br class="">+      case DS_Remark:<br class="">+        OS << "remark";<br class="">+        break;<br class="">+      case DS_Note:<br class="">+        OS << "note";<br class="">+        break;<br class="">+      }<br class="">+      if (!CurrentActivity.empty())<br class="">+        OS << ' ' << CurrentActivity;<br class="">+      OS << ": ";<br class="">+  <br class="">+      DiagnosticPrinterRawOStream DP(OS);<br class="">+      DI.print(DP);<br class="">+      OS << '\n';<br class="">+  <br class="">+      if (DI.getSeverity() == DS_Error)<br class="">+        exit(1);<br class="">+      return true;<br class="">+    }<br class="">+  };<br class="">+  }<br class=""><br class=""> static void error(const Twine &Msg) {<br class="">   errs() << "llvm-lto: " << Msg << '\n';<br class="">@@ -293,7 +299,8 @@ getLocalLTOModule(StringRef Path, std::u<br class="">   Buffer = std::move(BufferOrErr.get());<br class="">   CurrentActivity = ("loading file '" + Path + "'").str();<br class="">   std::unique_ptr<LLVMContext> Context = llvm::make_unique<LLVMContext>();<br class="">-  Context->setDiagnosticHandler(diagnosticHandler, nullptr, true);<br class="">+  Context->setDiagnosticHandler(llvm::make_unique<LLVMLTODiagnosticHandler>(),<br class="">+                                true);<br class="">   ErrorOr<std::unique_ptr<LTOModule>> Ret = LTOModule::createInLocalContext(<br class="">       std::move(Context), Buffer->getBufferStart(), Buffer->getBufferSize(),<br class="">       Options, Path);<br class="">@@ -837,7 +844,8 @@ int main(int argc, char **argv) {<br class="">   unsigned BaseArg = 0;<br class=""><br class="">   LLVMContext Context;<br class="">-  Context.setDiagnosticHandler(diagnosticHandler, nullptr, true);<br class="">+  Context.setDiagnosticHandler(llvm::make_unique<LLVMLTODiagnosticHandler>(),<br class="">+                               true);<br class=""><br class="">   LTOCodeGenerator CodeGen(Context);<br class=""><br class=""><br class="">Modified: llvm/trunk/tools/lto/lto.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=313382&r1=313381&r2=313382&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=313382&r1=313381&r2=313382&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/tools/lto/lto.cpp (original)<br class="">+++ llvm/trunk/tools/lto/lto.cpp Fri Sep 15 12:30:59 2017<br class="">@@ -75,20 +75,23 @@ static bool parsedOptions = false;<br class=""><br class=""> static LLVMContext *LTOContext = nullptr;<br class=""><br class="">-static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) {<br class="">-  if (DI.getSeverity() != DS_Error) {<br class="">-    DiagnosticPrinterRawOStream DP(errs());<br class="">-    DI.print(DP);<br class="">-    errs() << '\n';<br class="">-    return;<br class="">-  }<br class="">-  sLastErrorString = "";<br class="">-  {<br class="">-    raw_string_ostream Stream(sLastErrorString);<br class="">-    DiagnosticPrinterRawOStream DP(Stream);<br class="">-    DI.print(DP);<br class="">+struct LTOToolDiagnosticHandler : public DiagnosticHandler {<br class="">+  bool handleDiagnostics(const DiagnosticInfo &DI) override {<br class="">+    if (DI.getSeverity() != DS_Error) {<br class="">+      DiagnosticPrinterRawOStream DP(errs());<br class="">+      DI.print(DP);<br class="">+      errs() << '\n';<br class="">+      return true;<br class="">+    }<br class="">+    sLastErrorString = "";<br class="">+    {<br class="">+      raw_string_ostream Stream(sLastErrorString);<br class="">+      DiagnosticPrinterRawOStream DP(Stream);<br class="">+      DI.print(DP);<br class="">+    }<br class="">+    return true;<br class="">   }<br class="">-}<br class="">+};<br class=""><br class=""> // Initialize the configured targets if they have not been initialized.<br class=""> static void lto_initialize() {<br class="">@@ -108,7 +111,8 @@ static void lto_initialize() {<br class=""><br class="">     static LLVMContext Context;<br class="">     LTOContext = &Context;<br class="">-    LTOContext->setDiagnosticHandler(diagnosticHandler, nullptr, true);<br class="">+    LTOContext->setDiagnosticHandler(<br class="">+        llvm::make_unique<LTOToolDiagnosticHandler>(), true);<br class="">     initialized = true;<br class="">   }<br class=""> }<br class="">@@ -274,7 +278,8 @@ lto_module_t lto_module_create_in_local_<br class=""><br class="">   // Create a local context. Ownership will be transferred to LTOModule.<br class="">   std::unique_ptr<LLVMContext> Context = llvm::make_unique<LLVMContext>();<br class="">-  Context->setDiagnosticHandler(diagnosticHandler, nullptr, true);<br class="">+  Context->setDiagnosticHandler(llvm::make_unique<LTOToolDiagnosticHandler>(),<br class="">+                                true);<br class=""><br class="">   ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createInLocalContext(<br class="">       std::move(Context), mem, length, Options, StringRef(path));<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""></div></div></blockquote></div><br class=""></div></body></html>