<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>