Defer call to InitSections until after MCContext has been initialized. If

InitSections is called before the MCContext is initialized it could cause
duplicate temporary symbols to be emitted later (after context initialization
resets the temporary label counter).

llvm-svn: 169785
This commit is contained in:
Lang Hames 2012-12-10 22:49:11 +00:00
parent 3923e286cd
commit 517fc8b264
4 changed files with 18 additions and 2 deletions

View File

@ -70,6 +70,8 @@ namespace llvm {
SmallVector<std::pair<const MCSection *,
const MCSection *>, 4> SectionStack;
bool AutoInitSections;
protected:
MCStreamer(MCContext &Ctx);
@ -214,6 +216,17 @@ namespace llvm {
SectionStack.back().first = Section;
}
/// Initialize the streamer.
void InitStreamer() {
if (AutoInitSections)
InitSections();
}
/// Tell this MCStreamer to call InitSections upon initialization.
void setAutoInitSections(bool AutoInitSections) {
this->AutoInitSections = AutoInitSections;
}
/// InitSections - Create the default sections and set the initial one.
virtual void InitSections() = 0;

View File

@ -149,6 +149,8 @@ void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
}
bool AsmPrinter::doInitialization(Module &M) {
OutStreamer.InitStreamer();
MMI = getAnalysisIfAvailable<MachineModuleInfo>();
MMI->AnalyzeModule(M);

View File

@ -202,7 +202,7 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
*Context, *MAB, Out,
MCE, hasMCRelaxAll(),
hasMCNoExecStack()));
AsmStreamer.get()->InitSections();
AsmStreamer.get()->setAutoInitSections(true);
break;
}
case CGFT_Null:

View File

@ -23,7 +23,8 @@ using namespace llvm;
MCStreamer::MCStreamer(MCContext &Ctx)
: Context(Ctx), EmitEHFrame(true), EmitDebugFrame(false),
CurrentW64UnwindInfo(0), LastSymbol(0) {
CurrentW64UnwindInfo(0), LastSymbol(0),
AutoInitSections(false) {
const MCSection *section = NULL;
SectionStack.push_back(std::make_pair(section, section));
}