13#ifndef CLANG_LIB_CIR_CODEGEN_CIRGENFUNCTION_H
14#define CLANG_LIB_CIR_CODEGEN_CIRGENFUNCTION_H
41#include "llvm/ADT/ScopedHashTable.h"
42#include "llvm/IR/Instructions.h"
43#include "llvm/IR/Intrinsics.h"
52class OutlinedFunctionDecl;
53class SYCLKernelCallStmt;
80 struct ConstrainedFPRAII {
82 bool savedIsFPConstrained;
84 llvm::RoundingMode savedRounding;
85 cir::FastMathFlags savedFastMathFlags;
88 : builder(builder), savedIsFPConstrained(builder.getIsFPConstrained()),
89 savedExcept(builder.getDefaultConstrainedExcept()),
90 savedRounding(builder.getDefaultConstrainedRounding()),
91 savedFastMathFlags(builder.getFastMathFlags()) {}
92 ~ConstrainedFPRAII() {
93 builder.setIsFPConstrained(savedIsFPConstrained);
94 builder.setDefaultConstrainedExcept(savedExcept);
95 builder.setDefaultConstrainedRounding(savedRounding);
96 builder.setFastMathFlags(savedFastMathFlags);
98 } constrainedFPState{builder};
114 std::unique_ptr<CGCoroData>
data;
243 assert(!
deactivated &&
"Deactivating already deactivated scope");
244 auto &stack =
cgf.deferredDeactivationCleanupStack;
246 cgf.deactivateCleanupBlock(stack[i - 1].cleanup,
247 stack[i - 1].dominatingIP);
248 stack[i - 1].dominatingIP->erase();
264 llvm::SmallDenseMap<const ParmVarDecl *, const ImplicitParamDecl *>
271 llvm::DenseMap<const clang::ValueDecl *, clang::FieldDecl *>
315 using DeclMapTy = llvm::DenseMap<const clang::Decl *, Address>;
332 auto fn = mlir::cast<cir::FuncOp>(
curFn);
333 return &fn.getRegion().front();
350 llvm::RoundingMode oldRounding;
351 std::optional<cir::FastMathFlags> oldFastMathFlags;
368 using SymTableTy = llvm::ScopedHashTable<const clang::Decl *, mlir::Value>;
392 auto constOp = val.getDefiningOp<cir::ConstantOp>();
393 assert(constOp &&
"getSExtIntValueFromConstOp call with non ConstantOp");
394 return constOp.getIntValue().getSExtValue();
400 auto constOp = val.getDefiningOp<cir::ConstantOp>();
401 assert(constOp &&
"getZExtIntValueFromConstOp call with non ConstantOp");
402 return constOp.getIntValue().getZExtValue();
417 bool suppressNewContext =
false);
426 return cgm.getTargetCIRGenInfo();
452 class OpaqueValueMappingData {
457 : opaqueValue(ov), boundLValue(boundLValue) {}
468 return expr->isGLValue() ||
expr->getType()->isFunctionType() ||
491 OpaqueValueMappingData data(ov,
false);
500 bool isValid()
const {
return opaqueValue !=
nullptr; }
501 void clear() { opaqueValue =
nullptr; }
504 assert(opaqueValue &&
"no data to unbind!");
533 if (mlir::isa<ConditionalOperator>(op))
538 mlir::cast<BinaryConditionalOperator>(op);
548 assert(ov->
getSourceExpr() &&
"wrong form of OpaqueValueMapping used "
549 "for OVE with no source expression");
580 bool isParam =
false);
590 class VarDeclContext {
597 oldVal = p.currVarDecl;
598 p.currVarDecl = value;
603 void restore() { p.currVarDecl = oldVal; }
604 ~VarDeclContext() { restore(); }
614 std::optional<SourceRange> oldLoc;
619 oldLoc = cgf.currSrcLoc;
620 cgf.currSrcLoc = value;
630 llvm::ScopedHashTableScope<const clang::Decl *, mlir::Value>;
641 mlir::Location
getLoc(mlir::Location lhs, mlir::Location rhs);
646 if (
cgm.getCodeGenOpts().getFiniteLoops() ==
676 controllingExpression, hasEmptyBody, [
this] {
677 curFn->removeAttr(cir::CIRDialect::getMustProgressAttrName());
687 return builder.getInsertionBlock() !=
nullptr;
695 mlir::Block *block = builder.getInsertionBlock();
696 return block && (block->isEntryBlock() || !block->hasNoPredecessors());
717 bool isVolatile =
false,
730 return llvm::isa_and_nonnull<clang::FunctionDecl>(calleeDecl);
736 if (
const auto *fd = llvm::dyn_cast<clang::FunctionDecl>(calleeDecl))
737 return fd->getNumParams();
738 return llvm::cast<clang::ObjCMethodDecl>(calleeDecl)->param_size();
742 if (
const auto *fd = llvm::dyn_cast<clang::FunctionDecl>(calleeDecl))
743 return fd->getParamDecl(I);
744 return *(llvm::cast<clang::ObjCMethodDecl>(calleeDecl)->param_begin() +
793 bool allowLabels =
false);
795 llvm::APSInt &resultInt,
796 bool allowLabels =
false);
805 class ConstantEmission {
807 llvm::PointerIntPair<mlir::Attribute, 1, bool> valueAndIsReference;
816 static ConstantEmission
forValue(mlir::TypedAttr c) {
820 explicit operator bool()
const {
821 return valueAndIsReference.getOpaqueValue() !=
nullptr;
829 mlir::cast<mlir::TypedAttr>(valueAndIsReference.getPointer()));
835 return mlir::cast<mlir::TypedAttr>(valueAndIsReference.getPointer());
907 cir::GetGlobalOp gvAddr);
931 cgm.getCodeGenOpts().ObjCAutoRefCountExceptions;
933 llvm_unreachable(
"bad destruction kind");
944 assert(!
localDeclMap.count(vd) &&
"Decl already exists in LocalDeclMap!");
966 bool shouldDelete =
false;
972 auto mapItr = cgf.localDeclMap.find(vd);
974 if (mapItr != cgf.localDeclMap.end())
975 oldAddr = mapItr->second;
982 cgf.localDeclMap.erase(vd);
984 cgf.localDeclMap.insert_or_assign(vd, oldAddr);
1011 bool baseIsNonVirtualPrimaryBase,
1036 cgf.cxxDefaultInitExprThis = thisAddr;
1039 cgf.cxxDefaultInitExprThis = oldCXXDefaultInitExprThis;
1044 Address oldCXXDefaultInitExprThis;
1055 cgf.cxxThisValue =
cgf.cxxDefaultInitExprThis.getPointer();
1056 cgf.cxxThisAlignment =
cgf.cxxDefaultInitExprThis.getAlignment();
1083 oldArrayInitIndex(setIdx
1087 cgf.arrayInitIndex =
index;
1090 if (oldArrayInitIndex.has_value())
1091 cgf.arrayInitIndex = *oldArrayInitIndex;
1096 std::optional<mlir::Value> oldArrayInitIndex;
1111 bool forPointeeType =
false,
1114 alignment =
cgm.getNaturalTypeAlignment(t, baseInfo);
1120 llvm::iterator_range<CastExpr::path_const_iterator> path,
1125 llvm::iterator_range<CastExpr::path_const_iterator> path,
1126 bool nullCheckValue);
1154 "Invalid argument to getAddrOfLocalVar(), no decl!");
1159 mlir::Type fieldType,
unsigned index);
1173 assert(
cxxThisValue &&
"no 'this' value for this function");
1191 bool baseIsVirtual);
1214 cir::FuncType funcType);
1229 cir::FuncOp fn, cir::FuncType funcType,
1245 return rd->hasVolatileMember();
1265 mlir::isa<cir::CatchAllAttr>(
ehSpecTryOp.getHandlerTypes()[0]);
1278 size_t oldLifetimeExtendedSize,
1287 mlir::Location loc);
1299 mlir::Operation *dominatingIP);
1319 template <
class T,
class... As>
1335 template <
class T,
class... As>
1337 mlir::Location loc = builder.getUnknownLoc();
1338 mlir::Operation *dominatingIP = builder.getBool(
false, loc).getOperation();
1341 {
ehStack.stable_begin(), dominatingIP});
1348 bool useEHCleanupForArray);
1360 class RunCleanupsScope {
1362 size_t lifetimeExtendedCleanupStackSize;
1364 bool deferLifetimeExtended =
false;
1366 size_t oldLifetimeExtendedSize()
const {
1367 return deferLifetimeExtended ?
cgf.lifetimeExtendedCleanupStack.size()
1368 : lifetimeExtendedCleanupStackSize;
1376 RunCleanupsScope(
const RunCleanupsScope &) =
delete;
1377 void operator=(
const RunCleanupsScope &) =
delete;
1386 cleanupStackDepth =
cgf.ehStack.stable_begin();
1387 lifetimeExtendedCleanupStackSize =
1388 cgf.lifetimeExtendedCleanupStack.size();
1390 cgf.didCallStackSave =
false;
1391 oldCleanupStackDepth =
cgf.currentCleanupStackDepth;
1392 cgf.currentCleanupStackDepth = cleanupStackDepth;
1419 const bool hasPendingDeactivations =
1424 bool didSpillAny =
false;
1425 if (hasPendingDeactivations) {
1426 tempAllocas.reserve(valuesToReload.size());
1427 for (mlir::Value *valPtr : valuesToReload) {
1428 mlir::Value val = *valPtr;
1429 if (!val || !val.getDefiningOp() ||
1430 !val.getDefiningOp()->getParentOfType<cir::CleanupScopeOp>()) {
1435 val.getType(), val.getLoc(),
"tmp.exprcleanup");
1436 tempAllocas.push_back(temp);
1455 for (
auto [addr, valPtr] : llvm::zip(tempAllocas, valuesToReload)) {
1456 if (!addr.isValid())
1461 cgf.popCleanupBlocks(cleanupStackDepth, oldLifetimeExtendedSize(),
1466 cgf.currentCleanupStackDepth = oldCleanupStackDepth;
1476 deactivateCleanups.forceDeactivate();
1477 cgf.popCleanupBlocks(cleanupStackDepth);
1485 assert(deactivateCleanups.deactivated &&
1486 "forceCleanupExceptLifetimeExtended() must be called first");
1487 cgf.popCleanupBlocks(cleanupStackDepth, oldLifetimeExtendedSize());
1489 cgf.currentCleanupStackDepth = oldCleanupStackDepth;
1495 return cgf.ehStack.stable_begin() != cleanupStackDepth;
1515 cir::CleanupScopeOp scope;
1516 cir::CleanupScopeOp oldFullExprCleanupScope;
1519 size_t deferredCleanupStackSize;
1520 size_t conditionalScopeDepth;
1521 bool exited =
false;
1531 cleanups.deferLifetimeExtendedCleanups();
1563 : cgf(cgf), depth(cgf.
ehStack.stable_begin()), active(active) {}
1574 : ehStack(scope.cgf.ehStack) {
1577 assert(!ehStack.isCapturingCleanups() &&
1578 "cleanup capturing should not nest");
1580 ehStack.setCapturingCleanups(
true);
1592 cgf.emitCapturedCleanups(depth, loc);
1609 mlir::Block *entryBlock;
1614 cir::TryOp tryOp =
nullptr;
1620 bool hasCoreturnSinceLastLabel =
false;
1631 Kind scopeKind = Kind::Regular;
1634 mlir::Value retVal =
nullptr;
1636 mlir::Location beginLoc;
1637 mlir::Location endLoc;
1644 beginLoc(loc), endLoc(loc) {
1646 assert(entryBlock &&
"LexicalScope requires an entry block");
1647 cgf.curLexScope =
this;
1651 if (
const auto fusedLoc = mlir::dyn_cast<mlir::FusedLoc>(loc)) {
1652 assert(fusedLoc.getLocations().size() == 2 &&
"too many locations");
1653 beginLoc = fusedLoc.getLocations()[0];
1654 endLoc = fusedLoc.getLocations()[1];
1680 s->hasCoreturnSinceLastLabel =
false;
1690 bool isTry() {
return scopeKind == Kind::Try; }
1696 scopeKind = Kind::Try;
1716 llvm::DenseMap<mlir::Block *, mlir::Location> retLocs;
1717 llvm::DenseMap<cir::CaseOp, unsigned> retBlockInCaseIndex;
1718 std::optional<unsigned> normalRetBlockIndex;
1724 assert((isa_and_nonnull<cir::CaseOp>(
1725 cgf.builder.getBlock()->getParentOp()) ||
1726 retBlocks.size() == 0) &&
1727 "only switches can hold more than one ret block");
1730 mlir::OpBuilder::InsertionGuard guard(
cgf.builder);
1731 auto *b =
cgf.builder.createBlock(
cgf.builder.getBlock()->getParent());
1732 retBlocks.push_back(b);
1737 cir::ReturnOp emitReturn(mlir::Location loc);
1738 void emitImplicitReturn();
1742 mlir::Location
getRetLoc(mlir::Block *b) {
return retLocs.at(b); }
1744 retLocs.insert_or_assign(b, loc);
1749 if (
auto caseOp = mlir::dyn_cast_if_present<cir::CaseOp>(
1750 cgf.builder.getBlock()->getParentOp())) {
1751 auto iter = retBlockInCaseIndex.find(caseOp);
1752 if (iter != retBlockInCaseIndex.end()) {
1754 mlir::Block *ret = retBlocks[iter->second];
1759 mlir::Block *ret = createRetBlock(
cgf, loc);
1760 retBlockInCaseIndex[caseOp] = retBlocks.size() - 1;
1764 if (normalRetBlockIndex) {
1765 mlir::Block *ret = retBlocks[*normalRetBlockIndex];
1770 mlir::Block *ret = createRetBlock(
cgf, loc);
1771 normalRetBlockIndex = retBlocks.size() - 1;
1793 bool useEHCleanupForArray,
1814 const ThunkInfo &thunk,
bool isUnprototyped);
1824 mlir::Location loc);
1825 std::optional<mlir::Value>
1828 llvm::Triple::ArchType arch);
1839 mlir::Value offsetValue =
nullptr);
1844 mlir::Value offsetValue =
nullptr);
1857 llvm::StringRef fieldName,
1858 unsigned fieldIndex);
1862 bool insertIntoFnEntryBlock,
1863 mlir::Value arraySize =
nullptr);
1866 mlir::OpBuilder::InsertPoint ip,
1867 mlir::Value arraySize =
nullptr);
1886 bool isVolatile =
false);
1894 bool ignoreResult =
false);
1899 bool isInitializer);
1923 std::pair<mlir::Value, mlir::Type>
1925 QualType inputType, std::string &constraintString,
1927 std::pair<mlir::Value, mlir::Type>
1929 std::string &constraintString);
1936 bool isVolatile,
bool isInit);
1938 const Expr *memOrder,
bool isStore,
bool isLoad,
bool isFence,
1943 mlir::Type *originalArgType =
nullptr,
1944 mlir::Value *emittedArgValue =
nullptr,
1945 cir::MemOrder ordering = cir::MemOrder::SequentiallyConsistent);
1951 cir::MemOrder successOrder = cir::MemOrder::SequentiallyConsistent,
1952 cir::MemOrder failureOrder = cir::MemOrder::SequentiallyConsistent,
1953 cir::SyncScopeKind scope = cir::SyncScopeKind::System);
1958 mlir::OpBuilder::InsertPoint ip = {});
1977 CapturedCleanups &condCleanup,
2019 cir::IntType resType, mlir::Value emittedE,
2024 cir::IntType resType,
2025 mlir::Value emittedE,
2042 template <
unsigned N>
2043 [[maybe_unused]] RValue
2045 llvm::StringRef intrinName,
2046 mlir::Type resultType = {}) {
2047 static_assert(N,
"expect non-empty argument");
2051 for (
unsigned i = 0; i < N; ++i)
2053 const auto call = cir::LLVMIntrinsicCallOp::create(
2059 RValue
emitCall(
const CIRGenFunctionInfo &funcInfo,
2060 const CIRGenCallee &callee, ReturnValueSlot
returnValue,
2061 const CallArgList &args, cir::CIRCallOpInterface *callOp,
2066 cir::CIRCallOpInterface *callOrTryCall =
nullptr) {
2067 assert(
currSrcLoc &&
"source location must have been set");
2077 const ThunkInfo *thunk,
bool isUnprototyped);
2083 llvm::iterator_range<clang::CallExpr::const_arg_iterator> argRange,
2084 AbstractCallee callee = AbstractCallee(),
unsigned paramsToSkip = 0,
2094 template <
typename T>
2096 mlir::ArrayAttr value,
2097 cir::CaseOpKind
kind,
2098 bool buildingTopLevelCase);
2103 mlir::Type condType,
2104 bool buildingTopLevelCase);
2153 bool newPointerIsChecked,
2154 bool zeroInitialize =
false);
2156 mlir::Value numElements,
Address arrayBase,
2158 bool newPointerIsChecked,
bool zeroInitialize,
2167 bool delegating,
Address thisAddr,
2171 bool forVirtualBase,
Address thisAddr,
2172 bool inheritedFromVBase,
2177 bool forVirtualBase,
bool delegating,
CallArgList &args);
2182 bool forVirtualBase,
bool delegating,
2186 mlir::Value thisVal,
QualType thisTy,
2187 mlir::Value implicitParam,
2197 const Expr *e,
Address base, mlir::Value memberPtr,
2218 mlir::Type elementTy,
Address beginPtr,
2219 mlir::Value numElements,
2220 mlir::Value allocSizeWithoutCookie);
2254 bool isFnTryBlock =
false);
2287 LValue lvalue,
bool capturedByInit =
false);
2312 mlir::NamedAttrList attrs = {});
2318 bool ignoreResultAssign =
false);
2331 bool useCurrentScope);
2333 mlir::LogicalResult
emitForStmt(
const clang::ForStmt &s,
2334 llvm::ArrayRef<const Attr *> attrs = {});
2337 CallArgList &callArgs);
2341 bool ignoreResult =
false);
2346 bool ignoreResult =
false);
2359 mlir::Value &result);
2367 Address *lastValue =
nullptr,
2370 void emitDecl(
const clang::Decl &d,
bool evaluateConditionDecl =
false);
2371 mlir::LogicalResult
emitDeclStmt(
const clang::DeclStmt &s);
2375 mlir::Type condType,
2376 bool buildingTopLevelCase);
2380 const FunctionArgList &args,
2381 clang::SourceLocation loc);
2387 clang::SourceLocation loc);
2396 const clang::Stmt *thenS,
2397 const clang::Stmt *elseS);
2400 mlir::Location thenLoc,
2402 std::optional<mlir::Location> elseLoc = {});
2407 mlir::Location thenLoc,
2409 std::optional<mlir::Location> elseLoc = {});
2415 mlir::LogicalResult
emitLabel(
const clang::LabelDecl &d);
2416 mlir::LogicalResult
emitLabelStmt(
const clang::LabelStmt &s);
2421 mlir::LogicalResult
emitIfStmt(
const clang::IfStmt &s);
2440 LValueBaseInfo *pointeeBaseInfo);
2450 SourceLocation loc, LValueBaseInfo baseInfo,
2451 bool isNontemporal =
false);
2462 mlir::Value thisValue);
2468 const clang::FieldDecl *field,
2469 llvm::StringRef fieldName);
2478 cir::FuncOp callee);
2482 const CallExpr *
expr);
2486 const CallExpr *
expr);
2506 LValueBaseInfo *baseInfo =
nullptr);
2513 RValue
emitRotate(
const CallExpr *e,
bool isRotateLeft);
2520 clang::QualType dstType,
2521 clang::SourceLocation loc);
2524 bool capturedByInit =
false);
2527 const Expr *argExpr);
2539 clang::QualType ty, LValueBaseInfo baseInfo,
2540 bool isInit =
false,
bool isNontemporal =
false);
2553 llvm::StringRef name =
".str");
2557 bool buildingTopLevelCase);
2563 cir::FuncOp funcOp, cir::FuncType funcType,
2564 FunctionArgList &args);
2569 std::optional<mlir::Value>
2576 const clang::FunctionDecl *targetDecl);
2578 const clang::FunctionDecl *targetDecl);
2584 mlir::Value
emitToMemory(mlir::Value value, clang::QualType ty);
2588 mlir::Value
emitFromMemory(mlir::Value value, clang::QualType ty);
2598 void emitTrap(mlir::Location loc,
bool createNewBlock);
2620 mlir::LogicalResult
emitWhileStmt(
const clang::WhileStmt &s,
2621 llvm::ArrayRef<const Attr *> attrs = {});
2625 cir::LoopHintAttr
getLoopHints(llvm::ArrayRef<const Attr *> attrs,
2629 const CallExpr *
expr);
2633 mlir::Value
emitX86CpuIs(mlir::Location loc, StringRef cpuStr);
2636 ArrayRef<StringRef> FeatureStrs);
2638 std::array<uint32_t, 4> FeatureMask);
2641 const CallExpr *
expr);
2646 clang::SourceLocation loc);
2657 mlir::Block *anchorBlock;
2658 mlir::Operation *anchorAfter =
nullptr;
2669 if (cgf.currentFullExprCleanupScope && !cgf.isInConditionalBranch()) {
2670 cir::CleanupKind cleanupKind = cgf.getLangOpts().Exceptions
2671 ? cir::CleanupKind::All
2672 : cir::CleanupKind::Normal;
2673 cir::CleanupScopeOp scope = cir::CleanupScopeOp::create(
2674 cgf.builder, loc, cleanupKind,
2675 [](mlir::OpBuilder &, mlir::Location) {},
2676 [](mlir::OpBuilder &, mlir::Location) {});
2677 cgf.conditionalCleanupScopes.push_back(
2678 {scope, cgf.deferredConditionalCleanupStack.size()});
2679 cgf.builder.setInsertionPointToEnd(&scope.getBodyRegion().front());
2682 anchorBlock = cgf.builder.getInsertionBlock();
2683 assert(anchorBlock &&
"conditional evaluation needs an insertion point");
2684 mlir::Block::iterator ip = cgf.builder.getInsertionPoint();
2685 if (ip != anchorBlock->begin())
2686 anchorAfter = &*std::prev(ip);
2690 assert(cgf.outermostConditional !=
this);
2691 if (!cgf.outermostConditional)
2692 cgf.outermostConditional =
this;
2696 assert(cgf.outermostConditional !=
nullptr);
2697 if (cgf.outermostConditional ==
this)
2698 cgf.outermostConditional =
nullptr;
2711 return mlir::OpBuilder::InsertPoint(anchorBlock, anchorBlock->begin());
2712 return mlir::OpBuilder::InsertPoint(
2713 anchorAfter->getBlock(), std::next(anchorAfter->getIterator()));
2718 std::optional<LValue>
lhs{}, rhs{};
2729 mlir::OpBuilder::InsertionGuard guard(builder);
2731 cir::StoreOp store = builder.createStore(
2732 value.getLoc(), value, addr,
false,
2734 mlir::IntegerAttr::get(
2735 mlir::IntegerType::get(value.getContext(), 64),
2767 cgf.outermostConditional =
nullptr;
2768 cgf.hiddenOutermostConditional =
nullptr;
2772 cgf.outermostConditional = savedOutermostConditional;
2773 cgf.hiddenOutermostConditional = savedHiddenOutermostConditional;
2777 template <
typename FuncTy>
2779 const FuncTy &branchGenFunc);
2817 const Twine &name =
"tmp",
2818 mlir::Value arraySize =
nullptr,
2819 bool insertIntoFnEntryBlock =
false);
2821 const Twine &name =
"tmp",
2822 mlir::OpBuilder::InsertPoint ip = {},
2823 mlir::Value arraySize =
nullptr);
2824 Address createTempAlloca(mlir::Type ty,
CharUnits align, mlir::Location loc,
2825 const Twine &name =
"tmp",
2826 mlir::Value arraySize =
nullptr,
2828 mlir::OpBuilder::InsertPoint ip = {});
2829 Address createTempAlloca(mlir::Type ty,
2830 mlir::ptr::MemorySpaceAttrInterface destAddrSpace,
2832 const Twine &name =
"tmp",
2833 mlir::Value arraySize =
nullptr,
2834 Address *alloca =
nullptr,
2835 mlir::OpBuilder::InsertPoint ip = {});
2836 Address createTempAllocaWithoutCast(mlir::Type ty, CharUnits align,
2838 const Twine &name =
"tmp",
2839 mlir::Value arraySize =
nullptr,
2840 mlir::OpBuilder::InsertPoint ip = {});
2842 maybeCastStackAddressSpace(
Address alloca,
2843 mlir::ptr::MemorySpaceAttrInterface destAddrSpace,
2844 mlir::Value arraySize =
nullptr);
2845 Address createDefaultAlignTempAlloca(mlir::Type ty, mlir::Location loc,
2851 Address createMemTemp(QualType t, mlir::Location loc,
2852 const Twine &name =
"tmp",
Address *alloca =
nullptr,
2853 mlir::OpBuilder::InsertPoint ip = {});
2854 Address createMemTemp(QualType t, CharUnits align, mlir::Location loc,
2855 const Twine &name =
"tmp",
Address *alloca =
nullptr,
2856 mlir::OpBuilder::InsertPoint ip = {});
2857 Address createMemTempWithoutCast(QualType t, mlir::Location loc,
2858 const Twine &name =
"tmp");
2861 if (cir::GlobalOp globalOp = v.getDefiningOp<cir::GlobalOp>())
2862 cgm.errorNYI(
"Global op addrspace cast");
2863 return builder.createAddrSpaceCast(v, destTy);
2872 mlir::LogicalResult emitOMPParallelDirective(
const OMPParallelDirective &s);
2877 mlir::LogicalResult emitOMPCanonicalLoop(
const OMPCanonicalLoop &s);
2937 mlir::LogicalResult emitOMPParallelMaskedTaskLoopDirective(
2939 mlir::LogicalResult emitOMPParallelMaskedTaskLoopSimdDirective(
2941 mlir::LogicalResult emitOMPParallelMasterTaskLoopDirective(
2943 mlir::LogicalResult emitOMPParallelMasterTaskLoopSimdDirective(
2947 mlir::LogicalResult emitOMPDistributeParallelForDirective(
2949 mlir::LogicalResult emitOMPDistributeParallelForSimdDirective(
2953 mlir::LogicalResult emitOMPTargetParallelGenericLoopDirective(
2955 mlir::LogicalResult emitOMPTargetParallelForSimdDirective(
2959 mlir::LogicalResult emitOMPTargetTeamsGenericLoopDirective(
2967 mlir::LogicalResult emitOMPTeamsDistributeParallelForSimdDirective(
2969 mlir::LogicalResult emitOMPTeamsDistributeParallelForDirective(
2975 mlir::LogicalResult emitOMPTargetTeamsDistributeDirective(
2977 mlir::LogicalResult emitOMPTargetTeamsDistributeParallelForDirective(
2979 mlir::LogicalResult emitOMPTargetTeamsDistributeParallelForSimdDirective(
2981 mlir::LogicalResult emitOMPTargetTeamsDistributeSimdDirective(
3008 template <
typename Op>
3013 template <
typename Op,
typename TermOp>
3015 emitOpenACCOpAssociatedStmt(mlir::Location start, mlir::Location end,
3018 const Stmt *associatedStmt);
3020 template <
typename Op,
typename TermOp>
3021 mlir::LogicalResult emitOpenACCOpCombinedConstruct(
3025 template <
typename Op>
3034 template <
typename ComputeOp,
typename LoopOp>
3035 void emitOpenACCClauses(ComputeOp &op, LoopOp &loopOp,
3042 void updateLoopOpParallelism(mlir::acc::LoopOp &op,
bool isOrphan,
3047 mlir::acc::LoopOp *activeLoopOp =
nullptr;
3049 struct ActiveOpenACCLoopRAII {
3051 mlir::acc::LoopOp *oldLoopOp;
3053 ActiveOpenACCLoopRAII(
CIRGenFunction &cgf, mlir::acc::LoopOp *newOp)
3054 : cgf(cgf), oldLoopOp(cgf.activeLoopOp) {
3055 cgf.activeLoopOp = newOp;
3057 ~ActiveOpenACCLoopRAII() { cgf.activeLoopOp = oldLoopOp; }
3062 mlir::OpBuilder::InsertPoint lastRecipeLocation;
3121 const Twine &name =
"tmp",
3133 bool shouldEmitLifetimeMarkers =
false;
3136 bool fnHasBypassStmt =
false;
3138 bool shouldEmitLifetimeMarkersForAutoVar()
const {
3139 return shouldEmitLifetimeMarkers && !fnHasBypassStmt;
3142 class InlinedInheritingConstructorScope {
3144 InlinedInheritingConstructorScope(CIRGenFunction &cgf,
GlobalDecl gd)
3145 : cgf(cgf), oldCurGD(cgf.curGD), oldCurFuncDecl(cgf.curFuncDecl),
3146 oldCurCodeDecl(cgf.curCodeDecl),
3147 oldCxxabiThisDecl(cgf.cxxabiThisDecl),
3148 oldCxxThisValue(cgf.cxxThisValue),
3149 oldCxxabiThisAlignment(cgf.cxxabiThisAlignment),
3150 oldCxxThisAlignment(cgf.cxxThisAlignment),
3151 oldReturnValue(cgf.returnValue), oldFnRetTy(cgf.fnRetTy),
3152 oldCxxInheritedCtorInitExprArgs(
3153 std::move(cgf.cxxInheritedCtorInitExprArgs)) {
3156 cgf.curCodeDecl = cgf.curFuncDecl;
3157 cgf.cxxabiThisDecl =
nullptr;
3158 cgf.cxxabiThisValue =
nullptr;
3159 cgf.cxxThisValue =
nullptr;
3162 cgf.returnValue = Address::invalid();
3164 cgf.cxxInheritedCtorInitExprArgs.clear();
3168 ~InlinedInheritingConstructorScope() {
3169 cgf.curGD = oldCurGD;
3170 cgf.curFuncDecl = oldCurFuncDecl;
3171 cgf.curCodeDecl = oldCurCodeDecl;
3172 cgf.cxxabiThisDecl = oldCxxabiThisDecl;
3173 cgf.cxxabiThisValue = oldCxxabiThisValue;
3174 cgf.cxxThisValue = oldCxxThisValue;
3175 cgf.cxxThisAlignment = oldCxxThisAlignment;
3176 cgf.cxxabiThisAlignment = oldCxxabiThisAlignment;
3177 cgf.returnValue = oldReturnValue;
3178 cgf.fnRetTy = oldFnRetTy;
3179 cgf.cxxInheritedCtorInitExprArgs =
3180 std::move(oldCxxInheritedCtorInitExprArgs);
3184 CIRGenFunction &cgf;
3185 GlobalDecl oldCurGD;
3186 const Decl *oldCurFuncDecl;
3187 const Decl *oldCurCodeDecl;
3188 ImplicitParamDecl *oldCxxabiThisDecl;
3189 mlir::Value oldCxxabiThisValue;
3190 mlir::Value oldCxxThisValue;
3191 clang::CharUnits oldCxxabiThisAlignment;
3192 clang::CharUnits oldCxxThisAlignment;
3194 QualType oldFnRetTy;
3195 CallArgList oldCxxInheritedCtorInitExprArgs;
Defines the clang::ASTContext interface.
static void emitOMPDistributeDirective(const OMPLoopDirective &S, CodeGenFunction &CGF, CodeGenModule &CGM)
static void emitOMPForDirective(const OMPLoopDirective &S, CodeGenFunction &CGF, CodeGenModule &CGM, bool HasCancel)
static void emitOMPSimdDirective(const OMPLoopDirective &S, CodeGenFunction &CGF, CodeGenModule &CGM)
llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> BuilderCallbackRef
static void emitAtomicOp(CIRGenFunction &cgf, AtomicExpr *expr, Address dest, Address ptr, Address val1, Address val2, Address expectedResult, Expr *isWeakExpr, Expr *failureOrderExpr, int64_t size, cir::MemOrder order, cir::SyncScopeKind scope)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines some OpenACC-specific enums and functions.
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
Defines an enumeration for C++ overloaded operators.
Enumerates target-specific builtins in their own namespaces within namespace clang.
C Language Family Type Representation.
This represents 'pragma omp atomic' directive.
This represents 'pragma omp barrier' directive.
This represents 'pragma omp cancel' directive.
This represents 'pragma omp cancellation point' directive.
This represents 'pragma omp critical' directive.
This represents 'pragma omp depobj' directive.
This represents 'pragma omp dispatch' directive.
This represents 'pragma omp distribute' directive.
This represents 'pragma omp distribute parallel for' composite directive.
This represents 'pragma omp distribute parallel for simd' composite directive.
This represents 'pragma omp distribute simd' composite directive.
This represents 'pragma omp error' directive.
Represents the 'pragma omp flatten' loop transformation directive.
This represents 'pragma omp flush' directive.
This represents 'pragma omp for' directive.
This represents 'pragma omp for simd' directive.
Represents the 'pragma omp fuse' loop transformation directive.
This represents 'pragma omp loop' directive.
Represents the 'pragma omp interchange' loop transformation directive.
This represents 'pragma omp interop' directive.
This represents 'pragma omp masked' directive.
This represents 'pragma omp masked taskloop' directive.
This represents 'pragma omp masked taskloop simd' directive.
This represents 'pragma omp master' directive.
This represents 'pragma omp master taskloop' directive.
This represents 'pragma omp master taskloop simd' directive.
This represents block-associated 'pragma omp ordered' directive.
This represents standalone 'pragma omp ordered' directive.
This represents 'pragma omp parallel for' directive.
This represents 'pragma omp parallel for simd' directive.
This represents 'pragma omp parallel loop' directive.
This represents 'pragma omp parallel masked' directive.
This represents 'pragma omp parallel masked taskloop' directive.
This represents 'pragma omp parallel masked taskloop simd' directive.
This represents 'pragma omp parallel master' directive.
This represents 'pragma omp parallel master taskloop' directive.
This represents 'pragma omp parallel master taskloop simd' directive.
This represents 'pragma omp parallel sections' directive.
Represents the 'pragma omp reverse' loop transformation directive.
This represents 'pragma omp scan' directive.
This represents 'pragma omp scope' directive.
This represents 'pragma omp section' directive.
This represents 'pragma omp sections' directive.
This represents 'pragma omp simd' directive.
This represents 'pragma omp single' directive.
Represents the 'pragma omp split' loop transformation directive.
This represents the 'pragma omp stripe' loop transformation directive.
This represents 'pragma omp target data' directive.
This represents 'pragma omp target' directive.
This represents 'pragma omp target enter data' directive.
This represents 'pragma omp target exit data' directive.
This represents 'pragma omp target parallel' directive.
This represents 'pragma omp target parallel for' directive.
This represents 'pragma omp target parallel for simd' directive.
This represents 'pragma omp target parallel loop' directive.
This represents 'pragma omp target simd' directive.
This represents 'pragma omp target teams' directive.
This represents 'pragma omp target teams distribute' combined directive.
This represents 'pragma omp target teams distribute parallel for' combined directive.
This represents 'pragma omp target teams distribute parallel for simd' combined directive.
This represents 'pragma omp target teams distribute simd' combined directive.
This represents 'pragma omp target teams loop' directive.
This represents 'pragma omp target update' directive.
This represents 'pragma omp task' directive.
This represents 'pragma omp taskloop' directive.
This represents 'pragma omp taskloop simd' directive.
This represents 'pragma omp taskgroup' directive.
This represents 'pragma omp taskwait' directive.
This represents 'pragma omp taskyield' directive.
This represents 'pragma omp teams' directive.
This represents 'pragma omp teams distribute' directive.
This represents 'pragma omp teams distribute parallel for' composite directive.
This represents 'pragma omp teams distribute parallel for simd' composite directive.
This represents 'pragma omp teams distribute simd' combined directive.
This represents 'pragma omp teams loop' directive.
This represents the 'pragma omp tile' loop transformation directive.
This represents the 'pragma omp unroll' loop transformation directive.
This class represents a 'loop' construct. The 'loop' construct applies to a 'for' loop (or range-for ...
cir::ConstantOp getConstant(mlir::Location loc, mlir::TypedAttr attr)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
AbstractConditionalOperator - An abstract base class for ConditionalOperator and BinaryConditionalOpe...
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
AsmStmt is the base class for GCCAsmStmt and MSAsmStmt.
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Represents an attribute applied to a statement.
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Expr * getCommon() const
getCommon - Return the common expression, written to the left of the condition.
A builtin binary operation expression such as "x + y" or "x <= y".
BreakStmt - This represents a break.
mlir::Value getPointer() const
clang::CharUnits getAlignment() const
mlir::Value getBasePointer() const
static AggValueSlot forAddr(Address addr, clang::Qualifiers quals, IsDestructed_t isDestructed, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed)
static AggValueSlot ignored()
Returns an aggregate value slot indicating that the aggregate value is being ignored.
cir::LoadOp createLoad(mlir::Location loc, Address addr, bool isVolatile=false, bool isNontemporal=false)
cir::StoreOp createStore(mlir::Location loc, mlir::Value val, Address dst, bool isVolatile=false, bool isNontemporal=false, mlir::IntegerAttr align={}, cir::SyncScopeKindAttr scope={}, cir::MemOrderAttr order={})
An abstract representation of regular/ObjC call/message targets.
bool hasFunctionDecl() const
unsigned getNumParams() const
const clang::Decl * getDecl() const
AbstractCallee(const clang::FunctionDecl *fd)
const clang::ParmVarDecl * getParamDecl(unsigned I) const
ArrayInitLoopExprScope(CIRGenFunction &cgf, bool setIdx, mlir::Value index)
~ArrayInitLoopExprScope()
CIRGenFPOptionsRAII(CIRGenFunction &cgf, FPOptions FPFeatures)
SourceLocExprScopeGuard sourceLocScope
CXXDefaultInitExprScope(CIRGenFunction &cgf, const CXXDefaultInitExpr *e)
clang::CharUnits oldCXXThisAlignment
mlir::Value oldCXXThisValue
~CXXDefaultInitExprScope()
CaptureScope(const CaptureScope &)=delete
CaptureScope(CapturedCleanups &scope)
void operator=(const CaptureScope &)=delete
Captures cleanups for variables whose lifetime ends in a region owned by an enclosing op rather than ...
CapturedCleanups(CIRGenFunction &cgf, bool active)
void emitIntoCleanupRegion(mlir::Location loc)
Emit the captured cleanups into the current insertion point, which must be inside the owning op's cle...
An object to manage conditionally-evaluated expressions.
void advanceInsertPoint(mlir::Operation *op)
Records op as the last operation emitted at the pre-conditional insertion point, so that a later emis...
mlir::OpBuilder::InsertPoint getInsertPoint() const
Returns the insertion point which will be executed prior to each evaluation of the conditional code.
ConditionalEvaluation(CIRGenFunction &cgf, mlir::Location loc)
loc is the location of the conditional expression.
static ConstantEmission forReference(mlir::TypedAttr c)
static ConstantEmission forValue(mlir::TypedAttr c)
LValue getReferenceLValue(CIRGenFunction &cgf, const Expr *refExpr) const
mlir::TypedAttr getValue() const
DeclMapRevertingRAII(CIRGenFunction &cgf, const VarDecl *vd)
~FieldConstructionScope()
FieldConstructionScope(CIRGenFunction &cgf, Address thisAddr)
void deferLifetimeExtendedCleanups()
FullExprCleanupScope(CIRGenFunction &cgf, const Stmt *s)
s is the AST root for one cleanup boundary: a full-expression, an asm statement, or the construction ...
void exit(ArrayRef< mlir::Value * > valuesToReload={})
A non-RAII class containing all the information about a bound opaque value.
static OpaqueValueMappingData bind(CIRGenFunction &cgf, const OpaqueValueExpr *ov, const LValue &lv)
static OpaqueValueMappingData bind(CIRGenFunction &cgf, const OpaqueValueExpr *ov, const RValue &rv)
static bool shouldBindAsLValue(const Expr *expr)
static OpaqueValueMappingData bind(CIRGenFunction &cgf, const OpaqueValueExpr *ov, const Expr *e)
void unbind(CIRGenFunction &cgf)
OpaqueValueMapping(CIRGenFunction &cgf, const OpaqueValueExpr *opaqueValue, RValue rvalue)
OpaqueValueMapping(CIRGenFunction &cgf, const OpaqueValueExpr *opaqueValue, LValue lvalue)
OpaqueValueMapping(CIRGenFunction &cgf, const AbstractConditionalOperator *op)
Build the opaque value mapping for the given conditional operator if it's the GNU ?
OpaqueValueMapping(CIRGenFunction &cgf, const OpaqueValueExpr *ov)
Build the opaque value mapping for an OpaqueValueExpr whose source expression is set to the expressio...
static bool shouldBindAsLValue(const Expr *expr)
Enters a new scope for capturing cleanups, all of which will be executed once the scope is exited.
RunCleanupsScope(CIRGenFunction &cgf)
Enter a new cleanup scope.
void deferLifetimeExtendedCleanups()
Leave the cleanups of lifetime-extended temporaries created in this scope to the enclosing scope inst...
void forceLifetimeExtendedCleanups()
Promote any pending lifetime-extended cleanup entries onto the EH scope stack at the current insertio...
void forceCleanup(ArrayRef< mlir::Value * > valuesToReload={})
Force the emission of cleanups now, instead of waiting until this object is destroyed.
void forceCleanupExceptLifetimeExtended()
Force the emission of EH cleanups now, but defer promoting any lifetime-extended cleanup entries onto...
bool hasPendingCleanups() const
Whether there are any pending cleanups that have been pushed since this scope was entered.
~RunCleanupsScope()
Exit this cleanup scope, emitting any accumulated cleanups.
void restore()
Can be used to restore the state early, before the dtor is run.
SourceLocRAIIObject(CIRGenFunction &cgf, SourceRange value)
StmtExprEvaluation(CIRGenFunction &cgf)
static bool isConstructorDelegationValid(const clang::CXXConstructorDecl *ctor)
Checks whether the given constructor is a valid subject for the complete-to-base constructor delegati...
static bool hasScalarEvaluationKind(clang::QualType type)
void emitFunctionProlog(const FunctionArgList &args, mlir::Block *entryBB, const FunctionDecl *fd, SourceLocation bodyBeginLoc)
Emit the function prologue: initialize the return value of an implicit-return-zero function and decla...
void emitOpenACCRoutine(const OpenACCRoutineDecl &d)
void emitLambdaDelegatingInvokeBody(const CXXMethodDecl *md)
mlir::Value emitComplexToScalarConversion(mlir::Value src, QualType srcTy, QualType dstTy, SourceLocation loc)
Emit a conversion from the specified complex type to the specified destination type,...
mlir::Type convertType(clang::QualType t)
cir::GlobalOp addInitializerToStaticVarDecl(const VarDecl &d, cir::GlobalOp gv, cir::GetGlobalOp gvAddr)
Add the initializer for 'd' to the global variable that has already been created for it.
LValue emitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *e)
mlir::Value emitCheckedArgForAssume(const Expr *e)
Emits an argument for a call to a __builtin_assume.
LValue emitOpaqueValueLValue(const OpaqueValueExpr *e)
static cir::TypeEvaluationKind getEvaluationKind(clang::QualType type)
Return the cir::TypeEvaluationKind of QualType type.
clang::GlobalDecl curGD
The GlobalDecl for the current function being compiled or the global variable currently being initial...
clang::CurrentSourceLocExprScope::SourceLocExprScopeGuard SourceLocExprScopeGuard
RValue convertTempToRValue(Address addr, clang::QualType type, clang::SourceLocation loc)
Given the address of a temporary variable, produce an r-value of its type.
mlir::LogicalResult emitCoreturnStmt(const CoreturnStmt &s)
mlir::LogicalResult emitOpenACCDataConstruct(const OpenACCDataConstruct &s)
AutoVarEmission emitAutoVarAlloca(const clang::VarDecl &d, mlir::OpBuilder::InsertPoint ip={})
mlir::Value emitPromotedValue(mlir::Value result, QualType promotionType)
void emitAutoVarTypeCleanup(const AutoVarEmission &emission, clang::QualType::DestructionKind dtorKind)
Enter a destroy cleanup for the given local variable.
ImplicitParamDecl * cxxabiThisDecl
CXXThisDecl - When generating code for a C++ member function, this will hold the implicit 'this' decl...
EHScopeStack::stable_iterator prologueCleanupDepth
The cleanup depth enclosing all the cleanups associated with the parameters.
mlir::LogicalResult emitOpenACCCombinedConstruct(const OpenACCCombinedConstruct &s)
Address emitCXXMemberDataPointerAddress(const Expr *e, Address base, mlir::Value memberPtr, const MemberPointerType *memberPtrType, LValueBaseInfo *baseInfo)
bool curFuncIsThunk
In C++, whether we are code generating a thunk.
mlir::LogicalResult emitOpenACCWaitConstruct(const OpenACCWaitConstruct &s)
cir::FuncOp generateCode(clang::GlobalDecl gd, cir::FuncOp fn, cir::FuncType funcType)
llvm::SmallVector< PendingCleanupEntry > lifetimeExtendedCleanupStack
ConditionalEvaluation * hiddenOutermostConditional
CIRGenTypes & getTypes() const
Address emitPointerWithAlignment(const clang::Expr *expr, LValueBaseInfo *baseInfo=nullptr)
Given an expression with a pointer type, emit the value and compute our best estimate of the alignmen...
llvm::ScopedHashTable< const clang::Decl *, mlir::Value > SymTableTy
The symbol table maps a variable name to a value in the current scope.
void initFullExprCleanup()
Set up the last cleanup that was pushed as a conditional full-expression cleanup.
void emitInvariantStart(CharUnits size, mlir::Value addr, mlir::Location loc)
void emitVariablyModifiedType(QualType ty)
RValue emitLoadOfLValue(LValue lv, SourceLocation loc)
Given an expression that represents a value lvalue, this method emits the address of the lvalue,...
const clang::LangOptions & getLangOpts() const
mlir::Value cxxStructorImplicitParamValue
void emitCapturedCleanups(EHScopeStack::stable_iterator depth, mlir::Location loc)
Emit the captured cleanups (those pushed above depth while EHScopeStack was capturing cleanups) at th...
cir::AllocaOp createTempAlloca(mlir::Type ty, mlir::Location loc, const Twine &name="tmp", mlir::Value arraySize=nullptr, bool insertIntoFnEntryBlock=false)
This creates an alloca and inserts it into the entry block if ArraySize is nullptr,...
void emitTrap(mlir::Location loc, bool createNewBlock)
Emit a trap instruction, which is used to abort the program in an abnormal way, usually for debugging...
void emitForwardingCallToLambda(const CXXMethodDecl *lambdaCallOperator, CallArgList &callArgs)
mlir::Block * getCurFunctionEntryBlock()
RValue emitCXXMemberCallExpr(const clang::CXXMemberCallExpr *e, ReturnValueSlot returnValue)
mlir::LogicalResult emitOpenACCUpdateConstruct(const OpenACCUpdateConstruct &s)
RValue emitCXXMemberPointerCallExpr(const CXXMemberCallExpr *ce, ReturnValueSlot returnValue)
bool isInConditionalBranch() const
mlir::Value emitX86CpuIs(const CallExpr *expr)
LValue emitLValueForBitField(LValue base, const FieldDecl *field)
mlir::LogicalResult emitIfOnBoolExpr(const clang::Expr *cond, const clang::Stmt *thenS, const clang::Stmt *elseS)
Emit an if on a boolean condition to the specified blocks.
VlaSizePair getVLASize(const VariableArrayType *type)
Returns an MLIR::Value+QualType pair that corresponds to the size, in non-variably-sized elements,...
LValue emitScalarCompoundAssignWithComplex(const CompoundAssignOperator *e, mlir::Value &result)
cir::CoroAllocOp emitCoroAllocBuiltinCall(const CallExpr *e)
Address cxxDefaultInitExprThis
The value of 'this' to sue when evaluating CXXDefaultInitExprs within this expression.
cir::IfOp emitIfOnBoolValue(mlir::Value condV, mlir::Location loc, BuilderCallbackRef thenBuilder, mlir::Location thenLoc, BuilderCallbackRef elseBuilder, std::optional< mlir::Location > elseLoc={})
Build the cir.if for an already-emitted condition value.
void emitStaticVarDecl(const VarDecl &d, cir::GlobalLinkageKind linkage)
mlir::Value emitComplexExpr(const Expr *e)
Emit the computation of the specified expression of complex type, returning the result.
void setBeforeOutermostConditional(mlir::Value value, Address addr)
mlir::LogicalResult emitOpenACCCacheConstruct(const OpenACCCacheConstruct &s)
mlir::Value loadCXXThis()
Load the value for 'this'.
LValue makeNaturalAlignPointeeAddrLValue(mlir::Value v, clang::QualType t)
Given a value of type T* that may not be to a complete object, construct an l-vlaue withi the natural...
RValue emitCallExpr(const clang::CallExpr *e, ReturnValueSlot returnValue=ReturnValueSlot())
void emitDeleteCall(const FunctionDecl *deleteFD, mlir::Value ptr, QualType deleteTy)
LValue emitMemberExpr(const MemberExpr *e)
clang::CharUnits cxxThisAlignment
const TargetInfo & getTarget() const
void replaceAddrOfLocalVar(const clang::VarDecl *vd, Address addr)
llvm::DenseMap< const clang::Decl *, Address > DeclMapTy
LValue emitConditionalOperatorLValue(const AbstractConditionalOperator *expr)
LValue emitLValue(const clang::Expr *e)
Emit code to compute a designator that specifies the location of the expression.
void addCatchHandlerAttr(const CXXCatchStmt *catchStmt, SmallVector< mlir::Attribute > &handlerAttrs)
Address makeNaturalAddressForPointer(mlir::Value ptr, QualType t, CharUnits alignment, bool forPointeeType=false, LValueBaseInfo *baseInfo=nullptr)
Construct an address with the natural alignment of T.
const clang::Decl * curFuncDecl
mlir::LogicalResult emitCXXForRangeStmt(const CXXForRangeStmt &s, llvm::ArrayRef< const Attr * > attrs)
clang::FPOptions curFPFeatures
cir::CoroNoopOp emitCoroNoopBuiltinCall(const CallExpr *e)
bool insertionPointIsReachable() const
True if code emitted at the builder's insertion point can be reached.
Address loadCXXThisAddress()
LValue emitLValueForLambdaField(const FieldDecl *field)
mlir::Value evaluateExprAsBool(const clang::Expr *e)
Perform the usual unary conversions on the specified expression and compare the result against zero,...
bool isTrivialInitializer(const Expr *init)
Determine whether the given initializer is trivial in the sense that it requires no code to be genera...
void emitOpenACCDeclare(const OpenACCDeclareDecl &d)
void emitInlinedInheritingCXXConstructorCall(SourceLocation loc, const CXXConstructorDecl *d, CXXCtorType ctorType, bool forVirtualBase, bool delegating, CallArgList &args)
Address getAddrOfLocalVar(const clang::VarDecl *vd)
Return the address of a local variable.
void emitAnyExprToExn(const Expr *e, Address addr)
void emitAggregateCopy(LValue dest, LValue src, QualType eltTy, AggValueSlot::Overlap_t mayOverlap, bool isVolatile=false)
Emit an aggregate copy.
cir::CoroSuspendOp emitCoroSuspendBuiltinCall(const CallExpr *e)
std::string getCounterRefTmpAsString()
LValue makeNaturalAlignAddrLValue(mlir::Value val, QualType ty)
llvm::DenseMap< const Expr *, mlir::Value > vlaSizeMap
bool constantFoldsToSimpleInteger(const clang::Expr *cond, llvm::APSInt &resultInt, bool allowLabels=false)
If the specified expression does not fold to a constant, or if it does fold but contains a label,...
void emitMustTailThunk(GlobalDecl gd, mlir::Value adjustedThisPtr, cir::FuncOp callee)
Emit a musttail call for a thunk with a potentially different ABI.
mlir::LogicalResult emitForStmt(const clang::ForStmt &s, llvm::ArrayRef< const Attr * > attrs={})
void pushIrregularPartialArrayCleanup(mlir::Value arrayBegin, Address arrayEndPointer, QualType elementType, CharUnits elementAlign, Destroyer *destroyer)
Push an EH cleanup to destroy already-constructed elements of the given array.
void emitLifetimeEndOp(mlir::Location loc, mlir::Value addr)
Address getAsNaturalAddressOf(Address addr, QualType pointeeTy)
void pushCleanupAndDeferDeactivation(CleanupKind kind, As... a)
Push a cleanup and record it for deferred deactivation.
cir::TryOp ehSpecTryOp
The cir.try wrapping a function whose exception specification has to be enforced.
LValue emitComplexCompoundAssignmentLValue(const CompoundAssignOperator *e)
bool checkIfFunctionMustProgress()
void emitBeginCatch(const CXXCatchStmt *catchStmt, mlir::Value ehToken)
Begins a catch statement by initializing the catch variable and calling __cxa_begin_catch.
mlir::Value getVTTParameter(GlobalDecl gd, bool forVirtualBase, bool delegating)
Return the VTT parameter that should be passed to a base constructor/destructor with virtual bases.
mlir::Location getLoc(clang::SourceLocation srcLoc)
Helpers to convert Clang's SourceLocation to a MLIR Location.
void initializeVTablePointers(mlir::Location loc, const clang::CXXRecordDecl *rd)
mlir::Type convertType(const TypeDecl *t)
bool constantFoldsToBool(const clang::Expr *cond, bool &resultBool, bool allowLabels=false)
If the specified expression does not fold to a constant, or if it does but contains a label,...
mlir::Value emitOpOnBoolExpr(mlir::Location loc, const clang::Expr *cond)
TODO(cir): see EmitBranchOnBoolExpr for extra ideas).
void emitStoreThroughExtVectorComponentLValue(RValue src, LValue dst)
CodeGenUtils::EvaluationOrder EvaluationOrder
void initializeVTablePointer(mlir::Location loc, const VPtr &vptr)
void emitCallArgs(CallArgList &args, PrototypeWrapper prototype, llvm::iterator_range< clang::CallExpr::const_arg_iterator > argRange, AbstractCallee callee=AbstractCallee(), unsigned paramsToSkip=0, EvaluationOrder order=EvaluationOrder::Default)
Address getAddressOfBaseClass(Address value, const CXXRecordDecl *derived, llvm::iterator_range< CastExpr::path_const_iterator > path, bool nullCheckValue, SourceLocation loc)
void emitAggregateStore(mlir::Value value, Address dest)
mlir::LogicalResult emitDoStmt(const clang::DoStmt &s, llvm::ArrayRef< const Attr * > attrs={})
mlir::LogicalResult emitReturnStmt(const clang::ReturnStmt &s)
LValue emitLoadOfReferenceLValue(Address refAddr, mlir::Location loc, QualType refTy, AlignmentSource source)
cir::CoroBeginOp emitCoroBeginBuiltinCall(const CallExpr *e)
void emitDelegateCXXConstructorCall(const clang::CXXConstructorDecl *ctor, clang::CXXCtorType ctorType, const FunctionArgList &args, clang::SourceLocation loc)
VlaSizePair getVLAElements1D(const VariableArrayType *vla)
Return the number of elements for a single dimension for the given array type.
ConditionalEvaluation * outermostConditional
mlir::LogicalResult emitOpenACCInitConstruct(const OpenACCInitConstruct &s)
void emitAnyExprToMem(const Expr *e, Address location, Qualifiers quals, bool isInitializer)
Emits the code necessary to evaluate an arbitrary expression into the given memory location.
RValue emitCXXMemberOrOperatorCall(const clang::CXXMethodDecl *md, const CIRGenCallee &callee, ReturnValueSlot returnValue, mlir::Value thisPtr, mlir::Value implicitParam, clang::QualType implicitParamTy, const clang::CallExpr *ce, CallArgList *rtlArgs)
LValue getOrCreateOpaqueLValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its LValue mapping if it exists, otherwise create one.
void emitBaseInitializer(mlir::Location loc, const CXXRecordDecl *classDecl, CXXCtorInitializer *baseInit)
RValue emitAtomicExpr(AtomicExpr *e)
void emitExprAsInit(const clang::Expr *init, const clang::ValueDecl *d, LValue lvalue, bool capturedByInit=false)
Emit an expression as an initializer for an object (variable, field, etc.) at the given location.
void emitCXXGuardedInit(const VarDecl &varDecl, cir::GlobalOp globalOp, bool performInit)
Emit a guarded initializer for a static local variable.
void emitLoopConditionVariable(const clang::VarDecl &d, CapturedCleanups &condCleanup, llvm::ArrayRef< QualType > extendedTemporaries)
Emit a loop's condition-variable declaration.
static bool resumeExprDefersCleanups(const CoroutineSuspendExpr &s)
Whether the resume expression of s contains a construct that defers cleanups to the end of the enclos...
mlir::Value emitArrayLength(const clang::ArrayType *arrayType, QualType &baseType, Address &addr)
Computes the length of an array in elements, as well as the base element type and a properly-typed fi...
void emitNullInitialization(mlir::Location loc, Address destPtr, QualType ty)
mlir::LogicalResult emitOpenACCSetConstruct(const OpenACCSetConstruct &s)
mlir::Value performAddrSpaceCast(mlir::Value v, mlir::Type destTy) const
RValue emitReferenceBindingToExpr(const Expr *e)
Emits a reference binding to the passed in expression.
llvm::SmallVector< DeferredDeactivateCleanup > deferredDeactivationCleanupStack
VPtrsVector getVTablePointers(const clang::CXXRecordDecl *vtableClass)
const TargetCIRGenInfo & getTargetHooks() const
mlir::LogicalResult emitSwitchStmt(const clang::SwitchStmt &s)
RValue emitCoyieldExpr(const CoyieldExpr &e, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
cir::CoroFreeOp emitCoroFreeBuiltin(const CallExpr *e)
mlir::Value evaluateOrEmitBuiltinObjectSize(const clang::Expr *e, unsigned type, cir::IntType resType, mlir::Value emittedE, bool isDynamic)
mlir::Value emitX86CpuInit(mlir::Location loc)
std::optional< mlir::Value > emitRISCVBuiltinExpr(unsigned builtinID, const CallExpr *expr)
void pushDestroyAndDeferDeactivation(QualType::DestructionKind dtorKind, Address addr, QualType type)
mlir::LogicalResult emitWhileStmt(const clang::WhileStmt &s, llvm::ArrayRef< const Attr * > attrs={})
mlir::LogicalResult emitCaseStmt(const clang::CaseStmt &s, mlir::Type condType, bool buildingTopLevelCase)
LValue emitArraySubscriptExpr(const clang::ArraySubscriptExpr *e)
void emitScalarInit(const clang::Expr *init, LValue lvalue, bool capturedByInit=false)
llvm::ScopedHashTableScope< const clang::Decl *, mlir::Value > SymTableScopeTy
OpenACCDataOperandInfo getOpenACCDataOperandInfo(const Expr *e)
CleanupKind getCleanupKind(QualType::DestructionKind kind)
clang::CharUnits cxxabiThisAlignment
void checkTargetFeatures(const clang::CallExpr *e, const clang::FunctionDecl *targetDecl)
Emit a diagnostic if the target features required by targetDecl are not available in the calling func...
mlir::Value emitX86CpuSupports(const CallExpr *expr)
mlir::Value emitBuiltinObjectSize(const clang::Expr *e, unsigned type, cir::IntType resType, mlir::Value emittedE, bool isDynamic)
Returns a Value corresponding to the size of the given expression by emitting a cir....
LValue emitCoawaitLValue(const CoawaitExpr *e)
mlir::Value makeBinaryAtomicValue(cir::AtomicFetchKind kind, const clang::CallExpr *expr, mlir::Type *originalArgType=nullptr, mlir::Value *emittedArgValue=nullptr, cir::MemOrder ordering=cir::MemOrder::SequentiallyConsistent)
Utility to insert an atomic instruction based on Intrinsic::ID and the expression node.
RValue emitCUDAKernelCallExpr(const CUDAKernelCallExpr *expr, ReturnValueSlot returnValue)
AggValueSlot::Overlap_t getOverlapForFieldInit(const FieldDecl *fd)
mlir::LogicalResult emitSimpleStmt(const clang::Stmt *s, bool useCurrentScope)
mlir::Operation * curFn
The current function or global initializer that is generated code for.
mlir::LogicalResult emitAsmStmt(const clang::AsmStmt &s)
std::pair< mlir::Value, mlir::Type > emitAsmInputLValue(const TargetInfo::ConstraintInfo &info, LValue inputValue, QualType inputType, std::string &constraintString, SourceLocation loc)
Address emitExtVectorElementLValue(LValue lv, mlir::Location loc)
Generates lvalue for partial ext_vector access.
mlir::Value emitScalarConversion(mlir::Value src, clang::QualType srcType, clang::QualType dstType, clang::SourceLocation loc)
Emit a conversion from the specified type to the specified destination type, both of which are CIR sc...
Address getAddressOfDerivedClass(mlir::Location loc, Address baseAddr, const CXXRecordDecl *derived, llvm::iterator_range< CastExpr::path_const_iterator > path, bool nullCheckValue)
std::optional< mlir::Value > emitTargetBuiltinExpr(unsigned builtinID, const clang::CallExpr *e, ReturnValueSlot &returnValue)
CallArgList cxxInheritedCtorInitExprArgs
The values of function arguments to use when evaluating CXXInheritedCtorInitExprs within this context...
mlir::Value emitPromotedComplexExpr(const Expr *e, QualType promotionType)
ImplicitParamDecl * cxxStructorImplicitParamDecl
When generating code for a constructor or destructor, this will hold the implicit argument (e....
mlir::LogicalResult emitOpenACCComputeConstruct(const OpenACCComputeConstruct &s)
EHScopeStack ehStack
Tracks function scope overall cleanup handling.
void enterDtorCleanups(const CXXDestructorDecl *dtor, CXXDtorType type)
Enter the cleanups necessary to complete the given phase of destruction for a destructor.
llvm::SmallVector< const ParmVarDecl * > fnArgs
Save Parameter Decl for coroutine.
mlir::Value emitUnPromotedValue(mlir::Value result, QualType unPromotionType)
mlir::LogicalResult emitSwitchBody(const clang::Stmt *s)
void startThunk(cir::FuncOp fn, GlobalDecl gd, const CIRGenFunctionInfo &fnInfo, bool isUnprototyped)
Start generating a thunk function.
RValue emitAtomicLoad(LValue lvalue, SourceLocation loc, AggValueSlot slot=AggValueSlot::ignored())
AggValueSlot createAggTemp(QualType ty, mlir::Location loc, const Twine &name="tmp", Address *alloca=nullptr)
Create a temporary memory object for the given aggregate type.
mlir::Value emitDevicePrintfCallExpr(const CallExpr *expr)
Emit a device-side printf call for GPU targets.
llvm::SmallVector< PendingCleanupEntry > deferredConditionalCleanupStack
Cleanups for temporaries constructed inside a conditional.
llvm::SmallVector< ConditionalCleanupScope > conditionalCleanupScopes
void emitNewArrayInitializer(const CXXNewExpr *e, QualType elementType, mlir::Type elementTy, Address beginPtr, mlir::Value numElements, mlir::Value allocSizeWithoutCookie)
std::optional< mlir::Value > fnRetAlloca
The compiler-generated variable that holds the return value.
unsigned nextCleanupDestIndex
void emitImplicitAssignmentOperatorBody(FunctionArgList &args)
clang::SanitizerSet sanOpts
Sanitizers enabled for this function.
static int64_t getZExtIntValueFromConstOp(mlir::Value val)
Get zero-extended integer from a mlir::Value that is an int constant or a constant op.
cir::FastMathFlagsAttr getFastMathFlagsAttr(cir::FastMathFlags fastMathFlags)
Create a CIR fast-math attribute from the specified flags.
RValue emitLoadOfExtVectorElementLValue(LValue lv)
mlir::Value emitCXXTypeidExpr(const CXXTypeidExpr *e)
mlir::Type convertTypeForMem(QualType t)
clang::QualType buildFunctionArgList(clang::GlobalDecl gd, FunctionArgList &args)
RValue emitCoroutineFrame()
void emitCtorPrologue(const clang::CXXConstructorDecl *ctor, clang::CXXCtorType ctorType, FunctionArgList &args)
This routine generates necessary code to initialize base classes and non-static data members belongin...
mlir::Value emitAlloca(llvm::StringRef name, mlir::Type ty, mlir::Location loc, clang::CharUnits alignment, bool insertIntoFnEntryBlock, mlir::Value arraySize=nullptr)
mlir::Value emitComplexPrePostIncDec(const UnaryOperator *e, LValue lv)
void emitUnreachable(clang::SourceLocation loc, bool createNewBlock)
Emit a reached-unreachable diagnostic if loc is valid and runtime checking is enabled.
mlir::LogicalResult emitCXXTryStmt(const clang::CXXTryStmt &s, cxxTryBodyEmitter &bodyCallback, bool isFnTryBlock=false)
mlir::Value createDummyValue(mlir::Location loc, clang::QualType qt)
mlir::LogicalResult emitAttributedStmt(const AttributedStmt &s)
cir::FastMathFlags getCurrentFastMathFlags() const
Convert the active Clang floating-point options to CIR fast-math flags.
void emitCXXConstructExpr(const clang::CXXConstructExpr *e, AggValueSlot dest)
mlir::Value emitLoadOfComplex(LValue src, SourceLocation loc)
Load a complex number from the specified l-value.
cir::CoroPromiseOp emitCoroPromiseBuiltinCall(const CallExpr *e)
LValue emitAggExprToLValue(const Expr *e)
void emitStoreOfScalar(mlir::Value value, Address addr, bool isVolatile, clang::QualType ty, LValueBaseInfo baseInfo, bool isInit=false, bool isNontemporal=false)
void pushDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
Push the standard destructor for the given type as at least a normal cleanup.
clang::CurrentSourceLocExprScope curSourceLocExprScope
Source location information about the default argument or member initializer expression we're evaluat...
mlir::Value loadCXXVTT()
Load the VTT parameter to base constructors/destructors have virtual bases.
void emitVarDecl(const clang::VarDecl &d)
This method handles emission of any variable declaration inside a function, including static vars etc...
static Destroyer destroyCXXObject
LValue emitCompoundAssignmentLValue(const clang::CompoundAssignOperator *e)
mlir::Value emitSVEPredicateCast(mlir::Value pred, unsigned minNumElts, mlir::Location loc)
mlir::Value emitCXXNewExpr(const CXXNewExpr *e)
RValue getUndefRValue(clang::QualType ty)
Get an appropriate 'undef' rvalue for the given type.
bool getAArch64SVEProcessedOperands(unsigned builtinID, const CallExpr *expr, SmallVectorImpl< mlir::Value > &ops, clang::SVETypeFlags typeFlags)
Address returnValue
The temporary alloca to hold the return value.
LValue makeAddrLValue(Address addr, QualType ty, LValueBaseInfo baseInfo)
static int64_t getSExtIntValueFromConstOp(mlir::Value val)
Get integer from a mlir::Value that is an int constant or a constant op.
mlir::Value getArrayInitIndex()
Get the index of the current ArrayInitLoopExpr, if any.
std::optional< mlir::Value > emitX86BuiltinExpr(unsigned builtinID, const CallExpr *expr)
mlir::LogicalResult emitLabel(const clang::LabelDecl &d)
void emitCXXConstructorCall(const clang::CXXConstructorDecl *d, clang::CXXCtorType type, bool forVirtualBase, bool delegating, AggValueSlot thisAVS, const clang::CXXConstructExpr *e)
static bool hasAggregateEvaluationKind(clang::QualType type)
mlir::Value getVTablePtr(mlir::Location loc, Address thisAddr, const clang::CXXRecordDecl *vtableClass)
Return the Value of the vtable pointer member pointed to by thisAddr.
void emitArrayDestroy(mlir::Value begin, mlir::Value numElements, QualType elementType, CharUnits elementAlign, Destroyer *destroyer)
Destroys all the elements of the given array, beginning from last to first.
LValue emitPointerToDataMemberBinaryExpr(const BinaryOperator *e)
RValue emitAnyExprToTemp(const clang::Expr *e)
Similarly to emitAnyExpr(), however, the result will always be accessible even if no aggregate locati...
void finishFunction(SourceLocation endLoc)
mlir::LogicalResult emitOpenACCShutdownConstruct(const OpenACCShutdownConstruct &s)
mlir::LogicalResult emitFunctionBody(const clang::Stmt *body)
mlir::LogicalResult emitBreakStmt(const clang::BreakStmt &s)
void initFullExprCleanupWithFlag(Address activeFlag)
cir::CoroDestroyOp emitCoroDestroyBuiltinCall(const CallExpr *e)
mlir::LogicalResult emitIndirectGotoStmt(const IndirectGotoStmt &s)
const CallExpr * mustTailCall
mlir::Value emitTernaryOnBoolExpr(const clang::Expr *cond, mlir::Location loc, const clang::Stmt *thenS, const clang::Stmt *elseS)
void emitCallAndReturnForThunk(cir::FuncOp callee, SourceRange fnLoc, const ThunkInfo *thunk, bool isUnprototyped)
Emit the call and return for a thunk function.
void emitStoreOfComplex(mlir::Location loc, mlir::Value v, LValue dest, bool isInit)
EmitStoreOfComplex - Store a complex number into the specified l-value.
llvm::SmallPtrSet< const clang::CXXRecordDecl *, 4 > VisitedVirtualBasesSetTy
std::string getCounterAggTmpAsString()
LValue emitUnaryOpLValue(const clang::UnaryOperator *e)
void emitReturnOfRValue(mlir::Location loc, RValue rv, QualType ty)
LValue emitMatrixSubscriptExpr(const MatrixSubscriptExpr *e)
Address createCleanupActiveFlag()
Create an active flag variable for use with conditional cleanups.
bool shouldEmitVTableTypeCheckedLoad(const CXXRecordDecl *rd)
Returns whether we should perform a type checked load when loading a virtual function for virtual cal...
bool hasVolatileMember(QualType t)
returns true if aggregate type has a volatile member.
RValue emitLoadOfBitfieldLValue(LValue lv, SourceLocation loc)
LValue emitComplexAssignmentLValue(const BinaryOperator *e)
void emitCallArg(CallArgList &args, const clang::Expr *e, clang::QualType argType)
bool checkIfLoopMustProgress(const clang::Expr *controllingExpression, bool hasEmptyBody)
cir::CoroEndOp emitCoroEndBuiltinCall(const CallExpr *e)
clang::FieldDecl * lambdaThisCaptureField
void deactivateCleanupBlock(EHScopeStack::stable_iterator cleanup, mlir::Operation *dominatingIP)
Deactivates the given cleanup block.
cir::LoopHintAttr getLoopHints(llvm::ArrayRef< const Attr * > attrs, bool mustProgress)
Build the hints that get attached to a loop, or a null attribute if there is nothing to say about it.
mlir::LogicalResult emitContinueStmt(const clang::ContinueStmt &s)
const clang::Decl * curCodeDecl
This is the inner-most code context, which includes blocks.
void emitConstructorBody(FunctionArgList &args)
LValue emitLValueForFieldInitialization(LValue base, const clang::FieldDecl *field, llvm::StringRef fieldName)
Like emitLValueForField, excpet that if the Field is a reference, this will return the address of the...
mlir::Value getAsNaturalPointerTo(Address addr, QualType pointeeType)
LValue emitCallExprLValue(const clang::CallExpr *e)
bool haveInsertPoint() const
True if an insertion point is defined.
llvm::SmallVector< mlir::Type, 2 > condTypeStack
The type of the condition for the emitting switch statement.
RValue emitBuiltinWithOneOverloadedType(const CallExpr *e, llvm::StringRef intrinName, mlir::Type resultType={})
Emit a simple LLVM intrinsic that takes N scalar arguments.
void emitAutoVarInit(const AutoVarEmission &emission)
Emit the initializer for an allocated variable.
void emitInitializerForField(clang::FieldDecl *field, LValue lhs, clang::Expr *init)
void emitStopPoint(const Stmt *s)
Build a debug stoppoint if we are emitting debug info.
std::optional< mlir::Value > emitAMDGPUBuiltinExpr(unsigned builtinID, const CallExpr *expr)
Emit a call to an AMDGPU builtin function.
std::optional< mlir::Value > emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr, ReturnValueSlot returnValue, llvm::Triple::ArchType arch)
void emitCXXTemporary(const CXXTemporary *temporary, QualType tempType, Address ptr)
Emits all the code to cause the given temporary to be cleaned up.
LValue emitStringLiteralLValue(const StringLiteral *e, llvm::StringRef name=".str")
void emitAtomicExprWithMemOrder(const Expr *memOrder, bool isStore, bool isLoad, bool isFence, llvm::function_ref< void(cir::MemOrder)> emitAtomicOp)
void maybeEmitDeferredVarDeclInit(const VarDecl *vd)
mlir::Value getUndefConstant(mlir::Location loc, mlir::Type cirTy)
Return a CIR constant for an undefined value of cirTy.
LValue emitCoyieldLValue(const CoyieldExpr *e)
llvm::SmallDenseMap< const ParmVarDecl *, const ImplicitParamDecl * > sizeArguments
If a ParmVarDecl had the pass_object_size attribute, this will contain a mapping from said ParmVarDec...
void emitVAEnd(mlir::Value vaList)
Emits the end of a CIR variable-argument operation (cir.va_start)
mlir::Value loadThisForDtorDelete(const CXXDestructorDecl *dd)
Return the pointer to pass to the operator delete of the given destructor, converted to the type of i...
mlir::Value emitToMemory(mlir::Value value, clang::QualType ty)
Given a value and its clang type, returns the value casted to its memory representation.
mlir::LogicalResult emitOpenACCHostDataConstruct(const OpenACCHostDataConstruct &s)
std::optional< mlir::Value > emitAArch64SMEBuiltinExpr(unsigned builtinID, const CallExpr *expr)
LValue emitLValueForField(LValue base, const clang::FieldDecl *field)
const LifetimeExtensionCapture * lifetimeExtensionCapture
mlir::Value emitScalarExpr(const clang::Expr *e, bool ignoreResultAssign=false)
Emit the computation of the specified expression of scalar type.
void pushStackRestore(CleanupKind kind, Address spMem)
LValue emitPseudoObjectLValue(const PseudoObjectExpr *E)
mlir::LogicalResult emitIfStmt(const clang::IfStmt &s)
void emitAutoVarDecl(const clang::VarDecl &d)
Emit code and set up symbol table for a variable declaration with auto, register, or no storage class...
cir::GetGlobalOp createGetCpuModel(mlir::Location loc)
void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray, const clang::ValueDecl *extendingDecl)
void popCleanupBlocks(EHScopeStack::stable_iterator oldCleanupStackDepth, ArrayRef< mlir::Value * > valuesToReload={})
Takes the old cleanup stack size and emits the cleanup blocks that have been added.
mlir::Value emitPromotedScalarExpr(const Expr *e, QualType promotionType)
AggValueSlot::Overlap_t getOverlapForReturnValue()
Determine whether a return value slot may overlap some other object.
bool needsEHCleanup(QualType::DestructionKind kind)
Determines whether an EH cleanup is required to destroy a type with the given destruction kind.
mlir::LogicalResult emitSwitchCase(const clang::SwitchCase &s, bool buildingTopLevelCase)
Address emitLoadOfReference(LValue refLVal, mlir::Location loc, LValueBaseInfo *pointeeBaseInfo)
Address getAddressOfDirectBaseInCompleteClass(mlir::Location loc, Address value, const CXXRecordDecl *derived, const CXXRecordDecl *base, bool baseIsVirtual)
Convert the given pointer to a complete class to the given direct base.
bool shouldNullCheckClassCastValue(const CastExpr *ce)
mlir::Value emitAtomicCmpXchg(const clang::CallExpr *expr, bool returnBool, cir::MemOrder successOrder=cir::MemOrder::SequentiallyConsistent, cir::MemOrder failureOrder=cir::MemOrder::SequentiallyConsistent, cir::SyncScopeKind scope=cir::SyncScopeKind::System)
Emit cir.atomic.cmpxchg.
CIRGenBuilderTy & getBuilder()
void emitVAStart(mlir::Value vaList)
Emits the start of a CIR variable-argument operation (cir.va_start)
cir::VectorType getSVEType(const SVETypeFlags &typeFlags)
bool didCallStackSave
Whether a cir.stacksave operation has been added.
void emitDecl(const clang::Decl &d, bool evaluateConditionDecl=false)
LValue emitBinaryOperatorLValue(const BinaryOperator *e)
mlir::Value emitOpenACCIntExpr(const Expr *intExpr)
Address getAddrOfBitFieldStorage(LValue base, const clang::FieldDecl *field, mlir::Type fieldType, unsigned index)
AggValueSlot::Overlap_t getOverlapForBaseInit(const CXXRecordDecl *rd, const CXXRecordDecl *baseRD, bool isVirtual)
Determine whether a base class initialization may overlap some other object.
cir::FuncType getIntrinsicType(llvm::Intrinsic::ID id, llvm::ArrayRef< mlir::Type > overloadTys={})
Return the CIR signature of the LLVM intrinsic id, resolving its overloaded types to overloadTys.
void emitDestroy(Address addr, QualType type, Destroyer *destroyer)
Immediately perform the destruction of the given object.
void emitNonNullArgCheck(RValue rv, QualType argType, SourceLocation argLoc, AbstractCallee ac, unsigned paramNum)
Create a check for a function parameter that may potentially be declared as non-null.
void pushPendingCleanupToEHStack(const PendingCleanupEntry &entry)
Promote a single pending cleanup entry onto the EH scope stack.
const CIRGenModule & getCIRGenModule() const
void startFunction(clang::GlobalDecl gd, clang::QualType returnType, cir::FuncOp fn, cir::FuncType funcType, FunctionArgList args, clang::SourceLocation loc, clang::SourceLocation startLoc)
Emit code for the start of a function.
llvm::DenseMap< const VarDecl *, mlir::Value > nrvoFlags
A mapping from NRVO variables to the flags used to indicate when the NRVO has been applied to this va...
CIRGenModule & getCIRGenModule()
unsigned counterRefTmp
Hold counters for incrementally naming temporaries.
mlir::MLIRContext & getMLIRContext()
mlir::LogicalResult emitOpenACCEnterDataConstruct(const OpenACCEnterDataConstruct &s)
RValue emitCall(const CIRGenFunctionInfo &funcInfo, const CIRGenCallee &callee, ReturnValueSlot returnValue, const CallArgList &args, bool isMustTail, cir::CIRCallOpInterface *callOrTryCall=nullptr)
Destroyer * getDestroyer(clang::QualType::DestructionKind kind)
mlir::Value emitRuntimeCall(mlir::Location loc, cir::FuncOp callee, llvm::ArrayRef< mlir::Value > args={}, mlir::NamedAttrList attrs={})
void Destroyer(CIRGenFunction &cgf, Address addr, QualType ty)
void emitDestructorBody(FunctionArgList &args)
Emits the body of the current destructor.
LValue emitInitListLValue(const InitListExpr *e)
mlir::Value arrayInitIndex
The current array initialization index when evaluating an ArrayInitIndexExpr within an ArrayInitLoopE...
void emitAtomicInit(Expr *init, LValue dest)
void popCleanupBlock(bool forDeactivation=false)
Pop a cleanup block from the stack.
std::optional< SourceRange > currSrcLoc
Use to track source locations across nested visitor traversals.
LValue emitCastLValue(const CastExpr *e)
Casts are never lvalues unless that cast is to a reference type.
LValue emitCXXTypeidLValue(const CXXTypeidExpr *e)
mlir::Value emitLoadOfScalar(LValue lvalue, SourceLocation loc)
EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...
mlir::Value emitScalarPrePostIncDec(const UnaryOperator *e, LValue lv)
bool containsLabel(const clang::Stmt *s, bool ignoreCaseStmts=false)
Return true if the statement contains a label in it.
DeclMapTy localDeclMap
This keeps track of the CIR allocas or globals for local C declarations.
mlir::Value createOpenACCConstantInt(mlir::Location loc, unsigned width, int64_t value)
RValue emitPseudoObjectRValue(const PseudoObjectExpr *e, AggValueSlot slot=AggValueSlot::ignored())
LValue emitDeclRefLValue(const clang::DeclRefExpr *e)
void emitComplexExprIntoLValue(const Expr *e, LValue dest, bool isInit)
void pushEHDestroyIfNeeded(QualType::DestructionKind dtorKind, Address addr, QualType type)
pushEHDestroyIfNeeded - Push the standard destructor for the given type as an EH-only cleanup.
std::optional< mlir::Value > emitNVPTXBuiltinExpr(unsigned builtinID, const CallExpr *expr)
Emit a call to an NVPTX builtin function.
static void eraseEmptyAndUnusedBlocks(cir::FuncOp func)
Remove leftover empty and unreachable blocks from an emitted function.
llvm::DenseMap< const clang::ValueDecl *, clang::FieldDecl * > lambdaCaptureFields
RValue emitCoawaitExpr(const CoawaitExpr &e, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
ConstantEmission tryEmitAsConstant(const DeclRefExpr *refExpr)
Try to emit a reference to the given value without producing it as an l-value.
bool emitLifetimeStartOp(mlir::Location loc, mlir::Value addr)
RValue emitCall(const CIRGenFunctionInfo &funcInfo, const CIRGenCallee &callee, ReturnValueSlot returnValue, const CallArgList &args, cir::CIRCallOpInterface *callOp, bool isMustTail, SourceRange clangLoc)
mlir::Value emitAlignmentAssumption(mlir::Value ptrValue, QualType ty, SourceLocation loc, SourceLocation assumptionLoc, int64_t alignment, mlir::Value offsetValue=nullptr)
mlir::LogicalResult emitCaseDefaultCascade(const T *stmt, mlir::Type condType, mlir::ArrayAttr value, cir::CaseOpKind kind, bool buildingTopLevelCase)
void emitCXXThrowExpr(const CXXThrowExpr *e)
void setFastMathFlags(FPOptions fpFeatures)
LValue makeAddrLValue(Address addr, QualType ty, AlignmentSource source=AlignmentSource::Type)
LValue emitMatrixElementExpr(const MatrixElementExpr *e)
int64_t getAccessedFieldNo(unsigned idx, mlir::ArrayAttr elts)
LValue emitPredefinedLValue(const PredefinedExpr *e)
bool isCatchOrCleanupRequired()
RValue emitAnyExpr(const clang::Expr *e, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
Emit code to compute the specified expression which can have any type.
void emitCXXDestructorCall(const CXXDestructorDecl *dd, CXXDtorType type, bool forVirtualBase, bool delegating, Address thisAddr, QualType thisTy)
llvm::SmallVector< VPtr, 4 > VPtrsVector
cir::CoroSizeOp emitCoroSizeBuiltinCall(const CallExpr *e)
void emitLambdaStaticInvokeBody(const CXXMethodDecl *md)
bool sawAsmBlock
Whether or not a Microsoft-style asm block has been processed within this fuction.
void emitEndEHSpec(const clang::Decl *d)
Close the cir.try opened by emitStartEHSpec.
mlir::LogicalResult emitDeclStmt(const clang::DeclStmt &s)
cir::GetGlobalOp createGetCpuFeatures2(mlir::Location loc)
cir::CleanupScopeOp currentFullExprCleanupScope
The cir.cleanup.scope of the innermost FullExprCleanupScope that materialized one,...
llvm::DenseMap< const OpaqueValueExpr *, RValue > opaqueRValues
RValue emitNewOrDeleteBuiltinCall(const FunctionProtoType *type, const CallExpr *callExpr, OverloadedOperatorKind op)
mlir::LogicalResult emitDefaultStmt(const clang::DefaultStmt &s, mlir::Type condType, bool buildingTopLevelCase)
cir::CoroDoneOp emitCoroDoneBuiltinCall(const CallExpr *e)
cir::CoroResumeOp emitCoroResumeBuiltinCall(const CallExpr *e)
mlir::LogicalResult emitLabelStmt(const clang::LabelStmt &s)
Address emitArrayToPointerDecay(const Expr *e, LValueBaseInfo *baseInfo=nullptr)
std::pair< mlir::Value, mlir::Type > emitAsmInput(const TargetInfo::ConstraintInfo &info, const Expr *inputExpr, std::string &constraintString)
EHScopeStack::stable_iterator currentCleanupStackDepth
void emitCXXAggrConstructorCall(const CXXConstructorDecl *ctor, const clang::ArrayType *arrayType, Address arrayBegin, const CXXConstructExpr *e, bool newPointerIsChecked, bool zeroInitialize=false)
Emit a loop to call a particular constructor for each of several members of an array.
cir::CoroAlignOp emitCoroAlignBuiltinCall(const CallExpr *e)
void pushFullExprCleanup(CleanupKind kind, As... a)
Push a cleanup to be run at the end of the current full-expression.
void emitDelegateCallArg(CallArgList &args, const clang::VarDecl *param, clang::SourceLocation loc)
We are performing a delegate call; that is, the current function is delegating to another one.
LexicalScope * curLexScope
void emitAtomicStore(RValue rvalue, LValue dest, bool isInit)
mlir::Value emitStoreThroughBitfieldLValue(RValue src, LValue dstresult)
llvm::DenseMap< const OpaqueValueExpr *, LValue > opaqueLValues
Keeps track of the current set of opaque value expressions.
const CIRGenFunctionInfo * curFnInfo
CIRGenFunction(CIRGenModule &cgm, CIRGenBuilderTy &builder, bool suppressNewContext=false)
cir::CoroIdOp emitCoroIDBuiltinCall(const CallExpr *e)
void terminateStructuredRegionBody(mlir::Region &r, mlir::Location loc)
LValue emitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *e)
LValue emitExtVectorElementExpr(const ExtVectorElementExpr *e)
bool inEHSpecTerminateScope()
Whether the wrapper opened by emitStartEHSpec is a terminate scope, whose handler calls std::terminat...
clang::ASTContext & getContext() const
RValue emitCXXMemberOrOperatorMemberCallExpr(const clang::CallExpr *ce, const clang::CXXMethodDecl *md, ReturnValueSlot returnValue, bool hasQualifier, clang::NestedNameSpecifier qualifier, bool isArrow, const clang::Expr *base)
void setAddrOfLocalVar(const clang::VarDecl *vd, Address addr)
Set the address of a local variable.
mlir::Value emitScalarConstant(const ConstantEmission &constant, Expr *e)
RValue emitBuiltinExpr(const clang::GlobalDecl &gd, unsigned builtinID, const clang::CallExpr *e, ReturnValueSlot returnValue)
void emitSYCLKernelCaller(const clang::OutlinedFunctionDecl *outlinedFnDecl, cir::FuncOp funcOp, cir::FuncType funcType, FunctionArgList &args)
void emitStartEHSpec(const clang::Decl *d)
Wrap the function body in a cir.try that enforces the exception specification of d: a filter handler ...
void emitInheritedCXXConstructorCall(const CXXConstructorDecl *d, bool forVirtualBase, Address thisAddr, bool inheritedFromVBase, const CXXInheritedCtorInitExpr *e)
void emitCXXDeleteExpr(const CXXDeleteExpr *e)
mlir::LogicalResult emitCoroutineBody(const CoroutineBodyStmt &s)
void pushCleanupAfterFullExpr(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer)
Queue a cleanup to be pushed after finishing the current full-expression.
RValue emitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *e, const CXXMethodDecl *md, ReturnValueSlot returnValue)
mlir::LogicalResult emitCompoundStmt(const clang::CompoundStmt &s, Address *lastValue=nullptr, AggValueSlot slot=AggValueSlot::ignored())
void emitNullabilityCheck(LValue lhs, mlir::Value rhs, clang::SourceLocation loc)
Given an assignment *lhs = rhs, emit a test that checks if rhs is nonnull, if 1LHS is marked _Nonnull...
mlir::LogicalResult emitGotoStmt(const clang::GotoStmt &s)
std::optional< mlir::Value > emitAArch64SVEBuiltinExpr(unsigned builtinID, const CallExpr *expr)
bool inAlwaysInlineAttributedStmt
True if the current statement has always_inline attribute.
bool inNoInlineAttributedStmt
True if the current statement has noinline attribute.
void emitStoreThroughLValue(RValue src, LValue dst, bool isInit=false)
Store the specified rvalue into the specified lvalue, where both are guaranteed to the have the same ...
mlir::Value cxxabiThisValue
bool isLValueSuitableForInlineAtomic(LValue lv)
An LValue is a candidate for having its loads and stores be made atomic if we are operating under /vo...
static llvm::SmallVector< QualType, 2 > getLifetimeExtendedTemporariesWithDestructor(const clang::VarDecl &d)
The types of the temporaries with a destructor that the initializer of the variable d,...
mlir::LogicalResult emitStmt(const clang::Stmt *s, bool useCurrentScope, llvm::ArrayRef< const Attr * > attrs={})
RValue getOrCreateOpaqueRValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its RValue mapping if it exists, otherwise create one.
mlir::Value emitFromMemory(mlir::Value value, clang::QualType ty)
EmitFromMemory - Change a scalar value from its memory representation to its value representation.
Address emitVAListRef(const Expr *e)
Build a "reference" to a va_list; this is either the address or the value of the expression,...
mlir::LogicalResult emitCompoundStmtWithoutScope(const clang::CompoundStmt &s, Address *lastValue=nullptr, AggValueSlot slot=AggValueSlot::ignored())
mlir::LogicalResult emitOpenACCExitDataConstruct(const OpenACCExitDataConstruct &s)
void generateThunk(cir::FuncOp fn, SourceRange fnLoc, const CIRGenFunctionInfo &fnInfo, GlobalDecl gd, const ThunkInfo &thunk, bool isUnprototyped)
Generate code for a thunk function.
mlir::LogicalResult emitSYCLKernelCallStmt(const SYCLKernelCallStmt &s)
void emitIgnoredExpr(const clang::Expr *e)
Emit code to compute the specified expression, ignoring the result.
Address createMemTemp(QualType t, mlir::Location loc, const Twine &name="tmp", Address *alloca=nullptr, mlir::OpBuilder::InsertPoint ip={})
Create a temporary memory object of the given type, with appropriate alignmen and cast it to the defa...
void emitDelegatingCXXConstructorCall(const CXXConstructorDecl *ctor, const FunctionArgList &args)
mlir::Value emitDynamicCast(Address thisAddr, const CXXDynamicCastExpr *dce)
void emitAggExpr(const clang::Expr *e, AggValueSlot slot)
mlir::Value emitScalarOrConstFoldImmArg(unsigned iceArguments, unsigned idx, const Expr *argExpr)
Address createDefaultAlignTempAlloca(mlir::Type ty, mlir::Location loc, const Twine &name)
CreateDefaultAlignTempAlloca - This creates an alloca with the default alignment of the corresponding...
mlir::Value emitAlloca(llvm::StringRef name, mlir::Type ty, mlir::Location loc, clang::CharUnits alignment, mlir::OpBuilder::InsertPoint ip, mlir::Value arraySize=nullptr)
mlir::LogicalResult emitOpenACCAtomicConstruct(const OpenACCAtomicConstruct &s)
LValue emitCXXConstructLValue(const CXXConstructExpr *e)
void finishThunk()
Finish generating a thunk function.
mlir::Value emitVAArg(VAArgExpr *ve)
Generate code to get an argument from the passed in pointer and update it accordingly.
RValue emitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *expr)
LValue emitCompoundLiteralLValue(const CompoundLiteralExpr *e)
void emitAutoVarCleanups(const AutoVarEmission &emission)
RValue emitRotate(const CallExpr *e, bool isRotateLeft)
mlir::LogicalResult emitOpenACCLoopConstruct(const OpenACCLoopConstruct &s)
CIRGenCallee emitCallee(const clang::Expr *e)
Address emitAddrOfFieldStorage(Address base, const FieldDecl *field, llvm::StringRef fieldName, unsigned fieldIndex)
This class organizes the cross-function state that is used while generating CIR code.
This class organizes the cross-module state that is used while lowering AST types to CIR types.
A saved depth on the scope stack.
A stack of scopes which respond to exceptions, including cleanups and catch blocks.
Type for representing both the decl and type of parameters to a function.
static LValue makeAddr(Address address, clang::QualType t, LValueBaseInfo baseInfo)
This trivial value class is used to represent the result of an expression that is evaluated.
static RValue get(mlir::Value v)
Contains the address where the return value of a function can be stored, and whether the address is v...
Represents a call to a CUDA kernel function.
Represents binding an expression to a temporary.
CXXCatchStmt - This represents a C++ catch block.
Represents a call to a C++ constructor.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a delete expression for memory deallocation and destructor calls, e.g.
Represents a C++ destructor within a class.
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a call to a member function that may be written either with member call syntax (e....
Represents a static or instance method of a struct/union/class.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
A call to an overloaded operator written using operator syntax.
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Represents a C++ struct/union/class.
Represents a C++ temporary.
A C++ throw-expression (C++ [except.throw]).
CXXTryStmt - A C++ try block, including all handlers.
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
CaseStmt - Represent a case statement.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
This is an opaque type for sizes expressed in character units.
bool isZero() const
Test whether the quantity equals zero.
llvm::Align getAsAlign() const
Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit bytes.
CompoundAssignOperator - For compound assignments (e.g.
CompoundLiteralExpr - [C99 6.5.2.5].
ContinueStmt - This represents a continue.
Represents a 'co_return' statement in the C++ Coroutines TS.
Represents the body of a coroutine.
Represents an expression that might suspend coroutine execution; either a co_await or co_yield expres...
SourceLocExprScopeGuard(const Expr *DefaultExpr, CurrentSourceLocExprScope &Current)
Represents the current source location and context used to determine the value of the source location...
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
DoStmt - This represents a 'do/while' stmt.
This represents one expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Represents a member of a struct/union/class.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
GlobalDecl - represents a global declaration.
const Decl * getDecl() const
GotoStmt - This represents a direct goto.
IndirectGotoStmt - This represents an indirect goto.
Describes an C or C++ initializer list.
FPExceptionModeKind
Possible floating point exception behavior.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
This represents 'pragma omp allocate ...' directive.
Pseudo declaration for capturing expressions.
This represents 'pragma omp declare mapper ...' directive.
This represents 'pragma omp declare reduction ...' directive.
This represents 'pragma omp groupprivate ...' directive.
This represents 'pragma omp requires...' directive.
This represents 'pragma omp threadprivate ...' directive.
ObjCMethodDecl - Represents an instance or class method declaration.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
Represents a parameter to a function.
[C99 6.4.2.2] - A predefined identifier such as func.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
A (possibly-)qualified type.
@ DK_objc_strong_lifetime
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
The collection of all-type qualifiers we support.
Flags to identify the types for overloaded SVE builtins.
Encodes a location in the source.
A trivial tuple used to represent a source range.
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...
Exposes information about the current target.
Represents a declaration of a type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Represents a call to the builtin function __builtin_va_arg.
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.
Represents a C array with a specified size that is not an integer-constant-expression.
AlignmentSource
The source of the alignment of an l-value; an expression of confidence in the alignment actually matc...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ NormalCleanup
Denotes a cleanup that should run when a scope is exited using normal control flow (falling off the e...
bool checkIfLoopMustProgress(const LangOptions &LangOpts, const CodeGenOptions &CGOpts, ASTContext &Ctx, const Expr *ControllingExpression, bool HasEmptyBody, llvm::function_ref< void()> RemoveMustProgress)
Returns true if a loop must make progress, which means the mustprogress attribute can be added to it.
EvaluationOrder
The order in which the arguments of a call must be evaluated.
const internal::VariadicDynCastAllOfMatcher< Decl, VarDecl > varDecl
Matches variable declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CallExpr > callExpr
Matches call expressions.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const internal::VariadicAllOfMatcher< Stmt > stmt
Matches statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
@ Address
A pointer to a ValueDecl.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
Top level wrappers for InstallAPI frontend operations.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
CXXCtorType
C++ constructor types.
QualType pointeeType(QualType T)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenACCComputeConstruct(OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, ArrayRef< const OpenACCClause * > Clauses, Stmt *StructuredBlock)
const FunctionProtoType * T
CXXDtorType
C++ destructor types.
U cast(CodeGen::Address addr)
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 int64_t
static bool aggValueSlot()
static bool peepholeProtection()
static bool opAllocaEscapeByReference()
static bool generateDebugInfo()
bool wasEmittedAsGlobal() const
AutoVarEmission(const clang::VarDecl &variable)
bool isEscapingByRef
True if the variable is a __block variable that is captured by an escaping block.
Address addr
The address of the alloca for languages with explicit address space (e.g.
bool useLifetimeMarkers
True if lifetime op should be used.
bool emittedAsOffload
True if the variable was emitted as an offload recipe, and thus doesn't have the same sort of alloca ...
const clang::VarDecl * variable
bool isConstantAggregate
True if the variable is of aggregate type and has a constant initializer.
Address getAllocatedAddress() const
Returns the raw, allocated address, which is not necessarily the address of the object itself.
bool wasEmittedAsOffloadClause() const
void setAllocatedAddress(Address a)
Address getObjectAddress(CIRGenFunction &cgf) const
Returns the address of the object within this declaration.
static AutoVarEmission invalid()
std::unique_ptr< CGCoroData > data
CXXDefaultArgExprScope(CIRGenFunction &cfg, const CXXDefaultArgExpr *e)
Scope that deactivates all enclosed deferred cleanups on exit.
size_t oldDeactivateCleanupStackSize
~CleanupDeactivationScope()
CleanupDeactivationScope(CIRGenFunction &cgf)
One record per cir.cleanup.scope opened by a ConditionalEvaluation, as described above.
size_t deferredCleanupStackSize
The size of deferredConditionalCleanupStack when this scope was opened.
cir::CleanupScopeOp scope
std::optional< LValue > lhs
A cleanup that was pushed to the EH stack but whose deactivation is deferred until the enclosing Clea...
EHScopeStack::stable_iterator cleanup
mlir::Operation * dominatingIP
Represents a scope, including function bodies, compound statements, and the substatements of if/while...
llvm::ArrayRef< mlir::Block * > getRetBlocks()
mlir::Block * getOrCreateRetBlock(CIRGenFunction &cgf, mlir::Location loc)
LexicalScope(CIRGenFunction &cgf, mlir::Location loc, mlir::Block *eb)
void markCoreturnEmitted()
void setAsTry(cir::TryOp op)
void clearCoreturnInEnclosingScopes()
mlir::Block * getEntryBlock()
void updateRetLoc(mlir::Block *b, mlir::Location loc)
cir::TryOp getClosestTryParent()
void setRetVal(mlir::Value v)
mlir::Location getRetLoc(mlir::Block *b)
Set by emitLoopConditionVariable while it emits the initializer of a loop condition variable that lif...
const clang::ValueDecl * extendingDecl
CapturedCleanups * cleanups
llvm::SmallVector< mlir::Value > bounds
llvm::SmallVector< QualType > boundTypes
A cleanup whose destructor call is not emitted where the cleanup is registered.
CapturedCleanups * capturedBy
If set, the cleanup is captured by this owner instead of opening a cir.cleanup.scope when it is pushe...
llvm::PointerUnion< const clang::FunctionProtoType *, const clang::ObjCMethodDecl * > p
PrototypeWrapper(const clang::ObjCMethodDecl *md)
PrototypeWrapper(const clang::FunctionProtoType *ft)
const clang::CXXRecordDecl * vtableClass
clang::CharUnits offsetFromNearestVBase
const clang::CXXRecordDecl * nearestVBase
clang::BaseSubobject base
VlaSizePair(mlir::Value num, QualType ty)
virtual mlir::LogicalResult operator()(CIRGenFunction &cgf)=0
virtual ~cxxTryBodyEmitter()=default
The this pointer adjustment as well as an optional return adjustment for a thunk.