18      builder(cgm.
getBuilder()), theCXXABI(cgm.getCXXABI()),
 
   19      theABIInfo(cgm.getTargetCIRGenInfo().
getABIInfo()) {}
 
 
   22  for (
auto i = functionInfos.begin(), e = functionInfos.end(); i != e;)
 
 
   27  return *builder.getContext();
 
 
   45  return !
tagType->isIncompleteType();
 
 
   57  if (
const auto *fpt = dyn_cast<FunctionProtoType>(ft))
 
   58    for (
unsigned i = 0, e = fpt->getNumParams(); i != e; i++)
 
 
   65mlir::Type CIRGenTypes::convertFunctionTypeInternal(
QualType qft) {
 
   78  if (
const auto *fpt = dyn_cast<FunctionProtoType>(ft)) {
 
   97  llvm::raw_svector_ostream outStream(typeName);
 
  107        .
print(outStream, policy);
 
  111    outStream << builder.getUniqueAnonRecordName();
 
  116  return builder.getUniqueRecordName(std::string(typeName));
 
 
  121  const auto it = recordDeclTypes.find(ty);
 
  122  return it != recordDeclTypes.end() && it->second.isComplete();
 
 
  129                llvm::SmallPtrSetImpl<const RecordDecl *> &alreadyChecked);
 
  136                llvm::SmallPtrSetImpl<const RecordDecl *> &alreadyChecked) {
 
  139  if (!alreadyChecked.insert(rd).second)
 
  143         "Expect RecordDecl to be CompleteDefinition");
 
  158  if (
const CXXRecordDecl *crd = dyn_cast<CXXRecordDecl>(rd)) {
 
  161                               ->castAs<RecordType>()
 
  163                               ->getDefinitionOrSelf(),
 
  164                           cgt, alreadyChecked))
 
 
  182                llvm::SmallPtrSetImpl<const RecordDecl *> &alreadyChecked) {
 
  185    qt = at->getValueType();
 
 
  217  const Type *key = astContext.getCanonicalTagType(rd).getTypePtr();
 
  218  cir::RecordType entry = recordDeclTypes[key];
 
  225    entry = builder.getIncompleteRecordTy(name, rd);
 
  226    recordDeclTypes[key] = entry;
 
  235    deferredRecords.push_back(rd);
 
  240  bool insertResult = recordsBeingLaidOut.insert(key).second;
 
  242  assert(insertResult && 
"isSafeToCovert() should have caught this.");
 
  245  if (
const auto *
cxxRecordDecl = dyn_cast<CXXRecordDecl>(rd)) {
 
  247      if (base.isVirtual())
 
  255  recordDeclTypes[key] = entry;
 
  256  cirGenRecordLayouts[key] = std::move(layout);
 
  259  bool eraseResult = recordsBeingLaidOut.erase(key);
 
  261  assert(eraseResult && 
"record not in RecordsBeingLaidOut set?");
 
  269  if (recordsBeingLaidOut.empty())
 
  270    while (!deferredRecords.empty())
 
 
  277  type = astContext.getCanonicalType(
type);
 
  285  TypeCacheTy::iterator tci = 
typeCache.find(ty);
 
  292  mlir::Type resultType = 
nullptr;
 
  295    llvm_unreachable(
"Should have been handled above");
 
  297  case Type::Builtin: {
 
  300    case BuiltinType::Void:
 
  301      resultType = cgm.voidTy;
 
  305    case BuiltinType::Bool:
 
  310    case BuiltinType::Char_S:
 
  311    case BuiltinType::Int:
 
  312    case BuiltinType::Int128:
 
  313    case BuiltinType::Long:
 
  314    case BuiltinType::LongLong:
 
  315    case BuiltinType::SChar:
 
  316    case BuiltinType::Short:
 
  317    case BuiltinType::WChar_S:
 
  323    case BuiltinType::Char8:
 
  324    case BuiltinType::Char16:
 
  325    case BuiltinType::Char32:
 
  326    case BuiltinType::Char_U:
 
  327    case BuiltinType::UChar:
 
  328    case BuiltinType::UInt:
 
  329    case BuiltinType::UInt128:
 
  330    case BuiltinType::ULong:
 
  331    case BuiltinType::ULongLong:
 
  332    case BuiltinType::UShort:
 
  333    case BuiltinType::WChar_U:
 
  340    case BuiltinType::Float16:
 
  341      resultType = cgm.fP16Ty;
 
  343    case BuiltinType::Half:
 
  344      if (astContext.getLangOpts().NativeHalfType ||
 
  345          !astContext.getTargetInfo().useFP16ConversionIntrinsics()) {
 
  346        resultType = cgm.fP16Ty;
 
  349        resultType = cgm.sInt32Ty;
 
  352    case BuiltinType::BFloat16:
 
  353      resultType = cgm.bFloat16Ty;
 
  355    case BuiltinType::Float:
 
  356      assert(&astContext.getFloatTypeSemantics(
type) ==
 
  357                 &llvm::APFloat::IEEEsingle() &&
 
  358             "ClangIR NYI: 'float' in a format other than IEEE 32-bit");
 
  359      resultType = cgm.floatTy;
 
  361    case BuiltinType::Double:
 
  362      assert(&astContext.getFloatTypeSemantics(
type) ==
 
  363                 &llvm::APFloat::IEEEdouble() &&
 
  364             "ClangIR NYI: 'double' in a format other than IEEE 64-bit");
 
  365      resultType = cgm.doubleTy;
 
  367    case BuiltinType::LongDouble:
 
  369          builder.getLongDoubleTy(astContext.getFloatTypeSemantics(
type));
 
  371    case BuiltinType::Float128:
 
  372      resultType = cgm.fP128Ty;
 
  374    case BuiltinType::Ibm128:
 
  376      resultType = cgm.sInt32Ty;
 
  379    case BuiltinType::NullPtr:
 
  384      resultType = builder.getVoidPtrTy();
 
  389      resultType = cgm.sInt32Ty;
 
  395  case Type::Complex: {
 
  397    mlir::Type elementTy = 
convertType(ct->getElementType());
 
  398    resultType = cir::ComplexType::get(elementTy);
 
  402  case Type::LValueReference:
 
  403  case Type::RValueReference: {
 
  407    resultType = builder.getPointerTo(pointeeType);
 
  408    assert(resultType && 
"Cannot get pointer type?");
 
  412  case Type::Pointer: {
 
  419    resultType = builder.getPointerTo(pointeeType, elemTy.
getAddressSpace());
 
  423  case Type::VariableArray: {
 
  433  case Type::IncompleteArray: {
 
  442      elemTy = cgm.sInt8Ty;
 
  445    resultType = cir::ArrayType::get(elemTy, 0);
 
  449  case Type::ConstantArray: {
 
  457      resultType = cgm.uInt32Ty;
 
  461    resultType = cir::ArrayType::get(elemTy, arrTy->
getSize().getZExtValue());
 
  465  case Type::ExtVector:
 
  475    if (
auto integerType = ed->getIntegerType(); !integerType.isNull())
 
  480    resultType = cgm.uInt32Ty;
 
  484  case Type::FunctionNoProto:
 
  485  case Type::FunctionProto:
 
  486    resultType = convertFunctionTypeInternal(
type);
 
  491    if (bitIntTy->getNumBits() > cir::IntType::maxBitwidth()) {
 
  493      resultType = cgm.sInt32Ty;
 
  495      resultType = cir::IntType::get(&
getMLIRContext(), bitIntTy->getNumBits(),
 
  496                                     bitIntTy->isSigned());
 
  506    uint64_t valueSize = astContext.getTypeSize(valueType);
 
  507    uint64_t atomicSize = astContext.getTypeSize(ty);
 
  508    if (valueSize != atomicSize) {
 
  509      cgm.errorNYI(
"convertType: atomic type value size != atomic size");
 
  517                 type->getTypeClassName());
 
  518    resultType = cgm.sInt32Ty;
 
  522  assert(resultType && 
"Type conversion not yet implemented");
 
 
  530  assert(!
qualType->isConstantMatrixType() && 
"Matrix types NYI");
 
  534  assert(!forBitField && 
"Bit fields NYI");
 
  538  if (forBitField && 
qualType->isBitIntType())
 
  539    assert(!
qualType->isBitIntType() && 
"Bit field with type _BitInt NYI");
 
  541  return convertedType;
 
 
  547  const auto *key = astContext.getCanonicalTagType(rd).getTypePtr();
 
  550  auto it = cirGenRecordLayouts.find(key);
 
  551  if (it != cirGenRecordLayouts.end())
 
  558  it = cirGenRecordLayouts.find(key);
 
  560  assert(it != cirGenRecordLayouts.end() &&
 
  561         "Unable to find record layout information for type");
 
 
  567    return astContext.getTargetNullPointerValue(t) == 0;
 
  569  if (
const auto *at = astContext.getAsArrayType(t)) {
 
  573    if (
const auto *cat = dyn_cast<ConstantArrayType>(at))
 
  574      if (astContext.getConstantArrayElementCount(cat) == 0)
 
  582    cgm.errorNYI(
SourceLocation(), 
"isZeroInitializable for MemberPointerType",
 
 
  598  assert(llvm::all_of(argTypes,
 
  601  llvm::FoldingSetNodeID id;
 
  604  void *insertPos = 
nullptr;
 
  612        "Bad match based on CIRGenFunctionInfo folding set id");
 
  620  functionInfos.InsertNode(fi, insertPos);
 
 
  626  assert(!dyn_cast<ObjCMethodDecl>(gd.
getDecl()) &&
 
  627         "This is reported as a FIXME in LLVM codegen");
 
 
  643  if (
const auto *ed = dyn_cast<EnumDecl>(td)) {
 
  651            ed->getASTContext().getCanonicalTagType(ed)->getTypePtr()) ||
 
  653         typeCache[ed->getASTContext().getCanonicalTagType(ed)->getTypePtr()]));
 
  663  if (rd->isDependentType())
 
  668  if (recordDeclTypes.count(astContext.getCanonicalTagType(rd).getTypePtr()))
 
 
Defines the clang::ASTContext interface.
static bool isSafeToConvert(QualType qt, CIRGenTypes &cgt, llvm::SmallPtrSetImpl< const RecordDecl * > &alreadyChecked)
Return true if it is safe to convert this field type, which requires the record elements contained by...
static Decl::Kind getKind(const Decl *D)
C Language Family Type Representation.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
CanQualType getCanonicalTagType(const TagDecl *TD) const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
CanQualType getReturnType() const
const_arg_iterator argTypesEnd() const
static void Profile(llvm::FoldingSetNodeID &id, RequiredArgs required, CanQualType resultType, llvm::ArrayRef< CanQualType > argTypes)
const_arg_iterator argTypesBegin() const
static CIRGenFunctionInfo * create(CanQualType resultType, llvm::ArrayRef< CanQualType > argTypes, RequiredArgs required)
This class organizes the cross-function state that is used while generating CIR code.
DiagnosticBuilder errorNYI(SourceLocation, llvm::StringRef)
Helpers to emit "not yet implemented" error diagnostics.
This class handles record and union layout info while lowering AST types to CIR types.
bool isZeroInitializable() const
Check whether this struct can be C++ zero-initialized with a zeroinitializer.
This class organizes the cross-module state that is used while lowering AST types to CIR types.
const CIRGenFunctionInfo & arrangeGlobalDeclaration(GlobalDecl gd)
const CIRGenFunctionInfo & arrangeCXXStructorDeclaration(clang::GlobalDecl gd)
const CIRGenFunctionInfo & arrangeFreeFunctionType(CanQual< FunctionProtoType > fpt)
bool isZeroInitializable(clang::QualType ty)
Return whether a type can be zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
bool isFuncTypeConvertible(const clang::FunctionType *ft)
Utility to check whether a function type can be converted to a CIR type (i.e.
CIRGenTypes(CIRGenModule &cgm)
bool isRecordBeingLaidOut(const clang::Type *ty) const
CIRGenBuilderTy & getBuilder() const
mlir::MLIRContext & getMLIRContext() const
const CIRGenFunctionInfo & arrangeCIRFunctionInfo(CanQualType returnType, llvm::ArrayRef< CanQualType > argTypes, RequiredArgs required)
cir::FuncType getFunctionType(const CIRGenFunctionInfo &info)
Get the CIR function type for.
bool isFuncParamTypeConvertible(clang::QualType type)
Return true if the specified type in a function parameter or result position can be converted to a CI...
void updateCompletedType(const clang::TagDecl *td)
UpdateCompletedType - when we find the full definition for a TagDecl, replace the 'opaque' type we pr...
std::string getRecordTypeName(const clang::RecordDecl *, llvm::StringRef suffix)
bool noRecordsBeingLaidOut() const
const ABIInfo & getABIInfo() const
const CIRGenFunctionInfo & arrangeFunctionDeclaration(const clang::FunctionDecl *fd)
Free functions are functions that are compatible with an ordinary C function pointer type.
clang::ASTContext & getASTContext() const
bool isRecordLayoutComplete(const clang::Type *ty) const
Return true if the specified type is already completely laid out.
mlir::Type convertType(clang::QualType type)
Convert a Clang type into a mlir::Type.
const CIRGenRecordLayout & getCIRGenRecordLayout(const clang::RecordDecl *rd)
Return record layout info for the given record decl.
std::unique_ptr< CIRGenRecordLayout > computeRecordLayout(const clang::RecordDecl *rd, cir::RecordType *ty)
mlir::Type convertRecordDeclType(const clang::RecordDecl *recordDecl)
Lay out a tagged decl type like struct or union.
mlir::Type convertTypeForMem(clang::QualType, bool forBitField=false)
Convert type T into an mlir::Type.
A class for recording the number of arguments that a function signature requires.
Represents a base class of a C++ class.
Represents a C++ struct/union/class.
static CanQual< T > CreateUnsafe(QualType Other)
Builds a canonical type from a QualType.
bool isCanonicalAsParam() const
Determines if this canonical type is furthermore canonical as a parameter.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
Represents the canonical version of C arrays with a specified constant size.
llvm::APInt getSize() const
Return the constant array size as an APInt.
Represents a member of a struct/union/class.
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
GlobalDecl - represents a global declaration.
const Decl * getDecl() const
Represents a C array with an unspecified size.
A pointer to member type per C++ 8.3.3 - Pointers to members.
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.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
Represents a struct/union/class.
field_range fields() const
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Encodes a location in the source.
Represents the declaration of a struct/union/class/enum.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
The base class of the type hierarchy.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isConstantMatrixType() const
EnumDecl * castAsEnumDecl() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
unsigned getNumElements() const
QualType getElementType() const
Defines the clang::TargetInfo interface.
bool isSized(mlir::Type ty)
Returns true if the type is a CIR sized type.
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
const internal::VariadicDynCastAllOfMatcher< Decl, TypedefNameDecl > typedefNameDecl
Matches typedef name declarations.
const AstTypeMatcher< TagType > tagType
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< RecordType > recordType
const internal::VariadicDynCastAllOfMatcher< Decl, CXXRecordDecl > cxxRecordDecl
Matches C++ class declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, RecordDecl > recordDecl
Matches class, struct, and union declarations.
const internal::VariadicAllOfMatcher< QualType > qualType
Matches QualTypes in the clang AST.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
U cast(CodeGen::Address addr)
static bool skippedLayout()
static bool opCallCallConv()
static bool generateDebugInfo()
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressTagKeyword
Whether type printing should skip printing the tag keyword.
unsigned AlwaysIncludeTypeForTemplateArgument
Whether to use type suffixes (eg: 1U) on integral non-type template parameters.
unsigned SuppressInlineNamespace
Suppress printing parts of scope specifiers that correspond to inline namespaces.
unsigned PrintAsCanonical
Whether to print entities as written or canonically.