File tree Expand file tree Collapse file tree 1 file changed +27
-0
lines changed Expand file tree Collapse file tree 1 file changed +27
-0
lines changed Original file line number Diff line number Diff line change @@ -121,6 +121,33 @@ class MachObjectWriter : public MCObjectWriter {
121
121
}
122
122
uint64_t getSymbolAddress (const MCSymbolData* SD,
123
123
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
+
124
151
return getSectionAddress (SD->getFragment ()->getParent ()) +
125
152
Layout.getSymbolOffset (SD);
126
153
}
You can’t perform that action at this time.
0 commit comments