summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-04-30 16:59:35 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-04-30 16:59:35 +0000
commit553e5ebe4a79836a462a872609913174280a9255 (patch)
treecc7980178ed5f7d2722566037073d26f903266b0 /llvm/lib/MC/ELFObjectWriter.cpp
parente8448728309a7a0f2386a6662a40864b4b4dc483 (diff)
downloadbcm5719-llvm-553e5ebe4a79836a462a872609913174280a9255.tar.gz
bcm5719-llvm-553e5ebe4a79836a462a872609913174280a9255.zip
Simplify ELFObjectWriter::SymbolValue.
It now defers all offset computation to getSymbolOffset. llvm-svn: 207674
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp36
1 files changed, 14 insertions, 22 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index ebcc691f0ae..27e34da6322 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -488,41 +488,33 @@ void ELFObjectWriter::WriteHeader(const MCAssembler &Asm,
uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &OrigData,
const MCAsmLayout &Layout) {
- const MCSymbol &OrigSymbol = OrigData.getSymbol();
MCSymbolData *Data = &OrigData;
if (Data->isCommon() && Data->isExternal())
return Data->getCommonAlignment();
const MCSymbol *Symbol = &Data->getSymbol();
+ MCAssembler &Asm = Layout.getAssembler();
+ bool IsThumb = Asm.isThumbFunc(Symbol);
- uint64_t Res = 0;
+ // Given how we implement symver, we can end up with an symbol reference
+ // to an undefined symbol. Walk past it first.
if (Symbol->isVariable()) {
const MCExpr *Expr = Symbol->getVariableValue();
- MCValue Value;
- if (!Expr->EvaluateAsValue(Value, &Layout))
- llvm_unreachable("Invalid expression");
-
- assert(!Value.getSymB());
-
- Res = Value.getConstant();
-
- if (const MCSymbolRefExpr *A = Value.getSymA()) {
- Symbol = &A->getSymbol();
- Data = &Layout.getAssembler().getSymbolData(*Symbol);
- } else {
- Symbol = nullptr;
- Data = nullptr;
+ if (auto *Ref = dyn_cast<MCSymbolRefExpr>(Expr)) {
+ if (Ref->getKind() == MCSymbolRefExpr::VK_None) {
+ Symbol = &Ref->getSymbol();
+ Data = &Asm.getOrCreateSymbolData(*Symbol);
+ }
}
}
- const MCAssembler &Asm = Layout.getAssembler();
- if (Asm.isThumbFunc(&OrigSymbol))
- Res |= 1;
+ if (!Symbol->isVariable() && !Data->getFragment())
+ return 0;
- if (!Symbol || !Symbol->isInSection())
- return Res;
+ uint64_t Res = Layout.getSymbolOffset(Data);
- Res += Layout.getSymbolOffset(Data);
+ if (IsThumb)
+ Res |= 1;
return Res;
}
OpenPOWER on IntegriCloud