diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-04-30 21:51:13 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-04-30 21:51:13 +0000 |
commit | fee224f942b707d855e97f8b0f1e31c70667d7ee (patch) | |
tree | 4b3fd8ad4dd60a157595f0239e57ef20d07c2034 /llvm/lib/MC/ELFObjectWriter.cpp | |
parent | c74503ea21a415f43f51f878085613581419f673 (diff) | |
download | bcm5719-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.cpp | 30 |
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; |