Change ELFCodeEmitter logic to emit the constant pool and jump tables to
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 21 Jul 2009 23:13:26 +0000 (23:13 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 21 Jul 2009 23:13:26 +0000 (23:13 +0000)
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

include/llvm/Target/TargetELFWriterInfo.h
lib/CodeGen/ELFCodeEmitter.cpp
lib/CodeGen/ELFCodeEmitter.h

index ef3ca1c4fc4eeb05a87e90bdaa898122f4a4c3a4..37e903c29e1b0fbba8608123706f83294e6811d1 100644 (file)
@@ -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;
index c77334aa28968296cb134930d64edfb987fd789e..fb439c68fdbdb1c066ebe8d5b3f80136c3222bf7 100644 (file)
@@ -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);
     }
   }
 }
index d7f178d8bfb9392def5b8e4ce474148bbb72b4e1..b5e9c844ec691fc88e01fdb4eeda091cc5124989 100644 (file)
@@ -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) {