mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
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 llvm-svn: 252791
This commit is contained in:
parent
b6376cdd2e
commit
c13f4daa7c
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user