Implement branches
authorChris Lattner <sabre@nondot.org>
Fri, 13 Dec 2002 05:40:28 +0000 (05:40 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Dec 2002 05:40:28 +0000 (05:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4988 91177308-0d34-0410-b5e6-96231b3b80d8

tools/jello/Emitter.cpp
tools/jello/VM.cpp

index db83318cf2e9f12fe0ed3bb1bd7b860ce7546bb1..a9cbed5799b8a6002b98bf479dced6112b51bbda 100644 (file)
@@ -8,6 +8,7 @@
 #include "VM.h"
 #include "llvm/CodeGen/MachineCodeEmitter.h"
 #include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/Function.h"
 
 namespace {
   class Emitter : public MachineCodeEmitter {
@@ -15,12 +16,15 @@ namespace {
 
     unsigned char *CurBlock;
     unsigned char *CurByte;
+    
+    std::vector<std::pair<BasicBlock*, unsigned *> > BBRefs;
+    std::map<BasicBlock*, unsigned> BBLocations;
   public:
     Emitter(VM &vm) : TheVM(vm) {}
 
     virtual void startFunction(MachineFunction &F);
     virtual void finishFunction(MachineFunction &F);
-    virtual void startBasicBlock(MachineBasicBlock &BB) {}
+    virtual void startBasicBlock(MachineBasicBlock &BB);
     virtual void emitByte(unsigned char B);
     virtual void emitPCRelativeDisp(Value *V);
     virtual void emitGlobalAddress(GlobalValue *V);
@@ -48,15 +52,23 @@ void Emitter::startFunction(MachineFunction &F) {
   TheVM.addGlobalMapping(F.getFunction(), CurBlock);
 }
 
-#include <iostream>
-#include "llvm/Function.h"
-
 void Emitter::finishFunction(MachineFunction &F) {
+  for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
+    unsigned Location = BBLocations[BBRefs[i].first];
+    unsigned *Ref = BBRefs[i].second;
+    *Ref = Location-(unsigned)Ref-4;
+  }
+  BBRefs.clear();
+  BBLocations.clear();
+
   std::cerr << "Finished Code Generation of Function: "
             << F.getFunction()->getName() << ": " << CurByte-CurBlock
             << " bytes of text\n";
 }
 
+void Emitter::startBasicBlock(MachineBasicBlock &BB) {
+  BBLocations[BB.getBasicBlock()] = (unsigned)CurByte;
+}
 
 
 void Emitter::emitByte(unsigned char B) {
@@ -64,16 +76,24 @@ void Emitter::emitByte(unsigned char B) {
 }
 
 
-// emitPCRelativeDisp - Just output a displacement that will cause a reference
-// to the zero page, which will cause a seg-fault, causing things to get
-// resolved on demand.  Keep track of these markers.
+// emitPCRelativeDisp - For functions, just output a displacement that will
+// cause a reference to the zero page, which will cause a seg-fault, causing
+// things to get resolved on demand.  Keep track of these markers.
+//
+// For basic block references, keep track of where the references are so they
+// may be patched up when the basic block is defined.
 //
 void Emitter::emitPCRelativeDisp(Value *V) {
-  TheVM.addFunctionRef(CurByte, cast<Function>(V));
-
-  unsigned ZeroAddr = -(unsigned)CurByte-4; // Calculate displacement to null
-  *(unsigned*)CurByte = ZeroAddr;   // 4 byte offset
-  CurByte += 4;
+  if (Function *F = dyn_cast<Function>(V)) {
+    TheVM.addFunctionRef(CurByte, F);
+    unsigned ZeroAddr = -(unsigned)CurByte-4; // Calculate displacement to null
+    *(unsigned*)CurByte = ZeroAddr;           // 4 byte offset
+    CurByte += 4;
+  } else {
+    BasicBlock *BB = cast<BasicBlock>(V);     // Keep track of reference...
+    BBRefs.push_back(std::make_pair(BB, (unsigned*)CurByte));
+    CurByte += 4;
+  }
 }
 
 void Emitter::emitGlobalAddress(GlobalValue *V) {
index 8d6172ad28642d18cbf13cdbe08185bc0ccfe2a4..5b0bf2f4ec375e4f85882538e2948d4e010c374b 100644 (file)
@@ -9,7 +9,6 @@
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/CodeGen/MachineCodeEmitter.h"
 #include "llvm/Function.h"
-#include <iostream>
 #include <dlfcn.h>    // dlsym access