mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
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:
parent
dbf30f7b02
commit
42aa3ae90b
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user