Add a non-exiting diagnostic handler for LTO.
authorYunzhong Gao <Yunzhong_Gao@playstation.sony.com>
Fri, 11 Sep 2015 20:01:53 +0000 (20:01 +0000)
committerYunzhong Gao <Yunzhong_Gao@playstation.sony.com>
Fri, 11 Sep 2015 20:01:53 +0000 (20:01 +0000)
This is in order to give LTO clients a chance to do some clean-up before
terminating the process.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247461 91177308-0d34-0410-b5e6-96231b3b80d8

lib/LTO/LTOCodeGenerator.cpp
test/LTO/X86/diagnostic-handler-noexit.ll [new file with mode: 0644]
tools/llvm-lto/llvm-lto.cpp

index 51515b0de50308c913c20221a2c3385328bbb99f..5dda8292bd654f9def83e26652d1d0623606c1f4 100644 (file)
@@ -64,17 +64,23 @@ 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()) {
+      IRLinker(MergedModule.get(), handleLTODiagnostic) {
   initializeLTOPasses();
 }
 
 LTOCodeGenerator::LTOCodeGenerator(std::unique_ptr<LLVMContext> Context)
     : OwnedContext(std::move(Context)), Context(*OwnedContext),
       MergedModule(new Module("ld-temp.o", *OwnedContext)),
-      IRLinker(MergedModule.get()) {
+      IRLinker(MergedModule.get(), handleLTODiagnostic) {
   initializeLTOPasses();
 }
 
diff --git a/test/LTO/X86/diagnostic-handler-noexit.ll b/test/LTO/X86/diagnostic-handler-noexit.ll
new file mode 100644 (file)
index 0000000..be768c9
--- /dev/null
@@ -0,0 +1,13 @@
+; LTO default diagnostic handler should be non-exiting.
+; This test verifies that after addModule() encounters an error, the diagnostic
+; handler does not call exit(1) and instead returns to the caller of addModule.
+
+; RUN: llvm-as <%s >%t1
+; RUN: llvm-as <%s >%t2
+; RUN: not llvm-lto -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 adding file
+@goodboy = global i32 3203383023, align 4    ; 0xbeefbeef
index ddde23175a3bc44b003e23fdcca5a1a309e214c7..cdb1bcaa6bca388d737f24dcc533bb57222258cf 100644 (file)
@@ -216,8 +216,11 @@ int main(int argc, char **argv) {
     if (SetMergedModule && i == BaseArg) {
       // Transfer ownership to the code generator.
       CodeGen.setModule(std::move(Module));
-    } else if (!CodeGen.addModule(Module.get()))
+    } else if (!CodeGen.addModule(Module.get())) {
+      // Print a message here so that we know addModule() did not abort.
+      errs() << argv[0] << ": error adding file '" << InputFilenames[i] << "'\n";
       return 1;
+    }
   }
 
   // Add all the exported symbols to the table of symbols to preserve.