[llvm-commits] CVS: llvm/lib/Target/X86/X86.h X86CodeEmitter.cpp X86ELFWriter.cpp X86JITInfo.cpp X86JITInfo.h X86TargetMachine.cpp

Evan Cheng evan.cheng at apple.com
Tue Jul 25 13:41:13 PDT 2006



Changes in directory llvm/lib/Target/X86:

X86.h updated: 1.45 -> 1.46
X86CodeEmitter.cpp updated: 1.110 -> 1.111
X86ELFWriter.cpp updated: 1.4 -> 1.5
X86JITInfo.cpp updated: 1.23 -> 1.24
X86JITInfo.h updated: 1.8 -> 1.9
X86TargetMachine.cpp updated: 1.117 -> 1.118
---
Log message:

- Refactor the code that resolve basic block references to a TargetJITInfo
  method.
- Added synchronizeICache() to TargetJITInfo. It is called after each block
  of code is emitted to flush the icache. This ensures correct execution
  on targets that have separate dcache and icache.
- Added PPC / Mac OS X specific code to do icache flushing.



---
Diffs of the changes:  (+26 -19)

 X86.h                |    3 ++-
 X86CodeEmitter.cpp   |   26 ++++++++++----------------
 X86ELFWriter.cpp     |    2 +-
 X86JITInfo.cpp       |   10 ++++++++++
 X86JITInfo.h         |    2 ++
 X86TargetMachine.cpp |    2 +-
 6 files changed, 26 insertions(+), 19 deletions(-)


Index: llvm/lib/Target/X86/X86.h
diff -u llvm/lib/Target/X86/X86.h:1.45 llvm/lib/Target/X86/X86.h:1.46
--- llvm/lib/Target/X86/X86.h:1.45	Mon Mar 13 17:20:37 2006
+++ llvm/lib/Target/X86/X86.h	Tue Jul 25 15:40:54 2006
@@ -44,7 +44,8 @@
 
 /// createX86CodeEmitterPass - Return a pass that emits the collected X86 code
 /// to the specified MCE object.
-FunctionPass *createX86CodeEmitterPass(MachineCodeEmitter &MCE);
+FunctionPass *createX86CodeEmitterPass(X86TargetMachine &TM,
+                                       MachineCodeEmitter &MCE);
 
 /// addX86ELFObjectWriterPass - Add passes to the FPM that output the generated
 /// code as an ELF object file.


Index: llvm/lib/Target/X86/X86CodeEmitter.cpp
diff -u llvm/lib/Target/X86/X86CodeEmitter.cpp:1.110 llvm/lib/Target/X86/X86CodeEmitter.cpp:1.111
--- llvm/lib/Target/X86/X86CodeEmitter.cpp:1.110	Wed Jun 28 18:27:49 2006
+++ llvm/lib/Target/X86/X86CodeEmitter.cpp	Tue Jul 25 15:40:54 2006
@@ -35,12 +35,14 @@
 namespace {
   class VISIBILITY_HIDDEN Emitter : public MachineFunctionPass {
     const X86InstrInfo  *II;
+    TargetMachine &TM;
     MachineCodeEmitter  &MCE;
-    std::vector<std::pair<MachineBasicBlock *, unsigned> > BBRefs;
   public:
-    explicit Emitter(MachineCodeEmitter &mce) : II(0), MCE(mce) {}
-    Emitter(MachineCodeEmitter &mce, const X86InstrInfo& ii)
-        : II(&ii), MCE(mce) {}
+    explicit Emitter(TargetMachine &tm, MachineCodeEmitter &mce)
+      : II(0), TM(tm), MCE(mce) {}
+    Emitter(TargetMachine &tm, MachineCodeEmitter &mce,
+            const X86InstrInfo& ii)
+      : II(&ii), TM(tm), MCE(mce) {}
 
     bool runOnMachineFunction(MachineFunction &MF);
 
@@ -71,8 +73,9 @@
 
 /// createX86CodeEmitterPass - Return a pass that emits the collected X86 code
 /// to the specified MCE object.
-FunctionPass *llvm::createX86CodeEmitterPass(MachineCodeEmitter &MCE) {
-  return new Emitter(MCE);
+FunctionPass *llvm::createX86CodeEmitterPass(X86TargetMachine &TM,
+                                             MachineCodeEmitter &MCE) {
+  return new Emitter(TM, MCE);
 }
 
 bool Emitter::runOnMachineFunction(MachineFunction &MF) {
@@ -82,8 +85,6 @@
   II = ((X86TargetMachine&)MF.getTarget()).getInstrInfo();
 
   do {
-    BBRefs.clear();
-
     MCE.startFunction(MF);
     for (MachineFunction::iterator MBB = MF.begin(), E = MF.end(); 
          MBB != E; ++MBB) {
@@ -94,13 +95,6 @@
     }
   } while (MCE.finishFunction(MF));
 
-  // Resolve all forward branches now.
-  for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
-    unsigned Location = MCE.getMachineBasicBlockAddress(BBRefs[i].first);
-    unsigned Ref = BBRefs[i].second;
-    *((unsigned*)(intptr_t)Ref) = Location-Ref-4;
-  }
-  BBRefs.clear();
   return false;
 }
 
@@ -117,7 +111,7 @@
 void Emitter::emitPCRelativeBlockAddress(MachineBasicBlock *MBB) {
   // Remember where this reference was and where it is to so we can
   // deal with it later.
-  BBRefs.push_back(std::make_pair(MBB, MCE.getCurrentPCValue()));
+  TM.getJITInfo()->addBBRef(MBB, MCE.getCurrentPCValue());
   MCE.emitWordLE(0);
 }
 


Index: llvm/lib/Target/X86/X86ELFWriter.cpp
diff -u llvm/lib/Target/X86/X86ELFWriter.cpp:1.4 llvm/lib/Target/X86/X86ELFWriter.cpp:1.5
--- llvm/lib/Target/X86/X86ELFWriter.cpp:1.4	Wed Jun 28 18:27:49 2006
+++ llvm/lib/Target/X86/X86ELFWriter.cpp	Tue Jul 25 15:40:54 2006
@@ -35,5 +35,5 @@
                                      std::ostream &O, X86TargetMachine &TM) {
   X86ELFWriter *EW = new X86ELFWriter(O, TM);
   FPM.add(EW);
-  FPM.add(createX86CodeEmitterPass(EW->getMachineCodeEmitter()));
+  FPM.add(createX86CodeEmitterPass(TM, EW->getMachineCodeEmitter()));
 }


Index: llvm/lib/Target/X86/X86JITInfo.cpp
diff -u llvm/lib/Target/X86/X86JITInfo.cpp:1.23 llvm/lib/Target/X86/X86JITInfo.cpp:1.24
--- llvm/lib/Target/X86/X86JITInfo.cpp:1.23	Wed Jul  5 02:09:13 2006
+++ llvm/lib/Target/X86/X86JITInfo.cpp	Tue Jul 25 15:40:54 2006
@@ -203,3 +203,13 @@
     }
   }
 }
+
+void X86JITInfo::resolveBBRefs(MachineCodeEmitter &MCE) {
+  // Resolve all forward branches now.
+  for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
+    unsigned Location = MCE.getMachineBasicBlockAddress(BBRefs[i].first);
+    intptr_t Ref = BBRefs[i].second;
+    *((unsigned*)Ref) = Location-Ref-4;
+  }
+  BBRefs.clear();
+}


Index: llvm/lib/Target/X86/X86JITInfo.h
diff -u llvm/lib/Target/X86/X86JITInfo.h:1.8 llvm/lib/Target/X86/X86JITInfo.h:1.9
--- llvm/lib/Target/X86/X86JITInfo.h:1.8	Mon Mar 13 17:20:37 2006
+++ llvm/lib/Target/X86/X86JITInfo.h	Tue Jul 25 15:40:54 2006
@@ -51,6 +51,8 @@
     /// referenced global symbols.
     virtual void relocate(void *Function, MachineRelocation *MR,
                           unsigned NumRelocs, unsigned char* GOTBase);
+
+    virtual void resolveBBRefs(MachineCodeEmitter &MCE);
   };
 }
 


Index: llvm/lib/Target/X86/X86TargetMachine.cpp
diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.117 llvm/lib/Target/X86/X86TargetMachine.cpp:1.118
--- llvm/lib/Target/X86/X86TargetMachine.cpp:1.117	Fri Jun 16 13:22:52 2006
+++ llvm/lib/Target/X86/X86TargetMachine.cpp	Tue Jul 25 15:40:54 2006
@@ -194,7 +194,7 @@
 
 bool X86TargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM,
                                                   MachineCodeEmitter &MCE) {
-  PM.add(createX86CodeEmitterPass(MCE));
+  PM.add(createX86CodeEmitterPass(*this, MCE));
   // Delete machine code for this function
   PM.add(createMachineCodeDeleter());
   return false;






More information about the llvm-commits mailing list