[llvm] r230991 - Add r230655 back with a fix.

Rafael Espindola rafael.espindola at gmail.com
Mon Mar 2 11:08:03 PST 2015


Author: rafael
Date: Mon Mar  2 13:08:03 2015
New Revision: 230991

URL: http://llvm.org/viewvc/llvm-project?rev=230991&view=rev
Log:
Add r230655 back with a fix.

The issue is that now we have a diag handler during optimizations
and get forward every optimization remark, flooding stdout.

The same filtering should probably be done with or without a
custom handler, but for now just ignore remarks.

Original message:

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).

Added:
    llvm/trunk/test/tools/gold/Inputs/drop-debug.bc
    llvm/trunk/test/tools/gold/drop-debug.ll
Modified:
    llvm/trunk/tools/gold/gold-plugin.cpp

Added: llvm/trunk/test/tools/gold/Inputs/drop-debug.bc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/gold/Inputs/drop-debug.bc?rev=230991&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/gold/Inputs/drop-debug.bc (added) and llvm/trunk/test/tools/gold/Inputs/drop-debug.bc Mon Mar  2 13:08:03 2015 differ

Added: llvm/trunk/test/tools/gold/drop-debug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/gold/drop-debug.ll?rev=230991&view=auto
==============================================================================
--- llvm/trunk/test/tools/gold/drop-debug.ll (added)
+++ llvm/trunk/test/tools/gold/drop-debug.ll Mon Mar  2 13:08:03 2015
@@ -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

Modified: llvm/trunk/tools/gold/gold-plugin.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=230991&r1=230990&r2=230991&view=diff
==============================================================================
--- llvm/trunk/tools/gold/gold-plugin.cpp (original)
+++ llvm/trunk/tools/gold/gold-plugin.cpp Mon Mar  2 13:08:03 2015
@@ -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<BitcodeDiagnosticInfo>(DI);
-  std::error_code EC = BDI.getError();
-  if (EC == BitcodeError::InvalidBitcodeSignature)
-    return;
+  if (const auto *BDI = dyn_cast<BitcodeDiagnosticInfo>(&DI)) {
+    std::error_code EC = BDI->getError();
+    if (EC == BitcodeError::InvalidBitcodeSignature)
+      return;
+  }
 
   std::string ErrStorage;
   {
@@ -285,8 +286,24 @@ static void diagnosticHandler(const Diag
     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_Note:
+    Level = LDPL_INFO;
+    break;
+    // FIXME: Just ignore remarks for now. They are always passed by
+    // if there is a custom diagnostic handler, so we get flooded.
+  case DS_Remark:
+    return;
+  }
+  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 +578,7 @@ static void freeSymName(ld_plugin_symbol
 
 static std::unique_ptr<Module>
 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 +588,8 @@ getModuleForFile(LLVMContext &Context, c
   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<std::unique_ptr<object::IRObjectFile>> ObjOrErr =
       object::IRObjectFile::create(BufferRef, Context);
 
@@ -583,6 +601,8 @@ getModuleForFile(LLVMContext &Context, c
 
   Module &M = Obj.getModule();
 
+  UpgradeDebugInfo(M);
+
   SmallPtrSet<GlobalValue *, 8> Used;
   collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);
 
@@ -792,6 +812,8 @@ static ld_plugin_status allSymbolsReadHo
     return LDPS_OK;
 
   LLVMContext Context;
+  Context.setDiagnosticHandler(diagnosticHandler);
+
   std::unique_ptr<Module> Combined(new Module("ld-temp.o", Context));
   Linker L(Combined.get());
 
@@ -804,8 +826,7 @@ static ld_plugin_status allSymbolsReadHo
     if (get_input_file(F.handle, &File) != LDPS_OK)
       message(LDPL_FATAL, "Failed to get file information");
     std::unique_ptr<Module> 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()) {





More information about the llvm-commits mailing list