mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Fix ExecutionEngine's constant code to work properly when structs and arrays
will become first-class types. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51293 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ca756ae886
commit
638e378f2c
@ -812,35 +812,26 @@ void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
|
||||
} else if (isa<ConstantAggregateZero>(Init)) {
|
||||
memset(Addr, 0, (size_t)getTargetData()->getABITypeSize(Init->getType()));
|
||||
return;
|
||||
} else if (const ConstantArray *CPA = dyn_cast<ConstantArray>(Init)) {
|
||||
unsigned ElementSize =
|
||||
getTargetData()->getABITypeSize(CPA->getType()->getElementType());
|
||||
for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
|
||||
InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
|
||||
return;
|
||||
} else if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(Init)) {
|
||||
const StructLayout *SL =
|
||||
getTargetData()->getStructLayout(cast<StructType>(CPS->getType()));
|
||||
for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
|
||||
InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i));
|
||||
return;
|
||||
} else if (Init->getType()->isFirstClassType()) {
|
||||
GenericValue Val = getConstantValue(Init);
|
||||
StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType());
|
||||
return;
|
||||
}
|
||||
|
||||
switch (Init->getType()->getTypeID()) {
|
||||
case Type::ArrayTyID: {
|
||||
const ConstantArray *CPA = cast<ConstantArray>(Init);
|
||||
unsigned ElementSize =
|
||||
getTargetData()->getABITypeSize(CPA->getType()->getElementType());
|
||||
for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
|
||||
InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
|
||||
return;
|
||||
}
|
||||
|
||||
case Type::StructTyID: {
|
||||
const ConstantStruct *CPS = cast<ConstantStruct>(Init);
|
||||
const StructLayout *SL =
|
||||
getTargetData()->getStructLayout(cast<StructType>(CPS->getType()));
|
||||
for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
|
||||
InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i));
|
||||
return;
|
||||
}
|
||||
|
||||
default:
|
||||
cerr << "Bad Type: " << *Init->getType() << "\n";
|
||||
assert(0 && "Unknown constant type to initialize memory with!");
|
||||
}
|
||||
cerr << "Bad Type: " << *Init->getType() << "\n";
|
||||
assert(0 && "Unknown constant type to initialize memory with!");
|
||||
}
|
||||
|
||||
/// EmitGlobals - Emit all of the global variables to memory, storing their
|
||||
|
Loading…
Reference in New Issue
Block a user