本文整理汇总了C++中CodeGenTypes::ConvertTypeForMemRecursive方法的典型用法代码示例。如果您正苦于以下问题:C++ CodeGenTypes::ConvertTypeForMemRecursive方法的具体用法?C++ CodeGenTypes::ConvertTypeForMemRecursive怎么用?C++ CodeGenTypes::ConvertTypeForMemRecursive使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CodeGenTypes
的用法示例。
在下文中一共展示了CodeGenTypes::ConvertTypeForMemRecursive方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ComputeBitFieldInfo
static CGBitFieldInfo ComputeBitFieldInfo(CodeGenTypes &Types,
const FieldDecl *FD,
uint64_t FieldOffset,
uint64_t FieldSize) {
const llvm::Type *Ty = Types.ConvertTypeForMemRecursive(FD->getType());
uint64_t TypeSizeInBytes = Types.getTargetData().getTypeAllocSize(Ty);
uint64_t TypeSizeInBits = TypeSizeInBytes * 8;
unsigned StartBit = FieldOffset % TypeSizeInBits;
bool IsSigned = FD->getType()->isSignedIntegerType();
// The current policy is to always access the bit-field using the source type
// of the bit-field. With the C bit-field rules, this implies that we always
// use either one or two accesses, and two accesses can only occur with a
// packed structure when the bit-field straddles an alignment boundary.
CGBitFieldInfo::AccessInfo Components[2];
unsigned LowBits = std::min(FieldSize, TypeSizeInBits - StartBit);
bool NeedsHighAccess = LowBits != FieldSize;
unsigned NumComponents = 1 + NeedsHighAccess;
// FIXME: This access policy is probably wrong on big-endian systems.
CGBitFieldInfo::AccessInfo &LowAccess = Components[0];
LowAccess.FieldIndex = 0;
LowAccess.FieldByteOffset =
TypeSizeInBytes * ((FieldOffset / 8) / TypeSizeInBytes);
LowAccess.FieldBitStart = StartBit;
LowAccess.AccessWidth = TypeSizeInBits;
// FIXME: This might be wrong!
LowAccess.AccessAlignment = 0;
LowAccess.TargetBitOffset = 0;
LowAccess.TargetBitWidth = LowBits;
if (NeedsHighAccess) {
CGBitFieldInfo::AccessInfo &HighAccess = Components[1];
HighAccess.FieldIndex = 0;
HighAccess.FieldByteOffset = LowAccess.FieldByteOffset + TypeSizeInBytes;
HighAccess.FieldBitStart = 0;
HighAccess.AccessWidth = TypeSizeInBits;
// FIXME: This might be wrong!
HighAccess.AccessAlignment = 0;
HighAccess.TargetBitOffset = LowBits;
HighAccess.TargetBitWidth = FieldSize - LowBits;
}
return CGBitFieldInfo(FieldSize, NumComponents, Components, IsSigned);
}