// Simple getSymbolOffset helper for the non-varibale case. static bool getLabelOffset(const MCAsmLayout &Layout, const MCSymbol &S, bool ReportError, uint64_t &Val) { if (!S.getFragment()) { if (ReportError) report_fatal_error("unable to evaluate offset to undefined symbol '" + S.getName() + "'"); return false; } Val = Layout.getFragmentOffset(S.getFragment()) + S.getOffset(); return true; }
uint64_t MachObjectWriter::getSymbolAddress(const MCSymbol &S, const MCAsmLayout &Layout) const { // If this is a variable, then recursively evaluate now. if (S.isVariable()) { if (const MCConstantExpr *C = dyn_cast<const MCConstantExpr>(S.getVariableValue())) return C->getValue(); MCValue Target; if (!S.getVariableValue()->evaluateAsRelocatable(Target, &Layout, nullptr)) 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(Target.getSymA()->getSymbol(), Layout); if (Target.getSymB()) Address += getSymbolAddress(Target.getSymB()->getSymbol(), Layout); return Address; } return getSectionAddress(S.getFragment()->getParent()) + Layout.getSymbolOffset(S); }
bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( const MCAssembler &Asm, const MCSymbol &A, const MCSymbol &B, bool InSet) const { return isSymbolRefDifferenceFullyResolvedImpl(Asm, A, *B.getFragment(), InSet, false); }