Convert CGBitFieldInfo::FieldByteOffset to CharUnits. No change in

functionality intended.

llvm-svn: 130085
This commit is contained in:
Ken Dyck 2011-04-24 10:04:59 +00:00
parent 617339e692
commit f76759c6fa
3 changed files with 13 additions and 9 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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"));