Add support for global value references

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4908 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-12-04 06:45:40 +00:00
parent dbf30f7b02
commit 42aa3ae90b
3 changed files with 24 additions and 1 deletions

View File

@ -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 <iostream>
@ -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;
}

View File

@ -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<Function>(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

View File

@ -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();