[llvm-commits] CVS: llvm/tools/lli/JIT/SparcEmitter.cpp

Misha Brukman brukman at cs.uiuc.edu
Sat May 31 01:27:01 PDT 2003


Changes in directory llvm/tools/lli/JIT:

SparcEmitter.cpp updated: 1.4 -> 1.5

---
Log message:

Fixed rewriting of branches -- they now work forward and backward.


---
Diffs of the changes:

Index: llvm/tools/lli/JIT/SparcEmitter.cpp
diff -u llvm/tools/lli/JIT/SparcEmitter.cpp:1.4 llvm/tools/lli/JIT/SparcEmitter.cpp:1.5
--- llvm/tools/lli/JIT/SparcEmitter.cpp:1.4	Fri May 30 15:39:37 2003
+++ llvm/tools/lli/JIT/SparcEmitter.cpp	Sat May 31 01:26:48 2003
@@ -30,7 +30,7 @@
     
     std::vector<std::pair<BasicBlock*,
                           std::pair<unsigned*,MachineInstr*> > > BBRefs;
-    std::map<BasicBlock*, unsigned> BBLocations;
+    std::map<BasicBlock*, long> BBLocations;
     std::vector<void*> ConstantPoolAddresses;
   public:
     SparcEmitter(VM &vm) : TheVM(vm) {}
@@ -94,15 +94,20 @@
   ConstantPoolAddresses.clear();
   // Re-write branches to BasicBlocks for the entire function
   for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
-    unsigned Location = BBLocations[BBRefs[i].first];
+    long Location = BBLocations[BBRefs[i].first];
     unsigned *Ref = BBRefs[i].second.first;
     MachineInstr *MI = BBRefs[i].second.second;
     std::cerr << "attempting to resolve BB: " << i << "\n";
     for (unsigned i=0, e = MI->getNumOperands(); i != e; ++i) {
       MachineOperand &op = MI->getOperand(i);
       if (op.isPCRelativeDisp()) {
+        // the instruction's branch target is made such that it branches to
+        // PC + (br target * 4), so undo that arithmetic here:
+        // Location is the target of the branch
+        // Ref is the location of the instruction, and hence the PC
+        unsigned branchTarget = (Location - (long)Ref) >> 2;
         MI->SetMachineOperandConst(i, MachineOperand::MO_SignExtendedImmed,
-                                   Location);
+                                   branchTarget);
         std::cerr << "Rewrote BB ref: ";
         unsigned fixedInstr = SparcV9CodeEmitter::getBinaryCodeForInstr(*MI);
         *Ref = fixedInstr;
@@ -135,7 +140,7 @@
 
 
 void SparcEmitter::startBasicBlock(MachineBasicBlock &BB) {
-  BBLocations[BB.getBasicBlock()] = (unsigned)(intptr_t)CurByte;
+  BBLocations[BB.getBasicBlock()] = (long)(intptr_t)CurByte;
 }
 
 





More information about the llvm-commits mailing list