diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-07-18 19:30:09 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-07-18 19:30:09 +0000 |
commit | 484e90b45effc975cdc449411f401ee832e5f8a6 (patch) | |
tree | fa911dd398b7c83ebb7042b3ed593fda883b3cbc /llvm/lib/Target/X86/X86ELFWriterInfo.cpp | |
parent | eb6bcf34624fef9fe340fb91454e54bc1e8400bd (diff) | |
download | bcm5719-llvm-484e90b45effc975cdc449411f401ee832e5f8a6.tar.gz bcm5719-llvm-484e90b45effc975cdc449411f401ee832e5f8a6.zip |
Add support to properly reference private symbols on relocation entries.
Use proper relocation type to build relocations for JumpTables (rodata
sections).
llvm-svn: 76326
Diffstat (limited to 'llvm/lib/Target/X86/X86ELFWriterInfo.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ELFWriterInfo.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86ELFWriterInfo.cpp b/llvm/lib/Target/X86/X86ELFWriterInfo.cpp index 2736a81cdd5..4002e265304 100644 --- a/llvm/lib/Target/X86/X86ELFWriterInfo.cpp +++ b/llvm/lib/Target/X86/X86ELFWriterInfo.cpp @@ -43,7 +43,7 @@ unsigned X86ELFWriterInfo::getRelocationType(unsigned MachineRelTy) const { return R_X86_64_64; case X86::reloc_picrel_word: default: - llvm_unreachable("unknown relocation type"); + llvm_unreachable("unknown x86_64 machine relocation type"); } } else { switch(MachineRelTy) { @@ -54,22 +54,55 @@ unsigned X86ELFWriterInfo::getRelocationType(unsigned MachineRelTy) const { case X86::reloc_absolute_dword: case X86::reloc_picrel_word: default: - llvm_unreachable("unknown relocation type"); + llvm_unreachable("unknown x86 machine relocation type"); } } return 0; } -long int X86ELFWriterInfo::getAddendForRelTy(unsigned RelTy) const { +long int X86ELFWriterInfo::getDefaultAddendForRelTy(unsigned RelTy) const { if (is64Bit) { switch(RelTy) { case R_X86_64_PC32: return -4; - break; case R_X86_64_32: return 0; - break; + default: + llvm_unreachable("unknown x86_64 relocation type"); + } + } else { + switch(RelTy) { + case R_386_PC32: return -4; + case R_386_32: return 0; + default: + llvm_unreachable("unknown x86 relocation type"); + } + } + return 0; +} + +unsigned X86ELFWriterInfo::getRelocationTySize(unsigned RelTy) const { + if (is64Bit) { + switch(RelTy) { + case R_X86_64_PC32: + case R_X86_64_32: + return 32; + case R_X86_64_64: + return 64; + default: + llvm_unreachable("unknown x86_64 relocation type"); + } + } else { + switch(RelTy) { + case R_386_PC32: + case R_386_32: + return 32; default: llvm_unreachable("unknown x86 relocation type"); } } return 0; } + +unsigned X86ELFWriterInfo::getJumpTableMachineRelocationTy() const { + return X86::reloc_absolute_dword; +} + |