summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2011-12-09 03:03:58 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2011-12-09 03:03:58 +0000
commit0a7f336475f8e63322d77ae192319b4d0af5d15c (patch)
treea0825be3e7579f1fe81583feb7170ae98c53ee3b /llvm/lib/MC/ELFObjectWriter.cpp
parentfac35c0a9b6bae81e8aa6827d750fc12435e1e6e (diff)
downloadbcm5719-llvm-0a7f336475f8e63322d77ae192319b4d0af5d15c.tar.gz
bcm5719-llvm-0a7f336475f8e63322d77ae192319b4d0af5d15c.zip
Handle the case of the magical _GLOBAL_OFFSET_TABLE_ showing up in a
symbol difference. This matches gas behavior and fixes PR11513. We still don't handle _GLOBAL_OFFSET_TABLE_ in data sections. llvm-svn: 146238
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index 935ef4209d4..14ca509d75f 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -1742,14 +1742,25 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target,
}
} else {
if (IsPCRel) {
- switch (Modifier) {
- default:
- llvm_unreachable("Unimplemented");
- case MCSymbolRefExpr::VK_None:
- Type = ELF::R_386_PC32;
+ switch ((unsigned)Fixup.getKind()) {
+ default: llvm_unreachable("invalid fixup kind!");
+
+ case X86::reloc_global_offset_table:
+ Type = ELF::R_386_GOTPC;
break;
- case MCSymbolRefExpr::VK_PLT:
- Type = ELF::R_386_PLT32;
+
+ case FK_PCRel_4:
+ case FK_Data_4:
+ switch (Modifier) {
+ default:
+ llvm_unreachable("Unimplemented");
+ case MCSymbolRefExpr::VK_None:
+ Type = ELF::R_386_PC32;
+ break;
+ case MCSymbolRefExpr::VK_PLT:
+ Type = ELF::R_386_PLT32;
+ break;
+ }
break;
}
} else {
OpenPOWER on IntegriCloud