summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-04-30 21:51:13 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-04-30 21:51:13 +0000
commitfee224f942b707d855e97f8b0f1e31c70667d7ee (patch)
tree4b3fd8ad4dd60a157595f0239e57ef20d07c2034 /llvm/lib/MC/ELFObjectWriter.cpp
parentc74503ea21a415f43f51f878085613581419f673 (diff)
downloadbcm5719-llvm-fee224f942b707d855e97f8b0f1e31c70667d7ee.tar.gz
bcm5719-llvm-fee224f942b707d855e97f8b0f1e31c70667d7ee.zip
Provide a version of getSymbolOffset that returns false on error.
This simplifies ELFObjectWriter::SymbolValue a bit more. This new version will also be used in the COFF writer to fix pr19147. llvm-svn: 207711
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp30
1 files changed, 6 insertions, 24 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index 27e34da6322..9c224b3da6a 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -486,34 +486,16 @@ void ELFObjectWriter::WriteHeader(const MCAssembler &Asm,
Write16(ShstrtabIndex);
}
-uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &OrigData,
+uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &Data,
const MCAsmLayout &Layout) {
- 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);
-
- // 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();
- if (auto *Ref = dyn_cast<MCSymbolRefExpr>(Expr)) {
- if (Ref->getKind() == MCSymbolRefExpr::VK_None) {
- Symbol = &Ref->getSymbol();
- Data = &Asm.getOrCreateSymbolData(*Symbol);
- }
- }
- }
+ if (Data.isCommon() && Data.isExternal())
+ return Data.getCommonAlignment();
- if (!Symbol->isVariable() && !Data->getFragment())
+ uint64_t Res;
+ if (!Layout.getSymbolOffset(&Data, Res))
return 0;
- uint64_t Res = Layout.getSymbolOffset(Data);
-
- if (IsThumb)
+ if (Layout.getAssembler().isThumbFunc(&Data.getSymbol()))
Res |= 1;
return Res;
OpenPOWER on IntegriCloud