From a73e920f0982137083ba6291842cd81f4100fb0e Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 22 Jan 2014 22:11:14 +0000 Subject: [PATCH] Provide a dummy section to fix a crash with inline assembly in LTO. Fixes pr18508. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199843 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/LTO/LTOModule.cpp | 27 ++++++++++++++++++++++++++- test/LTO/current-section.ll | 4 ++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 test/LTO/current-section.ll diff --git a/lib/LTO/LTOModule.cpp b/lib/LTO/LTOModule.cpp index f73a608e3c4..b648982af1d 100644 --- a/lib/LTO/LTOModule.cpp +++ b/lib/LTO/LTOModule.cpp @@ -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 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 index 00000000000..f79b378318d --- /dev/null +++ b/test/LTO/current-section.ll @@ -0,0 +1,4 @@ +; RUN: llvm-as < %s >%t1 +; RUN: llvm-lto -o %t2 %t1 + +module asm ".align 4"