[llvm-commits] [llvm] r118722 - /llvm/trunk/lib/MC/ELFObjectWriter.cpp

Rafael Espindola rafael.espindola at gmail.com
Wed Nov 10 13:51:05 PST 2010


Author: rafael
Date: Wed Nov 10 15:51:05 2010
New Revision: 118722

URL: http://llvm.org/viewvc/llvm-project?rev=118722&view=rev
Log:
Factor some code into ComputeIndexMap.

Modified:
    llvm/trunk/lib/MC/ELFObjectWriter.cpp

Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=118722&r1=118721&r2=118722&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Wed Nov 10 15:51:05 2010
@@ -289,6 +289,7 @@
                      ELFSymbolData &MSD,
                      const MCAsmLayout &Layout);
 
+    typedef DenseMap<const MCSectionELF*, uint32_t> SectionIndexMapTy;
     void WriteSymbolTable(MCDataFragment *SymtabF, MCDataFragment *ShndxF,
                           const MCAssembler &Asm,
                           const MCAsmLayout &Layout,
@@ -306,7 +307,11 @@
     /// \param StringTable [out] - The string table data.
     /// \param StringIndexMap [out] - Map from symbol names to offsets in the
     /// string table.
-    void ComputeSymbolTable(MCAssembler &Asm);
+    void ComputeSymbolTable(MCAssembler &Asm,
+                            const SectionIndexMapTy &SectionIndexMap);
+
+    void ComputeIndexMap(MCAssembler &Asm,
+                         SectionIndexMapTy &SectionIndexMap);
 
     void WriteRelocation(MCAssembler &Asm, MCAsmLayout &Layout,
                          const MCSectionData &SD);
@@ -919,7 +924,19 @@
   return true;
 }
 
-void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) {
+void ELFObjectWriterImpl::ComputeIndexMap(MCAssembler &Asm,
+                                          SectionIndexMapTy &SectionIndexMap) {
+  unsigned Index = 1;
+  for (MCAssembler::iterator it = Asm.begin(),
+         ie = Asm.end(); it != ie; ++it) {
+    const MCSectionELF &Section =
+      static_cast<const MCSectionELF &>(it->getSection());
+    SectionIndexMap[&Section] = Index++;
+  }
+}
+
+void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm,
+                                     const SectionIndexMapTy &SectionIndexMap) {
   // FIXME: Is this the correct place to do this?
   if (NeedsGOT) {
     llvm::StringRef Name = "_GLOBAL_OFFSET_TABLE_";
@@ -931,11 +948,6 @@
 
   // Build section lookup table.
   NumRegularSections = Asm.size();
-  DenseMap<const MCSection*, uint32_t> SectionIndexMap;
-  unsigned Index = 1;
-  for (MCAssembler::iterator it = Asm.begin(),
-         ie = Asm.end(); it != ie; ++it, ++Index)
-    SectionIndexMap[&it->getSection()] = Index;
 
   // Index 0 is always the empty string.
   StringMap<uint64_t> StringIndexMap;
@@ -968,7 +980,9 @@
     } else if (RefSymbol.isUndefined()) {
       MSD.SectionIndex = ELF::SHN_UNDEF;
     } else {
-      MSD.SectionIndex = SectionIndexMap.lookup(&RefSymbol.getSection());
+      const MCSectionELF &Section =
+        static_cast<const MCSectionELF&>(RefSymbol.getSection());
+      MSD.SectionIndex = SectionIndexMap.lookup(&Section);
       if (MSD.SectionIndex >= ELF::SHN_LORESERVE)
         NeedsSymtabShndx = true;
       assert(MSD.SectionIndex && "Invalid section index!");
@@ -1010,7 +1024,7 @@
 
   // Set the symbol indices. Local symbols must come before all other
   // symbols with non-local bindings.
-  Index = 0;
+  unsigned Index = 0;
   for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i)
     LocalSymbolData[i].SymbolData->setIndex(Index++);
   for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i)
@@ -1228,8 +1242,12 @@
 
 void ELFObjectWriterImpl::WriteObject(MCAssembler &Asm,
                                       const MCAsmLayout &Layout) {
+  SectionIndexMapTy SectionIndexMap;
+
+  ComputeIndexMap(Asm, SectionIndexMap);
+
   // Compute symbol table information.
-  ComputeSymbolTable(Asm);
+  ComputeSymbolTable(Asm, SectionIndexMap);
 
   CreateMetadataSections(const_cast<MCAssembler&>(Asm),
                          const_cast<MCAsmLayout&>(Layout));
@@ -1262,9 +1280,6 @@
   // ... then all of the sections ...
   DenseMap<const MCSection*, uint64_t> SectionOffsetMap;
 
-  DenseMap<const MCSection*, uint32_t> SectionIndexMap;
-
-  unsigned Index = 1;
   for (MCAssembler::const_iterator it = Asm.begin(),
          ie = Asm.end(); it != ie; ++it) {
     const MCSectionData &SD = *it;
@@ -1275,7 +1290,6 @@
 
     // Remember the offset into the file for this section.
     SectionOffsetMap[&it->getSection()] = FileOff;
-    SectionIndexMap[&it->getSection()] = Index++;
 
     FileOff += Layout.getSectionFileSize(&SD);
 





More information about the llvm-commits mailing list