26#include "llvm/IR/DataLayout.h"
27#include "llvm/IR/DerivedTypes.h"
28#include "llvm/IR/Module.h"
31using namespace CodeGen;
34 : CGM(cgm), Context(cgm.getContext()), TheModule(cgm.getModule()),
35 Target(cgm.getTarget()), TheCXXABI(cgm.getCXXABI()),
36 TheABIInfo(cgm.getTargetCodeGenInfo().getABIInfo()) {
37 SkippedLayout =
false;
38 LongDoubleReferenced =
false;
42 for (llvm::FoldingSet<CGFunctionInfo>::iterator
43 I = FunctionInfos.begin(),
E = FunctionInfos.end(); I !=
E; )
55 llvm::raw_svector_ostream OS(
TypeName);
76 if (TDD->getDeclContext())
77 TDD->printQualifiedName(OS, Policy);
86 Ty->setName(OS.str());
112 auto *FixedVT = cast<llvm::FixedVectorType>(R);
114 uint64_t BytePadded = std::max<uint64_t>(FixedVT->getNumElements(), 8);
115 return llvm::IntegerType::get(FixedVT->getContext(), BytePadded);
133 return llvm::ArrayType::get(CGM.
Int8Ty,
139 if (R->isIntegerTy(1))
148 llvm::Type *LLVMTy) {
155 return ASTSize != LLVMSize;
159 llvm::Type *LLVMTy) {
164 return llvm::Type::getIntNTy(
167 if (LLVMTy->isIntegerTy(1))
180 llvm::DenseMap<const Type*, llvm::StructType *>::const_iterator I =
181 RecordDeclTypes.find(Ty);
182 return I != RecordDeclTypes.end() && !I->second->isOpaque();
196 if (!TT)
return true;
213 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
226 if (
const EnumDecl *ED = dyn_cast<EnumDecl>(TD)) {
228 if (TypeCache.count(ED->getTypeForDecl())) {
232 if (!
ConvertType(ED->getIntegerType())->isIntegerTy(32))
238 DI->completeType(ED);
255 DI->completeType(RD);
262 const Type *Ty =
T.getTypePtr();
263 if (RecordsWithOpaqueMemberPointers.count(Ty)) {
265 RecordsWithOpaqueMemberPointers.clear();
270 const llvm::fltSemantics &format,
271 bool UseNativeHalf =
false) {
272 if (&format == &llvm::APFloat::IEEEhalf()) {
274 return llvm::Type::getHalfTy(VMContext);
276 return llvm::Type::getInt16Ty(VMContext);
278 if (&format == &llvm::APFloat::BFloat())
279 return llvm::Type::getBFloatTy(VMContext);
280 if (&format == &llvm::APFloat::IEEEsingle())
281 return llvm::Type::getFloatTy(VMContext);
282 if (&format == &llvm::APFloat::IEEEdouble())
283 return llvm::Type::getDoubleTy(VMContext);
284 if (&format == &llvm::APFloat::IEEEquad())
285 return llvm::Type::getFP128Ty(VMContext);
286 if (&format == &llvm::APFloat::PPCDoubleDouble())
287 return llvm::Type::getPPC_FP128Ty(VMContext);
288 if (&format == &llvm::APFloat::x87DoubleExtended())
289 return llvm::Type::getX86_FP80Ty(VMContext);
290 llvm_unreachable(
"Unknown float format!");
293llvm::Type *CodeGenTypes::ConvertFunctionTypeInternal(
QualType QFT) {
307 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
311 SkippedLayout =
true;
329 llvm::Type *ResultType =
nullptr;
332 if (FunctionsBeingProcessed.count(FI)) {
335 SkippedLayout =
true;
349 const Type *Ty =
T.getTypePtr();
366 if (
const RecordType *RT = dyn_cast<RecordType>(Ty))
369 llvm::Type *CachedType =
nullptr;
370 auto TCI = TypeCache.find(Ty);
371 if (TCI != TypeCache.end())
372 CachedType = TCI->second;
375#ifndef EXPENSIVE_CHECKS
381 llvm::Type *ResultType =
nullptr;
384#define TYPE(Class, Base)
385#define ABSTRACT_TYPE(Class, Base)
386#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
387#define DEPENDENT_TYPE(Class, Base) case Type::Class:
388#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
389#include "clang/AST/TypeNodes.inc"
390 llvm_unreachable(
"Non-canonical or dependent types aren't possible.");
392 case Type::Builtin: {
393 switch (cast<BuiltinType>(Ty)->
getKind()) {
394 case BuiltinType::Void:
395 case BuiltinType::ObjCId:
396 case BuiltinType::ObjCClass:
397 case BuiltinType::ObjCSel:
403 case BuiltinType::Bool:
408 case BuiltinType::Char_S:
409 case BuiltinType::Char_U:
410 case BuiltinType::SChar:
411 case BuiltinType::UChar:
412 case BuiltinType::Short:
413 case BuiltinType::UShort:
414 case BuiltinType::Int:
415 case BuiltinType::UInt:
416 case BuiltinType::Long:
417 case BuiltinType::ULong:
418 case BuiltinType::LongLong:
419 case BuiltinType::ULongLong:
420 case BuiltinType::WChar_S:
421 case BuiltinType::WChar_U:
422 case BuiltinType::Char8:
423 case BuiltinType::Char16:
424 case BuiltinType::Char32:
425 case BuiltinType::ShortAccum:
426 case BuiltinType::Accum:
427 case BuiltinType::LongAccum:
428 case BuiltinType::UShortAccum:
429 case BuiltinType::UAccum:
430 case BuiltinType::ULongAccum:
431 case BuiltinType::ShortFract:
432 case BuiltinType::Fract:
433 case BuiltinType::LongFract:
434 case BuiltinType::UShortFract:
435 case BuiltinType::UFract:
436 case BuiltinType::ULongFract:
437 case BuiltinType::SatShortAccum:
438 case BuiltinType::SatAccum:
439 case BuiltinType::SatLongAccum:
440 case BuiltinType::SatUShortAccum:
441 case BuiltinType::SatUAccum:
442 case BuiltinType::SatULongAccum:
443 case BuiltinType::SatShortFract:
444 case BuiltinType::SatFract:
445 case BuiltinType::SatLongFract:
446 case BuiltinType::SatUShortFract:
447 case BuiltinType::SatUFract:
448 case BuiltinType::SatULongFract:
453 case BuiltinType::Float16:
459 case BuiltinType::Half:
466 case BuiltinType::LongDouble:
467 LongDoubleReferenced =
true;
469 case BuiltinType::BFloat16:
470 case BuiltinType::Float:
471 case BuiltinType::Double:
472 case BuiltinType::Float128:
473 case BuiltinType::Ibm128:
479 case BuiltinType::NullPtr:
484 case BuiltinType::UInt128:
485 case BuiltinType::Int128:
489#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
490 case BuiltinType::Id:
491#include "clang/Basic/OpenCLImageTypes.def"
492#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
493 case BuiltinType::Id:
494#include "clang/Basic/OpenCLExtensionTypes.def"
495 case BuiltinType::OCLSampler:
496 case BuiltinType::OCLEvent:
497 case BuiltinType::OCLClkEvent:
498 case BuiltinType::OCLQueue:
499 case BuiltinType::OCLReserveID:
502 case BuiltinType::SveInt8:
503 case BuiltinType::SveUint8:
504 case BuiltinType::SveInt8x2:
505 case BuiltinType::SveUint8x2:
506 case BuiltinType::SveInt8x3:
507 case BuiltinType::SveUint8x3:
508 case BuiltinType::SveInt8x4:
509 case BuiltinType::SveUint8x4:
510 case BuiltinType::SveInt16:
511 case BuiltinType::SveUint16:
512 case BuiltinType::SveInt16x2:
513 case BuiltinType::SveUint16x2:
514 case BuiltinType::SveInt16x3:
515 case BuiltinType::SveUint16x3:
516 case BuiltinType::SveInt16x4:
517 case BuiltinType::SveUint16x4:
518 case BuiltinType::SveInt32:
519 case BuiltinType::SveUint32:
520 case BuiltinType::SveInt32x2:
521 case BuiltinType::SveUint32x2:
522 case BuiltinType::SveInt32x3:
523 case BuiltinType::SveUint32x3:
524 case BuiltinType::SveInt32x4:
525 case BuiltinType::SveUint32x4:
526 case BuiltinType::SveInt64:
527 case BuiltinType::SveUint64:
528 case BuiltinType::SveInt64x2:
529 case BuiltinType::SveUint64x2:
530 case BuiltinType::SveInt64x3:
531 case BuiltinType::SveUint64x3:
532 case BuiltinType::SveInt64x4:
533 case BuiltinType::SveUint64x4:
534 case BuiltinType::SveBool:
535 case BuiltinType::SveBoolx2:
536 case BuiltinType::SveBoolx4:
537 case BuiltinType::SveFloat16:
538 case BuiltinType::SveFloat16x2:
539 case BuiltinType::SveFloat16x3:
540 case BuiltinType::SveFloat16x4:
541 case BuiltinType::SveFloat32:
542 case BuiltinType::SveFloat32x2:
543 case BuiltinType::SveFloat32x3:
544 case BuiltinType::SveFloat32x4:
545 case BuiltinType::SveFloat64:
546 case BuiltinType::SveFloat64x2:
547 case BuiltinType::SveFloat64x3:
548 case BuiltinType::SveFloat64x4:
549 case BuiltinType::SveBFloat16:
550 case BuiltinType::SveBFloat16x2:
551 case BuiltinType::SveBFloat16x3:
552 case BuiltinType::SveBFloat16x4: {
556 Info.
EC.getKnownMinValue() *
559 case BuiltinType::SveCount:
560 return llvm::TargetExtType::get(
getLLVMContext(),
"aarch64.svcount");
561#define PPC_VECTOR_TYPE(Name, Id, Size) \
562 case BuiltinType::Id: \
564 llvm::FixedVectorType::get(ConvertType(Context.BoolTy), Size); \
566#include "clang/Basic/PPCTypes.def"
567#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
568#include "clang/Basic/RISCVVTypes.def"
576 llvm::Type *EltTy = llvm::ScalableVectorType::get(
582 Info.
EC.getKnownMinValue());
584#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
585 case BuiltinType::Id: { \
586 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
587 ResultType = CGM.getTargetCodeGenInfo().getWasmExternrefReferenceType(); \
589 llvm_unreachable("Unexpected wasm reference builtin type!"); \
591#include "clang/Basic/WebAssemblyReferenceTypes.def"
592#define AMDGPU_OPAQUE_PTR_TYPE(Name, MangledName, AS, Width, Align, Id, \
594 case BuiltinType::Id: \
595 return llvm::PointerType::get(getLLVMContext(), AS);
596#include "clang/Basic/AMDGPUTypes.def"
597#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
598#include "clang/Basic/HLSLIntangibleTypes.def"
601 case BuiltinType::Dependent:
602#define BUILTIN_TYPE(Id, SingletonId)
603#define PLACEHOLDER_TYPE(Id, SingletonId) \
604 case BuiltinType::Id:
605#include "clang/AST/BuiltinTypes.def"
606 llvm_unreachable(
"Unexpected placeholder builtin type!");
611 case Type::DeducedTemplateSpecialization:
612 llvm_unreachable(
"Unexpected undeduced type!");
613 case Type::Complex: {
614 llvm::Type *EltTy =
ConvertType(cast<ComplexType>(Ty)->getElementType());
615 ResultType = llvm::StructType::get(EltTy, EltTy);
618 case Type::LValueReference:
619 case Type::RValueReference: {
626 case Type::Pointer: {
634 case Type::VariableArray: {
637 "FIXME: We only handle trivial array types so far!");
643 case Type::IncompleteArray: {
646 "FIXME: We only handle trivial array types so far!");
650 if (!ResultType->isSized()) {
651 SkippedLayout =
true;
654 ResultType = llvm::ArrayType::get(ResultType, 0);
657 case Type::ArrayParameter:
658 case Type::ConstantArray: {
664 if (!EltTy->isSized()) {
665 SkippedLayout =
true;
669 ResultType = llvm::ArrayType::get(EltTy, A->
getZExtSize());
672 case Type::ExtVector:
674 const auto *VT = cast<VectorType>(Ty);
676 llvm::Type *IRElemTy = VT->isExtVectorBoolType()
679 ResultType = llvm::FixedVectorType::get(IRElemTy, VT->getNumElements());
682 case Type::ConstantMatrix: {
689 case Type::FunctionNoProto:
690 case Type::FunctionProto:
691 ResultType = ConvertFunctionTypeInternal(
T);
693 case Type::ObjCObject:
694 ResultType =
ConvertType(cast<ObjCObjectType>(Ty)->getBaseType());
697 case Type::ObjCInterface: {
701 llvm::Type *&
T = InterfaceTypes[cast<ObjCInterfaceType>(Ty)];
708 case Type::ObjCObjectPointer:
713 const EnumDecl *ED = cast<EnumType>(Ty)->getDecl();
723 case Type::BlockPointer: {
736 case Type::MemberPointer: {
737 auto *MPTy = cast<MemberPointerType>(Ty);
738 if (!
getCXXABI().isMemberPointerConvertible(MPTy)) {
739 auto *
C = MPTy->getClass();
740 auto Insertion = RecordsWithOpaqueMemberPointers.insert({
C,
nullptr});
741 if (Insertion.second)
742 Insertion.first->second = llvm::StructType::create(
getLLVMContext());
743 ResultType = Insertion.first->second;
751 QualType valueType = cast<AtomicType>(Ty)->getValueType();
755 uint64_t valueSize = Context.
getTypeSize(valueType);
757 if (valueSize != atomicSize) {
758 assert(valueSize < atomicSize);
759 llvm::Type *elts[] = {
761 llvm::ArrayType::get(CGM.
Int8Ty, (atomicSize - valueSize) / 8)
773 const auto &EIT = cast<BitIntType>(Ty);
774 ResultType = llvm::Type::getIntNTy(
getLLVMContext(), EIT->getNumBits());
779 assert(ResultType &&
"Didn't convert a type?");
780 assert((!CachedType || CachedType == ResultType) &&
781 "Cached type doesn't match computed type");
783 TypeCache[Ty] = ResultType;
801 llvm::StructType *&Entry = RecordDeclTypes[Key];
808 llvm::StructType *Ty = Entry;
817 if (
const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
818 for (
const auto &I : CRD->bases()) {
819 if (I.isVirtual())
continue;
826 CGRecordLayouts[Key] = std::move(Layout);
842 auto I = CGRecordLayouts.find(Key);
843 if (I != CGRecordLayouts.end())
849 I = CGRecordLayouts.find(Key);
851 assert(I != CGRecordLayouts.end() &&
852 "Unable to find record layout information for type");
866 if (isa<IncompleteArrayType>(AT))
868 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
Defines the clang::ASTContext interface.
static llvm::Type * getTypeForFormat(llvm::LLVMContext &VMContext, const llvm::fltSemantics &format, bool UseNativeHalf=false)
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
llvm::MachO::Target Target
static CharUnits getTypeAllocSize(CodeGenModule &CGM, llvm::Type *type)
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
QualType getRecordType(const RecordDecl *Decl) const
uint64_t getTargetNullPointerValue(QualType QT) const
Get target-dependent integer value for null pointer which is used for constant folding.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
const clang::PrintingPolicy & getPrintingPolicy() const
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
const TargetInfo & getTargetInfo() const
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
unsigned getTargetAddressSpace(LangAS AS) const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
Represents a C++ struct/union/class.
Represents a canonical, potentially-qualified type.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
virtual bool isMemberPointerConvertible(const MemberPointerType *MPT) const
Return whether or not a member pointers type is convertible to an IR type.
virtual llvm::Type * ConvertMemberPointerType(const MemberPointerType *MPT)
Find the LLVM type used to represent the given member pointer type.
virtual bool isZeroInitializable(const MemberPointerType *MPT)
Return true if the given member pointer can be zero-initialized (in the C++ sense) with an LLVM zeroi...
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
CGFunctionInfo - Class to encapsulate the information about a function definition.
llvm::Type * convertHLSLSpecificType(const Type *T)
virtual llvm::Type * getPipeType(const PipeType *T, StringRef Name, llvm::Type *&PipeTy)
virtual llvm::Type * convertOpenCLSpecificType(const Type *T)
CGRecordLayout - This class handles struct and union layout info while lowering AST types to LLVM typ...
bool isZeroInitializable() const
Check whether this struct can be C++ zero-initialized with a zeroinitializer.
This class organizes the cross-function state that is used while generating LLVM code.
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
CGDebugInfo * getModuleDebugInfo()
bool isPaddedAtomicType(QualType type)
CGOpenCLRuntime & getOpenCLRuntime()
Return a reference to the configured OpenCL runtime.
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
CodeGenTypes(CodeGenModule &cgm)
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
bool isPointerZeroInitializable(QualType T)
Check if the pointer type can be zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
const CodeGenOptions & getCodeGenOpts() const
ASTContext & getContext() const
const CGFunctionInfo & arrangeFreeFunctionType(CanQual< FunctionProtoType > Ty)
Arrange the argument and result information for a value of the given freestanding function type.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
bool isFuncTypeConvertible(const FunctionType *FT)
isFuncTypeConvertible - Utility to check whether a function type can be converted to an LLVM type (i....
std::unique_ptr< CGRecordLayout > ComputeRecordLayout(const RecordDecl *D, llvm::StructType *Ty)
Compute a new LLVM record layout object for the given record.
llvm::Type * convertTypeForLoadStore(QualType T, llvm::Type *LLVMTy=nullptr)
Given that T is a scalar type, return the IR type that should be used for load and store operations.
const CGRecordLayout & getCGRecordLayout(const RecordDecl *)
getCGRecordLayout - Return record layout info for the given record decl.
unsigned getTargetAddressSpace(QualType T) const
llvm::StructType * ConvertRecordDeclType(const RecordDecl *TD)
ConvertRecordDeclType - Lay out a tagged decl type like struct or union.
void RefreshTypeCacheForClass(const CXXRecordDecl *RD)
Remove stale types from the type cache when an inheritance model gets assigned to a class.
bool isRecordLayoutComplete(const Type *Ty) const
isRecordLayoutComplete - Return true if the specified type is already completely laid out.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
void UpdateCompletedType(const TagDecl *TD)
UpdateCompletedType - When we find the full definition for a TagDecl, replace the 'opaque' type we pr...
llvm::LLVMContext & getLLVMContext()
bool typeRequiresSplitIntoByteArray(QualType ASTTy, llvm::Type *LLVMTy=nullptr)
Check whether the given type needs to be laid out in memory using an opaque byte-array type because i...
const llvm::DataLayout & getDataLayout() const
CGCXXABI & getCXXABI() const
bool isFuncParamTypeConvertible(QualType Ty)
isFuncParamTypeConvertible - Return true if the specified type in a function parameter or result posi...
bool isZeroInitializable(QualType T)
IsZeroInitializable - Return whether a type can be zero-initialized (in the C++ sense) with an LLVM z...
void addRecordTypeName(const RecordDecl *RD, llvm::StructType *Ty, StringRef suffix)
addRecordTypeName - Compute a name from the given record decl with an optional suffix and name the gi...
virtual llvm::Type * getCUDADeviceBuiltinSurfaceDeviceType() const
Return the device-side type for the CUDA device builtin surface type.
virtual llvm::Type * getCUDADeviceBuiltinTextureDeviceType() const
Return the device-side type for the CUDA device builtin texture type.
Represents the canonical version of C arrays with a specified constant size.
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
ASTContext & getASTContext() const LLVM_READONLY
DeclContext * getDeclContext()
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
Represents a C array with an unspecified size.
QualType getElementType() const
Returns type of the elements being stored in the matrix.
A pointer to member type per C++ 8.3.3 - Pointers to members.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
void printQualifiedName(raw_ostream &OS) const
Returns a human-readable qualified name for this declaration, like A::B::i, for i being member of nam...
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
A (possibly-)qualified type.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Represents a struct/union/class.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Represents the declaration of a struct/union/class/enum.
StringRef getKindName() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TypedefNameDecl * getTypedefNameForAnonDecl() const
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
virtual bool useFP16ConversionIntrinsics() const
Check whether llvm intrinsics such as llvm.convert.to.fp16 should be used to convert to and from __fp...
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isConstantMatrixType() const
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isExtVectorBoolType() const
bool isBitIntType() const
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
Represents a C array with a specified size that is not an integer-constant-expression.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressInlineNamespace
Suppress printing parts of scope specifiers that correspond to inline namespaces, where the name is u...