mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-14 17:34:41 +00:00
Add a pointersize/endianness safe load routine to match the store routine
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6042 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
da82ed52ac
commit
f88b9a6397
@ -79,6 +79,7 @@ private:
|
||||
public: // FIXME: protected: // API shared among subclasses
|
||||
GenericValue getConstantValue(const Constant *C);
|
||||
void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty);
|
||||
GenericValue LoadValueFromMemory(GenericValue *Ptr, const Type *Ty);
|
||||
void *CreateArgv(const std::vector<std::string> &InputArgv);
|
||||
void InitializeMemory(const Constant *Init, void *Addr);
|
||||
};
|
||||
|
@ -152,6 +152,82 @@ void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr,
|
||||
}
|
||||
}
|
||||
|
||||
GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr,
|
||||
const Type *Ty) {
|
||||
GenericValue Result;
|
||||
if (getTargetData().isLittleEndian()) {
|
||||
switch (Ty->getPrimitiveID()) {
|
||||
case Type::BoolTyID:
|
||||
case Type::UByteTyID:
|
||||
case Type::SByteTyID: Result.UByteVal = Ptr->Untyped[0]; break;
|
||||
case Type::UShortTyID:
|
||||
case Type::ShortTyID: Result.UShortVal = (unsigned)Ptr->Untyped[0] |
|
||||
((unsigned)Ptr->Untyped[1] << 8);
|
||||
break;
|
||||
Load4BytesLittleEndian:
|
||||
case Type::FloatTyID:
|
||||
case Type::UIntTyID:
|
||||
case Type::IntTyID: Result.UIntVal = (unsigned)Ptr->Untyped[0] |
|
||||
((unsigned)Ptr->Untyped[1] << 8) |
|
||||
((unsigned)Ptr->Untyped[2] << 16) |
|
||||
((unsigned)Ptr->Untyped[3] << 24);
|
||||
break;
|
||||
case Type::PointerTyID: if (getModule().has32BitPointers())
|
||||
goto Load4BytesLittleEndian;
|
||||
case Type::DoubleTyID:
|
||||
case Type::ULongTyID:
|
||||
case Type::LongTyID: Result.ULongVal = (uint64_t)Ptr->Untyped[0] |
|
||||
((uint64_t)Ptr->Untyped[1] << 8) |
|
||||
((uint64_t)Ptr->Untyped[2] << 16) |
|
||||
((uint64_t)Ptr->Untyped[3] << 24) |
|
||||
((uint64_t)Ptr->Untyped[4] << 32) |
|
||||
((uint64_t)Ptr->Untyped[5] << 40) |
|
||||
((uint64_t)Ptr->Untyped[6] << 48) |
|
||||
((uint64_t)Ptr->Untyped[7] << 56);
|
||||
break;
|
||||
default:
|
||||
std::cout << "Cannot load value of type " << *Ty << "!\n";
|
||||
abort();
|
||||
}
|
||||
} else {
|
||||
switch (Ty->getPrimitiveID()) {
|
||||
case Type::BoolTyID:
|
||||
case Type::UByteTyID:
|
||||
case Type::SByteTyID: Result.UByteVal = Ptr->Untyped[0]; break;
|
||||
case Type::UShortTyID:
|
||||
case Type::ShortTyID: Result.UShortVal = (unsigned)Ptr->Untyped[1] |
|
||||
((unsigned)Ptr->Untyped[0] << 8);
|
||||
break;
|
||||
Load4BytesBigEndian:
|
||||
case Type::FloatTyID:
|
||||
case Type::UIntTyID:
|
||||
case Type::IntTyID: Result.UIntVal = (unsigned)Ptr->Untyped[3] |
|
||||
((unsigned)Ptr->Untyped[2] << 8) |
|
||||
((unsigned)Ptr->Untyped[1] << 16) |
|
||||
((unsigned)Ptr->Untyped[0] << 24);
|
||||
break;
|
||||
case Type::PointerTyID: if (getModule().has32BitPointers())
|
||||
goto Load4BytesBigEndian;
|
||||
case Type::DoubleTyID:
|
||||
case Type::ULongTyID:
|
||||
case Type::LongTyID: Result.ULongVal = (uint64_t)Ptr->Untyped[7] |
|
||||
((uint64_t)Ptr->Untyped[6] << 8) |
|
||||
((uint64_t)Ptr->Untyped[5] << 16) |
|
||||
((uint64_t)Ptr->Untyped[4] << 24) |
|
||||
((uint64_t)Ptr->Untyped[3] << 32) |
|
||||
((uint64_t)Ptr->Untyped[2] << 40) |
|
||||
((uint64_t)Ptr->Untyped[1] << 48) |
|
||||
((uint64_t)Ptr->Untyped[0] << 56);
|
||||
break;
|
||||
default:
|
||||
std::cout << "Cannot load value of type " << *Ty << "!\n";
|
||||
abort();
|
||||
}
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
||||
// InitializeMemory - Recursive function to apply a Constant value into the
|
||||
// specified memory location...
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user