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

Misha Brukman brukman at cs.uiuc.edu
Fri May 30 15:40:01 PDT 2003


Changes in directory llvm/tools/lli/JIT:

SparcEmitter.cpp updated: 1.3 -> 1.4

---
Log message:

Since malloc is no longer used, no need to free() memory.
Fixed BasicBlock patching by supplying correct type for the displacement.


---
Diffs of the changes:

Index: llvm/tools/lli/JIT/SparcEmitter.cpp
diff -u llvm/tools/lli/JIT/SparcEmitter.cpp:1.3 llvm/tools/lli/JIT/SparcEmitter.cpp:1.4
--- llvm/tools/lli/JIT/SparcEmitter.cpp:1.3	Thu May 29 22:37:13 2003
+++ llvm/tools/lli/JIT/SparcEmitter.cpp	Fri May 30 15:39:37 2003
@@ -32,16 +32,8 @@
                           std::pair<unsigned*,MachineInstr*> > > BBRefs;
     std::map<BasicBlock*, unsigned> BBLocations;
     std::vector<void*> ConstantPoolAddresses;
-    std::vector<void*> funcMemory;
   public:
     SparcEmitter(VM &vm) : TheVM(vm) {}
-    ~SparcEmitter() {
-      while (! funcMemory.empty()) {
-        void* addr = funcMemory.back();
-        free(addr);
-        funcMemory.pop_back();
-      }
-    }
 
     virtual void startFunction(MachineFunction &F);
     virtual void finishFunction(MachineFunction &F);
@@ -76,12 +68,12 @@
 
 // FIXME: This should be rewritten to support a real memory manager for
 // executable memory pages!
-void * SparcEmitter::getMemory(unsigned NumPages) {
+void* SparcEmitter::getMemory(unsigned NumPages) {
   void *pa;
   if (NumPages == 0) return 0;
   static const long pageSize = sysconf (_SC_PAGESIZE);
   pa = mmap(0, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC,
-                  MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+            MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
   if (pa == MAP_FAILED) {
     perror("mmap");
     abort();
@@ -91,28 +83,32 @@
 
 
 void SparcEmitter::startFunction(MachineFunction &F) {
-  CurBlock = (unsigned char *)getMemory(8);
   std::cerr << "Starting function " << F.getFunction()->getName() << "\n";
+  CurBlock = (unsigned char *)getMemory(8);
   CurByte = CurBlock;  // Start writing at the beginning of the fn.
   TheVM.addGlobalMapping(F.getFunction(), CurBlock);
 }
 
 void SparcEmitter::finishFunction(MachineFunction &F) {
+  std::cerr << "Finishing function " << F.getFunction()->getName() << "\n";
   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];
     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.isImmediate()) {
-        MI->SetMachineOperandConst(i, op.getType(), Location);
+      if (op.isPCRelativeDisp()) {
+        MI->SetMachineOperandConst(i, MachineOperand::MO_SignExtendedImmed,
+                                   Location);
+        std::cerr << "Rewrote BB ref: ";
+        unsigned fixedInstr = SparcV9CodeEmitter::getBinaryCodeForInstr(*MI);
+        *Ref = fixedInstr;
         break;
       }
     }
-    unsigned fixedInstr = SparcV9CodeEmitter::getBinaryCodeForInstr(*MI);
-    *Ref = fixedInstr;
   }
   BBRefs.clear();
   BBLocations.clear();





More information about the llvm-commits mailing list