summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-04-30 03:06:06 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-04-30 03:06:06 +0000
commitc8556d725f6b3575a45c9e7b9dab1468126882ad (patch)
tree65b0db7a2629f65ad1e29d9cbca10ada7f56415c
parent91cc1431cbd80f0ede7b898e3c15798e273a4716 (diff)
downloadllvm-c8556d725f6b3575a45c9e7b9dab1468126882ad.tar.gz
llvm-c8556d725f6b3575a45c9e7b9dab1468126882ad.tar.bz2
llvm-c8556d725f6b3575a45c9e7b9dab1468126882ad.tar.xz
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
-rw-r--r--lib/MC/MCAssembler.cpp54
1 files 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 {