From aefde2abfdb2a51e720cefce494b54279f1d7c0b Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 11 Mar 2010 05:53:33 +0000 Subject: [PATCH] MC/Mach-O: Start passing in the basic MCAsmLayout object. - Also, drop the current location part of AsmLayout, I think I prefer to implement this via explicit symbols. llvm-svn: 98240 --- include/llvm/MC/MCAsmLayout.h | 15 +-------------- lib/MC/MCAssembler.cpp | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/include/llvm/MC/MCAsmLayout.h b/include/llvm/MC/MCAsmLayout.h index d2b5e4a507c..d448625320c 100644 --- a/include/llvm/MC/MCAsmLayout.h +++ b/include/llvm/MC/MCAsmLayout.h @@ -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 diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 277cf921254..21feeedd67a 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -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(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; }