OSDN Git Service

Provide a dummy section to fix a crash with inline assembly in LTO.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 22 Jan 2014 22:11:14 +0000 (22:11 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 22 Jan 2014 22:11:14 +0000 (22:11 +0000)
Fixes pr18508.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199843 91177308-0d34-0410-b5e6-96231b3b80d8

lib/LTO/LTOModule.cpp
test/LTO/current-section.ll [new file with mode: 0644]

index f73a608..b648982 100644 (file)
@@ -24,6 +24,7 @@
 #include "llvm/MC/MCInst.h"
 #include "llvm/MC/MCInstrInfo.h"
 #include "llvm/MC/MCParser/MCAsmParser.h"
+#include "llvm/MC/MCSection.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCSubtargetInfo.h"
 #include "llvm/MC/MCSymbol.h"
@@ -532,10 +533,32 @@ LTOModule::addPotentialUndefinedSymbol(const GlobalValue *decl, bool isFunc) {
 }
 
 namespace {
+
+// Common infrastructure is allowed to assume the existence of a current
+// section. Since this streamer doesn't need one itself, we just provide
+// a dummy one.
+class DummySection : public MCSection {
+public:
+  DummySection() : MCSection(SV_ELF, SectionKind::getText()) {}
+
+  virtual void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS,
+                                    const MCExpr *Subsection) const {}
+
+  virtual std::string getLabelBeginName() const { return ""; }
+
+  virtual std::string getLabelEndName() const { return ""; }
+
+  virtual bool UseCodeAlign() const { return false; }
+
+  virtual bool isVirtualSection() const { return false; }
+};
+
   class RecordStreamer : public MCStreamer {
   public:
     enum State { NeverSeen, Global, Defined, DefinedGlobal, Used };
 
+    DummySection TheSection;
+
   private:
     StringMap<State> Symbols;
 
@@ -621,7 +644,9 @@ namespace {
       return Symbols.end();
     }
 
-    RecordStreamer(MCContext &Context) : MCStreamer(Context, 0) {}
+    RecordStreamer(MCContext &Context) : MCStreamer(Context, 0) {
+      SwitchSection(&TheSection);
+    }
 
     virtual void EmitInstruction(const MCInst &Inst) {
       // Scan for values.
diff --git a/test/LTO/current-section.ll b/test/LTO/current-section.ll
new file mode 100644 (file)
index 0000000..f79b378
--- /dev/null
@@ -0,0 +1,4 @@
+; RUN: llvm-as < %s >%t1
+; RUN: llvm-lto -o %t2 %t1
+
+module asm ".align 4"