Skip to content

Commit b200f93

Browse files
committed
MC/Mach-O: Update getSymbolAddress() to support evaluation of variables.
llvm-svn: 130522
1 parent 575d41e commit b200f93

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

llvm/lib/MC/MachObjectWriter.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,33 @@ class MachObjectWriter : public MCObjectWriter {
121121
}
122122
uint64_t getSymbolAddress(const MCSymbolData* SD,
123123
const MCAsmLayout &Layout) const {
124+
const MCSymbol &S = SD->getSymbol();
125+
126+
// If this is a variable, then recursively evaluate now.
127+
if (S.isVariable()) {
128+
MCValue Target;
129+
if (!S.getVariableValue()->EvaluateAsRelocatable(Target, Layout))
130+
report_fatal_error("unable to evaluate offset for variable '" +
131+
S.getName() + "'");
132+
133+
// Verify that any used symbols are defined.
134+
if (Target.getSymA() && Target.getSymA()->getSymbol().isUndefined())
135+
report_fatal_error("unable to evaluate offset to undefined symbol '" +
136+
Target.getSymA()->getSymbol().getName() + "'");
137+
if (Target.getSymB() && Target.getSymB()->getSymbol().isUndefined())
138+
report_fatal_error("unable to evaluate offset to undefined symbol '" +
139+
Target.getSymB()->getSymbol().getName() + "'");
140+
141+
uint64_t Address = Target.getConstant();
142+
if (Target.getSymA())
143+
Address += getSymbolAddress(&Layout.getAssembler().getSymbolData(
144+
Target.getSymA()->getSymbol()), Layout);
145+
if (Target.getSymB())
146+
Address += getSymbolAddress(&Layout.getAssembler().getSymbolData(
147+
Target.getSymB()->getSymbol()), Layout);
148+
return Address;
149+
}
150+
124151
return getSectionAddress(SD->getFragment()->getParent()) +
125152
Layout.getSymbolOffset(SD);
126153
}

0 commit comments

Comments
 (0)