mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
llvm/ConstantFolding.cpp: Make ReadDataFromGlobal() and FoldReinterpretLoadFromConstPtr() Big-endian-aware.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167595 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -292,7 +292,10 @@ static bool ReadDataFromGlobal(Constant *C, uint64_t ByteOffset,
|
||||
unsigned IntBytes = unsigned(CI->getBitWidth()/8);
|
||||
|
||||
for (unsigned i = 0; i != BytesLeft && ByteOffset != IntBytes; ++i) {
|
||||
CurPtr[i] = (unsigned char)(Val >> (ByteOffset * 8));
|
||||
int n = ByteOffset;
|
||||
if (!TD.isLittleEndian())
|
||||
n = IntBytes - n - 1;
|
||||
CurPtr[i] = (unsigned char)(Val >> (n * 8));
|
||||
++ByteOffset;
|
||||
}
|
||||
return true;
|
||||
@ -442,10 +445,19 @@ static Constant *FoldReinterpretLoadFromConstPtr(Constant *C,
|
||||
BytesLoaded, TD))
|
||||
return 0;
|
||||
|
||||
APInt ResultVal = APInt(IntType->getBitWidth(), RawBytes[BytesLoaded-1]);
|
||||
for (unsigned i = 1; i != BytesLoaded; ++i) {
|
||||
ResultVal <<= 8;
|
||||
ResultVal |= RawBytes[BytesLoaded-1-i];
|
||||
APInt ResultVal = APInt(IntType->getBitWidth(), 0);
|
||||
if (TD.isLittleEndian()) {
|
||||
ResultVal = RawBytes[BytesLoaded - 1];
|
||||
for (unsigned i = 1; i != BytesLoaded; ++i) {
|
||||
ResultVal <<= 8;
|
||||
ResultVal |= RawBytes[BytesLoaded-1-i];
|
||||
}
|
||||
} else {
|
||||
ResultVal = RawBytes[0];
|
||||
for (unsigned i = 1; i != BytesLoaded; ++i) {
|
||||
ResultVal <<= 8;
|
||||
ResultVal |= RawBytes[i];
|
||||
}
|
||||
}
|
||||
|
||||
return ConstantInt::get(IntType->getContext(), ResultVal);
|
||||
@ -521,10 +533,8 @@ Constant *llvm::ConstantFoldLoadFromConstPtr(Constant *C,
|
||||
}
|
||||
}
|
||||
|
||||
// Try hard to fold loads from bitcasted strange and non-type-safe things. We
|
||||
// currently don't do any of this for big endian systems. It can be
|
||||
// generalized in the future if someone is interested.
|
||||
if (TD && TD->isLittleEndian())
|
||||
// Try hard to fold loads from bitcasted strange and non-type-safe things.
|
||||
if (TD)
|
||||
return FoldReinterpretLoadFromConstPtr(CE, *TD);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user