aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-03-11 05:53:33 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-03-11 05:53:33 +0000
commit18ff2cced7e08ac76d8d5bcff8160a5f9a109cbb (patch)
tree16c56ca447dbba5777596b2042d8424e5fbba5c1
parent040056fd11693ffc41ce9b777281c71705d0dc1f (diff)
downloadexternal_llvm-18ff2cced7e08ac76d8d5bcff8160a5f9a109cbb.zip
external_llvm-18ff2cced7e08ac76d8d5bcff8160a5f9a109cbb.tar.gz
external_llvm-18ff2cced7e08ac76d8d5bcff8160a5f9a109cbb.tar.bz2
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98240 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/MC/MCAsmLayout.h15
-rw-r--r--lib/MC/MCAssembler.cpp27
2 files changed, 15 insertions, 27 deletions
diff --git a/include/llvm/MC/MCAsmLayout.h b/include/llvm/MC/MCAsmLayout.h
index d2b5e4a..d448625 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 277cf92..21feeed 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<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;
}