From c8556d725f6b3575a45c9e7b9dab1468126882ad Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 30 Apr 2014 03:06:06 +0000 Subject: Simplify getSymbolOffset. We can now use EvaluateAsValue to make it non recursive and remove some code duplication. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207604 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCAssembler.cpp | 54 ++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 98a65620a5..ba10500c95 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -117,36 +117,38 @@ uint64_t MCAsmLayout::getFragmentOffset(const MCFragment *F) const { return F->Offset; } +// Simple getSymbolOffset helper for the non-varibale case. +static uint64_t getLabelOffset(const MCAsmLayout &Layout, + const MCSymbolData &SD) { + if (!SD.getFragment()) + report_fatal_error("unable to evaluate offset to undefined symbol '" + + SD.getSymbol().getName() + "'"); + return Layout.getFragmentOffset(SD.getFragment()) + SD.getOffset(); +} + uint64_t MCAsmLayout::getSymbolOffset(const MCSymbolData *SD) 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, this)) - 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 Offset = Target.getConstant(); - if (Target.getSymA()) - Offset += getSymbolOffset(&Assembler.getSymbolData( - Target.getSymA()->getSymbol())); - if (Target.getSymB()) - Offset -= getSymbolOffset(&Assembler.getSymbolData( - Target.getSymB()->getSymbol())); - return Offset; - } + if (!S.isVariable()) + return getLabelOffset(*this, *SD); + + // If SD is a variable, evaluate it. + MCValue Target; + if (!S.getVariableValue()->EvaluateAsValue(Target, this)) + report_fatal_error("unable to evaluate offset for variable '" + + S.getName() + "'"); + + uint64_t Offset = Target.getConstant(); + + const MCSymbolRefExpr *A = Target.getSymA(); + if (A) + Offset += getLabelOffset(*this, Assembler.getSymbolData(A->getSymbol())); + + const MCSymbolRefExpr *B = Target.getSymB(); + if (B) + Offset -= getLabelOffset(*this, Assembler.getSymbolData(B->getSymbol())); - assert(SD->getFragment() && "Invalid getOffset() on undefined symbol!"); - return getFragmentOffset(SD->getFragment()) + SD->getOffset(); + return Offset; } uint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const { -- cgit v1.2.3