Do relaxations with FT_Org fragments. Fixes the FIXME:
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 2 Nov 2010 21:38:23 +0000 (21:38 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 2 Nov 2010 21:38:23 +0000 (21:38 +0000)
    // FIXME: We should compute this sooner, we don't want to recurse here, and
    // we would like to be more functional.

In MCAssembler::ComputeFragmentSize.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118080 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAssembler.h
lib/MC/MCAssembler.cpp

index 174a75527227757f1a84cd8707488f27211bb2f8..6a1f83e15978a0c290e73367d7e06ac3d4dd187f 100644 (file)
@@ -319,10 +319,13 @@ class MCOrgFragment : public MCFragment {
   /// Value - Value to use for filling bytes.
   int8_t Value;
 
+  /// Size - The current estimate of the size.
+  unsigned Size;
+
 public:
   MCOrgFragment(const MCExpr &_Offset, int8_t _Value, MCSectionData *SD = 0)
     : MCFragment(FT_Org, SD),
-      Offset(&_Offset), Value(_Value) {}
+      Offset(&_Offset), Value(_Value), Size(0) {}
 
   /// @name Accessors
   /// @{
@@ -331,6 +334,9 @@ public:
 
   uint8_t getValue() const { return Value; }
 
+  unsigned getSize() const { return Size; }
+
+  void setSize(unsigned Size_) { Size = Size_; }
   /// @}
 
   static bool classof(const MCFragment *F) {
@@ -715,6 +721,9 @@ private:
   bool RelaxInstruction(const MCObjectWriter &Writer, MCAsmLayout &Layout,
                         MCInstFragment &IF);
 
+  bool RelaxOrg(const MCObjectWriter &Writer, MCAsmLayout &Layout,
+                MCOrgFragment &OF);
+
   bool RelaxLEB(const MCObjectWriter &Writer, MCAsmLayout &Layout,
                 MCLEBFragment &IF);
 
index 1b464ee98fddc3920a08bd94899900f18fa7623f..6558a1b927b6ac5e5e4b9cb99045fb084275db50 100644 (file)
@@ -337,23 +337,8 @@ uint64_t MCAssembler::ComputeFragmentSize(MCAsmLayout &Layout,
     return Size;
   }
 
-  case MCFragment::FT_Org: {
-    const MCOrgFragment &OF = cast<MCOrgFragment>(F);
-
-    // FIXME: We should compute this sooner, we don't want to recurse here, and
-    // we would like to be more functional.
-    int64_t TargetLocation;
-    if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, &Layout))
-      report_fatal_error("expected assembly-time absolute expression");
-
-    // FIXME: We need a way to communicate this error.
-    int64_t Offset = TargetLocation - FragmentOffset;
-    if (Offset < 0 || Offset >= 0x40000000)
-      report_fatal_error("invalid .org offset '" + Twine(TargetLocation) +
-                         "' (at offset '" + Twine(FragmentOffset) + "')");
-
-    return Offset;
-  }
+  case MCFragment::FT_Org:
+    return cast<MCOrgFragment>(F).getSize();
 
   case MCFragment::FT_Dwarf: {
     const MCDwarfLineAddrFragment &OF = cast<MCDwarfLineAddrFragment>(F);
@@ -841,6 +826,25 @@ bool MCAssembler::RelaxInstruction(const MCObjectWriter &Writer,
   return true;
 }
 
+bool MCAssembler::RelaxOrg(const MCObjectWriter &Writer,
+                           MCAsmLayout &Layout,
+                           MCOrgFragment &OF) {
+  int64_t TargetLocation;
+  if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, &Layout))
+    report_fatal_error("expected assembly-time absolute expression");
+
+  // FIXME: We need a way to communicate this error.
+  uint64_t FragmentOffset = Layout.getFragmentOffset(&OF);
+  int64_t Offset = TargetLocation - FragmentOffset;
+  if (Offset < 0 || Offset >= 0x40000000)
+    report_fatal_error("invalid .org offset '" + Twine(TargetLocation) +
+                       "' (at offset '" + Twine(FragmentOffset) + "')");
+
+  unsigned OldSize = OF.getSize();
+  OF.setSize(Offset);
+  return OldSize != OF.getSize();
+}
+
 bool MCAssembler::RelaxLEB(const MCObjectWriter &Writer,
                            MCAsmLayout &Layout,
                            MCLEBFragment &LF) {
@@ -857,7 +861,6 @@ bool MCAssembler::RelaxLEB(const MCObjectWriter &Writer,
   return OldSize != LF.getSize();
 }
 
-
 bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer,
                              MCAsmLayout &Layout) {
   ++stats::RelaxationSteps;
@@ -880,6 +883,9 @@ bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer,
         WasRelaxed |= RelaxInstruction(Writer, Layout,
                                        *cast<MCInstFragment>(it2));
         break;
+      case MCFragment::FT_Org:
+        WasRelaxed |= RelaxOrg(Writer, Layout, *cast<MCOrgFragment>(it2));
+        break;
       case MCFragment::FT_LEB:
         WasRelaxed |= RelaxLEB(Writer, Layout, *cast<MCLEBFragment>(it2));
         break;