mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-04 01:11:44 +00:00
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
This commit is contained in:
parent
ca619ceee9
commit
15919ad6d1
@ -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();
|
||||
}
|
||||
|
||||
|
13
test/LTO/X86/diagnostic-handler-noexit.ll
Normal file
13
test/LTO/X86/diagnostic-handler-noexit.ll
Normal file
@ -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
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user