summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2009-07-21 23:13:26 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2009-07-21 23:13:26 +0000
commit82a70ccb24a09dd38ab8eaf55428880781fe9006 (patch)
tree0f82b9349af64d4ebb6e7f49a8955f6705a9889d
parent0f4b285a5b86b1e9c6e27bb46028dfbb77bb5db4 (diff)
downloadllvm-82a70ccb24a09dd38ab8eaf55428880781fe9006.tar.gz
llvm-82a70ccb24a09dd38ab8eaf55428880781fe9006.tar.bz2
llvm-82a70ccb24a09dd38ab8eaf55428880781fe9006.tar.xz
Change ELFCodeEmitter logic to emit the constant pool and jump tables to
their appropriate sections before the code itself. They need to be emitted before the function because on some targets (x86 but not x86_64) the later may reference a JT or CP entry address git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76672 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Target/TargetELFWriterInfo.h2
-rw-r--r--lib/CodeGen/ELFCodeEmitter.cpp46
-rw-r--r--lib/CodeGen/ELFCodeEmitter.h10
3 files changed, 30 insertions, 28 deletions
diff --git a/include/llvm/Target/TargetELFWriterInfo.h b/include/llvm/Target/TargetELFWriterInfo.h
index ef3ca1c4fc..37e903c29e 100644
--- a/include/llvm/Target/TargetELFWriterInfo.h
+++ b/include/llvm/Target/TargetELFWriterInfo.h
@@ -120,7 +120,7 @@ namespace llvm {
virtual unsigned getAbsoluteLabelMachineRelTy() const = 0;
/// computeRelocation - Some relocatable fields could be relocated
- /// directly, avoiding the emission of a relocation symbol, compute the
+ /// directly, avoiding the relocation symbol emission, compute the
/// final relocation value for this symbol.
virtual long int computeRelocation(unsigned SymOffset, unsigned RelOffset,
unsigned RelTy) const = 0;
diff --git a/lib/CodeGen/ELFCodeEmitter.cpp b/lib/CodeGen/ELFCodeEmitter.cpp
index c77334aa28..fb439c68fd 100644
--- a/lib/CodeGen/ELFCodeEmitter.cpp
+++ b/lib/CodeGen/ELFCodeEmitter.cpp
@@ -54,6 +54,12 @@ void ELFCodeEmitter::startFunction(MachineFunction &MF) {
// Record the function start offset
FnStartOff = ES->getCurrentPCOffset();
+
+ // Emit constant pool and jump tables to their appropriate sections.
+ // They need to be emitted before the function because in some targets
+ // the later may reference JT or CP entry address.
+ emitConstantPool(MF.getConstantPool());
+ emitJumpTables(MF.getJumpTableInfo());
}
/// finishFunction - This callback is invoked after the function is completely
@@ -78,11 +84,17 @@ bool ELFCodeEmitter::finishFunction(MachineFunction &MF) {
if (!F->hasPrivateLinkage())
EW.SymbolList.push_back(FnSym);
- // Emit constant pool to appropriate section(s)
- emitConstantPool(MF.getConstantPool());
-
- // Emit jump tables to appropriate section
- emitJumpTables(MF.getJumpTableInfo());
+ // Patch up Jump Table Section relocations to use the real MBBs offsets
+ // now that the MBB label offsets inside the function are known.
+ ELFSection &JTSection = EW.getJumpTableSection();
+ for (std::vector<MachineRelocation>::iterator MRI = JTRelocations.begin(),
+ MRE = JTRelocations.end(); MRI != MRE; ++MRI) {
+ MachineRelocation &MR = *MRI;
+ unsigned MBBOffset = getMachineBasicBlockAddress(MR.getBasicBlock());
+ MR.setResultPointer((void*)MBBOffset);
+ MR.setConstantVal(ES->SectionIdx);
+ JTSection.addRelocation(MR);
+ }
// Relocations
// -----------
@@ -105,7 +117,7 @@ bool ELFCodeEmitter::finishFunction(MachineFunction &MF) {
MR.setResultPointer((void*)Addr);
} else if (MR.isJumpTableIndex()) {
Addr = getJumpTableEntryAddress(MR.getJumpTableIndex());
- MR.setConstantVal(JumpTableSectionIdx);
+ MR.setConstantVal(JTSection.SectionIdx);
MR.setResultPointer((void*)Addr);
} else {
llvm_unreachable("Unhandled relocation type");
@@ -114,6 +126,7 @@ bool ELFCodeEmitter::finishFunction(MachineFunction &MF) {
}
// Clear per-function data structures.
+ JTRelocations.clear();
Relocations.clear();
CPLocations.clear();
CPSections.clear();
@@ -159,21 +172,15 @@ void ELFCodeEmitter::emitJumpTables(MachineJumpTableInfo *MJTI) {
"PIC codegen not yet handled for elf jump tables!");
const TargetELFWriterInfo *TEW = TM.getELFWriterInfo();
+ unsigned EntrySize = MJTI->getEntrySize();
// Get the ELF Section to emit the jump table
ELFSection &JTSection = EW.getJumpTableSection();
- JumpTableSectionIdx = JTSection.SectionIdx;
-
- // Entries in the JT Section are relocated against the text section
- ELFSection &TextSection = EW.getTextSection();
// For each JT, record its offset from the start of the section
for (unsigned i = 0, e = JT.size(); i != e; ++i) {
const std::vector<MachineBasicBlock*> &MBBs = JT[i].MBBs;
- DOUT << "JTSection.size(): " << JTSection.size() << "\n";
- DOUT << "JTLocations.size: " << JTLocations.size() << "\n";
-
// Record JT 'i' offset in the JT section
JTLocations.push_back(JTSection.size());
@@ -182,19 +189,14 @@ void ELFCodeEmitter::emitJumpTables(MachineJumpTableInfo *MJTI) {
for (unsigned mi = 0, me = MBBs.size(); mi != me; ++mi) {
unsigned MachineRelTy = TEW->getAbsoluteLabelMachineRelTy();
MachineRelocation MR =
- MachineRelocation::getBB(JTSection.size(),
- MachineRelTy,
- MBBs[mi]);
-
- // Offset of JT 'i' in JT section
- MR.setResultPointer((void*)getMachineBasicBlockAddress(MBBs[mi]));
- MR.setConstantVal(TextSection.SectionIdx);
+ MachineRelocation::getBB(JTSection.size(), MachineRelTy, MBBs[mi]);
// Add the relocation to the Jump Table section
- JTSection.addRelocation(MR);
+ JTRelocations.push_back(MR);
// Output placeholder for MBB in the JT section
- JTSection.emitWord(0);
+ for (unsigned s=0; s < EntrySize; ++s)
+ JTSection.emitByte(0);
}
}
}
diff --git a/lib/CodeGen/ELFCodeEmitter.h b/lib/CodeGen/ELFCodeEmitter.h
index d7f178d8bf..b5e9c844ec 100644
--- a/lib/CodeGen/ELFCodeEmitter.h
+++ b/lib/CodeGen/ELFCodeEmitter.h
@@ -31,14 +31,14 @@ namespace llvm {
/// Relocations - Record relocations needed by the current function
std::vector<MachineRelocation> Relocations;
+ /// JTRelocations - Record relocations needed by the relocation
+ /// section.
+ std::vector<MachineRelocation> JTRelocations;
+
/// FnStartPtr - Function offset from the beginning of ELFSection 'ES'
uintptr_t FnStartOff;
-
- /// JumpTableSectionIdx - Holds the index of the Jump Table Section
- unsigned JumpTableSectionIdx;
public:
- explicit ELFCodeEmitter(ELFWriter &ew) : EW(ew), TM(EW.TM),
- JumpTableSectionIdx(0) {}
+ explicit ELFCodeEmitter(ELFWriter &ew) : EW(ew), TM(EW.TM) {}
/// addRelocation - Register new relocations for this function
void addRelocation(const MachineRelocation &MR) {