зеркало из https://github.com/microsoft/clang-1.git
Support getTypeInfo, getTypeAlign, getTypeSize on const Type*s.
- Size/align are not effected by CVR qualifiers. Support getCanonicalType: const Type* -> const Type*. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58891 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
d7f6050113
Коммит
1d75118af7
|
@ -343,19 +343,28 @@ public:
|
|||
|
||||
/// getTypeInfo - Get the size and alignment of the specified complete type in
|
||||
/// bits.
|
||||
std::pair<uint64_t, unsigned> getTypeInfo(QualType T);
|
||||
std::pair<uint64_t, unsigned> getTypeInfo(const Type *T);
|
||||
std::pair<uint64_t, unsigned> getTypeInfo(QualType T) {
|
||||
return getTypeInfo(T.getTypePtr());
|
||||
}
|
||||
|
||||
/// getTypeSize - Return the size of the specified type, in bits. This method
|
||||
/// does not work on incomplete types.
|
||||
uint64_t getTypeSize(QualType T) {
|
||||
return getTypeInfo(T).first;
|
||||
}
|
||||
uint64_t getTypeSize(const Type *T) {
|
||||
return getTypeInfo(T).first;
|
||||
}
|
||||
|
||||
/// getTypeAlign - Return the alignment of the specified type, in bits. This
|
||||
/// method does not work on incomplete types.
|
||||
unsigned getTypeAlign(QualType T) {
|
||||
return getTypeInfo(T).second;
|
||||
}
|
||||
unsigned getTypeAlign(const Type *T) {
|
||||
return getTypeInfo(T).second;
|
||||
}
|
||||
|
||||
/// getASTRecordLayout - Get or compute information about the layout of the
|
||||
/// specified record (struct/union/class), which indicates its size and field
|
||||
|
@ -374,6 +383,9 @@ public:
|
|||
/// to be free of any of these, allowing two canonical types to be compared
|
||||
/// for exact equality with a simple pointer comparison.
|
||||
QualType getCanonicalType(QualType T);
|
||||
const Type *getCanonicalType(const Type *T) {
|
||||
return T->getCanonicalTypeInternal().getTypePtr();
|
||||
}
|
||||
|
||||
/// Type Query functions. If the type is an instance of the specified class,
|
||||
/// return the Type pointer for the underlying maximally pretty type. This
|
||||
|
|
|
@ -223,7 +223,7 @@ const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
|
|||
/// getTypeSize - Return the size of the specified type, in bits. This method
|
||||
/// does not work on incomplete types.
|
||||
std::pair<uint64_t, unsigned>
|
||||
ASTContext::getTypeInfo(QualType T) {
|
||||
ASTContext::getTypeInfo(const Type *T) {
|
||||
T = getCanonicalType(T);
|
||||
uint64_t Width;
|
||||
unsigned Align;
|
||||
|
@ -236,7 +236,7 @@ ASTContext::getTypeInfo(QualType T) {
|
|||
case Type::VariableArray:
|
||||
assert(0 && "VLAs not implemented yet!");
|
||||
case Type::ConstantArray: {
|
||||
ConstantArrayType *CAT = cast<ConstantArrayType>(T);
|
||||
const ConstantArrayType *CAT = cast<ConstantArrayType>(T);
|
||||
|
||||
std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType());
|
||||
Width = EltInfo.first*CAT->getSize().getZExtValue();
|
||||
|
@ -344,23 +344,25 @@ ASTContext::getTypeInfo(QualType T) {
|
|||
break;
|
||||
}
|
||||
case Type::ObjCInterface: {
|
||||
ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
|
||||
const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
|
||||
const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
|
||||
Width = Layout.getSize();
|
||||
Align = Layout.getAlignment();
|
||||
break;
|
||||
}
|
||||
case Type::Tagged: {
|
||||
if (cast<TagType>(T)->getDecl()->isInvalidDecl()) {
|
||||
const TagType *TT = cast<TagType>(T);
|
||||
|
||||
if (TT->getDecl()->isInvalidDecl()) {
|
||||
Width = 1;
|
||||
Align = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (EnumType *ET = dyn_cast<EnumType>(cast<TagType>(T)))
|
||||
if (const EnumType *ET = dyn_cast<EnumType>(TT))
|
||||
return getTypeInfo(ET->getDecl()->getIntegerType());
|
||||
|
||||
RecordType *RT = cast<RecordType>(T);
|
||||
const RecordType *RT = cast<RecordType>(TT);
|
||||
const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
|
||||
Width = Layout.getSize();
|
||||
Align = Layout.getAlignment();
|
||||
|
|
Загрузка…
Ссылка в новой задаче