Convert CGBitFieldInfo::FieldByteOffset to CharUnits. No change in
functionality intended. llvm-svn: 130085
This commit is contained in:
parent
617339e692
commit
f76759c6fa
|
@ -726,9 +726,10 @@ RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV,
|
|||
Ptr = Builder.CreateStructGEP(Ptr, AI.FieldIndex, "bf.field");
|
||||
|
||||
// Offset by the byte offset, if used.
|
||||
if (AI.FieldByteOffset) {
|
||||
if (!AI.FieldByteOffset.isZero()) {
|
||||
Ptr = EmitCastToVoidPtr(Ptr);
|
||||
Ptr = Builder.CreateConstGEP1_32(Ptr, AI.FieldByteOffset,"bf.field.offs");
|
||||
Ptr = Builder.CreateConstGEP1_32(Ptr, AI.FieldByteOffset.getQuantity(),
|
||||
"bf.field.offs");
|
||||
}
|
||||
|
||||
// Cast to the access type.
|
||||
|
@ -929,9 +930,10 @@ void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
|
|||
Ptr = Builder.CreateStructGEP(Ptr, AI.FieldIndex, "bf.field");
|
||||
|
||||
// Offset by the byte offset, if used.
|
||||
if (AI.FieldByteOffset) {
|
||||
if (!AI.FieldByteOffset.isZero()) {
|
||||
Ptr = EmitCastToVoidPtr(Ptr);
|
||||
Ptr = Builder.CreateConstGEP1_32(Ptr, AI.FieldByteOffset,"bf.field.offs");
|
||||
Ptr = Builder.CreateConstGEP1_32(Ptr, AI.FieldByteOffset.getQuantity(),
|
||||
"bf.field.offs");
|
||||
}
|
||||
|
||||
// Cast to the access type.
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "clang/AST/CharUnits.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
namespace llvm {
|
||||
class raw_ostream;
|
||||
|
@ -53,7 +54,7 @@ public:
|
|||
/// unused as the cleanest IR comes from having a well-constructed LLVM type
|
||||
/// with proper GEP instructions, but sometimes its use is required, for
|
||||
/// example if an access is intended to straddle an LLVM field boundary.
|
||||
unsigned FieldByteOffset;
|
||||
CharUnits FieldByteOffset;
|
||||
|
||||
/// Bit offset in the accessed value to use. The width is implied by \see
|
||||
/// TargetBitWidth.
|
||||
|
|
|
@ -309,9 +309,10 @@ CGBitFieldInfo CGBitFieldInfo::MakeInfo(CodeGenTypes &Types,
|
|||
// in higher bits. But this also reverts the bytes, so fix this here by reverting
|
||||
// the byte offset on big-endian machines.
|
||||
if (Types.getTargetData().isBigEndian()) {
|
||||
AI.FieldByteOffset = (ContainingTypeSizeInBits - AccessStart - AccessWidth )/8;
|
||||
AI.FieldByteOffset = Types.getContext().toCharUnitsFromBits(
|
||||
ContainingTypeSizeInBits - AccessStart - AccessWidth);
|
||||
} else {
|
||||
AI.FieldByteOffset = AccessStart / 8;
|
||||
AI.FieldByteOffset = Types.getContext().toCharUnitsFromBits(AccessStart);
|
||||
}
|
||||
AI.FieldBitStart = AccessBitsInFieldStart - AccessStart;
|
||||
AI.AccessWidth = AccessWidth;
|
||||
|
@ -978,7 +979,7 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
|
|||
// Verify that every component access is within the structure.
|
||||
uint64_t FieldOffset = SL->getElementOffsetInBits(AI.FieldIndex);
|
||||
uint64_t AccessBitOffset = FieldOffset +
|
||||
getContext().toBits(CharUnits::fromQuantity(AI.FieldByteOffset));
|
||||
getContext().toBits(AI.FieldByteOffset);
|
||||
assert(AccessBitOffset + AI.AccessWidth <= TypeSizeInBits &&
|
||||
"Invalid bit-field access (out of range)!");
|
||||
}
|
||||
|
@ -1037,7 +1038,7 @@ void CGBitFieldInfo::print(llvm::raw_ostream &OS) const {
|
|||
OS.indent(8);
|
||||
OS << "<AccessInfo"
|
||||
<< " FieldIndex:" << AI.FieldIndex
|
||||
<< " FieldByteOffset:" << AI.FieldByteOffset
|
||||
<< " FieldByteOffset:" << AI.FieldByteOffset.getQuantity()
|
||||
<< " FieldBitStart:" << AI.FieldBitStart
|
||||
<< " AccessWidth:" << AI.AccessWidth << "\n";
|
||||
OS.indent(8 + strlen("<AccessInfo"));
|
||||
|
|
Loading…
Reference in New Issue