diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-07-18 23:24:01 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-07-18 23:24:01 +0000 |
commit | e2b0ecd8be031685a4fe63633235eceae7f1c4fa (patch) | |
tree | 87ba3192f419d41c3666b79b1ce53db24775976f /lib/CodeGen/ELFWriter.cpp | |
parent | edcb540496ca798003d9fece8cf4e57d536afa38 (diff) |
Use R_X86_64_32S to handle Jump Table Index relocation entries. Hide TAI usage inside getSection* functions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76347 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/ELFWriter.cpp')
-rw-r--r-- | lib/CodeGen/ELFWriter.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp index 69220f9aea..527adb821e 100644 --- a/lib/CodeGen/ELFWriter.cpp +++ b/lib/CodeGen/ELFWriter.cpp @@ -145,6 +145,24 @@ bool ELFWriter::doInitialization(Module &M) { return false; } +/// Get jump table section on the section name returned by TAI +ELFSection &ELFWriter::getJumpTableSection() { + unsigned Align = TM.getTargetData()->getPointerABIAlignment(); + return getSection(TAI->getJumpTableDataSection(), + ELFSection::SHT_PROGBITS, + ELFSection::SHF_ALLOC, Align); +} + +/// Get a constant pool section based on the section name returned by TAI +ELFSection &ELFWriter::getConstantPoolSection(MachineConstantPoolEntry &CPE) { + std::string CstPoolName = + TAI->SelectSectionForMachineConst(CPE.getType())->getName(); + return getSection(CstPoolName, + ELFSection::SHT_PROGBITS, + ELFSection::SHF_MERGE | ELFSection::SHF_ALLOC, + CPE.getAlignment()); +} + // getGlobalELFVisibility - Returns the ELF specific visibility type unsigned ELFWriter::getGlobalELFVisibility(const GlobalValue *GV) { switch (GV->getVisibility()) { @@ -513,9 +531,14 @@ void ELFWriter::EmitRelocations() { Addend = TEW->getDefaultAddendForRelTy(RelType); } } else { - // Get the symbol index for the section symbol referenced - // by the relocation + // Get the symbol index for the section symbol unsigned SectionIdx = MR.getConstantVal(); + + // Handle Jump Table Index relocation + if ((SectionIdx == getJumpTableSection().SectionIdx) && + TEW->hasCustomJumpTableIndexRelTy()) + RelType = TEW->getJumpTableIndexRelTy(); + SymIdx = SectionList[SectionIdx]->getSymbolTableIndex(); Addend = (uint64_t)MR.getResultPointer(); } |