35#include "mlir/IR/BuiltinOps.h"
36#include "mlir/IR/Location.h"
37#include "mlir/IR/MLIRContext.h"
38#include "mlir/IR/Operation.h"
39#include "mlir/IR/Verifier.h"
48 case TargetCXXABI::GenericItanium:
49 case TargetCXXABI::GenericAArch64:
50 case TargetCXXABI::AppleARM64:
53 case TargetCXXABI::Fuchsia:
54 case TargetCXXABI::GenericARM:
55 case TargetCXXABI::iOS:
56 case TargetCXXABI::WatchOS:
57 case TargetCXXABI::GenericMIPS:
58 case TargetCXXABI::WebAssembly:
59 case TargetCXXABI::XL:
60 case TargetCXXABI::Microsoft:
61 cgm.
errorNYI(
"C++ ABI kind not yet implemented");
65 llvm_unreachable(
"invalid C++ ABI kind");
68CIRGenModule::CIRGenModule(mlir::MLIRContext &mlirContext,
72 : builder(mlirContext, *this), astContext(astContext),
73 langOpts(astContext.
getLangOpts()), codeGenOpts(cgo),
74 theModule{
mlir::ModuleOp::create(
mlir::UnknownLoc::get(&mlirContext))},
75 diags(diags), target(astContext.getTargetInfo()),
76 abi(
createCXXABI(*this)), genTypes(*this), vtables(*this) {
104 .toCharUnitsFromBits(
108 const unsigned charSize = astContext.getTargetInfo().getCharWidth();
112 const unsigned sizeTypeSize =
113 astContext.getTypeSize(astContext.getSignedSizeType());
114 SizeSizeInBytes = astContext.toCharUnitsFromBits(sizeTypeSize).getQuantity();
121 std::optional<cir::SourceLanguage> sourceLanguage = getCIRSourceLanguage();
124 cir::CIRDialect::getSourceLanguageAttrName(),
125 cir::SourceLanguageAttr::get(&mlirContext, *sourceLanguage));
126 theModule->setAttr(cir::CIRDialect::getTripleAttrName(),
127 builder.getStringAttr(
getTriple().str()));
129 if (cgo.OptimizationLevel > 0 || cgo.OptimizeSize > 0)
130 theModule->setAttr(cir::CIRDialect::getOptInfoAttrName(),
131 cir::OptInfoAttr::get(&mlirContext,
132 cgo.OptimizationLevel,
141 FileID mainFileId = astContext.getSourceManager().getMainFileID();
143 *astContext.getSourceManager().getFileEntryForID(mainFileId);
146 theModule.setSymName(path);
147 theModule->setLoc(mlir::FileLineColLoc::get(&mlirContext, path,
155void CIRGenModule::createCUDARuntime() {
167 auto &layout = astContext.getASTRecordLayout(rd);
172 return layout.getAlignment();
175 return layout.getNonVirtualAlignment();
189 if (
unsigned align = tt->getDecl()->getMaxAlignment()) {
192 return astContext.toCharUnitsFromBits(align);
198 t = astContext.getBaseElementType(t);
220 alignment = astContext.getTypeAlignInChars(t);
225 if (
unsigned maxAlign = astContext.getLangOpts().MaxTypeAlign) {
227 !astContext.isAlignmentRequired(t))
234 if (theTargetCIRGenInfo)
235 return *theTargetCIRGenInfo;
238 switch (triple.getArch()) {
245 case llvm::Triple::x86_64: {
246 switch (triple.getOS()) {
253 case llvm::Triple::Linux:
255 return *theTargetCIRGenInfo;
258 case llvm::Triple::nvptx:
259 case llvm::Triple::nvptx64:
261 return *theTargetCIRGenInfo;
266 assert(cLoc.
isValid() &&
"expected valid source location");
270 return mlir::FileLineColLoc::get(builder.getStringAttr(filename),
275 assert(cRange.
isValid() &&
"expected a valid source range");
278 mlir::Attribute metadata;
279 return mlir::FusedLoc::get({begin, end}, metadata, builder.getContext());
288 false, isForDefinition);
322 assert(op &&
"expected a valid global op");
330 mlir::Operation *globalValueOp = op;
331 if (
auto gv = dyn_cast<cir::GetGlobalOp>(op))
333 mlir::SymbolTable::lookupSymbolIn(
getModule(), gv.getNameAttr());
335 if (
auto cirGlobalValue =
336 dyn_cast<cir::CIRGlobalValueInterface>(globalValueOp))
337 if (!cirGlobalValue.isDeclaration())
362 std::vector<GlobalDecl> curDeclsToEmit;
381 if (
auto *
attr =
decl->getAttr<AttrT>())
382 return attr->isImplicit();
383 return decl->isImplicit();
388 assert(langOpts.CUDA &&
"Should not be called by non-CUDA languages");
393 return !langOpts.CUDAIsDevice || global->
hasAttr<CUDADeviceAttr>() ||
394 global->
hasAttr<CUDAConstantAttr>() ||
395 global->
hasAttr<CUDASharedAttr>() ||
401 if (
const auto *cd = dyn_cast<clang::OpenACCConstructDecl>(gd.
getDecl())) {
419 "Expected Variable or Function");
420 if (
const auto *
varDecl = dyn_cast<VarDecl>(global)) {
424 }
else if (langOpts.CUDAIsDevice) {
425 const auto *
functionDecl = dyn_cast<FunctionDecl>(global);
426 if ((!global->hasAttr<CUDADeviceAttr>() ||
427 (langOpts.OffloadImplicitHostDeviceTemplates &&
432 !
getASTContext().CUDAImplicitHostDeviceFunUsedByDevice.count(
434 !global->hasAttr<CUDAGlobalAttr>() &&
436 !global->hasAttr<CUDAHostAttr>()))
439 }
else if (!global->hasAttr<CUDAHostAttr>() &&
440 global->hasAttr<CUDADeviceAttr>())
444 if (
const auto *fd = dyn_cast<FunctionDecl>(global)) {
447 if (fd->hasAttr<AnnotateAttr>())
448 errorNYI(fd->getSourceRange(),
"deferredAnnotations");
449 if (!fd->doesThisDeclarationHaveABody()) {
450 if (!fd->doesDeclarationForceExternallyVisibleDefinition())
454 "function declaration that forces code gen");
459 assert(vd->isFileVarDecl() &&
"Cannot emit local var decl as global.");
461 !astContext.isMSStaticDataMemberInlineDefinition(vd)) {
465 if (astContext.getInlineVariableDefinitionKind(vd) ==
504 mlir::Operation *op) {
508 cir::FuncOp funcOp = dyn_cast_if_present<cir::FuncOp>(op);
509 if (!funcOp || funcOp.getFunctionType() != funcType) {
515 if (!funcOp.isDeclaration())
527 mlir::OpBuilder::InsertionGuard guard(builder);
532 setNonAliasAttributes(gd, funcOp);
535 auto getPriority = [
this](
const auto *
attr) ->
int {
539 return attr->DefaultPriority;
542 if (
const ConstructorAttr *ca = funcDecl->getAttr<ConstructorAttr>())
544 if (
const DestructorAttr *da = funcDecl->getAttr<DestructorAttr>())
547 if (funcDecl->getAttr<AnnotateAttr>())
548 errorNYI(funcDecl->getSourceRange(),
"deferredAnnotations");
553 std::optional<int> priority) {
562 ctor.setGlobalCtorPriority(priority);
567 std::optional<int> priority) {
568 if (codeGenOpts.RegisterGlobalDtorsWithAtExit &&
570 errorNYI(dtor.getLoc(),
"registerGlobalDtorsWithAtExit");
573 dtor.setGlobalDtorPriority(priority);
591 return mlir::SymbolTable::lookupSymbolIn(theModule, name);
595 mlir::Location loc, StringRef name,
596 mlir::Type t,
bool isConstant,
597 mlir::Operation *insertPoint) {
602 mlir::OpBuilder::InsertionGuard guard(builder);
608 builder.setInsertionPoint(insertPoint);
614 builder.setInsertionPointToStart(cgm.
getModule().getBody());
617 g = cir::GlobalOp::create(builder, loc, name, t, isConstant);
623 mlir::SymbolTable::setSymbolVisibility(
624 g, mlir::SymbolTable::Visibility::Private);
631 if (isa_and_nonnull<NamedDecl>(d))
637void CIRGenModule::setNonAliasAttributes(
GlobalDecl gd, mlir::Operation *op) {
648std::optional<cir::SourceLanguage> CIRGenModule::getCIRSourceLanguage()
const {
650 using CIRLang = cir::SourceLanguage;
655 if (opts.C99 || opts.C11 || opts.C17 || opts.C23 || opts.C2y ||
656 opts.LangStd == ClangStd::lang_c89 ||
657 opts.LangStd == ClangStd::lang_gnu89)
662 errorNYI(
"CIR does not yet support the given source language");
674 gv.
setLinkage(cir::GlobalLinkageKind::ExternalWeakLinkage);
681 assert(oldGV.getSymName() == newGV.getSymName() &&
"symbol names must match");
683 mlir::Type oldTy = oldGV.getSymType();
684 mlir::Type newTy = newGV.getSymType();
689 assert(oldTy != newTy &&
"expected type change in replaceGlobal");
692 std::optional<mlir::SymbolTable::UseRange> oldSymUses =
693 oldGV.getSymbolUses(theModule);
694 for (mlir::SymbolTable::SymbolUse use : *oldSymUses) {
695 mlir::Operation *userOp = use.getUser();
697 (mlir::isa<cir::GetGlobalOp, cir::GlobalOp, cir::ConstantOp>(userOp)) &&
698 "Unexpected user for global op");
700 if (
auto getGlobalOp = dyn_cast<cir::GetGlobalOp>(use.getUser())) {
701 mlir::Value useOpResultValue = getGlobalOp.getAddr();
702 useOpResultValue.setType(cir::PointerType::get(newTy));
704 mlir::OpBuilder::InsertionGuard guard(builder);
705 builder.setInsertionPointAfter(getGlobalOp);
706 mlir::Type ptrTy = builder.getPointerTo(oldTy);
708 builder.createBitcast(getGlobalOp->getLoc(), useOpResultValue, ptrTy);
709 useOpResultValue.replaceAllUsesExcept(
cast,
cast.getDefiningOp());
711 errorNYI(userOp->getLoc(),
"Replace global op use in global view attr");
751 if (entry.getSymType() == ty)
760 if (isForDefinition && !entry.isDeclaration()) {
769 if (!isForDefinition)
778 bool isConstant =
false;
783 astContext,
true, !needsDtor);
790 entry.getOperation());
810 if (langOpts.OpenMP && !langOpts.OpenMPSimd)
813 gv.setAlignmentAttr(
getSize(astContext.getDeclAlign(d)));
827 if (astContext.isMSStaticDataMemberInlineDefinition(d))
834 if (
getTriple().getArch() == llvm::Triple::xcore)
844 "external const declaration with initializer");
878 mlir::Type ptrTy = builder.getPointerTo(g.getSymType());
879 return cir::GetGlobalOp::create(
882 g.getStaticLocalGuard().has_value());
891 cir::PointerType ptrTy = builder.getPointerTo(globalOp.getSymType());
892 return builder.getGlobalViewAttr(ptrTy, globalOp);
905 bool isDefinitionAvailableExternally =
910 if (isDefinitionAvailableExternally &&
918 mlir::Attribute init;
919 bool needsGlobalCtor =
false;
920 bool needsGlobalDtor =
921 !isDefinitionAvailableExternally &&
926 std::optional<ConstantEmitter> emitter;
930 if (vd->
hasAttr<LoaderUninitializedAttr>()) {
933 }
else if (!initExpr) {
946 emitter.emplace(*
this);
947 mlir::Attribute initializer = emitter->tryEmitForInitializer(*initDecl);
957 if (!isDefinitionAvailableExternally)
958 needsGlobalCtor =
true;
972 if (mlir::isa<mlir::SymbolRefAttr>(init)) {
976 assert(mlir::isa<mlir::TypedAttr>(init) &&
"This should have a type");
977 auto typedInitAttr = mlir::cast<mlir::TypedAttr>(init);
978 initType = typedInitAttr.getType();
980 assert(!mlir::isa<mlir::NoneType>(initType) &&
"Should have a type by now");
986 if (!gv || gv.getSymType() != initType) {
993 if (vd->
hasAttr<AnnotateAttr>()) {
1004 emitter->finalize(gv);
1008 gv.setConstant((vd->
hasAttr<CUDAConstantAttr>() && langOpts.CUDAIsDevice) ||
1009 (!needsGlobalCtor && !needsGlobalDtor &&
1016 cir::GlobalLinkageKind linkage =
1020 gv.setLinkage(linkage);
1024 if (linkage == cir::GlobalLinkageKind::CommonLinkage) {
1026 gv.setConstant(
false);
1031 std::optional<mlir::Attribute> initializer = gv.getInitialValue();
1032 if (initializer && !
getBuilder().isNullValue(*initializer))
1033 gv.setLinkage(cir::GlobalLinkageKind::WeakAnyLinkage);
1036 setNonAliasAttributes(vd, gv);
1043 if (needsGlobalCtor || needsGlobalDtor)
1048 mlir::Operation *op) {
1050 if (
const auto *fd = dyn_cast<FunctionDecl>(
decl)) {
1054 if (
const auto *method = dyn_cast<CXXMethodDecl>(
decl)) {
1058 abi->emitCXXStructor(gd);
1059 else if (fd->isMultiVersion())
1060 errorNYI(method->getSourceRange(),
"multiversion functions");
1064 if (method->isVirtual())
1070 if (fd->isMultiVersion())
1071 errorNYI(fd->getSourceRange(),
"multiversion functions");
1076 if (
const auto *vd = dyn_cast<VarDecl>(
decl))
1079 llvm_unreachable(
"Invalid argument to CIRGenModule::emitGlobalDefinition");
1093 astContext.getAsConstantArrayType(e->
getType());
1094 uint64_t finalSize = cat->getZExtSize();
1095 str.resize(finalSize);
1097 mlir::Type eltTy =
convertType(cat->getElementType());
1098 return builder.getString(str, eltTy, finalSize);
1103 auto arrayEltTy = mlir::cast<cir::IntType>(arrayTy.getElementType());
1105 uint64_t arraySize = arrayTy.getSize();
1107 assert(arraySize == literalSize + 1 &&
1108 "wide string literal array size must be literal length plus null "
1113 bool isAllZero =
true;
1114 for (
unsigned i = 0; i < literalSize; ++i) {
1122 return cir::ZeroAttr::get(arrayTy);
1126 elements.reserve(arraySize);
1127 for (
unsigned i = 0; i < literalSize; ++i)
1128 elements.push_back(cir::IntAttr::get(arrayEltTy, e->
getCodeUnit(i)));
1130 elements.push_back(cir::IntAttr::get(arrayEltTy, 0));
1132 auto elementsAttr = mlir::ArrayAttr::get(&
getMLIRContext(), elements);
1133 return builder.getConstArray(elementsAttr, arrayTy);
1144 if (d.
hasAttr<SelectAnyAttr>())
1148 if (
auto *vd = dyn_cast<VarDecl>(&d))
1163 llvm_unreachable(
"No such linkage");
1169 if (
auto globalOp = dyn_cast_or_null<cir::GlobalOp>(op)) {
1170 globalOp.setComdat(
true);
1173 funcOp.setComdat(
true);
1179 genTypes.updateCompletedType(td);
1183 replacements[name] = op;
1186void CIRGenModule::replacePointerTypeArgs(cir::FuncOp oldF, cir::FuncOp newF) {
1187 std::optional<mlir::SymbolTable::UseRange> optionalUseRange =
1188 oldF.getSymbolUses(theModule);
1189 if (!optionalUseRange)
1192 for (
const mlir::SymbolTable::SymbolUse &u : *optionalUseRange) {
1194 auto call = mlir::dyn_cast<cir::CallOp>(u.getUser());
1198 for (
const auto [argOp, fnArgType] :
1199 llvm::zip(call.getArgs(), newF.getFunctionType().getInputs())) {
1200 if (argOp.getType() == fnArgType)
1206 errorNYI(call.getLoc(),
"replace call with mismatched types");
1211void CIRGenModule::applyReplacements() {
1212 for (
auto &i : replacements) {
1213 StringRef mangledName = i.first;
1214 mlir::Operation *replacement = i.second;
1220 auto newF = dyn_cast<cir::FuncOp>(replacement);
1223 errorNYI(replacement->getLoc(),
"replacement is not a function");
1229 replacePointerTypeArgs(oldF, newF);
1232 if (oldF.replaceAllSymbolUses(newF.getSymNameAttr(), theModule).failed())
1233 llvm_unreachable(
"internal error, cannot RAUW symbol");
1235 newF->moveBefore(oldF);
1242 mlir::Location loc, StringRef name, mlir::Type ty,
1244 auto gv = mlir::dyn_cast_or_null<cir::GlobalOp>(
1245 mlir::SymbolTable::lookupSymbolIn(theModule, name));
1249 if (gv.getSymType() == ty)
1255 assert(gv.isDeclaration() &&
"Declaration has wrong type!");
1257 errorNYI(loc,
"createOrReplaceCXXRuntimeVariable: declaration exists with "
1268 mlir::SymbolTable::setSymbolVisibility(gv,
1272 !gv.hasAvailableExternallyLinkage()) {
1276 gv.setAlignmentAttr(
getSize(alignment));
1287 if ((noCommon || vd->
hasAttr<NoCommonAttr>()) && !vd->
hasAttr<CommonAttr>())
1298 if (vd->
hasAttr<SectionAttr>())
1304 if (vd->
hasAttr<PragmaClangBSSSectionAttr>() ||
1305 vd->
hasAttr<PragmaClangDataSectionAttr>() ||
1306 vd->
hasAttr<PragmaClangRelroSectionAttr>() ||
1307 vd->
hasAttr<PragmaClangRodataSectionAttr>())
1315 if (vd->
hasAttr<WeakImportAttr>())
1325 if (vd->
hasAttr<AlignedAttr>())
1332 for (
const FieldDecl *fd : rd->fields()) {
1333 if (fd->isBitField())
1335 if (fd->hasAttr<AlignedAttr>())
1360 return cir::GlobalLinkageKind::InternalLinkage;
1362 if (dd->
hasAttr<WeakAttr>()) {
1363 if (isConstantVariable)
1364 return cir::GlobalLinkageKind::WeakODRLinkage;
1365 return cir::GlobalLinkageKind::WeakAnyLinkage;
1370 return cir::GlobalLinkageKind::LinkOnceAnyLinkage;
1375 return cir::GlobalLinkageKind::AvailableExternallyLinkage;
1389 return !astContext.getLangOpts().AppleKext
1390 ? cir::GlobalLinkageKind::LinkOnceODRLinkage
1391 : cir::GlobalLinkageKind::InternalLinkage;
1405 return cir::GlobalLinkageKind::ExternalLinkage;
1408 return dd->
hasAttr<CUDAGlobalAttr>()
1409 ? cir::GlobalLinkageKind::ExternalLinkage
1410 : cir::GlobalLinkageKind::InternalLinkage;
1411 return cir::GlobalLinkageKind::WeakODRLinkage;
1419 return cir::GlobalLinkageKind::CommonLinkage;
1425 if (dd->
hasAttr<SelectAnyAttr>())
1426 return cir::GlobalLinkageKind::WeakODRLinkage;
1430 return cir::GlobalLinkageKind::ExternalLinkage;
1442 mlir::Operation *old, cir::FuncOp newFn) {
1444 auto oldFn = mlir::dyn_cast<cir::FuncOp>(old);
1452 if (oldFn->getAttrs().size() <= 1)
1454 "replaceUsesOfNonProtoTypeWithRealFunction: Attribute forwarding");
1457 newFn.setNoProto(oldFn.getNoProto());
1460 std::optional<mlir::SymbolTable::UseRange> symUses =
1461 oldFn.getSymbolUses(oldFn->getParentOp());
1462 for (
const mlir::SymbolTable::SymbolUse &use : symUses.value()) {
1463 mlir::OpBuilder::InsertionGuard guard(builder);
1465 if (
auto noProtoCallOp = mlir::dyn_cast<cir::CallOp>(use.getUser())) {
1466 builder.setInsertionPoint(noProtoCallOp);
1469 cir::CallOp realCallOp = builder.createCallOp(
1470 noProtoCallOp.getLoc(), newFn, noProtoCallOp.getOperands());
1473 noProtoCallOp.replaceAllUsesWith(realCallOp);
1474 noProtoCallOp.erase();
1475 }
else if (
auto getGlobalOp =
1476 mlir::dyn_cast<cir::GetGlobalOp>(use.getUser())) {
1478 getGlobalOp.getAddr().setType(
1479 cir::PointerType::get(newFn.getFunctionType()));
1482 "replaceUsesOfNonProtoTypeWithRealFunction: unexpected use");
1487cir::GlobalLinkageKind
1489 assert(!isConstant &&
"constant variables NYI");
1490 GVALinkage linkage = astContext.GetGVALinkageForVariable(vd);
1497 GVALinkage linkage = astContext.GetGVALinkageForFunction(d);
1499 if (
const auto *dtor = dyn_cast<CXXDestructorDecl>(d))
1508 StringRef globalName,
CharUnits alignment) {
1514 cgm, loc, globalName,
c.getType(), !cgm.
getLangOpts().WritableStrings);
1517 gv.setAlignmentAttr(cgm.
getSize(alignment));
1519 cir::GlobalLinkageKindAttr::get(cgm.
getBuilder().getContext(), lt));
1523 if (gv.isWeakForLinker()) {
1524 assert(cgm.
supportsCOMDAT() &&
"Only COFF uses weak string literals");
1527 cgm.
setDSOLocal(
static_cast<mlir::Operation *
>(gv));
1548 std::string result =
1551 assert(!mlir::SymbolTable::lookupSymbolIn(theModule, result));
1559 astContext.getAlignOfGlobalVarInChars(
s->getType(),
nullptr);
1567 if (!gv.getAlignment() ||
1568 uint64_t(alignment.
getQuantity()) > *gv.getAlignment())
1569 gv.setAlignmentAttr(
getSize(alignment));
1574 if (
getCXXABI().getMangleContext().shouldMangleStringLiteral(
s) &&
1577 "getGlobalForStringLiteral: mangle string literals");
1585 mlir::Location loc =
s->getBeginLoc().isValid()
1587 : builder.getUnknownLoc();
1588 auto typedC = llvm::cast<mlir::TypedAttr>(
c);
1590 cir::GlobalLinkageKind::PrivateLinkage, *
this,
1591 uniqueName, alignment);
1605 auto arrayTy = mlir::dyn_cast<cir::ArrayType>(gv.getSymType());
1606 assert(arrayTy &&
"String literal must be array");
1610 return builder.getGlobalViewAttr(ptrTy, gv);
1626 errorNYI(
"SYCL or OpenMP temp address space");
1636 "emitExplicitCastExprType");
1647 if (
const auto *methodDecl = dyn_cast<CXXMethodDecl>(
decl)) {
1649 if (methodDecl->isVirtual())
1650 return cir::ConstantOp::create(
1651 builder, loc,
getCXXABI().buildVirtualMethodAttr(ty, methodDecl));
1654 return cir::ConstantOp::create(builder, loc,
1655 builder.getMethodAttr(ty, methodFuncOp));
1661 return cir::ConstantOp::create(
1662 builder, loc, builder.getDataMemberAttr(ty,
fieldDecl->getFieldIndex()));
1672 if (
auto *oid = dyn_cast<ObjCImplDecl>(
decl))
1673 errorNYI(oid->getSourceRange(),
"emitDeclConext: ObjCImplDecl");
1683 if (
decl->isTemplated())
1686 switch (
decl->getKind()) {
1689 decl->getDeclKindName());
1692 case Decl::CXXConversion:
1693 case Decl::CXXMethod:
1694 case Decl::Function: {
1697 if (!fd->isConsteval())
1703 case Decl::Decomposition:
1704 case Decl::VarTemplateSpecialization: {
1707 errorNYI(
decl->getSourceRange(),
"global variable decompositions");
1713 case Decl::OpenACCRoutine:
1716 case Decl::OpenACCDeclare:
1719 case Decl::OMPThreadPrivate:
1722 case Decl::OMPGroupPrivate:
1725 case Decl::OMPAllocate:
1728 case Decl::OMPCapturedExpr:
1731 case Decl::OMPDeclareReduction:
1734 case Decl::OMPDeclareMapper:
1737 case Decl::OMPRequires:
1742 case Decl::UsingDirective:
1743 case Decl::UsingEnum:
1744 case Decl::NamespaceAlias:
1746 case Decl::TypeAlias:
1752 case Decl::ClassTemplate:
1754 case Decl::CXXDeductionGuide:
1756 case Decl::FunctionTemplate:
1757 case Decl::StaticAssert:
1758 case Decl::TypeAliasTemplate:
1759 case Decl::UsingShadow:
1760 case Decl::VarTemplate:
1761 case Decl::VarTemplatePartialSpecialization:
1764 case Decl::CXXConstructor:
1767 case Decl::CXXDestructor:
1772 case Decl::LinkageSpec:
1773 case Decl::Namespace:
1777 case Decl::ClassTemplateSpecialization:
1778 case Decl::CXXRecord: {
1781 for (
auto *childDecl : crd->
decls())
1787 case Decl::FileScopeAsm:
1789 if (langOpts.CUDA && langOpts.CUDAIsDevice)
1792 if (langOpts.OpenMPIsTargetDevice)
1795 if (langOpts.SYCLIsDevice)
1798 std::string line = file_asm->getAsmString();
1799 globalScopeAsm.push_back(builder.getStringAttr(line));
1806 op.setInitialValueAttr(value);
1820 md->getParent()->getNumVBases() == 0)
1822 "getAddrAndTypeOfCXXStructor: MS ABI complete destructor");
1833 false, isForDefinition);
1835 return {fnType, fn};
1839 mlir::Type funcType,
bool forVTable,
1843 "consteval function should never be emitted");
1853 if (
const auto *dd = dyn_cast<CXXDestructorDecl>(gd.
getDecl())) {
1856 dd->getParent()->getNumVBases() == 0)
1858 "getAddrOfFunction: MS ABI complete destructor");
1864 false, isForDefinition);
1866 if (langOpts.CUDA && !langOpts.CUDAIsDevice &&
1872 bool isHIPHandle = mlir::isa<cir::GlobalOp>(*handle);
1873 if (isForDefinition || isHIPHandle)
1875 return mlir::dyn_cast<cir::FuncOp>(*handle);
1884 llvm::raw_svector_ostream
out(buffer);
1893 assert(ii &&
"Attempt to mangle unnamed decl.");
1895 const auto *fd = dyn_cast<FunctionDecl>(nd);
1899 }
else if (fd && fd->hasAttr<CUDAGlobalAttr>() &&
1903 DeviceKernelAttr::isOpenCLSpelling(
1904 fd->getAttr<DeviceKernelAttr>()) &&
1921 if (
const auto *fd = dyn_cast<FunctionDecl>(nd)) {
1922 if (fd->isMultiVersion()) {
1924 "getMangledName: multi-version functions");
1929 "getMangledName: GPU relocatable device code");
1932 return std::string(
out.str());
1935static FunctionDecl *
1950 if (
auto *methodDecl = dyn_cast<CXXMethodDecl>(protoFunc);
1951 methodDecl && methodDecl->isImplicitObjectMemberFunction()) {
1953 paramTypes.insert(paramTypes.begin(), methodDecl->getThisType());
1956 fpt->getExtProtoInfo());
1967 params.reserve(fpt->getNumParams());
1970 for (
unsigned i = 0, e = fpt->getNumParams(); i != e; ++i) {
1974 nullptr, fpt->getParamType(i),
nullptr,
1977 params.push_back(parm);
1980 tempFunc->setParams(params);
2005 if (
const auto *cd = dyn_cast<CXXConstructorDecl>(canonicalGd.
getDecl())) {
2008 "getMangledName: C++ constructor without variants");
2017 auto result = manglings.insert(std::make_pair(mangledName, gd));
2018 return mangledDeclNames[canonicalGd] = result.first->first();
2022 assert(!d->
getInit() &&
"Cannot emit definite definitions here!");
2030 if (gv && !mlir::cast<cir::GlobalOp>(gv).isDeclaration())
2046 if (langOpts.EmitAllDecls)
2049 const auto *vd = dyn_cast<VarDecl>(global);
2051 ((codeGenOpts.KeepPersistentStorageVariables &&
2052 (vd->getStorageDuration() ==
SD_Static ||
2053 vd->getStorageDuration() ==
SD_Thread)) ||
2054 (codeGenOpts.KeepStaticConsts && vd->getStorageDuration() ==
SD_Static &&
2055 vd->getType().isConstQualified())))
2068 if (langOpts.OpenMP >= 50 && !langOpts.OpenMPSimd) {
2069 std::optional<OMPDeclareTargetDeclAttr *> activeAttr =
2070 OMPDeclareTargetDeclAttr::getActiveAttr(global);
2071 if (!activeAttr || (*activeAttr)->getLevel() != (
unsigned)-1)
2075 const auto *fd = dyn_cast<FunctionDecl>(global);
2082 if (fd->hasAttr<TargetVersionAttr>() && !fd->isMultiVersion())
2084 if (langOpts.SYCLIsDevice) {
2085 errorNYI(fd->getSourceRange(),
"mayBeEmittedEagerly: SYCL");
2089 const auto *vd = dyn_cast<VarDecl>(global);
2091 if (astContext.getInlineVariableDefinitionKind(vd) ==
2099 if (langOpts.OpenMP && langOpts.OpenMPUseTLS &&
2100 astContext.getTargetInfo().isTLSSupported() &&
isa<VarDecl>(global) &&
2102 !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(global))
2105 assert((fd || vd) &&
2106 "Only FunctionDecl and VarDecl should hit this path so far.");
2111 cir::CIRGlobalValueInterface gv) {
2112 if (gv.hasLocalLinkage())
2115 if (!gv.hasDefaultVisibility() && !gv.hasExternalWeakLinkage())
2123 const llvm::Triple &tt = cgm.
getTriple();
2125 if (tt.isOSCygMing()) {
2134 cgm.
errorNYI(
"shouldAssumeDSOLocal: MinGW");
2140 if (tt.isOSBinFormatCOFF() && gv.hasExternalWeakLinkage())
2148 if (tt.isOSBinFormatCOFF() || (tt.isOSWindows() && tt.isOSBinFormatMachO()))
2152 if (!tt.isOSBinFormatELF())
2157 if (rm != llvm::Reloc::Static && !lOpts.PIE) {
2165 return !(lOpts.SemanticInterposition || lOpts.HalfNoSemanticInterposition);
2169 if (!gv.isDeclarationForLinker())
2175 if (rm == llvm::Reloc::PIC_ && gv.hasExternalWeakLinkage())
2182 if (cgOpts.DirectAccessExternalData) {
2188 if (
auto globalOp = dyn_cast<cir::GlobalOp>(gv.getOperation())) {
2221 if (
auto globalValue = dyn_cast<cir::CIRGlobalValueInterface>(op))
2240 auto res = manglings.find(mangledName);
2241 if (res == manglings.end())
2243 result = res->getValue();
2250 return cir::TLS_Model::GeneralDynamic;
2252 return cir::TLS_Model::LocalDynamic;
2254 return cir::TLS_Model::InitialExec;
2256 return cir::TLS_Model::LocalExec;
2258 llvm_unreachable(
"Invalid TLS model!");
2262 assert(d.
getTLSKind() &&
"setting TLS mode on non-TLS var!");
2267 if (d.
getAttr<TLSModelAttr>())
2271 global.setTlsModel(tlm);
2276 cir::FuncOp func,
bool isThunk) {
2278 cir::CallingConv callingConv;
2279 cir::SideEffect sideEffect;
2286 mlir::NamedAttrList pal{};
2287 std::vector<mlir::NamedAttrList> argAttrs(info.
arguments().size());
2288 mlir::NamedAttrList retAttrs{};
2290 retAttrs, callingConv, sideEffect,
2293 for (mlir::NamedAttribute
attr : pal)
2294 func->setAttr(
attr.getName(),
attr.getValue());
2296 llvm::for_each(llvm::enumerate(argAttrs), [func](
auto idx_arg_pair) {
2297 mlir::function_interface_impl::setArgAttrs(func, idx_arg_pair.index(),
2298 idx_arg_pair.value());
2300 if (!retAttrs.empty())
2301 mlir::function_interface_impl::setResultAttrs(func, 0, retAttrs);
2314 bool isIncompleteFunction,
2320 if (!isIncompleteFunction)
2322 getTypes().arrangeGlobalDeclaration(globalDecl),
2338 if (fd->isInlineBuiltinDeclaration()) {
2340 bool hasBody = fd->
hasBody(fdBody);
2342 assert(hasBody &&
"Inline builtin declarations should always have an "
2353 std::optional<cir::InlineKind> existingInlineKind = f.getInlineKind();
2355 existingInlineKind && *existingInlineKind == cir::InlineKind::NoInline;
2356 bool isAlwaysInline = existingInlineKind &&
2357 *existingInlineKind == cir::InlineKind::AlwaysInline;
2361 if (!isAlwaysInline &&
2366 f.setInlineKind(cir::InlineKind::NoInline);
2381 if (
decl->hasAttr<NoInlineAttr>() && !isAlwaysInline) {
2383 f.setInlineKind(cir::InlineKind::NoInline);
2384 }
else if (
decl->hasAttr<AlwaysInlineAttr>() && !isNoInline) {
2387 f.setInlineKind(cir::InlineKind::AlwaysInline);
2391 if (!isAlwaysInline)
2392 f.setInlineKind(cir::InlineKind::NoInline);
2397 if (
auto *fd = dyn_cast<FunctionDecl>(
decl)) {
2402 auto checkRedeclForInline = [](
const FunctionDecl *redecl) {
2403 return redecl->isInlineSpecified();
2405 if (any_of(
decl->redecls(), checkRedeclForInline))
2410 return any_of(pattern->
redecls(), checkRedeclForInline);
2412 if (checkForInline(fd)) {
2413 f.setInlineKind(cir::InlineKind::InlineHint);
2414 }
else if (codeGenOpts.getInlining() ==
2416 !fd->isInlined() && !isAlwaysInline) {
2417 f.setInlineKind(cir::InlineKind::NoInline);
2426 StringRef mangledName, mlir::Type funcType,
GlobalDecl gd,
bool forVTable,
2428 mlir::NamedAttrList extraAttrs) {
2431 if (
const auto *fd = cast_or_null<FunctionDecl>(d)) {
2433 if (
getLangOpts().OpenMPIsTargetDevice && fd->isDefined() && !dontDefer &&
2436 "getOrCreateCIRFunction: OpenMP target function");
2440 if (fd->isMultiVersion())
2441 errorNYI(fd->getSourceRange(),
"getOrCreateCIRFunction: multi-version");
2447 assert(mlir::isa<cir::FuncOp>(entry));
2452 if (d && !d->
hasAttr<DLLImportAttr>() && !d->
hasAttr<DLLExportAttr>()) {
2460 if (isForDefinition && fn && !fn.isDeclaration()) {
2467 diagnosedConflictingDefinitions.insert(gd).second) {
2471 diag::note_previous_definition);
2475 if (fn && fn.getFunctionType() == funcType) {
2479 if (!isForDefinition) {
2487 auto *funcDecl = llvm::cast_or_null<FunctionDecl>(gd.
getDecl());
2488 bool invalidLoc = !funcDecl ||
2489 funcDecl->getSourceRange().getBegin().isInvalid() ||
2490 funcDecl->getSourceRange().getEnd().isInvalid();
2492 invalidLoc ? theModule->getLoc() :
getLoc(funcDecl->getSourceRange()),
2493 mangledName, mlir::cast<cir::FuncType>(funcType), funcDecl);
2504 auto symbolOp = mlir::cast<mlir::SymbolOpInterface>(entry);
2512 if (symbolOp.getSymbolUses(symbolOp->getParentOp()))
2521 if (!extraAttrs.empty()) {
2522 extraAttrs.append(funcOp->getAttrs());
2523 funcOp->setAttrs(extraAttrs);
2530 assert(funcOp.getFunctionType() == funcType);
2537 if (isa_and_nonnull<CXXDestructorDecl>(d) &&
2567 fd = fd->getPreviousDecl()) {
2569 if (fd->doesThisDeclarationHaveABody()) {
2582 cir::FuncType funcType,
2586 mlir::OpBuilder::InsertionGuard guard(builder);
2594 builder.setInsertionPoint(cgf->
curFn);
2596 func = cir::FuncOp::create(builder, loc, name, funcType);
2601 func.setNoProto(
true);
2603 assert(func.isDeclaration() &&
"expected empty body");
2607 func.setLinkageAttr(cir::GlobalLinkageKindAttr::get(
2609 mlir::SymbolTable::setSymbolVisibility(
2610 func, mlir::SymbolTable::Visibility::Private);
2618 theModule.push_back(func);
2623 for (
const auto *
attr :
2637 fnOp.setBuiltin(
true);
2643 return cir::CtorKind::Default;
2645 return cir::CtorKind::Copy;
2647 return cir::CtorKind::Move;
2648 return cir::CtorKind::Custom;
2653 return cir::AssignKind::Copy;
2655 return cir::AssignKind::Move;
2656 llvm_unreachable(
"not a copy or move assignment operator");
2664 if (
const auto *dtor = dyn_cast<CXXDestructorDecl>(funcDecl)) {
2665 auto cxxDtor = cir::CXXDtorAttr::get(
2668 funcOp.setCxxSpecialMemberAttr(cxxDtor);
2672 if (
const auto *ctor = dyn_cast<CXXConstructorDecl>(funcDecl)) {
2674 auto cxxCtor = cir::CXXCtorAttr::get(
2676 kind, ctor->isTrivial());
2677 funcOp.setCxxSpecialMemberAttr(cxxCtor);
2681 const auto *method = dyn_cast<CXXMethodDecl>(funcDecl);
2682 if (method && (method->isCopyAssignmentOperator() ||
2683 method->isMoveAssignmentOperator())) {
2685 auto cxxAssign = cir::CXXAssignAttr::get(
2687 assignKind, method->isTrivial());
2688 funcOp.setCxxSpecialMemberAttr(cxxAssign);
2694 cir::FuncOp funcOp, StringRef name) {
2710 mlir::NamedAttrList extraAttrs,
2712 bool assumeConvergent) {
2713 if (assumeConvergent)
2714 errorNYI(
"createRuntimeFunction: assumeConvergent");
2724 entry.setDSOLocal(
true);
2730mlir::SymbolTable::Visibility
2734 if (op.isDeclaration())
2735 return mlir::SymbolTable::Visibility::Private;
2739mlir::SymbolTable::Visibility
2742 case cir::GlobalLinkageKind::InternalLinkage:
2743 case cir::GlobalLinkageKind::PrivateLinkage:
2744 return mlir::SymbolTable::Visibility::Private;
2745 case cir::GlobalLinkageKind::ExternalLinkage:
2746 case cir::GlobalLinkageKind::ExternalWeakLinkage:
2747 case cir::GlobalLinkageKind::LinkOnceODRLinkage:
2748 case cir::GlobalLinkageKind::AvailableExternallyLinkage:
2749 case cir::GlobalLinkageKind::CommonLinkage:
2750 case cir::GlobalLinkageKind::WeakAnyLinkage:
2751 case cir::GlobalLinkageKind::WeakODRLinkage:
2752 return mlir::SymbolTable::Visibility::Public;
2754 llvm::errs() <<
"visibility not implemented for '"
2755 << stringifyGlobalLinkageKind(glk) <<
"'\n";
2756 assert(0 &&
"not implemented");
2759 llvm_unreachable(
"linkage should be handled above!");
2763 clang::VisibilityAttr::VisibilityType visibility) {
2764 switch (visibility) {
2765 case clang::VisibilityAttr::VisibilityType::Default:
2766 return cir::VisibilityKind::Default;
2767 case clang::VisibilityAttr::VisibilityType::Hidden:
2768 return cir::VisibilityKind::Hidden;
2769 case clang::VisibilityAttr::VisibilityType::Protected:
2770 return cir::VisibilityKind::Protected;
2772 llvm_unreachable(
"unexpected visibility value");
2777 const clang::VisibilityAttr *va =
decl->getAttr<clang::VisibilityAttr>();
2778 cir::VisibilityAttr cirVisibility =
2781 cirVisibility = cir::VisibilityAttr::get(
2785 return cirVisibility;
2790 applyReplacements();
2792 theModule->setAttr(cir::CIRDialect::getModuleLevelAsmAttrName(),
2793 builder.getArrayAttr(globalScopeAsm));
2801 cir::FuncOp aliasee,
2802 cir::GlobalLinkageKind linkage) {
2804 auto *aliasFD = dyn_cast<FunctionDecl>(aliasGD.
getDecl());
2805 assert(aliasFD &&
"expected FunctionDecl");
2816 mangledName, fnType, aliasFD);
2817 alias.setAliasee(aliasee.getName());
2818 alias.setLinkage(linkage);
2822 mlir::SymbolTable::setSymbolVisibility(
2823 alias, mlir::SymbolTable::Visibility::Private);
2830 errorNYI(aliasFD->getSourceRange(),
"emitAliasForGlobal: previous uses");
2840 return genTypes.convertType(
type);
2847 return mlir::verify(theModule).succeeded();
2856 return builder.getConstNullPtrAttr(builder.getUInt8PtrTy());
2859 langOpts.ObjCRuntime.isGNUFamily()) {
2860 errorNYI(loc,
"getAddrOfRTTIDescriptor: Objc PtrType & Objc RT GUN");
2870 llvm::iterator_range<CastExpr::path_const_iterator> path) {
2877 assert(!base->isVirtual() &&
"Should not see virtual bases here!");
2882 const auto *baseDecl = base->getType()->castAsCXXRecordDecl();
2894 llvm::StringRef feature) {
2895 unsigned diagID = diags.getCustomDiagID(
2897 return diags.Report(loc, diagID) << feature;
2901 llvm::StringRef feature) {
2913 "cannot compile this %0 yet");
2914 diags.Report(astContext.getFullLoc(
s->getBeginLoc()), diagId)
2915 <<
type <<
s->getSourceRange();
2921 "cannot compile this %0 yet");
2922 diags.Report(astContext.getFullLoc(d->
getLocation()), diagId) <<
type;
2926 cir::LabelOp label) {
2927 [[maybe_unused]]
auto result =
2929 assert(result.second &&
2930 "attempting to map a blockaddress info that is already mapped");
2935 assert(result.second &&
2936 "attempting to map a blockaddress operation that is already mapped");
2940 cir::LabelOp label) {
2942 assert(result.second &&
2943 "attempting to map a blockaddress operation that is already mapped");
2947 cir::LabelOp newLabel) {
2950 "trying to update a blockaddress not previously mapped");
2951 assert(!it->second &&
"blockaddress already has a resolved label");
2953 it->second = newLabel;
2966 "not a global temporary");
2973 materializedType = mte->
getType();
2977 auto insertResult = materializedGlobalTemporaryMap.insert({mte,
nullptr});
2978 if (!insertResult.second)
2985 llvm::raw_svector_ostream
out(name);
3003 value = &evalResult.
Val;
3007 std::optional<ConstantEmitter> emitter;
3008 mlir::Attribute initialValue =
nullptr;
3009 bool isConstant =
false;
3013 emitter.emplace(*
this);
3014 initialValue = emitter->emitForInitializer(*value, materializedType);
3019 type = mlir::cast<mlir::TypedAttr>(initialValue).getType();
3027 cir::GlobalLinkageKind linkage =
3029 if (linkage == cir::GlobalLinkageKind::ExternalLinkage) {
3031 if (
varDecl->isStaticDataMember() &&
varDecl->getAnyInitializer(initVD) &&
3039 linkage = cir::GlobalLinkageKind::InternalLinkage;
3044 gv.setInitialValueAttr(initialValue);
3047 emitter->finalize(gv);
3049 if (!gv.hasLocalLinkage()) {
3054 gv.setAlignment(align.getAsAlign().value());
3057 "Global temporary with comdat/weak linkage");
3060 "Global temporary with thread local storage");
3061 mlir::Operation *cv = gv;
3067 mlir::Operation *&entry = materializedGlobalTemporaryMap[mte];
3069 entry->replaceAllUsesWith(cv);
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static bool shouldAssumeDSOLocal(const CIRGenModule &cgm, cir::CIRGlobalValueInterface gv)
static cir::AssignKind getAssignKindFromDecl(const CXXMethodDecl *method)
static FunctionDecl * createOpenACCBindTempFunction(ASTContext &ctx, const IdentifierInfo *bindName, const FunctionDecl *protoFunc)
static bool shouldBeInCOMDAT(CIRGenModule &cgm, const Decl &d)
static void setWindowsItaniumDLLImport(CIRGenModule &cgm, bool isLocal, cir::FuncOp funcOp, StringRef name)
static std::string getMangledNameImpl(CIRGenModule &cgm, GlobalDecl gd, const NamedDecl *nd)
static cir::GlobalOp generateStringLiteral(mlir::Location loc, mlir::TypedAttr c, cir::GlobalLinkageKind lt, CIRGenModule &cgm, StringRef globalName, CharUnits alignment)
static bool hasImplicitAttr(const ValueDecl *decl)
static CIRGenCXXABI * createCXXABI(CIRGenModule &cgm)
static bool isVarDeclStrongDefinition(const ASTContext &astContext, CIRGenModule &cgm, const VarDecl *vd, bool noCommon)
static void setLinkageForGV(cir::GlobalOp &gv, const NamedDecl *nd)
static cir::CtorKind getCtorKindFromDecl(const CXXConstructorDecl *ctor)
This file defines OpenACC nodes for declarative directives.
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
Defines the SourceManager interface.
__device__ __2f16 float __ockl_bool s
__device__ __2f16 float c
cir::PointerType getPointerTo(mlir::Type ty)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
void Deallocate(void *Ptr) const
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
bool isAlignmentRequired(const Type *T) const
Determine if the alignment the type has was required using an alignment attribute.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const
Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
const TargetInfo & getTargetInfo() const
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
virtual mlir::Operation * getKernelHandle(cir::FuncOp fn, GlobalDecl gd)=0
Implements C++ ABI-specific code generation functions.
virtual mlir::Attribute getAddrOfRTTIDescriptor(mlir::Location loc, QualType ty)=0
virtual void emitCXXConstructors(const clang::CXXConstructorDecl *d)=0
Emit constructor variants required by this ABI.
virtual void emitCXXDestructors(const clang::CXXDestructorDecl *d)=0
Emit dtor variants required by this ABI.
clang::MangleContext & getMangleContext()
Gets the mangle context.
virtual cir::GlobalLinkageKind getCXXDestructorLinkage(GVALinkage linkage, const CXXDestructorDecl *dtor, CXXDtorType dt) const
llvm::ArrayRef< CanQualType > arguments() const
cir::FuncOp generateCode(clang::GlobalDecl gd, cir::FuncOp fn, cir::FuncType funcType)
void emitVariablyModifiedType(QualType ty)
mlir::Operation * curFn
The current function or global initializer that is generated code for.
This class organizes the cross-function state that is used while generating CIR code.
void updateResolvedBlockAddress(cir::BlockAddressOp op, cir::LabelOp newLabel)
void replaceUsesOfNonProtoTypeWithRealFunction(mlir::Operation *old, cir::FuncOp newFn)
This function is called when we implement a function with no prototype, e.g.
llvm::StringRef getMangledName(clang::GlobalDecl gd)
CharUnits computeNonVirtualBaseClassOffset(const CXXRecordDecl *derivedClass, llvm::iterator_range< CastExpr::path_const_iterator > path)
void setGlobalVisibility(mlir::Operation *op, const NamedDecl *d) const
Set the visibility for the given global.
DiagnosticBuilder errorNYI(SourceLocation, llvm::StringRef)
Helpers to emit "not yet implemented" error diagnostics.
void emitDeferred()
Emit any needed decls for which code generation was deferred.
clang::ASTContext & getASTContext() const
cir::FuncOp getAddrOfCXXStructor(clang::GlobalDecl gd, const CIRGenFunctionInfo *fnInfo=nullptr, cir::FuncType fnType=nullptr, bool dontDefer=false, ForDefinition_t isForDefinition=NotForDefinition)
CIRGenCUDARuntime & getCUDARuntime()
llvm::DenseMap< cir::BlockAddrInfoAttr, cir::LabelOp > blockAddressInfoToLabel
Map BlockAddrInfoAttr (function name, label name) to the corresponding CIR LabelOp.
void emitTopLevelDecl(clang::Decl *decl)
void emitOMPDeclareMapper(const OMPDeclareMapperDecl *d)
void addReplacement(llvm::StringRef name, mlir::Operation *op)
mlir::Type convertType(clang::QualType type)
bool shouldEmitRTTI(bool forEH=false)
cir::GlobalOp getGlobalForStringLiteral(const StringLiteral *s, llvm::StringRef name=".str")
Return a global symbol reference to a constant array for the given string literal.
void emitOMPCapturedExpr(const OMPCapturedExprDecl *d)
void mapUnresolvedBlockAddress(cir::BlockAddressOp op)
bool mustBeEmitted(const clang::ValueDecl *d)
Determine whether the definition must be emitted; if this returns false, the definition can be emitte...
void emitGlobalOpenACCDeclareDecl(const clang::OpenACCDeclareDecl *cd)
mlir::IntegerAttr getSize(CharUnits size)
CIRGenBuilderTy & getBuilder()
void setDSOLocal(mlir::Operation *op) const
std::string getUniqueGlobalName(const std::string &baseName)
std::pair< cir::FuncType, cir::FuncOp > getAddrAndTypeOfCXXStructor(clang::GlobalDecl gd, const CIRGenFunctionInfo *fnInfo=nullptr, cir::FuncType fnType=nullptr, bool dontDefer=false, ForDefinition_t isForDefinition=NotForDefinition)
void setGVProperties(mlir::Operation *op, const NamedDecl *d) const
Set visibility, dllimport/dllexport and dso_local.
cir::GlobalOp getOrCreateCIRGlobal(llvm::StringRef mangledName, mlir::Type ty, LangAS langAS, const VarDecl *d, ForDefinition_t isForDefinition)
If the specified mangled name is not in the module, create and return an mlir::GlobalOp value.
cir::FuncOp createCIRBuiltinFunction(mlir::Location loc, llvm::StringRef name, cir::FuncType ty, const clang::FunctionDecl *fd)
Create a CIR function with builtin attribute set.
void emitGlobalOpenACCRoutineDecl(const clang::OpenACCRoutineDecl *cd)
clang::CharUnits getClassPointerAlignment(const clang::CXXRecordDecl *rd)
Return the best known alignment for an unknown pointer to a particular class.
void handleCXXStaticMemberVarInstantiation(VarDecl *vd)
Tell the consumer that this variable has been instantiated.
void emitOMPRequiresDecl(const OMPRequiresDecl *d)
void emitGlobalDefinition(clang::GlobalDecl gd, mlir::Operation *op=nullptr)
void mapResolvedBlockAddress(cir::BlockAddressOp op, cir::LabelOp)
clang::DiagnosticsEngine & getDiags() const
mlir::Attribute getAddrOfRTTIDescriptor(mlir::Location loc, QualType ty, bool forEH=false)
Get the address of the RTTI descriptor for the given type.
void setFunctionAttributes(GlobalDecl gd, cir::FuncOp f, bool isIncompleteFunction, bool isThunk)
Set function attributes for a function declaration.
static mlir::SymbolTable::Visibility getMLIRVisibilityFromCIRLinkage(cir::GlobalLinkageKind GLK)
const clang::TargetInfo & getTarget() const
void setCIRFunctionAttributes(GlobalDecl gd, const CIRGenFunctionInfo &info, cir::FuncOp func, bool isThunk)
Set the CIR function attributes (Sext, zext, etc).
const llvm::Triple & getTriple() const
static mlir::SymbolTable::Visibility getMLIRVisibility(Visibility v)
void emitTentativeDefinition(const VarDecl *d)
cir::GlobalOp createOrReplaceCXXRuntimeVariable(mlir::Location loc, llvm::StringRef name, mlir::Type ty, cir::GlobalLinkageKind linkage, clang::CharUnits alignment)
Will return a global variable of the given type.
void emitOMPAllocateDecl(const OMPAllocateDecl *d)
void error(SourceLocation loc, llvm::StringRef error)
Emit a general error that something can't be done.
void emitGlobalDecl(const clang::GlobalDecl &d)
Helper for emitDeferred to apply actual codegen.
void emitGlobalVarDefinition(const clang::VarDecl *vd, bool isTentative=false)
cir::FuncOp createRuntimeFunction(cir::FuncType ty, llvm::StringRef name, mlir::NamedAttrList extraAttrs={}, bool isLocal=false, bool assumeConvergent=false)
void setTLSMode(mlir::Operation *op, const VarDecl &d)
Set TLS mode for the given operation based on the given variable declaration.
cir::FuncOp getAddrOfFunction(clang::GlobalDecl gd, mlir::Type funcType=nullptr, bool forVTable=false, bool dontDefer=false, ForDefinition_t isForDefinition=NotForDefinition)
Return the address of the given function.
void emitAliasForGlobal(llvm::StringRef mangledName, mlir::Operation *op, GlobalDecl aliasGD, cir::FuncOp aliasee, cir::GlobalLinkageKind linkage)
mlir::Value emitMemberPointerConstant(const UnaryOperator *e)
void emitGlobalOpenACCDecl(const clang::OpenACCConstructDecl *cd)
bool verifyModule() const
void emitExplicitCastExprType(const ExplicitCastExpr *e, CIRGenFunction *cgf=nullptr)
Emit type info if type of an expression is a variably modified type.
mlir::Operation * getAddrOfGlobalTemporary(const MaterializeTemporaryExpr *mte, const Expr *init)
Returns a pointer to a global variable representing a temporary with static or thread storage duratio...
std::map< llvm::StringRef, clang::GlobalDecl > deferredDecls
This contains all the decls which have definitions but which are deferred for emission and therefore ...
void errorUnsupported(const Stmt *s, llvm::StringRef type)
Print out an error that codegen doesn't support the specified stmt yet.
mlir::Value getAddrOfGlobalVar(const VarDecl *d, mlir::Type ty={}, ForDefinition_t isForDefinition=NotForDefinition)
Return the mlir::Value for the address of the given global variable.
static void setInitializer(cir::GlobalOp &op, mlir::Attribute value)
cir::GlobalViewAttr getAddrOfGlobalVarAttr(const VarDecl *d)
Return the mlir::GlobalViewAttr for the address of the given global.
void addGlobalCtor(cir::FuncOp ctor, std::optional< int > priority=std::nullopt)
Add a global constructor or destructor to the module.
cir::GlobalLinkageKind getFunctionLinkage(GlobalDecl gd)
void updateCompletedType(const clang::TagDecl *td)
const clang::CodeGenOptions & getCodeGenOpts() const
const clang::LangOptions & getLangOpts() const
void constructAttributeList(llvm::StringRef name, const CIRGenFunctionInfo &info, CIRGenCalleeInfo calleeInfo, mlir::NamedAttrList &attrs, llvm::MutableArrayRef< mlir::NamedAttrList > argAttrs, mlir::NamedAttrList &retAttrs, cir::CallingConv &callingConv, cir::SideEffect &sideEffect, bool attrOnCallSite, bool isThunk)
Get the CIR attributes and calling convention to use for a particular function type.
cir::FuncOp getOrCreateCIRFunction(llvm::StringRef mangledName, mlir::Type funcType, clang::GlobalDecl gd, bool forVTable, bool dontDefer=false, bool isThunk=false, ForDefinition_t isForDefinition=NotForDefinition, mlir::NamedAttrList extraAttrs={})
void emitOpenACCRoutineDecl(const clang::FunctionDecl *funcDecl, cir::FuncOp func, SourceLocation pragmaLoc, ArrayRef< const OpenACCClause * > clauses)
cir::TLS_Model getDefaultCIRTLSModel() const
Get TLS mode from CodeGenOptions.
void addGlobalDtor(cir::FuncOp dtor, std::optional< int > priority=std::nullopt)
Add a function to the list that will be called when the module is unloaded.
void addDeferredDeclToEmit(clang::GlobalDecl GD)
bool shouldEmitCUDAGlobalVar(const VarDecl *global) const
cir::FuncOp createCIRFunction(mlir::Location loc, llvm::StringRef name, cir::FuncType funcType, const clang::FunctionDecl *funcDecl)
const TargetCIRGenInfo & getTargetCIRGenInfo()
void emitCXXGlobalVarDeclInitFunc(const VarDecl *vd, cir::GlobalOp addr, bool performInit)
void setGVPropertiesAux(mlir::Operation *op, const NamedDecl *d) const
LangAS getLangTempAllocaAddressSpace() const
Returns the address space for temporary allocations in the language.
llvm::DenseSet< cir::BlockAddressOp > unresolvedBlockAddressToLabel
Track CIR BlockAddressOps that cannot be resolved immediately because their LabelOp has not yet been ...
mlir::Location getLoc(clang::SourceLocation cLoc)
Helpers to convert the presumed location of Clang's SourceLocation to an MLIR Location.
llvm::DenseMap< mlir::Attribute, cir::GlobalOp > constantStringMap
mlir::Operation * lastGlobalOp
void replaceGlobal(cir::GlobalOp oldGV, cir::GlobalOp newGV)
Replace all uses of the old global with the new global, updating types and references as needed.
static cir::VisibilityKind getGlobalVisibilityKindFromClangVisibility(clang::VisibilityAttr::VisibilityType visibility)
llvm::StringMap< unsigned > cgGlobalNames
void setCXXSpecialMemberAttr(cir::FuncOp funcOp, const clang::FunctionDecl *funcDecl)
Mark the function as a special member (e.g. constructor, destructor)
mlir::Operation * getGlobalValue(llvm::StringRef ref)
void emitOMPDeclareReduction(const OMPDeclareReductionDecl *d)
mlir::ModuleOp getModule() const
bool supportsCOMDAT() const
cir::GlobalLinkageKind getCIRLinkageForDeclarator(const DeclaratorDecl *dd, GVALinkage linkage, bool isConstantVariable)
mlir::MLIRContext & getMLIRContext()
mlir::Operation * getAddrOfGlobal(clang::GlobalDecl gd, ForDefinition_t isForDefinition=NotForDefinition)
static cir::GlobalOp createGlobalOp(CIRGenModule &cgm, mlir::Location loc, llvm::StringRef name, mlir::Type t, bool isConstant=false, mlir::Operation *insertPoint=nullptr)
void maybeSetTrivialComdat(const clang::Decl &d, mlir::Operation *op)
CIRGenCXXABI & getCXXABI() const
cir::GlobalViewAttr getAddrOfConstantStringFromLiteral(const StringLiteral *s, llvm::StringRef name=".str")
Return a global symbol reference to a constant array for the given string literal.
llvm::MapVector< cir::BlockAddressOp, cir::LabelOp > blockAddressToLabel
Map CIR BlockAddressOps directly to their resolved LabelOps.
bool lookupRepresentativeDecl(llvm::StringRef mangledName, clang::GlobalDecl &gd) const
void emitDeclContext(const DeclContext *dc)
void emitGlobal(clang::GlobalDecl gd)
Emit code for a single global function or variable declaration.
cir::LabelOp lookupBlockAddressInfo(cir::BlockAddrInfoAttr blockInfo)
bool mayBeEmittedEagerly(const clang::ValueDecl *d)
Determine whether the definition can be emitted eagerly, or should be delayed until the end of the tr...
cir::GlobalLinkageKind getCIRLinkageVarDefinition(const VarDecl *vd, bool isConstant)
void mapBlockAddress(cir::BlockAddrInfoAttr blockInfo, cir::LabelOp label)
void setCIRFunctionAttributesForDefinition(const clang::FunctionDecl *fd, cir::FuncOp f)
Set extra attributes (inline, etc.) for a function.
std::string getOpenACCBindMangledName(const IdentifierInfo *bindName, const FunctionDecl *attachedFunction)
void emitGlobalFunctionDefinition(clang::GlobalDecl gd, mlir::Operation *op)
CIRGenVTables & getVTables()
void setFunctionLinkage(GlobalDecl gd, cir::FuncOp f)
std::vector< clang::GlobalDecl > deferredDeclsToEmit
void emitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *d)
void emitOMPGroupPrivateDecl(const OMPGroupPrivateDecl *d)
mlir::Attribute getConstantArrayFromStringLiteral(const StringLiteral *e)
Return a constant array for the given string.
cir::VisibilityAttr getGlobalVisibilityAttrFromDecl(const Decl *decl)
void setCommonAttributes(GlobalDecl gd, mlir::Operation *op)
Set attributes which are common to any form of a global definition (alias, Objective-C method,...
clang::CharUnits getNaturalTypeAlignment(clang::QualType t, LValueBaseInfo *baseInfo=nullptr)
FIXME: this could likely be a common helper and not necessarily related with codegen.
const CIRGenFunctionInfo & arrangeGlobalDeclaration(GlobalDecl gd)
const CIRGenFunctionInfo & arrangeCXXMethodDeclaration(const clang::CXXMethodDecl *md)
C++ methods have some special rules and also have implicit parameters.
const CIRGenFunctionInfo & arrangeCXXStructorDeclaration(clang::GlobalDecl gd)
cir::FuncType getFunctionType(const CIRGenFunctionInfo &info)
Get the CIR function type for.
mlir::Type convertTypeForMem(clang::QualType, bool forBitField=false)
Convert type T into an mlir::Type.
void emitThunks(GlobalDecl gd)
Emit the associated thunks for the given global decl.
virtual mlir::ptr::MemorySpaceAttrInterface getCIRAllocaAddressSpace() const
Get the address space for alloca.
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
bool isMoveConstructor(unsigned &TypeQuals) const
Determine whether this constructor is a move constructor (C++11 [class.copy]p3), which can be used to...
bool isCopyConstructor(unsigned &TypeQuals) const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
Represents a static or instance method of a struct/union/class.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
Represents a C++ struct/union/class.
bool isEffectivelyFinal() const
Determine whether it's impossible for a class to be derived from this class.
bool hasDefinition() const
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 One()
One - Construct a CharUnits quantity of one.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
llvm::Reloc::Model RelocationModel
The name of the relocation model to use.
Represents the canonical version of C arrays with a specified constant size.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Decl - This represents one declaration (or definition), e.g.
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
static DeclContext * castToDeclContext(const Decl *)
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Represents a ValueDecl that came out of a declarator.
A little helper class used to produce diagnostics.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
ExplicitCastExpr - An explicit cast written in the source code.
This represents one expression.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
Represents a member of a struct/union/class.
Cached information about one file (either on disk or in the virtual file system).
StringRef tryGetRealPathName() const
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Represents a function declaration or definition.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
GlobalDecl - represents a global declaration.
GlobalDecl getCanonicalDecl() const
KernelReferenceKind getKernelReferenceKind() const
GlobalDecl getWithDecl(const Decl *D)
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
void setLinkage(Linkage L)
Linkage getLinkage() const
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
bool shouldMangleDeclName(const NamedDecl *D)
void mangleName(GlobalDecl GD, raw_ostream &)
virtual void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, raw_ostream &)=0
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
APValue * getOrCreateValue(bool MayCreate) const
Get the storage for the constant value of a materialized temporary of static storage duration.
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
unsigned getManglingNumber() const
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
Represents a parameter to a function.
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
A (possibly-)qualified type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
bool isConstQualified() const
Determine whether this type is const-qualified.
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
bool hasUnaligned() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
StringLiteral - This represents a string literal expression, e.g.
unsigned getLength() const
uint32_t getCodeUnit(size_t i) const
StringRef getString() const
unsigned getCharByteWidth() const
Represents the declaration of a struct/union/class/enum.
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
bool isReferenceType() const
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
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 isObjCObjectPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Expr * getSubExpr() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
TLSKind getTLSKind() const
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ TLS_None
Not a TLS variable.
@ Definition
This declaration is definitely a definition.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
static bool isWeakForLinker(GlobalLinkageKind linkage)
Whether the definition of this global may be replaced at link time.
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
std::unique_ptr< TargetCIRGenInfo > createNVPTXTargetCIRGenInfo(CIRGenTypes &cgt)
CIRGenCXXABI * CreateCIRGenItaniumCXXABI(CIRGenModule &cgm)
Creates and Itanium-family ABI.
std::unique_ptr< TargetCIRGenInfo > createX8664TargetCIRGenInfo(CIRGenTypes &cgt)
CIRGenCUDARuntime * createNVCUDARuntime(CIRGenModule &cgm)
const internal::VariadicDynCastAllOfMatcher< Decl, VarDecl > varDecl
Matches variable declarations.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Decl, FieldDecl > fieldDecl
Matches field declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, FunctionDecl > functionDecl
Matches function declarations.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Dtor_Complete
Complete object dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
U cast(CodeGen::Address addr)
bool isExternallyVisible(Linkage L)
static bool globalCtorLexOrder()
static bool alignCXXRecordDecl()
static bool opFuncArmNewAttr()
static bool getRuntimeFunctionDecl()
static bool weakRefReference()
static bool opFuncOptNoneAttr()
static bool opGlobalSection()
static bool addressSpace()
static bool opFuncMinSizeAttr()
static bool opGlobalUnnamedAddr()
static bool opGlobalThreadLocal()
static bool sourceLanguageCases()
static bool opFuncAstDeclAttr()
static bool opFuncNoDuplicateAttr()
static bool opGlobalUsedOrCompilerUsed()
static bool stackProtector()
static bool moduleNameHash()
static bool opGlobalVisibility()
static bool setDLLStorageClass()
static bool opFuncUnwindTablesAttr()
static bool opFuncParameterAttributes()
static bool targetCIRGenInfoArch()
static bool opFuncExtraAttrs()
static bool opFuncNakedAttr()
static bool opFuncSection()
static bool attributeNoBuiltin()
static bool opGlobalDLLImportExport()
static bool opGlobalPartition()
static bool opGlobalWeakRef()
static bool setTargetAttributes()
static bool deferredCXXGlobalInit()
static bool opFuncOperandBundles()
static bool opFuncCallingConv()
static bool globalCtorAssociatedData()
static bool defaultVisibility()
static bool opFuncColdHotAttr()
static bool opFuncExceptions()
static bool opFuncArmStreamingAttr()
static bool deferredVtables()
static bool cudaSupport()
static bool opFuncMaybeHandleStaticInExternC()
static bool generateDebugInfo()
static bool targetCIRGenInfoOS()
static bool opFuncCPUAndFeaturesAttributes()
static bool maybeHandleStaticInExternC()
static bool setLLVMFunctionFEnvAttributes()
mlir::Type uCharTy
ClangIR char.
unsigned char SizeSizeInBytes
unsigned char PointerAlignInBytes
cir::PointerType allocaInt8PtrTy
void* in alloca address space
cir::PointerType uInt8PtrTy
mlir::ptr::MemorySpaceAttrInterface cirAllocaAddressSpace
cir::PointerType voidPtrTy
void* in address space 0
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool hasSideEffects() const
Return true if the evaluated expression has side effects.
LangStandard - Information about the properties of a particular language standard.