[llvm-commits] [llvm] r96093 - in /llvm/trunk: include/llvm/MC/MCAssembler.h lib/MC/MCAssembler.cpp

Daniel Dunbar daniel at zuster.org
Sat Feb 13 01:28:43 PST 2010


Author: ddunbar
Date: Sat Feb 13 03:28:43 2010
New Revision: 96093

URL: http://llvm.org/viewvc/llvm-project?rev=96093&view=rev
Log:
MCAssembler: Sink fixup list into MCDataFragment.

Modified:
    llvm/trunk/include/llvm/MC/MCAssembler.h
    llvm/trunk/lib/MC/MCAssembler.cpp

Modified: llvm/trunk/include/llvm/MC/MCAssembler.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAssembler.h?rev=96093&r1=96092&r2=96093&view=diff

==============================================================================
--- llvm/trunk/include/llvm/MC/MCAssembler.h (original)
+++ llvm/trunk/include/llvm/MC/MCAssembler.h Sat Feb 13 03:28:43 2010
@@ -55,10 +55,6 @@
   void operator=(const MCFragment&); // DO NOT IMPLEMENT
 
 public:
-  typedef std::vector<MCAsmFixup>::const_iterator const_fixup_iterator;
-  typedef std::vector<MCAsmFixup>::iterator fixup_iterator;
-
-public:
   enum FragmentType {
     FT_Data,
     FT_Align,
@@ -85,11 +81,6 @@
   /// FileSize - The file size of this section. This is ~0 until initialized.
   uint64_t FileSize;
 
-  /// Fixups - The list of fixups in this fragment.
-  //
-  // FIXME: This should be sunk into MCDataFragment.
-  std::vector<MCAsmFixup> Fixups;
-
   /// @}
 
 protected:
@@ -111,36 +102,6 @@
     return 0;
   }
 
-  /// @name Fixup Access
-  /// @{
-
-  /// LookupFixup - Look up the fixup for the given \arg Fragment and \arg
-  /// Offset.
-  ///
-  /// If multiple fixups exist for the same fragment and offset it is undefined
-  /// which one is returned.
-  //
-  // FIXME: This isn't horribly slow in practice, but there are much nicer
-  // solutions to applying the fixups. This will be fixed by sinking fixups into
-  // data fragments exclusively.
-  const MCAsmFixup *LookupFixup(uint64_t Offset) const {
-    for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
-      if (Fixups[i].Offset == Offset)
-        return &Fixups[i];
-    return 0;
-  }
-
-  std::vector<MCAsmFixup> &getFixups() { return Fixups; }
-  const std::vector<MCAsmFixup> &getFixups() const { return Fixups; }
-
-  fixup_iterator fixup_begin() { return Fixups.begin(); }
-  const_fixup_iterator fixup_begin() const { return Fixups.begin(); }
-
-  fixup_iterator fixup_end() {return Fixups.end();}
-  const_fixup_iterator fixup_end() const {return Fixups.end();}
-
-  size_t fixup_size() const { return Fixups.size(); }
-
   /// @name Assembler Backend Support
   /// @{
   //
@@ -173,6 +134,13 @@
 class MCDataFragment : public MCFragment {
   SmallString<32> Contents;
 
+  /// Fixups - The list of fixups in this fragment.
+  std::vector<MCAsmFixup> Fixups;
+
+public:
+  typedef std::vector<MCAsmFixup>::const_iterator const_fixup_iterator;
+  typedef std::vector<MCAsmFixup>::iterator fixup_iterator;
+
 public:
   MCDataFragment(MCSectionData *SD = 0) : MCFragment(FT_Data, SD) {}
 
@@ -188,6 +156,22 @@
 
   /// @}
 
+  /// @name Fixup Access
+  /// @{
+
+  std::vector<MCAsmFixup> &getFixups() { return Fixups; }
+  const std::vector<MCAsmFixup> &getFixups() const { return Fixups; }
+
+  fixup_iterator fixup_begin() { return Fixups.begin(); }
+  const_fixup_iterator fixup_begin() const { return Fixups.begin(); }
+
+  fixup_iterator fixup_end() {return Fixups.end();}
+  const_fixup_iterator fixup_end() const {return Fixups.end();}
+
+  size_t fixup_size() const { return Fixups.size(); }
+
+  /// @}
+
   static bool classof(const MCFragment *F) {
     return F->getKind() == MCFragment::FT_Data;
   }

Modified: llvm/trunk/lib/MC/MCAssembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=96093&r1=96092&r2=96093&view=diff

==============================================================================
--- llvm/trunk/lib/MC/MCAssembler.cpp (original)
+++ llvm/trunk/lib/MC/MCAssembler.cpp Sat Feb 13 03:28:43 2010
@@ -455,7 +455,7 @@
     }
   }
 
-  void ComputeRelocationInfo(MCAssembler &Asm, MCFragment &Fragment,
+  void ComputeRelocationInfo(MCAssembler &Asm, MCDataFragment &Fragment,
                              MCAsmFixup &Fixup,
                              DenseMap<const MCSymbol*,MCSymbolData*> &SymbolMap,
                              std::vector<MachRelocationEntry> &Relocs) {
@@ -780,9 +780,10 @@
       unsigned NumRelocsStart = RelocInfos.size();
       for (MCSectionData::reverse_iterator it2 = SD.rbegin(),
              ie2 = SD.rend(); it2 != ie2; ++it2)
-        for (unsigned i = 0, e = it2->fixup_size(); i != e; ++i)
-          ComputeRelocationInfo(Asm, *it2, it2->getFixups()[e - i - 1],
-                                SymbolMap, RelocInfos);
+        if (MCDataFragment *DF = dyn_cast<MCDataFragment>(&*it2))
+          for (unsigned i = 0, e = DF->fixup_size(); i != e; ++i)
+            ComputeRelocationInfo(Asm, *DF, DF->getFixups()[e - i - 1],
+                                  SymbolMap, RelocInfos);
 
       unsigned NumRelocs = RelocInfos.size() - NumRelocsStart;
       uint64_t SectionStart = SectionDataStart + SD.getAddress();
@@ -1198,16 +1199,6 @@
   OS << "<MCFragment " << (void*) this << " Offset:" << Offset
      << " FileSize:" << FileSize;
 
-  if (!Fixups.empty()) {
-    OS << "\n";
-    OS << "          Fixups:[";
-    for (fixup_iterator it = fixup_begin(), ie = fixup_end(); it != ie; ++it) {
-      if (it != fixup_begin()) OS << ",\n            ";
-      OS << *it;
-    }
-    OS << "]";
-  }
-
   OS << ">";
 }
 
@@ -1233,7 +1224,19 @@
     if (i) OS << ",";
     OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
   }
-  OS << "]>";
+  OS << "]";
+
+  if (!getFixups().empty()) {
+    OS << ",\n       ";
+    OS << " Fixups:[";
+    for (fixup_iterator it = fixup_begin(), ie = fixup_end(); it != ie; ++it) {
+      if (it != fixup_begin()) OS << ",\n            ";
+      OS << *it;
+    }
+    OS << "]";
+  }
+
+  OS << ">";
 }
 
 void MCFillFragment::dump() {





More information about the llvm-commits mailing list