diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-04-30 03:06:06 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-04-30 03:06:06 +0000 |
| commit | bc03586bccd22d034810f3f58090ef53ed3c4e75 (patch) | |
| tree | f9643018fc304d4330afffce18dd239863764d6c /llvm/lib/MC | |
| parent | d1c46746037cc1eb0cd28fb1581af7d262527f85 (diff) | |
| download | bcm5719-llvm-bc03586bccd22d034810f3f58090ef53ed3c4e75.tar.gz bcm5719-llvm-bc03586bccd22d034810f3f58090ef53ed3c4e75.zip | |
Simplify getSymbolOffset.
We can now use EvaluateAsValue to make it non recursive and remove some code
duplication.
llvm-svn: 207604
Diffstat (limited to 'llvm/lib/MC')
| -rw-r--r-- | llvm/lib/MC/MCAssembler.cpp | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index 98a65620a55..ba10500c951 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/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 { |

