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