summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
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
commitbc03586bccd22d034810f3f58090ef53ed3c4e75 (patch)
treef9643018fc304d4330afffce18dd239863764d6c /llvm/lib/MC
parentd1c46746037cc1eb0cd28fb1581af7d262527f85 (diff)
downloadbcm5719-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.cpp54
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 {
OpenPOWER on IntegriCloud