diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-09-27 21:23:02 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-09-27 21:23:02 +0000 |
commit | 2c6ec31df6c6c45ad735892eedab78612ac2847b (patch) | |
tree | cb35bfab0e45775cf4acadd01c008afc44ef8f91 /lib/MC/ELFObjectWriter.cpp | |
parent | 9cf23a9ab466a900bc0f937bc930d398d6097766 (diff) |
Factor symbol value computation into a function.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114891 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 810af37c6c..58fad80ba8 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -388,25 +388,33 @@ void ELFObjectWriterImpl::WriteSymbolEntry(MCDataFragment *F, uint64_t name, } } +static uint64_t SymbolValue(MCSymbolData &Data, const MCAsmLayout &Layout) { + if (Data.isCommon() && Data.isExternal()) + return Data.getCommonAlignment(); + + const MCSymbol &Symbol = Data.getSymbol(); + if (!Symbol.isInSection()) + return 0; + + if (!Data.isCommon() && !(Data.getFlags() & ELF_STB_Weak)) + if (MCFragment *FF = Data.getFragment()) + return Layout.getSymbolAddress(&Data) - + Layout.getSectionAddress(FF->getParent()); + + return 0; +} + void ELFObjectWriterImpl::WriteSymbol(MCDataFragment *F, ELFSymbolData &MSD, const MCAsmLayout &Layout) { MCSymbolData &Data = *MSD.SymbolData; uint8_t Info = (Data.getFlags() & 0xff); uint8_t Other = ((Data.getFlags() & 0xf00) >> ELF_STV_Shift); - uint64_t Value = 0; + uint64_t Value = SymbolValue(Data, Layout); uint64_t Size = 0; const MCExpr *ESize; - if (Data.isCommon() && Data.isExternal()) - Value = Data.getCommonAlignment(); - assert(!(Data.isCommon() && !Data.isExternal())); - if (!Data.isCommon() && !(Data.getFlags() & ELF_STB_Weak)) - if (MCFragment *FF = Data.getFragment()) - Value = Layout.getSymbolAddress(&Data) - - Layout.getSectionAddress(FF->getParent()); - ESize = Data.getSize(); if (Data.getSize()) { MCValue Res; |