From 42aa3ae90b9af648d34854aff4db43041497994a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 4 Dec 2002 06:45:40 +0000 Subject: [PATCH] Add support for global value references git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4908 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/jello/Emitter.cpp | 8 +++++++- tools/jello/VM.cpp | 12 ++++++++++++ tools/jello/VM.h | 5 +++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/tools/jello/Emitter.cpp b/tools/jello/Emitter.cpp index 0e54322ef9b..db83318cf2e 100644 --- a/tools/jello/Emitter.cpp +++ b/tools/jello/Emitter.cpp @@ -23,6 +23,7 @@ namespace { virtual void startBasicBlock(MachineBasicBlock &BB) {} virtual void emitByte(unsigned char B); virtual void emitPCRelativeDisp(Value *V); + virtual void emitGlobalAddress(GlobalValue *V); }; } @@ -44,6 +45,7 @@ static void *getMemory() { void Emitter::startFunction(MachineFunction &F) { CurBlock = (unsigned char *)getMemory(); CurByte = CurBlock; // Start writing at the beginning of the fn. + TheVM.addGlobalMapping(F.getFunction(), CurBlock); } #include @@ -53,7 +55,6 @@ void Emitter::finishFunction(MachineFunction &F) { std::cerr << "Finished Code Generation of Function: " << F.getFunction()->getName() << ": " << CurByte-CurBlock << " bytes of text\n"; - TheVM.addGlobalMapping(F.getFunction(), CurBlock); } @@ -74,3 +75,8 @@ void Emitter::emitPCRelativeDisp(Value *V) { *(unsigned*)CurByte = ZeroAddr; // 4 byte offset CurByte += 4; } + +void Emitter::emitGlobalAddress(GlobalValue *V) { + *(void**)CurByte = TheVM.getPointerToGlobal(V); + CurByte += 4; +} diff --git a/tools/jello/VM.cpp b/tools/jello/VM.cpp index 85c1f2a1e1f..8d6172ad286 100644 --- a/tools/jello/VM.cpp +++ b/tools/jello/VM.cpp @@ -59,6 +59,18 @@ const std::string &VM::getFunctionReferencedName(void *RefAddr) { return FunctionRefs[RefAddr]->getName(); } +// getPointerToGlobal - This returns the address of the specified global +// value. This may involve code generation if it's a function. +// +void *VM::getPointerToGlobal(GlobalValue *GV) { + if (Function *F = dyn_cast(GV)) + return getPointerToFunction(F); + + assert(GlobalAddress[GV] && "Global hasn't had an address allocated yet?"); + return GlobalAddress[GV]; +} + + static void NoopFn() {} /// getPointerToFunction - This method is used to get the address of the diff --git a/tools/jello/VM.h b/tools/jello/VM.h index 64451014c16..783b7dc12eb 100644 --- a/tools/jello/VM.h +++ b/tools/jello/VM.h @@ -61,6 +61,11 @@ public: void *resolveFunctionReference(void *RefAddr); + // getPointerToGlobal - This returns the address of the specified global + // value. This may involve code generation if it's a function. + // + void *getPointerToGlobal(GlobalValue *GV); + private: static MachineCodeEmitter *createEmitter(VM &V); void setupPassManager();