Skip to content

Commit

Permalink
Add a libLTO diagnostic handler that supports lto_get_error_message API
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Yunzhong Gao authored and Yunzhong Gao committed Nov 11, 2015
1 parent e2eaa97 commit 8de34ad
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 12 deletions.
10 changes: 2 additions & 8 deletions lib/LTO/LTOCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<LLVMContext> Context)
: OwnedContext(std::move(Context)), Context(*OwnedContext),
MergedModule(new Module("ld-temp.o", *OwnedContext)),
IRLinker(MergedModule.get(), handleLTODiagnostic) {
IRLinker(MergedModule.get()) {
initializeLTOPasses();
}

Expand Down
4 changes: 2 additions & 2 deletions test/LTO/X86/diagnostic-handler-noexit.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
12 changes: 10 additions & 2 deletions tools/lto/lto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<LLVMContext> Context)
: LTOCodeGenerator(std::move(Context)) {}
: LTOCodeGenerator(std::move(Context)) {
setDiagnosticHandler(handleLibLTODiagnostic, nullptr); }

std::unique_ptr<MemoryBuffer> NativeObjectFile;
};
Expand Down

0 comments on commit 8de34ad

Please sign in to comment.