summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2011-04-29 18:13:42 +0000
committerDaniel Dunbar <daniel@zuster.org>2011-04-29 18:13:42 +0000
commitb200f93125eb019d69c220fa447faea4f5d4eb8a (patch)
treeb13e32e1148e903e68cc8fb81ab23713aa7185c1 /llvm/lib
parent575d41ee924024a002598addf48864909b069be5 (diff)
downloadbcm5719-llvm-b200f93125eb019d69c220fa447faea4f5d4eb8a.tar.gz
bcm5719-llvm-b200f93125eb019d69c220fa447faea4f5d4eb8a.zip
MC/Mach-O: Update getSymbolAddress() to support evaluation of variables.
llvm-svn: 130522
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/MC/MachObjectWriter.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp
index 8e9f46f7069..f049b1c6e2a 100644
--- a/llvm/lib/MC/MachObjectWriter.cpp
+++ b/llvm/lib/MC/MachObjectWriter.cpp
@@ -121,6 +121,33 @@ private:
}
uint64_t getSymbolAddress(const MCSymbolData* SD,
const MCAsmLayout &Layout) const {
+ const MCSymbol &S = SD->getSymbol();
+
+ // If this is a variable, then recursively evaluate now.
+ if (S.isVariable()) {
+ MCValue Target;
+ if (!S.getVariableValue()->EvaluateAsRelocatable(Target, Layout))
+ report_fatal_error("unable to evaluate offset for variable '" +
+ S.getName() + "'");
+
+ // Verify that any used symbols are defined.
+ if (Target.getSymA() && Target.getSymA()->getSymbol().isUndefined())
+ report_fatal_error("unable to evaluate offset to undefined symbol '" +
+ Target.getSymA()->getSymbol().getName() + "'");
+ if (Target.getSymB() && Target.getSymB()->getSymbol().isUndefined())
+ report_fatal_error("unable to evaluate offset to undefined symbol '" +
+ Target.getSymB()->getSymbol().getName() + "'");
+
+ uint64_t Address = Target.getConstant();
+ if (Target.getSymA())
+ Address += getSymbolAddress(&Layout.getAssembler().getSymbolData(
+ Target.getSymA()->getSymbol()), Layout);
+ if (Target.getSymB())
+ Address += getSymbolAddress(&Layout.getAssembler().getSymbolData(
+ Target.getSymB()->getSymbol()), Layout);
+ return Address;
+ }
+
return getSectionAddress(SD->getFragment()->getParent()) +
Layout.getSymbolOffset(SD);
}
OpenPOWER on IntegriCloud