summaryrefslogtreecommitdiff
path: root/lib
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
commit1c37cbdf5490ac4d649a372e1b7ce939521b038e (patch)
tree9adf4a04673520725a9692aa750df8b8292bad41 /lib
parent1afb0ccb40ffb0396d7fe8eb1001207c4d051665 (diff)
downloadllvm-1c37cbdf5490ac4d649a372e1b7ce939521b038e.tar.gz
llvm-1c37cbdf5490ac4d649a372e1b7ce939521b038e.tar.bz2
llvm-1c37cbdf5490ac4d649a372e1b7ce939521b038e.tar.xz
Simplify ELFObjectWriter::SymbolValue.
It now defers all offset computation to getSymbolOffset. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207674 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/MC/ELFObjectWriter.cpp36
1 files changed, 14 insertions, 22 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp
index ebcc691f0a..27e34da632 100644
--- a/lib/MC/ELFObjectWriter.cpp
+++ b/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;
}