Implement PR135, lazy emission of global variables

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10549 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2003-12-20 03:36:47 +00:00
parent 1514b5b334
commit c07ed13875
4 changed files with 85 additions and 19 deletions
+7 -4
View File
@@ -155,7 +155,8 @@ GenericValue ExecutionEngine::getConstantValue(const Constant *C) {
const_cast<Function*>(dyn_cast<Function>(CPR->getValue())))
Result = PTOGV(getPointerToFunctionOrStub(F));
else
Result = PTOGV(getPointerToGlobal(CPR->getValue()));
Result = PTOGV(getOrEmitGlobalVariable(
cast<GlobalVariable>(CPR->getValue())));
} else {
assert(0 && "Unknown constant pointer type!");
@@ -374,7 +375,6 @@ void ExecutionEngine::emitGlobals() {
// Allocate some memory for it!
unsigned Size = TD.getTypeSize(Ty);
addGlobalMapping(I, new char[Size]);
NumInitBytes += Size;
DEBUG(std::cerr << "Global '" << I->getName() << "' -> "
<< (void*)GlobalAddress[I] << "\n");
@@ -401,12 +401,15 @@ void ExecutionEngine::emitGlobals() {
// EmitGlobalVariable - This method emits the specified global variable to the
// address specified in GlobalAddresses, or allocates new memory if it's not
// already in the map.
void ExecutionEngine::EmitGlobalVariable(GlobalVariable *GV) {
void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) {
void *&GA = GlobalAddress[GV];
const Type *ElTy = GV->getType()->getElementType();
if (GA == 0) {
// If it's not already specified, allocate memory for the global.
GA = new char[getTargetData().getTypeSize(GV->getType()->getElementType())];
GA = new char[getTargetData().getTypeSize(ElTy)];
}
InitializeMemory(GV->getInitializer(), GA);
NumInitBytes += getTargetData().getTypeSize(ElTy);
++NumGlobals;
}