From: Yunzhong Gao Date: Wed, 11 Nov 2015 19:59:08 +0000 (+0000) Subject: Add a libLTO diagnostic handler that supports lto_get_error_message API X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8de34ad8f7dd5c159c1989c011fa70fd6f62026a;p=oota-llvm.git Add a libLTO diagnostic handler that supports lto_get_error_message API This is a follow-up from the previous discussion on the thread: http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20151019/307763.html The LibLTO lto_get_error_message() API reads error messages from a std::string sLastErrorString. Instead of passing this string around as an argument, this patch creates a diagnostic handler and then sends this handler to the constructor of LTOCodeGenerator. Differential Revision: http://reviews.llvm.org/D14313 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252791 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 8dcc53c8033..56240502c02 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -64,23 +64,17 @@ const char* LTOCodeGenerator::getVersionString() { #endif } -static void handleLTODiagnostic(const DiagnosticInfo &DI) { - DiagnosticPrinterRawOStream DP(errs()); - DI.print(DP); - errs() << "\n"; -} - LTOCodeGenerator::LTOCodeGenerator() : Context(getGlobalContext()), MergedModule(new Module("ld-temp.o", Context)), - IRLinker(MergedModule.get(), handleLTODiagnostic) { + IRLinker(MergedModule.get()) { initializeLTOPasses(); } LTOCodeGenerator::LTOCodeGenerator(std::unique_ptr Context) : OwnedContext(std::move(Context)), Context(*OwnedContext), MergedModule(new Module("ld-temp.o", *OwnedContext)), - IRLinker(MergedModule.get(), handleLTODiagnostic) { + IRLinker(MergedModule.get()) { initializeLTOPasses(); } diff --git a/test/LTO/X86/diagnostic-handler-noexit.ll b/test/LTO/X86/diagnostic-handler-noexit.ll index be768c900f1..597419ff64f 100644 --- a/test/LTO/X86/diagnostic-handler-noexit.ll +++ b/test/LTO/X86/diagnostic-handler-noexit.ll @@ -4,10 +4,10 @@ ; RUN: llvm-as <%s >%t1 ; RUN: llvm-as <%s >%t2 -; RUN: not llvm-lto -o /dev/null %t1 %t2 2>&1 | FileCheck %s +; RUN: not llvm-lto -use-diagnostic-handler -o /dev/null %t1 %t2 2>&1 | FileCheck %s target triple = "x86_64-unknown-linux-gnu" -; CHECK: Linking globals named 'goodboy': symbol multiply defined! +; CHECK: llvm-lto: error: Linking globals named 'goodboy': symbol multiply defined! ; CHECK: llvm-lto{{.*}}: error adding file @goodboy = global i32 3203383023, align 4 ; 0xbeefbeef diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index 62675081464..0839a566cc5 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -85,13 +85,21 @@ static void lto_initialize() { namespace { +static void handleLibLTODiagnostic(lto_codegen_diagnostic_severity_t Severity, + const char *Msg, void *) { + sLastErrorString = Msg; + sLastErrorString += "\n"; +} + // This derived class owns the native object file. This helps implement the // libLTO API semantics, which require that the code generator owns the object // file. struct LibLTOCodeGenerator : LTOCodeGenerator { - LibLTOCodeGenerator() {} + LibLTOCodeGenerator() { + setDiagnosticHandler(handleLibLTODiagnostic, nullptr); } LibLTOCodeGenerator(std::unique_ptr Context) - : LTOCodeGenerator(std::move(Context)) {} + : LTOCodeGenerator(std::move(Context)) { + setDiagnosticHandler(handleLibLTODiagnostic, nullptr); } std::unique_ptr NativeObjectFile; };