[llvm-commits] [llvm] r169785 - in /llvm/trunk: include/llvm/MC/MCStreamer.h lib/CodeGen/AsmPrinter/AsmPrinter.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/MC/MCStreamer.cpp

Lang Hames lhames at gmail.com
Tue Dec 11 09:54:04 PST 2012


It's deterministic. If the MachOStreamer for the target is constructed with
LabelSections=true, then calling InitSections early leads to a temporary
symbol (ltmp0) being output before the MCContext is initialized.
Initializing the MCContext resets the temporary ID counter to zero, which
led to a second ltmp0 symbol being output later.

All in-tree code constructs MachOStreamer with LabelSections=false, so no
test case I'm afraid.

- Lang.


On Tue, Dec 11, 2012 at 9:13 AM, Rafael EspĂ­ndola <
rafael.espindola at gmail.com> wrote:

> The bug was  hard to trigger bu deterministic, no? Do you have a testcase?
>
> On 10 December 2012 17:49, Lang Hames <lhames at gmail.com> wrote:
> > Author: lhames
> > Date: Mon Dec 10 16:49:11 2012
> > New Revision: 169785
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=169785&view=rev
> > Log:
> > 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).
> >
> > Modified:
> >     llvm/trunk/include/llvm/MC/MCStreamer.h
> >     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> >     llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
> >     llvm/trunk/lib/MC/MCStreamer.cpp
> >
> > Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=169785&r1=169784&r2=169785&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> > +++ llvm/trunk/include/llvm/MC/MCStreamer.h Mon Dec 10 16:49:11 2012
> > @@ -70,6 +70,8 @@
> >      SmallVector<std::pair<const MCSection *,
> >                  const MCSection *>, 4> SectionStack;
> >
> > +    bool AutoInitSections;
> > +
> >    protected:
> >      MCStreamer(MCContext &Ctx);
> >
> > @@ -214,6 +216,17 @@
> >          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;
> >
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=169785&r1=169784&r2=169785&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Mon Dec 10 16:49:11
> 2012
> > @@ -149,6 +149,8 @@
> >  }
> >
> >  bool AsmPrinter::doInitialization(Module &M) {
> > +  OutStreamer.InitStreamer();
> > +
> >    MMI = getAnalysisIfAvailable<MachineModuleInfo>();
> >    MMI->AnalyzeModule(M);
> >
> >
> > Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=169785&r1=169784&r2=169785&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Mon Dec 10 16:49:11 2012
> > @@ -202,7 +202,7 @@
> >                                                           *Context,
> *MAB, Out,
> >                                                           MCE,
> hasMCRelaxAll(),
> >
> hasMCNoExecStack()));
> > -    AsmStreamer.get()->InitSections();
> > +    AsmStreamer.get()->setAutoInitSections(true);
> >      break;
> >    }
> >    case CGFT_Null:
> >
> > Modified: llvm/trunk/lib/MC/MCStreamer.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=169785&r1=169784&r2=169785&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> > +++ llvm/trunk/lib/MC/MCStreamer.cpp Mon Dec 10 16:49:11 2012
> > @@ -23,7 +23,8 @@
> >
> >  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));
> >  }
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121211/32a37f88/attachment.html>


More information about the llvm-commits mailing list