summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYunzhong Gao <Yunzhong_Gao@playstation.sony.com>2015-09-11 20:01:53 +0000
committerYunzhong Gao <Yunzhong_Gao@playstation.sony.com>2015-09-11 20:01:53 +0000
commit46261a74db3114e7035be0a3c5fb485fc3ec8ef6 (patch)
treebb4be61a28e30a15235e9e83a65730c2c4cd768c
parent9c7b08e609115eef68b1155545a7bc8d9c6f45bc (diff)
downloadbcm5719-llvm-46261a74db3114e7035be0a3c5fb485fc3ec8ef6.tar.gz
bcm5719-llvm-46261a74db3114e7035be0a3c5fb485fc3ec8ef6.zip
Add a non-exiting diagnostic handler for LTO.
This is in order to give LTO clients a chance to do some clean-up before terminating the process. llvm-svn: 247461
-rw-r--r--llvm/lib/LTO/LTOCodeGenerator.cpp10
-rw-r--r--llvm/test/LTO/X86/diagnostic-handler-noexit.ll13
-rw-r--r--llvm/tools/llvm-lto/llvm-lto.cpp5
3 files changed, 25 insertions, 3 deletions
diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp
index 51515b0de50..5dda8292bd6 100644
--- a/llvm/lib/LTO/LTOCodeGenerator.cpp
+++ b/llvm/lib/LTO/LTOCodeGenerator.cpp
@@ -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/llvm/test/LTO/X86/diagnostic-handler-noexit.ll b/llvm/test/LTO/X86/diagnostic-handler-noexit.ll
new file mode 100644
index 00000000000..be768c900f1
--- /dev/null
+++ b/llvm/test/LTO/X86/diagnostic-handler-noexit.ll
@@ -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
diff --git a/llvm/tools/llvm-lto/llvm-lto.cpp b/llvm/tools/llvm-lto/llvm-lto.cpp
index ddde23175a3..cdb1bcaa6bc 100644
--- a/llvm/tools/llvm-lto/llvm-lto.cpp
+++ b/llvm/tools/llvm-lto/llvm-lto.cpp
@@ -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.
OpenPOWER on IntegriCloud