Add X86::reloc_global_offset_table and use it to have a single place where

we check for _GLOBAL_OFFSET_TABLE_.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117241 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2010-10-24 17:35:42 +00:00
parent 6fb99559e4
commit 24ba4f7f5f
4 changed files with 16 additions and 10 deletions

View File

@ -701,6 +701,10 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
switch ((unsigned)Fixup.getKind()) {
default: llvm_unreachable("invalid fixup kind!");
case X86::reloc_global_offset_table:
Type = ELF::R_386_GOTPC;
break;
// FIXME: Should we avoid selecting reloc_signed_4byte in 32 bit mode
// instead?
case X86::reloc_signed_4byte:
@ -710,10 +714,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
default:
llvm_unreachable("Unimplemented");
case MCSymbolRefExpr::VK_None:
if (Symbol->getName() == "_GLOBAL_OFFSET_TABLE_")
Type = ELF::R_386_GOTPC;
else
Type = ELF::R_386_32;
Type = ELF::R_386_32;
break;
case MCSymbolRefExpr::VK_GOT:
Type = ELF::R_386_GOT32;

View File

@ -39,6 +39,7 @@ static unsigned getFixupKindLog2Size(unsigned Kind) {
case X86::reloc_riprel_4byte:
case X86::reloc_riprel_4byte_movq_load:
case X86::reloc_signed_4byte:
case X86::reloc_global_offset_table:
case FK_Data_4: return 2;
case FK_Data_8: return 3;
}

View File

@ -20,9 +20,12 @@ enum Fixups {
reloc_pcrel_2byte, // 16-bit pcrel, e.g. callw
reloc_riprel_4byte, // 32-bit rip-relative
reloc_riprel_4byte_movq_load, // 32-bit rip-relative in movq
reloc_signed_4byte // 32-bit signed. Unlike FK_Data_4
reloc_signed_4byte, // 32-bit signed. Unlike FK_Data_4
// this will be sign extended at
// runtime.
reloc_global_offset_table // 32-bit, relative to the start
// of the instruction. Used only
// for _GLOBAL_OFFSET_TABLE_.
};
}
}

View File

@ -39,7 +39,7 @@ public:
~X86MCCodeEmitter() {}
unsigned getNumFixupKinds() const {
return 6;
return 7;
}
const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const {
@ -49,7 +49,8 @@ public:
{ "reloc_pcrel_2byte", 0, 2 * 8, MCFixupKindInfo::FKF_IsPCRel },
{ "reloc_riprel_4byte", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel },
{ "reloc_riprel_4byte_movq_load", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel },
{ "reloc_signed_4byte", 0, 4 * 8, 0}
{ "reloc_signed_4byte", 0, 4 * 8, 0},
{ "reloc_global_offset_table", 0, 4 * 8, 0}
};
if (Kind < FirstTargetFixupKind)
@ -229,10 +230,10 @@ EmitImmediate(const MCOperand &DispOp, unsigned Size, MCFixupKind FixupKind,
// If we have an immoffset, add it to the expression.
const MCExpr *Expr = DispOp.getExpr();
if (StartsWithGlobalOffsetTable(Expr)) {
// FIXME: We should probably change the FixupKind to a special one so that
// other parts of MC don't have to check the symbol name.
if (FixupKind == FK_Data_4 && StartsWithGlobalOffsetTable(Expr)) {
assert(ImmOffset == 0);
FixupKind = MCFixupKind(X86::reloc_global_offset_table);
ImmOffset = CurByte;
}