From 7360fb62063272510e4d3f690b19c505326f0b02 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 26 Feb 2015 18:24:37 +0000 Subject: [PATCH] gold-plugin: "Upgrade" debug info and handle its warnings. The gold plugin never calls MaterializeModule, so any old debug info was not deleted and could cause crashes. Now that it is being "upgraded", the plugin also has to handle warnings and create Modules with a nice id (it shows in the warning). llvm-svn: 230655 --- llvm/test/tools/gold/Inputs/drop-debug.bc | Bin 0 -> 1152 bytes llvm/test/tools/gold/drop-debug.ll | 8 ++++++ llvm/tools/gold/gold-plugin.cpp | 40 ++++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 llvm/test/tools/gold/Inputs/drop-debug.bc create mode 100644 llvm/test/tools/gold/drop-debug.ll diff --git a/llvm/test/tools/gold/Inputs/drop-debug.bc b/llvm/test/tools/gold/Inputs/drop-debug.bc new file mode 100644 index 0000000000000000000000000000000000000000..f9c471f8e0d1e6960c4efb96961bc1799c3c2bb4 GIT binary patch literal 1152 zcmZuxO=ufO6dwIpv$j^Nb)vTGW_Fp4lj2KZ>l9&I7D(E(vB3qkIn>9Mu!9M-UH_mz z_pp*&twPnHBrWLBgEqL}-U7Yk(1TVsLKrouIT>Mu)!2#&c5K?v=GKl}(^DVJ%$s>{ z-uvG7h6%})wnziOTL5roFt7puE|3A!!}o%9`?P}{9lvi`qp$W+LxTP5s78Na4c&K! z=Gals7{yHwj9$MoHBc0Xw?5J6A#v#ntk>D-MtLJpJ0&5(#~c73k@eE;;n#l?u@p54 z?--~X5n4dlH&9LFy9R1i(4N6p(+Dh6Fjmr+02NQ@UI`{CJvO3yH9bBB<7IuRsC!3X zY)X%T!=UiOK$^+74Ob&5R1JRHaP4*YrzU@Bpnb!&o#vk!e5=B@O}?e^+ahXM@NS21 zVSd*{U2@AJw8|u@(6mUps_4lPsHu88&|ULk=CdY~B6E?61z<{n zD@{jNgK8NrVwh+;UTQGK!dMwD<8$jzEL_r{{I&&X1Q!wPw4Y-XO6<_!OtH}a&W)N~ z{*4OsdxCeYnKwRMv}L|~AJ6_sbQ~1JH^6Oe(h8EK&QD1Ic`U%(1IUT4$hk8FeiJX>z^8?}(_a@jIr_>bOWNx@looL2rh?(3q1Zb8zZ7 zkld$5=4F66sW6>W$5Dm(v&lF&78PAp^<`jN9f8S`zLJ1(kR4aE6KZx0WcwAMZK#G4p)S@ht4VX;rRoogW^bGW%ioQJDE$VUAelx#YfSuMHWG zY`z`Y_c%CFl*b?2{4@Qyho;BzTV%aPX=tm1Zh0*JygatHSqNz`nSjfsMY;>z$1L+o zW3JI5p=$C^40KECJ9EokYS{dB*T>b%QnSV_H literal 0 HcmV?d00001 diff --git a/llvm/test/tools/gold/drop-debug.ll b/llvm/test/tools/gold/drop-debug.ll new file mode 100644 index 0000000..b8c4d8c --- /dev/null +++ b/llvm/test/tools/gold/drop-debug.ll @@ -0,0 +1,8 @@ +; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=emit-llvm -shared %p/Inputs/drop-debug.bc \ +; RUN: -o t2.bc 2>&1 | FileCheck %s + +; drop-debug.bc was created from "void f(void) {}" with clang 3.5 and +; -gline-tables-only, so it contains old debug info. + +; CHECK: warning: LLVM gold plugin: ignoring debug info with an invalid version (1) in {{.*}}/Inputs/drop-debug.bc diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index e654a15..e3a57b5 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -20,6 +20,7 @@ #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/CodeGen/Analysis.h" #include "llvm/CodeGen/CommandFlags.h" +#include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/DiagnosticPrinter.h" @@ -273,11 +274,11 @@ static bool shouldSkip(uint32_t Symflags) { } static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) { - assert(DI.getSeverity() == DS_Error && "Only expecting errors"); - const auto &BDI = cast(DI); - std::error_code EC = BDI.getError(); - if (EC == BitcodeError::InvalidBitcodeSignature) - return; + if (const auto *BDI = dyn_cast(&DI)) { + std::error_code EC = BDI->getError(); + if (EC == BitcodeError::InvalidBitcodeSignature) + return; + } std::string ErrStorage; { @@ -285,8 +286,21 @@ static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) { DiagnosticPrinterRawOStream DP(OS); DI.print(DP); } - message(LDPL_FATAL, "LLVM gold plugin has failed to create LTO module: %s", - ErrStorage.c_str()); + ld_plugin_level Level; + switch (DI.getSeverity()) { + case DS_Error: + message(LDPL_FATAL, "LLVM gold plugin has failed to create LTO module: %s", + ErrStorage.c_str()); + llvm_unreachable("Fatal doesn't return."); + case DS_Warning: + Level = LDPL_WARNING; + break; + case DS_Remark: + case DS_Note: + Level = LDPL_INFO; + break; + } + message(Level, "LLVM gold plugin: %s", ErrStorage.c_str()); } /// Called by gold to see whether this file is one that our plugin can handle. @@ -561,7 +575,7 @@ static void freeSymName(ld_plugin_symbol &Sym) { static std::unique_ptr getModuleForFile(LLVMContext &Context, claimed_file &F, - off_t Filesize, raw_fd_ostream *ApiFile, + ld_plugin_input_file &Info, raw_fd_ostream *ApiFile, StringSet<> &Internalize, StringSet<> &Maybe) { if (get_symbols(F.handle, F.syms.size(), &F.syms[0]) != LDPS_OK) @@ -571,7 +585,8 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, if (get_view(F.handle, &View) != LDPS_OK) message(LDPL_FATAL, "Failed to get a view of file"); - MemoryBufferRef BufferRef(StringRef((const char *)View, Filesize), ""); + MemoryBufferRef BufferRef(StringRef((const char *)View, Info.filesize), + Info.name); ErrorOr> ObjOrErr = object::IRObjectFile::create(BufferRef, Context); @@ -583,6 +598,8 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, Module &M = Obj.getModule(); + UpgradeDebugInfo(M); + SmallPtrSet Used; collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); @@ -792,6 +809,8 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) { return LDPS_OK; LLVMContext Context; + Context.setDiagnosticHandler(diagnosticHandler); + std::unique_ptr Combined(new Module("ld-temp.o", Context)); Linker L(Combined.get()); @@ -804,8 +823,7 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) { if (get_input_file(F.handle, &File) != LDPS_OK) message(LDPL_FATAL, "Failed to get file information"); std::unique_ptr M = - getModuleForFile(Context, F, File.filesize, ApiFile, - Internalize, Maybe); + getModuleForFile(Context, F, File, ApiFile, Internalize, Maybe); if (!options::triple.empty()) M->setTargetTriple(options::triple.c_str()); else if (M->getTargetTriple().empty()) { -- 2.7.4