X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FLinker%2FLinkModules.cpp;h=2467f67831615e32a217ee1c8cdd1ec18d9752be;hp=c9563e6c272bb333d2b0affb8e167317a732c26a;hb=f4a288c0f06f5333925e1bc8a7b35be9c3e88f12;hpb=e272236d69961cf3686d1d4e5720bc87ec996cd4 diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index c9563e6c272..2467f678316 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -1766,8 +1766,33 @@ bool Linker::LinkModules(Module *Dest, Module *Src, unsigned Mode) { // C API. //===----------------------------------------------------------------------===// +static void bindingDiagnosticHandler(const llvm::DiagnosticInfo &DI, + void *Context) { + if (DI.getSeverity() != DS_Error) + return; + + std::string *Message = (std::string *)Context; + { + raw_string_ostream Stream(*Message); + DiagnosticPrinterRawOStream DP(Stream); + DI.print(DP); + } +} + + LLVMBool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src, LLVMLinkerMode Mode, char **OutMessages) { - LLVMBool Result = Linker::LinkModules(unwrap(Dest), unwrap(Src), Mode); + Module *D = unwrap(Dest); + LLVMContext &Ctx = D->getContext(); + + LLVMContext::DiagnosticHandlerTy OldHandler = Ctx.getDiagnosticHandler(); + void *OldDiagnosticContext = Ctx.getDiagnosticContext(); + std::string Message; + Ctx.setDiagnosticHandler(bindingDiagnosticHandler, &Message); + LLVMBool Result = Linker::LinkModules(D, unwrap(Src), Mode); + Ctx.setDiagnosticHandler(OldHandler, OldDiagnosticContext); + + if (OutMessages && Result) + *OutMessages = strdup(Message.c_str()); return Result; }