aboutsummaryrefslogtreecommitdiff
path: root/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-10-06 21:02:29 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-10-06 21:02:29 +0000
commit152c1061e0b4ad379eec5fa38ee0091fc11ff936 (patch)
tree75c47bda865ce718e74756a4f210b5af6f511eab /lib/MC/ELFObjectWriter.cpp
parente9ef41a47d2ee637b6aed5d018c4d90019d987ac (diff)
Get binding and visibility info from the the alias, but Type from the symbol
being aliased. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115836 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/ELFObjectWriter.cpp')
-rw-r--r--lib/MC/ELFObjectWriter.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp
index ac8c250a83..fb0518b2ec 100644
--- a/lib/MC/ELFObjectWriter.cpp
+++ b/lib/MC/ELFObjectWriter.cpp
@@ -58,6 +58,14 @@ static void SetBinding(MCSymbolData &SD, unsigned Binding) {
SD.setFlags(OtherFlags | (Binding << ELF_STB_Shift));
}
+static unsigned GetVisibility(MCSymbolData &SD) {
+ unsigned Visibility =
+ (SD.getFlags() & (0xf << ELF_STV_Shift)) >> ELF_STV_Shift;
+ assert(Visibility == ELF::STV_DEFAULT || Visibility == ELF::STV_INTERNAL ||
+ Visibility == ELF::STV_HIDDEN || Visibility == ELF::STV_PROTECTED);
+ return Visibility;
+}
+
static bool isFixupKindX86PCRel(unsigned Kind) {
switch (Kind) {
default:
@@ -429,9 +437,23 @@ static uint64_t SymbolValue(MCSymbolData &Data, const MCAsmLayout &Layout) {
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);
+ MCSymbolData &OrigData = *MSD.SymbolData;
+ MCSymbolData *AliasData = NULL;
+ if (OrigData.Symbol->isVariable()) {
+ const MCExpr *Value = OrigData.getSymbol().getVariableValue();
+ assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented");
+ const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value);
+ AliasData = &Layout.getAssembler().getSymbolData(Ref->getSymbol());
+ }
+ MCSymbolData &Data = AliasData ? *AliasData : OrigData;
+
+ uint8_t Binding = GetBinding(OrigData);
+ uint8_t Visibility = GetVisibility(OrigData);
+ uint8_t Type = GetType(Data);
+
+ uint8_t Info = (Binding << ELF_STB_Shift) | (Type << ELF_STT_Shift);
+ uint8_t Other = Visibility;
+
uint64_t Value = SymbolValue(Data, Layout);
uint64_t Size = 0;
const MCExpr *ESize;