aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 ef3ca1c..37e903c 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 c77334a..fb439c6 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 d7f178d..b5e9c84 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) {