From 5a6e97a7e4e25265cd491f10cc9b0676ff5c0746 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 25 Mar 2010 07:10:11 +0000 Subject: [PATCH] MC: Explicity track section and fragment ordinals. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99500 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAssembler.h | 15 +++++++++++++++ lib/MC/MCAssembler.cpp | 13 +++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 19cec1c13cb..c34132db2fe 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -91,6 +91,10 @@ private: /// initialized. uint64_t EffectiveSize; + /// Ordinal - The global index of this fragment. This is the index across all + /// sections, not just the parent section. + unsigned Ordinal; + /// @} protected: @@ -106,6 +110,9 @@ public: MCSectionData *getParent() const { return Parent; } void setParent(MCSectionData *Value) { Parent = Value; } + unsigned getOrdinal() const { return Ordinal; } + void setOrdinal(unsigned Value) { Ordinal = Value; } + static bool classof(const MCFragment *O) { return true; } virtual void dump(); @@ -390,6 +397,9 @@ private: iplist Fragments; const MCSection *Section; + /// Ordinal - The section index in the assemblers section list. + unsigned Ordinal; + /// Alignment - The maximum alignment seen in this section. unsigned Alignment; @@ -428,6 +438,9 @@ public: bool hasInstructions() const { return HasInstructions; } void setHasInstructions(bool Value) { HasInstructions = Value; } + unsigned getOrdinal() const { return Ordinal; } + void setOrdinal(unsigned Value) { Ordinal = Value; } + /// @name Fragment Access /// @{ @@ -451,6 +464,8 @@ public: bool empty() const { return Fragments.empty(); } void dump(); + + /// @} }; // FIXME: Same concerns as with SectionData. diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 8efc78c1f9a..5190239f5a3 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -568,6 +568,18 @@ void MCAssembler::Finish() { llvm::errs() << "assembler backend - pre-layout\n--\n"; dump(); }); + // Assign section and fragment ordinals, all subsequent backend code is + // responsible for updating these in place. + unsigned SectionIndex = 0; + unsigned FragmentIndex = 0; + for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) { + it->setOrdinal(SectionIndex++); + + for (MCSectionData::iterator it2 = it->begin(), + ie2 = it->end(); it2 != ie2; ++it2) + it2->setOrdinal(FragmentIndex++); + } + // Layout until everything fits. MCAsmLayout Layout(*this); while (LayoutOnce(Layout)) @@ -781,6 +793,7 @@ void MCAssembler::FinishLayout(MCAsmLayout &Layout) { // // FIXME: Add MCAsmLayout utility for this. DF->setParent(IF->getParent()); + DF->setOrdinal(IF->getOrdinal()); Layout.setFragmentOffset(DF, Layout.getFragmentOffset(IF)); Layout.setFragmentEffectiveSize(DF, Layout.getFragmentEffectiveSize(IF));