MC/Mach-O: Start passing in the basic MCAsmLayout object.
authorDaniel Dunbar <daniel@zuster.org>
Thu, 11 Mar 2010 05:53:33 +0000 (05:53 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 11 Mar 2010 05:53:33 +0000 (05:53 +0000)
 - Also, drop the current location part of AsmLayout, I think I prefer to implement this via explicit symbols.

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

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

index d2b5e4a507cb8d612488b5a942f3b2fa6ab46778..d448625320cd99aa759b9dc2a1c2426e8de8288e 100644 (file)
@@ -22,26 +22,13 @@ class MCAssembler;
 /// even during the relaxation process.
 class MCAsmLayout {
 private:
-  uint64_t CurrentLocation;
-
   MCAssembler &Assembler;
 
 public:
-  MCAsmLayout(MCAssembler &_Assembler)
-    : CurrentLocation(0), Assembler(_Assember) {}
+  MCAsmLayout(MCAssembler &_Assembler) : Assembler(_Assembler) {}
 
   /// Get the assembler object this is a layout for.
   MCAssembler &getAssembler() { return Assembler; }
-
-  /// Get the current location value, i.e. that value of the '.' expression.
-  uin64_t getCurrentLocation() {
-    return CurrentLocation;
-  }
-
-  /// Set the current location.
-  void setCurrentLocation(uint64_t Value) {
-    CurrentLocation = Value;
-  }
 };
 
 } // end namespace llvm
index 277cf921254a6e893c0cc4d7a085357e86f20651..21feeedd67ab8dd0bea19738368aecb1b54ddc72 100644 (file)
@@ -9,6 +9,7 @@
 
 #define DEBUG_TYPE "assembler"
 #include "llvm/MC/MCAssembler.h"
+#include "llvm/MC/MCAsmLayout.h"
 #include "llvm/MC/MCExpr.h"
 #include "llvm/MC/MCSectionMachO.h"
 #include "llvm/MC/MCSymbol.h"
@@ -510,8 +511,11 @@ public:
     unsigned IsPCRel = isFixupKindPCRel(Fixup.Kind);
     unsigned Log2Size = getFixupKindLog2Size(Fixup.Kind);
 
+    // FIXME: Share layout object.
+    MCAsmLayout Layout(Asm);
+
     MCValue Target;
-    if (!Fixup.Value->EvaluateAsRelocatable(Target))
+    if (!Fixup.Value->EvaluateAsRelocatable(Target, &Layout))
       llvm_report_error("expected relocatable expression");
 
     // If this is a difference or a defined symbol plus an offset, then we need
@@ -1001,6 +1005,7 @@ MCAssembler::~MCAssembler() {
 }
 
 void MCAssembler::LayoutSection(MCSectionData &SD) {
+  MCAsmLayout Layout(*this);
   uint64_t Address = SD.getAddress();
 
   for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it) {
@@ -1029,21 +1034,17 @@ void MCAssembler::LayoutSection(MCSectionData &SD) {
     case MCFragment::FT_Org: {
       MCOrgFragment &OF = cast<MCOrgFragment>(F);
 
-      MCValue Target;
-      if (!OF.getOffset().EvaluateAsRelocatable(Target))
-        llvm_report_error("expected relocatable expression");
-
-      if (!Target.isAbsolute())
-        llvm_unreachable("FIXME: Not yet implemented!");
-      uint64_t OrgOffset = Target.getConstant();
-      uint64_t Offset = Address - SD.getAddress();
+      int64_t TargetLocation;
+      if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, &Layout))
+        llvm_report_error("expected assembly-time absolute expression");
 
       // FIXME: We need a way to communicate this error.
-      if (OrgOffset < Offset)
-        llvm_report_error("invalid .org offset '" + Twine(OrgOffset) +
-                          "' (at offset '" + Twine(Offset) + "'");
+      int64_t Offset = TargetLocation - F.getOffset();
+      if (Offset < 0)
+        llvm_report_error("invalid .org offset '" + Twine(TargetLocation) +
+                          "' (at offset '" + Twine(F.getOffset()) + "'");
 
-      F.setFileSize(OrgOffset - Offset);
+      F.setFileSize(Offset);
       break;
     }