41#include "llvm/ADT/ArrayRef.h"
42#include "llvm/ADT/ScopeExit.h"
43#include "llvm/ADT/StringExtras.h"
44#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
45#include "llvm/IR/DataLayout.h"
46#include "llvm/IR/Dominators.h"
47#include "llvm/IR/FPEnv.h"
48#include "llvm/IR/Instruction.h"
49#include "llvm/IR/IntrinsicInst.h"
50#include "llvm/IR/Intrinsics.h"
51#include "llvm/IR/IntrinsicsPowerPC.h"
52#include "llvm/IR/MDBuilder.h"
53#include "llvm/Support/CRC.h"
54#include "llvm/Support/SaveAndRestore.h"
55#include "llvm/Support/SipHash.h"
56#include "llvm/Support/xxhash.h"
57#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
58#include "llvm/Transforms/Utils/PromoteMemToReg.h"
64CodeGenFunction::CodeGenFunction(
CodeGenModule &cgm,
bool suppressNewContext)
68 DebugInfo(
CGM.getModuleDebugInfo()),
70 ShouldEmitLifetimeMarkers(
CodeGenUtils::shouldEmitLifetimeMarkers(
72 if (!suppressNewContext)
73 CGM.getCXXABI().getMangleContext().startNewFunction();
80 const auto *FD = dyn_cast_or_null<FunctionDecl>(
CurCodeDecl);
89 "missed to deactivate a cleanup");
92 CGM.getOpenMPRuntime().functionFinished(*
this);
99 if (
CGM.getLangOpts().OpenMPIRBuilder &&
CurFn)
100 CGM.getOpenMPRuntime().getOMPBuilder().finalize(
CurFn);
105llvm::fp::ExceptionBehavior
113 llvm_unreachable(
"Unsupported FP Exception Behavior");
118 llvm::FastMathFlags FMF;
119 FMF.setAllowReassoc(FPFeatures.getAllowFPReassociate());
120 FMF.setNoNaNs(FPFeatures.getNoHonorNaNs());
121 FMF.setNoInfs(FPFeatures.getNoHonorInfs());
122 FMF.setNoSignedZeros(FPFeatures.getNoSignedZero());
123 FMF.setAllowReciprocal(FPFeatures.getAllowReciprocal());
124 FMF.setApproxFunc(FPFeatures.getAllowApproxFunc());
138 ConstructorHelper(FPFeatures);
141void CodeGenFunction::CGFPOptionsRAII::ConstructorHelper(
FPOptions FPFeatures) {
142 OldFPFeatures = CGF.CurFPFeatures;
143 CGF.CurFPFeatures = FPFeatures;
145 OldExcept = CGF.Builder.getDefaultConstrainedExcept();
146 OldRounding = CGF.Builder.getDefaultConstrainedRounding();
148 if (OldFPFeatures == FPFeatures)
151 FMFGuard.emplace(CGF.Builder);
154 CGF.Builder.setDefaultConstrainedRounding(NewRoundingBehavior);
155 auto NewExceptionBehavior =
157 CGF.Builder.setDefaultConstrainedExcept(NewExceptionBehavior);
159 CGF.SetFastMathFlags(FPFeatures);
161 assert((CGF.CurFuncDecl ==
nullptr || CGF.Builder.getIsFPConstrained() ||
164 (NewExceptionBehavior == llvm::fp::ebIgnore &&
165 NewRoundingBehavior == llvm::RoundingMode::NearestTiesToEven)) &&
166 "FPConstrained should be enabled on entire function");
168 auto mergeFnAttrValue = [&](StringRef Name,
bool Value) {
170 CGF.CurFn->getFnAttribute(Name).getValueAsBool();
171 auto NewValue = OldValue &
Value;
172 if (OldValue != NewValue)
173 CGF.CurFn->addFnAttr(Name, llvm::toStringRef(NewValue));
175 mergeFnAttrValue(
"no-signed-zeros-fp-math", FPFeatures.getNoSignedZero());
179 CGF.CurFPFeatures = OldFPFeatures;
180 CGF.Builder.setDefaultConstrainedExcept(OldExcept);
181 CGF.Builder.setDefaultConstrainedRounding(OldRounding);
195 nullptr, IsKnownNonNull)
203 return ::makeNaturalAlignAddrLValue(
V,
T,
false,
210 return ::makeNaturalAlignAddrLValue(
V,
T,
true,
216 return ::makeNaturalAlignAddrLValue(
V,
T,
false,
222 return ::makeNaturalAlignAddrLValue(
V,
T,
true,
227 return CGM.getTypes().ConvertTypeForMem(
T);
231 return CGM.getTypes().ConvertType(
T);
235 llvm::Type *LLVMTy) {
236 return CGM.getTypes().convertTypeForLoadStore(ASTTy, LLVMTy);
242 switch (
type->getTypeClass()) {
243#define TYPE(name, parent)
244#define ABSTRACT_TYPE(name, parent)
245#define NON_CANONICAL_TYPE(name, parent) case Type::name:
246#define DEPENDENT_TYPE(name, parent) case Type::name:
247#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(name, parent) case Type::name:
248#include "clang/AST/TypeNodes.inc"
249 llvm_unreachable(
"non-canonical or dependent type in IR-generation");
252 case Type::DeducedTemplateSpecialization:
253 llvm_unreachable(
"undeduced type in IR-generation");
258 case Type::BlockPointer:
259 case Type::LValueReference:
260 case Type::RValueReference:
261 case Type::MemberPointer:
263 case Type::ExtVector:
264 case Type::ConstantMatrix:
265 case Type::FunctionProto:
266 case Type::FunctionNoProto:
268 case Type::ObjCObjectPointer:
271 case Type::HLSLAttributedResource:
272 case Type::HLSLInlineSpirv:
273 case Type::OverflowBehavior:
281 case Type::ConstantArray:
282 case Type::IncompleteArray:
283 case Type::VariableArray:
285 case Type::ObjCObject:
286 case Type::ObjCInterface:
287 case Type::ArrayParameter:
295 llvm_unreachable(
"unknown type kind!");
302 llvm::BasicBlock *CurBB =
Builder.GetInsertBlock();
305 assert(!CurBB->hasTerminator() &&
"Unexpected terminated block.");
309 if (CurBB->empty() ||
ReturnBlock.getBlock()->use_empty()) {
315 return llvm::DebugLoc();
323 dyn_cast<llvm::UncondBrInst>(*
ReturnBlock.getBlock()->user_begin());
324 if (BI && BI->getSuccessor(0) ==
ReturnBlock.getBlock()) {
327 llvm::DebugLoc Loc = BI->getDebugLoc();
328 Builder.SetInsertPoint(BI->getParent());
329 BI->eraseFromParent();
341 return llvm::DebugLoc();
346 if (!BB->use_empty()) {
354 assert(BreakContinueStack.empty() &&
355 "mismatched push/pop in break/continue stack!");
357 "mismatched push/pop of cleanups in EHStack!");
359 "mismatched activate/deactivate of cleanups!");
361 if (
CGM.shouldEmitConvergenceTokens()) {
364 "mismatched push/pop in convergence stack!");
367 bool OnlySimpleReturnStmts = NumSimpleReturnExprs > 0
368 && NumSimpleReturnExprs == NumReturnExprs
383 if (OnlySimpleReturnStmts)
384 DI->EmitLocation(
Builder, LastStopPoint);
386 DI->EmitLocation(
Builder, EndLoc);
394 bool HasOnlyNoopCleanups =
396 bool EmitRetDbgLoc = !HasCleanups || HasOnlyNoopCleanups;
398 std::optional<ApplyDebugLocation> OAL;
403 if (OnlySimpleReturnStmts)
404 DI->EmitLocation(
Builder, EndLoc);
418 if (
CGM.getCodeGenOpts().InstrumentFunctions)
419 CurFn->addFnAttr(
"instrument-function-exit",
"__cyg_profile_func_exit");
420 if (
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
421 CurFn->addFnAttr(
"instrument-function-exit-inlined",
422 "__cyg_profile_func_exit");
431 uint64_t RetKeyInstructionsAtomGroup = Loc ? Loc->getAtomGroup() : 0;
434 RetKeyInstructionsAtomGroup);
438 "did not remove all scopes from cleanup stack!");
442 if (IndirectBranch) {
449 if (!EscapedLocals.empty()) {
453 EscapeArgs.resize(EscapedLocals.size());
454 for (
auto &Pair : EscapedLocals)
455 EscapeArgs[Pair.second] = Pair.first;
456 llvm::Function *FrameEscapeFn = llvm::Intrinsic::getOrInsertDeclaration(
457 &
CGM.getModule(), llvm::Intrinsic::localescape);
464 Ptr->eraseFromParent();
468 if (PostAllocaInsertPt) {
469 llvm::Instruction *PostPtr = PostAllocaInsertPt;
470 PostAllocaInsertPt =
nullptr;
471 PostPtr->eraseFromParent();
476 if (IndirectBranch) {
478 if (PN->getNumIncomingValues() == 0) {
479 PN->replaceAllUsesWith(llvm::PoisonValue::get(PN->getType()));
480 PN->eraseFromParent();
489 for (
const auto &FuncletAndParent : TerminateFunclets)
492 if (
CGM.getCodeGenOpts().EmitDeclMetadata)
495 for (
const auto &R : DeferredReplacements) {
496 if (llvm::Value *Old = R.first) {
497 Old->replaceAllUsesWith(R.second);
501 DeferredReplacements.clear();
510 llvm::DominatorTree DT(*
CurFn);
511 llvm::PromoteMemToReg(
517 for (llvm::Argument &A :
CurFn->args())
518 if (
auto *VT = dyn_cast<llvm::VectorType>(A.getType()))
520 std::max((uint64_t)LargestVectorWidth,
521 VT->getPrimitiveSizeInBits().getKnownMinValue());
524 if (
auto *VT = dyn_cast<llvm::VectorType>(
CurFn->getReturnType()))
526 std::max((uint64_t)LargestVectorWidth,
527 VT->getPrimitiveSizeInBits().getKnownMinValue());
529 if (
CurFnInfo->getMaxVectorWidth() > LargestVectorWidth)
530 LargestVectorWidth =
CurFnInfo->getMaxVectorWidth();
540 CurFn->addFnAttr(
"min-legal-vector-width",
541 llvm::utostr(LargestVectorWidth));
550 dyn_cast<llvm::AllocaInst>(
ReturnValue.emitRawPointer(*
this));
551 if (RetAlloca && RetAlloca->use_empty()) {
552 RetAlloca->eraseFromParent();
561 if (!
CGM.getCodeGenOpts().InstrumentFunctions &&
562 !
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining &&
563 !
CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
573 return CurFuncDecl->hasAttr<DisableSanitizerInstrumentationAttr>();
579 return CGM.getCodeGenOpts().XRayInstrumentFunctions;
585 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
586 (
CGM.getCodeGenOpts().XRayAlwaysEmitCustomEvents ||
587 CGM.getCodeGenOpts().XRayInstrumentationBundle.Mask ==
592 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
593 (
CGM.getCodeGenOpts().XRayAlwaysEmitTypedEvents ||
594 CGM.getCodeGenOpts().XRayInstrumentationBundle.Mask ==
605 llvm::raw_string_ostream Out(Mangled);
606 CGM.getCXXABI().getMangleContext().mangleCanonicalTypeName(Ty, Out,
false);
607 return llvm::ConstantInt::get(
608 CGM.Int32Ty,
static_cast<uint32_t
>(llvm::xxh3_64bits(Mangled)));
611void CodeGenFunction::EmitKernelMetadata(
const FunctionDecl *FD,
612 llvm::Function *Fn) {
613 if (!FD->
hasAttr<DeviceKernelAttr>() && !FD->
hasAttr<CUDAGlobalAttr>())
625 if (
const VecTypeHintAttr *A = FD->
getAttr<VecTypeHintAttr>()) {
626 QualType HintQTy = A->getTypeHint();
628 bool IsSignedInteger =
630 (HintEltQTy && HintEltQTy->
getElementType()->isSignedIntegerType());
631 llvm::Metadata *AttrMDArgs[] = {
632 llvm::ConstantAsMetadata::get(llvm::PoisonValue::get(
634 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
635 llvm::IntegerType::get(Context, 32),
636 llvm::APInt(32, (uint64_t)(IsSignedInteger ? 1 : 0))))};
637 Fn->setMetadata(
"vec_type_hint", llvm::MDNode::get(Context, AttrMDArgs));
640 if (
const WorkGroupSizeHintAttr *A = FD->
getAttr<WorkGroupSizeHintAttr>()) {
641 auto Eval = [&](
Expr *E) {
642 return E->EvaluateKnownConstInt(FD->
getASTContext()).getExtValue();
644 llvm::Metadata *AttrMDArgs[] = {
645 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getXDim()))),
646 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getYDim()))),
647 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getZDim())))};
648 Fn->setMetadata(
"work_group_size_hint", llvm::MDNode::get(Context, AttrMDArgs));
651 if (
const ReqdWorkGroupSizeAttr *A = FD->
getAttr<ReqdWorkGroupSizeAttr>()) {
652 auto Eval = [&](Expr *E) {
653 return E->EvaluateKnownConstInt(FD->
getASTContext()).getExtValue();
655 llvm::Metadata *AttrMDArgs[] = {
656 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getXDim()))),
657 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getYDim()))),
658 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getZDim())))};
659 Fn->setMetadata(
"reqd_work_group_size", llvm::MDNode::get(Context, AttrMDArgs));
662 if (
const OpenCLIntelReqdSubGroupSizeAttr *A =
663 FD->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
664 llvm::Metadata *AttrMDArgs[] = {
665 llvm::ConstantAsMetadata::get(
Builder.getInt32(A->getSubGroupSize()))};
666 Fn->setMetadata(
"intel_reqd_sub_group_size",
667 llvm::MDNode::get(Context, AttrMDArgs));
673 const Stmt *Body =
nullptr;
674 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(F))
676 else if (
auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(F))
677 Body = OMD->getBody();
679 if (
auto *CS = dyn_cast_or_null<CompoundStmt>(Body)) {
680 auto LastStmt = CS->body_rbegin();
681 if (LastStmt != CS->body_rend())
688 if (
SanOpts.has(SanitizerKind::Thread)) {
689 Fn->addFnAttr(
"sanitize_thread_no_checking_at_run_time");
690 Fn->removeFnAttr(llvm::Attribute::SanitizeThread);
695bool CodeGenFunction::requiresReturnValueCheck()
const {
696 return requiresReturnValueNullabilityCheck() ||
702 auto *MD = dyn_cast_or_null<CXXMethodDecl>(D);
703 if (!MD || !MD->getDeclName().getAsIdentifierInfo() ||
704 !MD->getDeclName().getAsIdentifierInfo()->isStr(
"allocate") ||
705 (MD->getNumParams() != 1 && MD->getNumParams() != 2))
711 if (MD->getNumParams() == 2) {
712 auto *PT = MD->parameters()[1]->getType()->getAs<
PointerType>();
713 if (!PT || !PT->isVoidPointerType() ||
714 !PT->getPointeeType().isConstQualified())
721bool CodeGenFunction::isInAllocaArgument(
CGCXXABI &ABI, QualType Ty) {
726bool CodeGenFunction::hasInAllocaArg(
const CXXMethodDecl *MD) {
729 llvm::any_of(MD->
parameters(), [&](ParmVarDecl *P) {
730 return isInAllocaArgument(CGM.getCXXABI(), P->getType());
737 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
750 "Do not use a CodeGenFunction object for more than one function");
754 DidCallStackSave =
false;
756 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
763 assert(
CurFn->isDeclaration() &&
"Function already has body?");
768#define SANITIZER(NAME, ID) \
769 if (SanOpts.empty()) \
771 if (SanOpts.has(SanitizerKind::ID)) \
772 if (CGM.isInNoSanitizeList(SanitizerKind::ID, Fn, Loc)) \
773 SanOpts.set(SanitizerKind::ID, false);
775#include "clang/Basic/Sanitizers.def"
780 const bool SanitizeBounds =
SanOpts.hasOneOf(SanitizerKind::Bounds);
782 bool NoSanitizeCoverage =
false;
785 no_sanitize_mask |=
Attr->getMask();
787 if (
Attr->hasCoverage())
788 NoSanitizeCoverage =
true;
792 SanOpts.Mask &= ~no_sanitize_mask;
793 if (no_sanitize_mask & SanitizerKind::Address)
794 SanOpts.set(SanitizerKind::KernelAddress,
false);
795 if (no_sanitize_mask & SanitizerKind::KernelAddress)
796 SanOpts.set(SanitizerKind::Address,
false);
797 if (no_sanitize_mask & SanitizerKind::HWAddress)
798 SanOpts.set(SanitizerKind::KernelHWAddress,
false);
799 if (no_sanitize_mask & SanitizerKind::KernelHWAddress)
800 SanOpts.set(SanitizerKind::HWAddress,
false);
802 if (SanitizeBounds && !
SanOpts.hasOneOf(SanitizerKind::Bounds))
803 Fn->addFnAttr(llvm::Attribute::NoSanitizeBounds);
805 if (NoSanitizeCoverage &&
CGM.getCodeGenOpts().hasSanitizeCoverage())
806 Fn->addFnAttr(llvm::Attribute::NoSanitizeCoverage);
809 if (
CGM.getCodeGenOpts().hasSanitizeBinaryMetadata()) {
810 if (no_sanitize_mask & SanitizerKind::Thread)
811 Fn->addFnAttr(
"no_sanitize_thread");
816 CurFn->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
819 if (
SanOpts.hasOneOf(SanitizerKind::Address | SanitizerKind::KernelAddress))
820 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
821 if (
SanOpts.hasOneOf(SanitizerKind::HWAddress |
822 SanitizerKind::KernelHWAddress))
823 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
824 if (
SanOpts.has(SanitizerKind::MemtagStack))
825 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
826 if (
SanOpts.has(SanitizerKind::Thread))
827 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
828 if (
SanOpts.has(SanitizerKind::Type))
829 Fn->addFnAttr(llvm::Attribute::SanitizeType);
830 if (
SanOpts.has(SanitizerKind::NumericalStability))
831 Fn->addFnAttr(llvm::Attribute::SanitizeNumericalStability);
832 if (
SanOpts.hasOneOf(SanitizerKind::Memory | SanitizerKind::KernelMemory))
833 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
834 if (
SanOpts.has(SanitizerKind::AllocToken))
835 Fn->addFnAttr(llvm::Attribute::SanitizeAllocToken);
837 if (
SanOpts.has(SanitizerKind::SafeStack))
838 Fn->addFnAttr(llvm::Attribute::SafeStack);
839 if (
SanOpts.has(SanitizerKind::ShadowCallStack))
840 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
842 if (
SanOpts.has(SanitizerKind::Realtime))
846 Fn->addFnAttr(llvm::Attribute::SanitizeRealtime);
848 Fn->addFnAttr(llvm::Attribute::SanitizeRealtimeBlocking);
852 if (
SanOpts.hasOneOf(SanitizerKind::Fuzzer | SanitizerKind::FuzzerNoLink))
853 Fn->addFnAttr(llvm::Attribute::OptForFuzzing);
857 if (
SanOpts.has(SanitizerKind::Thread)) {
858 if (
const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
859 const IdentifierInfo *II = OMD->getSelector().getIdentifierInfoForSlot(0);
862 (OMD->getSelector().isUnarySelector() && II->
isStr(
".cxx_destruct"))) {
871 if (D &&
SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
879 if (D &&
SanOpts.has(SanitizerKind::Null))
885 bool AlwaysXRayAttr =
false;
886 if (
const auto *XRayAttr = D ? D->
getAttr<XRayInstrumentAttr>() :
nullptr) {
887 if (
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
889 CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
892 Fn->addFnAttr(
"function-instrument",
"xray-always");
893 AlwaysXRayAttr =
true;
895 if (XRayAttr->neverXRayInstrument())
896 Fn->addFnAttr(
"function-instrument",
"xray-never");
897 if (
const auto *LogArgs = D->
getAttr<XRayLogArgsAttr>())
899 Fn->addFnAttr(
"xray-log-args",
900 llvm::utostr(LogArgs->getArgumentCount()));
905 "xray-instruction-threshold",
906 llvm::itostr(
CGM.getCodeGenOpts().XRayInstructionThreshold));
910 if (
CGM.getCodeGenOpts().XRayIgnoreLoops)
911 Fn->addFnAttr(
"xray-ignore-loops");
913 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
915 Fn->addFnAttr(
"xray-skip-exit");
917 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
919 Fn->addFnAttr(
"xray-skip-entry");
921 auto FuncGroups =
CGM.getCodeGenOpts().XRayTotalFunctionGroups;
922 if (FuncGroups > 1) {
924 CurFn->getName().bytes_end());
925 auto Group = crc32(FuncName) % FuncGroups;
926 if (Group !=
CGM.getCodeGenOpts().XRaySelectedFunctionGroup &&
928 Fn->addFnAttr(
"function-instrument",
"xray-never");
932 if (
CGM.getCodeGenOpts().getProfileInstr() !=
933 llvm::driver::ProfileInstrKind::ProfileNone) {
934 switch (
CGM.isFunctionBlockedFromProfileInstr(Fn, Loc)) {
936 Fn->addFnAttr(llvm::Attribute::SkipProfile);
939 Fn->addFnAttr(llvm::Attribute::NoProfile);
946 unsigned Count, Offset;
948 if (
const auto *
Attr =
949 D ? D->
getAttr<PatchableFunctionEntryAttr>() :
nullptr) {
950 Count =
Attr->getCount();
951 Offset =
Attr->getOffset();
952 Section =
Attr->getSection();
954 Count =
CGM.getCodeGenOpts().PatchableFunctionEntryCount;
955 Offset =
CGM.getCodeGenOpts().PatchableFunctionEntryOffset;
958 Section =
CGM.getCodeGenOpts().PatchableFunctionEntrySection;
959 if (Count && Offset <= Count) {
960 Fn->addFnAttr(
"patchable-function-entry", std::to_string(Count - Offset));
962 Fn->addFnAttr(
"patchable-function-prefix", std::to_string(Offset));
963 if (!Section.empty())
964 Fn->addFnAttr(
"patchable-function-entry-section", Section);
970 if (
CGM.getCodeGenOpts().HotPatch &&
973 llvm::Triple::CODE16)
974 Fn->addFnAttr(
"patchable-function",
"prologue-short-redirect");
977 if (
CGM.getCodeGenOpts().NoUseJumpTables)
978 Fn->addFnAttr(
"no-jump-tables",
"true");
981 if (
CGM.getCodeGenOpts().NoInlineLineTables)
982 Fn->addFnAttr(
"no-inline-line-tables");
985 if (
CGM.getCodeGenOpts().ProfileSampleAccurate)
986 Fn->addFnAttr(
"profile-sample-accurate");
988 if (!
CGM.getCodeGenOpts().SampleProfileFile.empty())
989 Fn->addFnAttr(
"use-sample-profile");
991 if (D && D->
hasAttr<CFICanonicalJumpTableAttr>())
992 Fn->addFnAttr(
"cfi-canonical-jump-table");
994 if (D && D->
hasAttr<NoProfileFunctionAttr>())
995 Fn->addFnAttr(llvm::Attribute::NoProfile);
997 if (D && D->
hasAttr<HybridPatchableAttr>())
998 Fn->addFnAttr(llvm::Attribute::HybridPatchable);
1002 if (
auto *A = D->
getAttr<FunctionReturnThunksAttr>()) {
1003 switch (A->getThunkType()) {
1004 case FunctionReturnThunksAttr::Kind::Keep:
1006 case FunctionReturnThunksAttr::Kind::Extern:
1007 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1010 }
else if (
CGM.getCodeGenOpts().FunctionReturnThunks)
1011 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1020 EmitKernelMetadata(FD, Fn);
1023 if (FD && FD->
hasAttr<ClspvLibclcBuiltinAttr>()) {
1024 Fn->setMetadata(
"clspv_libclc_builtin",
1031 if (FD &&
SanOpts.has(SanitizerKind::Function) &&
1033 llvm::isCallableCC(Fn->getCallingConv())) {
1035 llvm::LLVMContext &Ctx = Fn->getContext();
1036 llvm::MDBuilder MDB(Ctx);
1038 llvm::LLVMContext::MD_func_sanitize,
1039 MDB.createRTTIPointerPrologue(
1046 if (
SanOpts.has(SanitizerKind::NullabilityReturn)) {
1047 auto Nullability =
FnRetTy->getNullability();
1050 if (!(
SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) &&
1052 RetValNullabilityPrecondition =
1059 if (
CGM.getCodeGenOpts().CopyProf) {
1060 if (
const auto *MD = dyn_cast_or_null<CXXMethodDecl>(D)) {
1062 if (
const auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
1063 if (!CD->isMoveConstructor())
1065 CD->isCopyConstructor() ?
"copyprof-copy-ctor" :
"copyprof-ctor";
1067 Attr =
"copyprof-dtor";
1069 Attr =
"copyprof-copy-assign-op";
1071 if (!
Attr.empty()) {
1078 CGM.getCodeGenOpts().CopyProfStaticSizeThreshold)
1102 Fn->addFnAttr(llvm::Attribute::NoRecurse);
1105 llvm::fp::ExceptionBehavior FPExceptionBehavior =
1107 Builder.setDefaultConstrainedRounding(RM);
1108 Builder.setDefaultConstrainedExcept(FPExceptionBehavior);
1110 (!FD && (FPExceptionBehavior != llvm::fp::ebIgnore ||
1111 RM != llvm::RoundingMode::NearestTiesToEven))) {
1112 Builder.setIsFPConstrained(
true);
1113 Fn->addFnAttr(llvm::Attribute::StrictFP);
1119 CGM.getCodeGenOpts().StackAlignment))
1120 Fn->addFnAttr(
"stackrealign");
1124 Fn->removeFnAttr(
"zero-call-used-regs");
1127 llvm::StringMap<bool> FeatureMap;
1132 if (
T->getAArch64SMEAttributes() &
1139 std::optional<std::pair<unsigned, unsigned>> VScaleRange =
1143 CurFn->addFnAttr(llvm::Attribute::getWithVScaleRangeArgs(
1152 llvm::Value *Poison = llvm::PoisonValue::get(
Int32Ty);
1157 Builder.SetInsertPoint(EntryBB);
1161 if (requiresReturnValueCheck()) {
1172 DI->emitFunctionStart(GD, Loc, StartLoc,
1173 DI->getFunctionType(FD, RetTy, Args),
CurFn,
1178 if (
CGM.getCodeGenOpts().InstrumentFunctions)
1179 CurFn->addFnAttr(
"instrument-function-entry",
"__cyg_profile_func_enter");
1180 if (
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
1181 CurFn->addFnAttr(
"instrument-function-entry-inlined",
1182 "__cyg_profile_func_enter");
1183 if (
CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
1184 CurFn->addFnAttr(
"instrument-function-entry-inlined",
1185 "__cyg_profile_func_enter_bare");
1192 if (
CGM.getCodeGenOpts().InstrumentForProfiling) {
1196 if (
CGM.getCodeGenOpts().CallFEntry)
1197 Fn->addFnAttr(
"fentry-call",
"true");
1199 Fn->addFnAttr(
"instrument-function-entry-inlined",
1202 if (
CGM.getCodeGenOpts().MNopMCount) {
1203 if (!
CGM.getCodeGenOpts().CallFEntry)
1204 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1205 <<
"-mnop-mcount" <<
"-mfentry";
1206 Fn->addFnAttr(
"mnop-mcount");
1209 if (
CGM.getCodeGenOpts().RecordMCount) {
1210 if (!
CGM.getCodeGenOpts().CallFEntry)
1211 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1212 <<
"-mrecord-mcount" <<
"-mfentry";
1213 Fn->addFnAttr(
"mrecord-mcount");
1218 if (
CGM.getCodeGenOpts().PackedStack) {
1220 llvm::Triple::systemz)
1221 CGM.getDiags().Report(diag::err_opt_not_valid_on_target)
1222 <<
"-mpacked-stack";
1223 Fn->addFnAttr(
"packed-stack");
1226 if (!
CGM.getCodeGenOpts().ZOSPPA1Name)
1227 Fn->addFnAttr(
"zos-ppa1-name",
"");
1229 if (
CGM.getCodeGenOpts().WarnStackSize !=
UINT_MAX &&
1230 !
CGM.getDiags().isIgnored(diag::warn_fe_backend_frame_larger_than, Loc))
1231 Fn->addFnAttr(
"warn-stack-size",
1232 std::to_string(
CGM.getCodeGenOpts().WarnStackSize));
1244 auto AI =
CurFn->arg_begin();
1245 if (
CurFnInfo->getReturnInfo().isSRetAfterThis())
1248 &*AI, RetTy,
CurFnInfo->getReturnInfo().getIndirectAlign(),
false,
1250 if (!
CurFnInfo->getReturnInfo().getIndirectByVal()) {
1259 unsigned Idx =
CurFnInfo->getReturnInfo().getInAllocaFieldIndex();
1260 llvm::Function::arg_iterator EI =
CurFn->arg_end();
1292 if (FD->
hasAttr<HLSLShaderAttr>()) {
1293 CGM.getHLSLRuntime().emitEntryFunction(FD, Fn);
1299 if (
const CXXMethodDecl *MD = dyn_cast_if_present<CXXMethodDecl>(D);
1304 CGM.getCXXABI().EmitInstanceFunctionProlog(*
this);
1320 CXXThisValue = ThisFieldLValue.
getPointer(*
this);
1329 if (FD->hasCapturedVLAType()) {
1332 auto VAT = FD->getCapturedVLAType();
1333 VLASizeMap[VAT->getSizeExpr()] = ExprArg;
1340 CXXThisValue = CXXABIThisValue;
1344 if (CXXABIThisValue) {
1346 SkippedChecks.
set(SanitizerKind::ObjectSize,
true);
1353 SkippedChecks.
set(SanitizerKind::Null,
true);
1357 Loc, CXXABIThisValue, ThisTy, CXXABIThisAlignment, SkippedChecks);
1364 if (!FD || !FD->
hasAttr<NakedAttr>()) {
1365 for (
const VarDecl *VD : Args) {
1370 if (
const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
1371 Ty = PVD->getOriginalType();
1381 DI->EmitLocation(
Builder, StartLoc);
1385 if (
const auto *VecWidth =
CurFuncDecl->getAttr<MinVectorWidthAttr>())
1386 LargestVectorWidth = VecWidth->getVectorWidth();
1388 if (
CGM.shouldEmitConvergenceTokens())
1395 if (
const CompoundStmt *S = dyn_cast<CompoundStmt>(Body))
1407 llvm::BasicBlock *SkipCountBB =
nullptr;
1429 if (F->isInterposable())
return;
1431 for (llvm::BasicBlock &BB : *F)
1432 for (llvm::Instruction &I : BB)
1436 F->setDoesNotThrow();
1446 if (
CGM.getCXXABI().HasThisReturn(GD))
1448 else if (
CGM.getCXXABI().hasMostDerivedReturn(GD))
1449 ResTy =
CGM.getContext().VoidPtrTy;
1450 CGM.getCXXABI().buildThisParam(*
this, Args);
1456 bool PassedParams =
true;
1458 if (
auto Inherited = CD->getInheritedConstructor())
1464 Args.push_back(Param);
1465 if (!Param->hasAttr<PassObjectSizeAttr>())
1469 getContext(), Param->getDeclContext(), Param->getLocation(),
1477 CGM.getCXXABI().addImplicitStructorParams(*
this, ResTy, Args);
1484 assert(Fn &&
"generating code for null Function");
1491 CGM.getTargetCodeGenInfo().checkFunctionABI(
CGM, FD);
1497 std::string FDInlineName = (Fn->getName() +
".inline").str();
1498 llvm::Module *M = Fn->getParent();
1499 llvm::Function *Clone = M->getFunction(FDInlineName);
1501 Clone = llvm::Function::Create(Fn->getFunctionType(),
1502 llvm::GlobalValue::InternalLinkage,
1503 Fn->getAddressSpace(), FDInlineName, M);
1504 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
1506 Fn->setLinkage(llvm::GlobalValue::ExternalLinkage);
1516 if (LLVM_UNLIKELY(PD->isInlineBuiltinDeclaration())) {
1517 std::string FDInlineName = (Fn->getName() +
".inline").str();
1518 llvm::Module *M = Fn->getParent();
1519 if (llvm::Function *Clone = M->getFunction(FDInlineName)) {
1520 Clone->replaceAllUsesWith(Fn);
1521 Clone->eraseFromParent();
1529 if (FD->
hasAttr<NoDebugAttr>()) {
1532 Fn->setSubprogram(
nullptr);
1534 DebugInfo =
nullptr;
1537 llvm::scope_exit Cleanup([
this] {
1539 DI->completeFunction();
1546 BodyRange = Body->getSourceRange();
1549 CurEHLocation = BodyRange.getEnd();
1561 if (SpecDecl->hasBody(SpecDecl))
1562 Loc = SpecDecl->getLocation();
1569 ShouldEmitLifetimeMarkers =
true;
1572 bool NeedsBypassDetection =
1573 ShouldEmitLifetimeMarkers ||
1574 (
CGM.getLangOpts().getTrivialAutoVarInit() !=
1576 if (NeedsBypassDetection)
1581 StartFunction(GD, ResTy, Fn, FnInfo, Args, Loc, BodyRange.getBegin());
1584 if (Body && isa_and_nonnull<CoroutineBodyStmt>(Body))
1592 CurFn->addFnAttr(llvm::Attribute::MustProgress);
1595 PGO->assignRegionCounters(GD,
CurFn);
1602 FD->
hasAttr<CUDAGlobalAttr>())
1603 CGM.getCUDARuntime().emitDeviceStub(*
this, Args);
1626 }
else if (DeviceKernelAttr::isOpenCLSpelling(
1627 FD->
getAttr<DeviceKernelAttr>()) &&
1630 for (
unsigned i = 0; i < Args.size(); ++i) {
1632 QualType ArgQualType = Args[i]->getType();
1634 CallArgs.
add(ArgRValue, ArgQualType);
1638 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FT);
1641 llvm::FunctionType *FTy =
CGM.getTypes().GetFunctionType(FnInfo);
1642 llvm::Constant *GDStubFunctionPointer =
1643 CGM.getRawFunctionPointer(GDStub, FTy);
1650 llvm_unreachable(
"no definition for emitted function");
1660 bool ShouldEmitUnreachable =
1661 CGM.getCodeGenOpts().StrictReturn ||
1663 if (
SanOpts.has(SanitizerKind::Return)) {
1664 auto CheckOrdinal = SanitizerKind::SO_Return;
1665 auto CheckHandler = SanitizerHandler::MissingReturn;
1667 llvm::Value *IsFalse =
Builder.getFalse();
1668 EmitCheck(std::make_pair(IsFalse, CheckOrdinal), CheckHandler,
1670 }
else if (ShouldEmitUnreachable) {
1671 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
1674 if (
SanOpts.has(SanitizerKind::Return) || ShouldEmitUnreachable) {
1676 Builder.ClearInsertionPoint();
1683 PGO->verifyCounterMap();
1686 StringRef Identifier =
1687 CurCodeDecl->getAttr<PersonalityAttr>()->getRoutine()->getName();
1688 llvm::FunctionCallee PersonalityRoutine =
1689 CGM.CreateRuntimeFunction(llvm::FunctionType::get(
CGM.Int32Ty,
true),
1690 Identifier, {},
true);
1696 if (!
CurFn->doesNotThrow())
1705 if (!S)
return false;
1722 IgnoreCaseStmts =
true;
1737 if (!S)
return false;
1757 if (!S)
return false;
1788 if (!AllowLabels &&
CGM.getCodeGenOpts().hasProfileClangInstr() &&
1789 CGM.getCodeGenOpts().MCDCCoverage)
1792 llvm::APSInt ResultInt;
1796 ResultBool = ResultInt.getBoolValue();
1804 llvm::APSInt &ResultInt,
1816 PGO->markStmtMaybeUsed(Cond);
1817 ResultInt = std::move(
Int);
1846 llvm::BasicBlock *FalseBlock, uint64_t TrueCount ,
1849 bool InstrumentRegions =
CGM.getCodeGenOpts().hasProfileClangInstr();
1853 const Stmt *CntrStmt = (CntrIdx ? CntrIdx : Cond);
1855 llvm::BasicBlock *ThenBlock =
nullptr;
1856 llvm::BasicBlock *ElseBlock =
nullptr;
1857 llvm::BasicBlock *NextBlock =
nullptr;
1862 llvm::BasicBlock *SkipIncrBlock =
1864 llvm::BasicBlock *SkipNextBlock =
nullptr;
1878 if (LOp == BO_LAnd) {
1879 SkipNextBlock = FalseBlock;
1880 ThenBlock = CounterIncrBlock;
1881 ElseBlock = (SkipIncrBlock ? SkipIncrBlock : SkipNextBlock);
1882 NextBlock = TrueBlock;
1897 else if (LOp == BO_LOr) {
1898 SkipNextBlock = TrueBlock;
1899 ThenBlock = (SkipIncrBlock ? SkipIncrBlock : SkipNextBlock);
1900 ElseBlock = CounterIncrBlock;
1901 NextBlock = FalseBlock;
1903 llvm_unreachable(
"Expected Opcode must be that of a Logical Operator");
1909 if (SkipIncrBlock) {
1933 const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock,
1935 const VarDecl *ConditionalDecl) {
1938 if (
const BinaryOperator *CondBOp = dyn_cast<BinaryOperator>(Cond)) {
1942 if (CondBOp->getOpcode() == BO_LAnd) {
1945 bool ConstantBool =
false;
1951 FalseBlock, TrueCount, LH);
1961 FalseBlock, TrueCount, LH, CondBOp);
1968 llvm::BasicBlock *LHSFalse =
1996 FalseBlock, TrueCount, LH);
2001 if (CondBOp->getOpcode() == BO_LOr) {
2004 bool ConstantBool =
false;
2010 FalseBlock, TrueCount, LH);
2020 FalseBlock, TrueCount, LH, CondBOp);
2025 llvm::BasicBlock *LHSTrue =
2033 uint64_t RHSCount = TrueCount - LHSCount;
2064 if (
const UnaryOperator *CondUOp = dyn_cast<UnaryOperator>(Cond)) {
2069 bool MCDCCondition =
CGM.getCodeGenOpts().hasProfileClangInstr() &&
2070 CGM.getCodeGenOpts().MCDCCoverage &&
2072 if (CondUOp->getOpcode() == UO_LNot && !MCDCCondition) {
2099 uint64_t LHSScaledTrueCount = 0;
2103 LHSScaledTrueCount = TrueCount * LHSRatio;
2112 LHSScaledTrueCount, LH, CondOp);
2120 TrueCount - LHSScaledTrueCount, LH, CondOp);
2126 if (
const CXXThrowExpr *Throw = dyn_cast<CXXThrowExpr>(Cond)) {
2148 const Expr *MCDCBaseExpr = Cond;
2155 MCDCBaseExpr = ConditionalOp;
2162 llvm::MDNode *Weights =
nullptr;
2163 llvm::MDNode *Unpredictable =
nullptr;
2169 if (
Call &&
CGM.getCodeGenOpts().OptimizationLevel != 0) {
2170 auto *FD = dyn_cast_or_null<FunctionDecl>(
Call->getCalleeDecl());
2171 if (FD && FD->
getBuiltinID() == Builtin::BI__builtin_unpredictable) {
2173 Unpredictable = MDHelper.createUnpredictable();
2179 llvm::Value *NewCondV = emitCondLikelihoodViaExpectIntrinsic(CondV, LH);
2180 if (CondV != NewCondV)
2185 Weights = createProfileWeights(TrueCount, CurrentCount - TrueCount);
2188 llvm::Instruction *BrInst =
Builder.CreateCondBr(CondV, TrueBlock, FalseBlock,
2189 Weights, Unpredictable);
2193 case HLSLControlFlowHintAttr::Microsoft_branch:
2194 case HLSLControlFlowHintAttr::Microsoft_flatten: {
2195 llvm::MDBuilder MDHelper(
CGM.getLLVMContext());
2197 llvm::ConstantInt *BranchHintConstant =
2199 HLSLControlFlowHintAttr::Spelling::Microsoft_branch
2200 ? llvm::ConstantInt::get(
CGM.Int32Ty, 1)
2201 : llvm::ConstantInt::get(
CGM.Int32Ty, 2);
2204 {MDHelper.createString(
"hlsl.controlflow.hint"),
2205 MDHelper.createConstant(BranchHintConstant)});
2206 BrInst->setMetadata(
"hlsl.controlflow.hint",
2207 llvm::MDNode::get(
CGM.getLLVMContext(), Vals));
2211 case HLSLControlFlowHintAttr::SpellingNotCalculated:
2219 llvm::Value *Arg =
nullptr;
2220 if ((ICEArguments & (1 << Idx)) == 0) {
2225 std::optional<llvm::APSInt>
Result =
2227 assert(
Result &&
"Expected argument to be a constant");
2236 CGM.ErrorUnsupported(S,
Type);
2248 llvm::Value *sizeInChars) {
2252 llvm::Value *baseSizeInChars
2256 llvm::Value *end = Builder.CreateInBoundsGEP(begin.
getElementType(),
2258 sizeInChars,
"vla.end");
2260 llvm::BasicBlock *originBB = CGF.
Builder.GetInsertBlock();
2268 llvm::PHINode *cur = Builder.CreatePHI(begin.
getType(), 2,
"vla.cur");
2275 Builder.CreateMemCpy(
Address(cur, CGF.
Int8Ty, curAlign), src, baseSizeInChars,
2280 Builder.CreateInBoundsGEP(CGF.
Int8Ty, cur, baseSizeInChars,
"vla.next");
2283 llvm::Value *done = Builder.CreateICmpEQ(next, end,
"vla-init.isdone");
2284 Builder.CreateCondBr(done, contBB, loopBB);
2285 cur->addIncoming(next, loopBB);
2303 if (
CGM.getContext().arePFPFieldsTriviallyCopyable(Field->getParent())) {
2304 uint64_t FieldSignature =
2305 llvm::getPointerAuthStableSipHash(
CGM.getPFPFieldName(Field));
2306 Disc = llvm::ConstantInt::get(
CGM.Int64Ty, FieldSignature);
2310 llvm::GlobalValue *DS =
CGM.getPFPDeactivationSymbol(Field);
2311 llvm::OperandBundleDef DSBundle(
"deactivation-symbol", DS);
2314 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::protected_field_ptr,
2333 llvm::Value *SizeVal;
2340 dyn_cast_or_null<VariableArrayType>(
2343 SizeVal = VlaSize.NumElts;
2345 if (!eltSize.
isOne())
2346 SizeVal =
Builder.CreateNUWMul(SizeVal,
CGM.getSize(eltSize));
2352 SizeVal =
CGM.getSize(size);
2360 if (!
CGM.getTypes().isZeroInitializable(Ty)) {
2364 llvm::Constant *NullConstant =
CGM.EmitNullConstant(Ty);
2366 llvm::GlobalVariable *NullVariable =
2367 new llvm::GlobalVariable(
CGM.getModule(), NullConstant->getType(),
2369 llvm::GlobalVariable::PrivateLinkage,
2370 NullConstant, Twine());
2372 NullVariable->setAlignment(NullAlign.
getAsAlign());
2378 Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal,
false);
2384 Builder.CreateMemSet(DestPtr,
Builder.getInt8(0), SizeVal,
false);
2397 if (!IndirectBranch)
2403 IndirectBranch->addDestination(BB);
2404 return llvm::BlockAddress::get(
CurFn->getType(), BB);
2409 if (IndirectBranch)
return IndirectBranch->getParent();
2414 llvm::Value *DestVal = TmpBuilder.CreatePHI(
Int8PtrTy, 0,
2415 "indirect.goto.dest");
2418 IndirectBranch = TmpBuilder.CreateIndirectBr(DestVal);
2419 return IndirectBranch->getParent();
2431 llvm::Value *numVLAElements =
nullptr;
2443 baseType = elementType;
2444 return numVLAElements;
2458 llvm::ConstantInt *zero =
Builder.getInt32(0);
2459 gepIndices.push_back(zero);
2461 uint64_t countFromCLAs = 1;
2464 llvm::ArrayType *llvmArrayType =
2466 while (llvmArrayType) {
2469 llvmArrayType->getNumElements());
2471 gepIndices.push_back(zero);
2472 countFromCLAs *= llvmArrayType->getNumElements();
2476 dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
2479 "LLVM and Clang types are out-of-synch");
2498 gepIndices,
"array.begin"),
2504 llvm::Value *numElements
2505 = llvm::ConstantInt::get(
SizeTy, countFromCLAs);
2509 numElements =
Builder.CreateNUWMul(numVLAElements, numElements);
2516 assert(vla &&
"type was not a variable array type!");
2523 llvm::Value *numElements =
nullptr;
2527 elementType =
type->getElementType();
2528 llvm::Value *vlaSize = VLASizeMap[
type->getSizeExpr()];
2529 assert(vlaSize &&
"no size for VLA!");
2530 assert(vlaSize->getType() ==
SizeTy);
2533 numElements = vlaSize;
2537 numElements =
Builder.CreateNUWMul(numElements, vlaSize);
2539 }
while ((
type =
getContext().getAsVariableArrayType(elementType)));
2541 return { numElements, elementType };
2547 assert(vla &&
"type was not a variable array type!");
2553 llvm::Value *VlaSize = VLASizeMap[Vla->
getSizeExpr()];
2554 assert(VlaSize &&
"no size for VLA!");
2555 assert(VlaSize->getType() ==
SizeTy);
2560 assert(
type->isVariablyModifiedType() &&
2561 "Must pass variably modified type to EmitVLASizes!");
2568 assert(
type->isVariablyModifiedType());
2570 const Type *ty =
type.getTypePtr();
2573#define TYPE(Class, Base)
2574#define ABSTRACT_TYPE(Class, Base)
2575#define NON_CANONICAL_TYPE(Class, Base)
2576#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2577#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
2578#include "clang/AST/TypeNodes.inc"
2579 llvm_unreachable(
"unexpected dependent type!");
2585 case Type::ExtVector:
2586 case Type::ConstantMatrix:
2590 case Type::TemplateSpecialization:
2591 case Type::ObjCTypeParam:
2592 case Type::ObjCObject:
2593 case Type::ObjCInterface:
2594 case Type::ObjCObjectPointer:
2596 case Type::HLSLInlineSpirv:
2597 case Type::PredefinedSugar:
2598 llvm_unreachable(
"type class is never variably-modified!");
2600 case Type::Adjusted:
2612 case Type::BlockPointer:
2616 case Type::LValueReference:
2617 case Type::RValueReference:
2621 case Type::MemberPointer:
2625 case Type::ArrayParameter:
2626 case Type::ConstantArray:
2627 case Type::IncompleteArray:
2632 case Type::VariableArray: {
2641 llvm::Value *&entry = VLASizeMap[sizeExpr];
2649 if (
SanOpts.has(SanitizerKind::VLABound)) {
2650 auto CheckOrdinal = SanitizerKind::SO_VLABound;
2651 auto CheckHandler = SanitizerHandler::VLABoundNotPositive;
2653 llvm::Value *
Zero = llvm::Constant::getNullValue(size->getType());
2655 llvm::Value *CheckCondition =
2659 llvm::Constant *StaticArgs[] = {
2662 EmitCheck(std::make_pair(CheckCondition, CheckOrdinal),
2663 CheckHandler, StaticArgs, size);
2676 case Type::FunctionProto:
2677 case Type::FunctionNoProto:
2683 case Type::UnaryTransform:
2684 case Type::Attributed:
2685 case Type::BTFTagAttributed:
2686 case Type::OverflowBehavior:
2687 case Type::HLSLAttributedResource:
2688 case Type::SubstTemplateTypeParm:
2689 case Type::MacroQualified:
2690 case Type::CountAttributed:
2691 case Type::LateParsedAttr:
2697 case Type::Decltype:
2699 case Type::DeducedTemplateSpecialization:
2700 case Type::PackIndexing:
2704 case Type::TypeOfExpr:
2717 }
while (
type->isVariablyModifiedType());
2721 if (
getContext().getBuiltinVaListType()->isArrayType())
2736 assert(
Init.hasValue() &&
"Invalid DeclRefExpr initializer!");
2738 if (
CGM.getCodeGenOpts().hasReducedDebugInfo())
2754 llvm::Instruction *inst =
new llvm::BitCastInst(value, value->getType(),
"",
2758 protection.Inst = inst;
2763 if (!protection.Inst)
return;
2766 protection.Inst->eraseFromParent();
2772 llvm::Value *Alignment,
2773 llvm::Value *OffsetValue) {
2774 if (Alignment->getType() !=
IntPtrTy)
2777 if (OffsetValue && OffsetValue->getType() !=
IntPtrTy)
2780 llvm::Value *TheCheck =
nullptr;
2781 if (
SanOpts.has(SanitizerKind::Alignment)) {
2782 llvm::Value *PtrIntValue =
2786 bool IsOffsetZero =
false;
2787 if (
const auto *CI = dyn_cast<llvm::ConstantInt>(OffsetValue))
2788 IsOffsetZero = CI->isZero();
2791 PtrIntValue =
Builder.CreateSub(PtrIntValue, OffsetValue,
"offsetptr");
2794 llvm::Value *
Zero = llvm::ConstantInt::get(
IntPtrTy, 0);
2797 llvm::Value *MaskedPtr =
Builder.CreateAnd(PtrIntValue, Mask,
"maskedptr");
2798 TheCheck =
Builder.CreateICmpEQ(MaskedPtr,
Zero,
"maskcond");
2800 llvm::Instruction *Assumption =
Builder.CreateAlignmentAssumption(
2801 CGM.getDataLayout(), PtrValue, Alignment, OffsetValue);
2803 if (!
SanOpts.has(SanitizerKind::Alignment))
2806 OffsetValue, TheCheck, Assumption);
2812 llvm::Value *Alignment,
2813 llvm::Value *OffsetValue) {
2822 llvm::Value *AnnotatedVal,
2823 StringRef AnnotationStr,
2825 const AnnotateAttr *
Attr) {
2828 CGM.EmitAnnotationString(AnnotationStr),
2829 CGM.EmitAnnotationUnit(Location),
2830 CGM.EmitAnnotationLineNo(Location),
2833 Args.push_back(
CGM.EmitAnnotationArgs(
Attr));
2834 return Builder.CreateCall(AnnotationFn, Args);
2838 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
2841 {V->getType(), CGM.ConstGlobalsPtrTy}),
2847 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
2848 llvm::Value *
V =
Addr.emitRawPointer(*
this);
2849 llvm::Type *VTy =
V->getType();
2850 auto *PTy = dyn_cast<llvm::PointerType>(VTy);
2851 unsigned AS = PTy ? PTy->getAddressSpace() : 0;
2852 llvm::PointerType *IntrinTy =
2853 llvm::PointerType::get(
CGM.getLLVMContext(), AS);
2854 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation,
2855 {IntrinTy,
CGM.ConstGlobalsPtrTy});
2861 if (VTy != IntrinTy)
2874 assert(!CGF->IsSanitizerScope);
2875 CGF->IsSanitizerScope =
true;
2879 CGF->IsSanitizerScope =
false;
2883 const llvm::Twine &Name,
2884 llvm::BasicBlock::iterator InsertPt)
const {
2887 I->setNoSanitizeMetadata();
2891 llvm::Instruction *I,
const llvm::Twine &Name,
2892 llvm::BasicBlock::iterator InsertPt)
const {
2893 llvm::IRBuilderDefaultInserter::InsertHelper(I, Name, InsertPt);
2895 CGF->InsertHelper(I, Name, InsertPt);
2917 if (!
CGM.getCodeGenOpts().SanitizeStats)
2920 llvm::IRBuilder<> IRB(
Builder.GetInsertBlock(),
Builder.GetInsertPoint());
2921 IRB.SetCurrentDebugLocation(
Builder.getCurrentDebugLocation());
2922 CGM.getSanStats().create(IRB, SSK);
2934 Salt = Info.CFISalt;
2936 Bundles.emplace_back(
"kcfi",
CGM.CreateKCFITypeId(FP->
desugar(), Salt));
2940CodeGenFunction::FormAArch64ResolverCondition(
const FMVResolverOption &RO) {
2941 return RO.Features.empty() ?
nullptr : EmitAArch64CpuSupports(RO.Features);
2945CodeGenFunction::FormX86ResolverCondition(
const FMVResolverOption &RO) {
2948 if (RO.Architecture) {
2949 StringRef
Arch = *RO.Architecture;
2952 if (
Arch.starts_with(
"x86-64"))
2958 if (!RO.Features.empty()) {
2959 llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Features);
2967 llvm::Function *Resolver,
2969 llvm::Function *FuncToReturn,
2970 bool SupportsIFunc) {
2971 if (SupportsIFunc) {
2972 Builder.CreateRet(FuncToReturn);
2977 llvm::make_pointer_range(Resolver->args()));
2979 llvm::CallInst *
Result = Builder.CreateCall(FuncToReturn, Args);
2980 Result->setTailCallKind(llvm::CallInst::TCK_MustTail);
2982 if (Resolver->getReturnType()->isVoidTy())
2983 Builder.CreateRetVoid();
2985 Builder.CreateRet(
Result);
2991 llvm::Triple::ArchType ArchType =
2995 case llvm::Triple::x86:
2996 case llvm::Triple::x86_64:
2999 case llvm::Triple::aarch64:
3002 case llvm::Triple::riscv32:
3003 case llvm::Triple::riscv64:
3004 case llvm::Triple::riscv32be:
3005 case llvm::Triple::riscv64be:
3008 case llvm::Triple::ppc:
3009 case llvm::Triple::ppc64:
3017 "Only implemented for x86, AArch64, RISC-V, and PowerPC AIX");
3045 Builder.SetInsertPoint(CurBlock);
3047 if (!RO.Architecture && RO.Features.empty()) {
3050 assert(&RO == Options.end() - 1 &&
3051 "Default or Generic case must be last");
3052 Builder.CreateRet(RO.Function);
3061 assert(RO.Features.size() == 1 &&
3062 "for now one feature requirement per version");
3064 StringRef FeatureStr = RO.Features[0];
3065 StringRef BuiltinCpuSupportsArg;
3066 bool IsNegated =
false;
3068 if (FeatureStr.starts_with(
"cpu=")) {
3070 StringRef CPU = FeatureStr.split(
"=").second.trim();
3071 BuiltinCpuSupportsArg = llvm::StringSwitch<StringRef>(CPU)
3072#define PPC_AIX_CLONES_CPU(CPU_NAME, AIX_BUILTIN_CPU_SUPPORTS_NAME, _) \
3073 .Case(CPU_NAME, AIX_BUILTIN_CPU_SUPPORTS_NAME)
3074#include "llvm/TargetParser/PPCTargetParser.def"
3080 if (FeatureStr.starts_with(
"no-")) {
3082 FeatureStr = FeatureStr.drop_front(3);
3086 BuiltinCpuSupportsArg =
3087 llvm::StringSwitch<StringRef>(FeatureStr)
3088#define PPC_AIX_CLONES_FEATURE(FEATURE_NAME, AIX_BUILTIN_CPU_SUPPORTS_NAME, _, \
3090 .Case(FEATURE_NAME, AIX_BUILTIN_CPU_SUPPORTS_NAME)
3091#include "llvm/TargetParser/PPCTargetParser.def"
3096 assert(!BuiltinCpuSupportsArg.empty() &&
3097 "Feature without runtime detection should have been rejected in "
3101 assert(
getContext().getTargetInfo().validateCpuSupports(
3102 BuiltinCpuSupportsArg));
3106 Builder.getInt1Ty(), BuiltinCpuSupportsArg);
3117 Builder.SetInsertPoint(ThenBlock);
3118 Builder.CreateRet(RO.Function);
3121 llvm_unreachable(
"Default case missing");
3128 llvm::Triple::OSType::Linux) {
3129 CGM.getDiags().Report(diag::err_os_unsupport_riscv_fmv);
3134 Builder.SetInsertPoint(CurBlock);
3138 bool HasDefault =
false;
3139 unsigned DefaultIndex = 0;
3142 for (
unsigned Index = 0; Index < Options.size(); Index++) {
3144 if (Options[Index].Features.empty()) {
3146 DefaultIndex = Index;
3150 Builder.SetInsertPoint(CurBlock);
3176 for (StringRef Feat : Options[Index].Features) {
3177 std::vector<std::string> FeatStr =
3180 assert(FeatStr.size() == 1 &&
"Feature string not delimited");
3182 std::string &CurrFeat = FeatStr.front();
3183 if (CurrFeat[0] ==
'+')
3184 TargetAttrFeats.push_back(CurrFeat.substr(1));
3187 if (TargetAttrFeats.empty())
3190 for (std::string &Feat : TargetAttrFeats)
3191 CurrTargetAttrFeats.push_back(Feat);
3193 Builder.SetInsertPoint(CurBlock);
3196 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3199 Options[Index].
Function, SupportsIFunc);
3202 Builder.SetInsertPoint(CurBlock);
3203 Builder.CreateCondBr(FeatsCondition, RetBlock, ElseBlock);
3205 CurBlock = ElseBlock;
3210 Builder.SetInsertPoint(CurBlock);
3217 Builder.SetInsertPoint(CurBlock);
3223 assert(!Options.empty() &&
"No multiversion resolver options found");
3224 assert(Options.back().Features.size() == 0 &&
"Default case must be last");
3226 assert(SupportsIFunc &&
3227 "Multiversion resolver requires target IFUNC support");
3228 bool AArch64CpuInitialized =
false;
3232 Builder.SetInsertPoint(CurBlock);
3233 llvm::Value *
Condition = FormAArch64ResolverCondition(RO);
3242 if (!AArch64CpuInitialized) {
3243 Builder.SetInsertPoint(CurBlock->begin());
3244 EmitAArch64CpuInit();
3245 AArch64CpuInitialized =
true;
3246 Builder.SetInsertPoint(CurBlock);
3250 if (RO.Function ==
nullptr)
3253 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3262 Builder.SetInsertPoint(CurBlock);
3273 Builder.SetInsertPoint(CurBlock);
3277 Builder.SetInsertPoint(CurBlock);
3278 llvm::Value *
Condition = FormX86ResolverCondition(RO);
3282 assert(&RO == Options.end() - 1 &&
3283 "Default or Generic case must be last");
3289 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3298 Builder.SetInsertPoint(CurBlock);
3311 llvm::Value *OffsetValue, llvm::Value *TheCheck,
3312 llvm::Instruction *Assumption) {
3313 assert(isa_and_nonnull<llvm::CallInst>(Assumption) &&
3315 llvm::Intrinsic::getOrInsertDeclaration(
3316 Builder.GetInsertBlock()->getParent()->getParent(),
3317 llvm::Intrinsic::assume) &&
3318 "Assumption should be a call to llvm.assume().");
3319 assert(&(
Builder.GetInsertBlock()->back()) == Assumption &&
3320 "Assumption should be the last instruction of the basic block, "
3321 "since the basic block is still being generated.");
3323 if (!
SanOpts.has(SanitizerKind::Alignment))
3333 Assumption->removeFromParent();
3336 auto CheckOrdinal = SanitizerKind::SO_Alignment;
3337 auto CheckHandler = SanitizerHandler::AlignmentAssumption;
3341 OffsetValue =
Builder.getInt1(
false);
3346 llvm::Value *DynamicData[] = {Ptr, Alignment, OffsetValue};
3347 EmitCheck({std::make_pair(TheCheck, CheckOrdinal)}, CheckHandler,
3348 StaticData, DynamicData);
3359 return DI->SourceLocToDebugLoc(Location);
3361 return llvm::DebugLoc();
3365CodeGenFunction::emitCondLikelihoodViaExpectIntrinsic(llvm::Value *Cond,
3376 llvm::Type *CondTy = Cond->getType();
3377 assert(CondTy->isIntegerTy(1) &&
"expecting condition to be a boolean");
3378 llvm::Function *FnExpect =
3380 llvm::Value *ExpectedValueOfCond =
3382 return Builder.CreateCall(FnExpect, {Cond, ExpectedValueOfCond},
3383 Cond->getName() +
".expval");
3385 llvm_unreachable(
"Unknown Likelihood");
3389 unsigned NumElementsDst,
3390 const llvm::Twine &Name) {
3392 unsigned NumElementsSrc = SrcTy->getNumElements();
3393 if (NumElementsSrc == NumElementsDst)
3396 std::vector<int> ShuffleMask(NumElementsDst, -1);
3397 for (
unsigned MaskIdx = 0;
3398 MaskIdx < std::min<>(NumElementsDst, NumElementsSrc); ++MaskIdx)
3399 ShuffleMask[MaskIdx] = MaskIdx;
3401 return Builder.CreateShuffleVector(SrcVec, ShuffleMask, Name);
3414 Discriminator =
Builder.getSize(0);
3416 llvm::Value *Args[] = {Key, Discriminator};
3417 Bundles.emplace_back(
"ptrauth", Args);
3423 unsigned IntrinsicID) {
3430 if (!Discriminator) {
3435 auto OrigType =
Pointer->getType();
3453 llvm::Intrinsic::ptrauth_sign);
3459 auto StripIntrinsic = CGF.
CGM.
getIntrinsic(llvm::Intrinsic::ptrauth_strip);
3463 auto OrigType =
Pointer->getType();
3480 llvm::Intrinsic::ptrauth_auth);
3484 llvm::Instruction *KeyInstruction, llvm::Value *Backup) {
3486 DI->addInstToCurrentSourceAtom(KeyInstruction, Backup);
3490 llvm::Instruction *KeyInstruction, llvm::Value *Backup, uint64_t Atom) {
3492 DI->addInstToSpecificSourceAtom(KeyInstruction, Backup, Atom);
3496 llvm::Value *Backup) {
3499 DI->addInstToCurrentSourceAtom(KeyInstruction, Backup);
3506 if (
getContext().arePFPFieldsTriviallyCopyable(Field.Field->getParent()))
3510 Builder.CreateStore(
Builder.CreateLoad(SrcFieldPtr), DestFieldPtr);
static void findPFPFields(const ASTContext &Ctx, QualType Ty, CharUnits Offset, std::vector< PFPField > &Fields, bool IncludeVBases)
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
static llvm::Value * EmitPointerAuthCommon(CodeGenFunction &CGF, const CGPointerAuthInfo &PointerAuth, llvm::Value *Pointer, unsigned IntrinsicID)
static void CreateMultiVersionResolverReturn(CodeGenModule &CGM, llvm::Function *Resolver, CGBuilderTy &Builder, llvm::Function *FuncToReturn, bool SupportsIFunc)
static llvm::Value * EmitStrip(CodeGenFunction &CGF, const CGPointerAuthInfo &PointerAuth, llvm::Value *Pointer)
static void emitNonZeroVLAInit(CodeGenFunction &CGF, QualType baseType, Address dest, Address src, llvm::Value *sizeInChars)
emitNonZeroVLAInit - Emit the "zero" initialization of a variable-length array whose elements have a ...
static void EmitIfUsed(CodeGenFunction &CGF, llvm::BasicBlock *BB)
static LValue makeNaturalAlignAddrLValue(llvm::Value *V, QualType T, bool ForPointeeType, bool MightBeSigned, CodeGenFunction &CGF, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
static void TryMarkNoThrow(llvm::Function *F)
Tries to mark the given function nounwind based on the non-existence of any throwing calls within it.
static llvm::Constant * getPrologueSignature(CodeGenModule &CGM, const FunctionDecl *FD)
Return the UBSan prologue signature for FD if one is available.
static bool endsWithReturn(const Decl *F)
Determine whether the function F ends with a return stmt.
static bool matchesStlAllocatorFn(const Decl *D, const ASTContext &Ctx)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Result
Implement __builtin_bit_cast and related operations.
static StringRef getTriple(const Command &Job)
Defines the Objective-C statement AST node classes.
Enumerates target-specific builtins in their own namespaces within namespace clang.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
bool hasAnyFunctionEffects() const
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
Attr - This represents one attribute.
A builtin binary operation expression such as "x + y" or "x <= y".
static bool isLogicalOp(Opcode Opc)
BinaryOperatorKind Opcode
Represents a C++ constructor within a class.
Represents a static or instance method of a struct/union/class.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
QualType getThisType() const
Return the type of the this pointer.
QualType getFunctionObjectParameterType() const
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
bool isLambda() const
Determine whether this class describes a lambda function object.
void getCaptureFields(llvm::DenseMap< const ValueDecl *, FieldDecl * > &Captures, FieldDecl *&ThisCapture) const
For a closure type, retrieve the mapping from captured variables and this to the non-static data memb...
bool isCapturelessLambda() const
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
A C++ throw-expression (C++ [except.throw]).
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
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.
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
CharUnits alignmentOfArrayElement(CharUnits elementSize) const
Given that this is the alignment of the first element of an array, return the minimum alignment of an...
bool isOne() const
Test whether the quantity equals one.
@ InAlloca
InAlloca - Pass the argument directly using the LLVM inalloca attribute.
@ Indirect
Indirect - Pass the argument indirectly via a hidden pointer with the specified alignment (0 indicate...
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
llvm::Value * getBasePointer() const
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
CharUnits getAlignment() const
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
llvm::PointerType * getType() const
Return the type of the pointer value.
A scoped helper to set the current source atom group for CGDebugInfo::addInstToCurrentSourceAtom.
A scoped helper to set the current debug location to the specified location or preferred location of ...
static ApplyDebugLocation CreateDefaultArtificial(CodeGenFunction &CGF, SourceLocation TemporaryLocation)
Apply TemporaryLocation if it is valid.
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock::iterator InsertPt) const override
This forwards to CodeGenFunction::InsertHelper.
llvm::ConstantInt * getSize(CharUnits N)
@ RAA_DirectInMemory
Pass it on the stack using its defined layout.
virtual RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const =0
Returns how an argument of the given record type should be passed.
Abstract information about a function or function prototype.
const FunctionProtoType * getCalleeFunctionProtoType() const
All available information about a concrete callee.
static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
CGFunctionInfo - Class to encapsulate the information about a function definition.
bool isDelegateCall() const
llvm::Value * getDiscriminator() const
CallArgList - Type for representing both the value and type of arguments in a call.
void add(RValue rvalue, QualType type)
virtual ~CGCapturedStmtInfo()
CGFPOptionsRAII(CodeGenFunction &CGF, FPOptions FPFeatures)
An object to manage conditionally-evaluated expressions.
void begin(CodeGenFunction &CGF)
void end(CodeGenFunction &CGF)
An object which temporarily prevents a value from being destroyed by aggressive peephole optimization...
SanitizerScope(CodeGenFunction *CGF)
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void EmitRISCVMultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
GlobalDecl CurGD
CurGD - The GlobalDecl for the current function being compiled.
void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount, Stmt::Likelihood LH=Stmt::LH_None, const Expr *ConditionalOp=nullptr, const VarDecl *ConditionalDecl=nullptr)
EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g.
void setCurrentProfileCount(uint64_t Count)
Set the profiler's current count.
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID, bool EnsureInsertPoint=true)
Emit a call to trap or debugtrap.
llvm::Value * emitBoolVecConversion(llvm::Value *SrcVec, unsigned NumElementsDst, const llvm::Twine &Name="")
void EmitAArch64MultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
JumpDest getJumpDestInCurrentScope(llvm::BasicBlock *Target)
The given basic block lies in the current EH scope, but may be a target of a potentially scope-crossi...
llvm::Value * EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx, const CallExpr *E)
SanitizerSet SanOpts
Sanitizers enabled for this function.
@ UseSkipPath
Skip (false)
void EmitNullInitialization(Address DestPtr, QualType Ty)
EmitNullInitialization - Generate code to set a value of the given type to null, If the type contains...
void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl)
static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts=false)
ContainsLabel - Return true if the statement contains a label in it.
void EmitPPCAIXMultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
define internal ptr @foo.resolver() { entry: is_version_1 = __builtin_cpu_supports(version_1) br i1 %...
bool ShouldSkipSanitizerInstrumentation()
ShouldSkipSanitizerInstrumentation - Return true if the current function should not be instrumented w...
llvm::Value * EmitPPCBuiltinCpu(unsigned BuiltinID, llvm::Type *ReturnType, StringRef CPUStr)
llvm::BlockAddress * GetAddrOfLabel(const LabelDecl *L)
llvm::Value * EmitRISCVCpuSupports(const CallExpr *E)
llvm::Value * EmitRISCVCpuInit()
static bool hasScalarEvaluationKind(QualType T)
llvm::Type * ConvertType(QualType T)
void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)
void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK)
void addInstToNewSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
Add KeyInstruction and an optional Backup instruction to a new atom group (See ApplyAtomGroup for mor...
FieldDecl * LambdaThisCaptureField
PeepholeProtection protectFromPeepholes(RValue rvalue)
protectFromPeepholes - Protect a value that we're intending to store to the side, but which will prob...
void EmitLambdaStaticInvokeBody(const CXXMethodDecl *MD)
bool CurFuncIsThunk
In C++, whether we are code generating a thunk.
LValue MakeNaturalAlignPointeeAddrLValue(llvm::Value *V, QualType T)
Given a value of type T* that may not be to a complete object, construct an l-value with the natural ...
JumpDest getJumpDestForLabel(const LabelDecl *S)
getBasicBlockForLabel - Return the LLVM basicblock that the specified label maps to.
void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint=true)
SmallVector< llvm::ConvergenceControlInst *, 4 > ConvergenceTokenStack
Stack to track the controlled convergence tokens.
void unprotectFromPeepholes(PeepholeProtection protection)
RValue convertTempToRValue(Address addr, QualType type, SourceLocation Loc)
Given the address of a temporary variable, produce an r-value of its type.
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void addInstToCurrentSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
See CGDebugInfo::addInstToCurrentSourceAtom.
const LangOptions & getLangOpts() const
void addInstToSpecificSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup, uint64_t Atom)
See CGDebugInfo::addInstToSpecificSourceAtom.
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
void EmitVarAnnotations(const VarDecl *D, llvm::Value *V)
Emit local annotations for the local variable V, declared by D.
llvm::BasicBlock * EHResumeBlock
EHResumeBlock - Unified block containing a call to llvm.eh.resume.
Address EmitFieldAnnotations(const FieldDecl *D, Address V)
Emit field annotations for the given field & value.
void EmitConstructorBody(FunctionArgList &Args)
EmitConstructorBody - Emits the body of the current constructor.
void EmitKCFIOperandBundle(const CGCallee &Callee, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
void EmitDeclRefExprDbgValue(const DeclRefExpr *E, const APValue &Init)
Address makeNaturalAddressForPointer(llvm::Value *Ptr, QualType T, CharUnits Alignment=CharUnits::Zero(), bool ForPointeeType=false, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
Construct an address with the natural alignment of T.
LValue MakeNaturalAlignPointeeRawAddrLValue(llvm::Value *V, QualType T)
Same as MakeNaturalAlignPointeeAddrLValue except that the pointer is known to be unsigned.
@ TCK_ConstructorCall
Checking the 'this' pointer for a constructor call.
@ TCK_MemberCall
Checking the 'this' pointer for a call to a non-static member function.
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
bool hasSkipCounter(const Stmt *S) const
llvm::AssertingVH< llvm::Instruction > AllocaInsertPt
AllocaInsertPoint - This is an instruction in the entry block before which we prefer to insert alloca...
void EmitFunctionBody(const Stmt *Body)
JumpDest ReturnBlock
ReturnBlock - Unified return block.
llvm::DebugLoc SourceLocToDebugLoc(SourceLocation Location)
Converts Location to a DebugLoc, if debug information is enabled.
llvm::Constant * EmitCheckTypeDescriptor(QualType T)
Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.
llvm::DebugLoc EmitReturnBlock()
Emit the unified return block, trying to avoid its emission when possible.
RawAddress CreateDefaultAlignTempAlloca(llvm::Type *Ty, const Twine &Name="tmp")
CreateDefaultAlignedTempAlloca - This creates an alloca with the default ABI alignment of the given L...
const TargetInfo & getTarget() const
llvm::Value * EmitAnnotationCall(llvm::Function *AnnotationFn, llvm::Value *AnnotatedVal, StringRef AnnotationStr, SourceLocation Location, const AnnotateAttr *Attr)
Emit an annotation call (intrinsic).
Address EmitCompoundStmtWithoutScope(const CompoundStmt &S, bool GetLast=false, AggValueSlot AVS=AggValueSlot::ignored())
void PopCleanupBlocks(EHScopeStack::stable_iterator OldCleanupStackSize, std::initializer_list< llvm::Value ** > ValuesToReload={})
Takes the old cleanup stack size and emits the cleanup blocks that have been added.
void maybeCreateMCDCCondBitmap()
Allocate a temp value on the stack that MCDC can use to track condition results.
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
RValue EmitLoadOfLValue(LValue V, SourceLocation Loc)
EmitLoadOfLValue - Given an expression that represents a value lvalue, this method emits the address ...
static bool isInstrumentedCondition(const Expr *C)
isInstrumentedCondition - Determine whether the given condition is an instrumentable condition (i....
VlaSizePair getVLAElements1D(const VariableArrayType *vla)
Return the number of elements for a single dimension for the given array type.
RawAddress CreateIRTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateIRTempWithoutCast - Create a temporary IR object of the given type, with appropriate alignment.
bool AlwaysEmitXRayCustomEvents() const
AlwaysEmitXRayCustomEvents - Return true if we must unconditionally emit XRay custom event handling c...
void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn, const CGFunctionInfo &FnInfo, const FunctionArgList &Args, SourceLocation Loc=SourceLocation(), SourceLocation StartLoc=SourceLocation())
Emit code for the start of a function.
llvm::Value * EmitPointerAuthSign(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
void markAsIgnoreThreadCheckingAtRuntime(llvm::Function *Fn)
Annotate the function with an attribute that disables TSan checking at runtime.
llvm::Value * EvaluateExprAsBool(const Expr *E)
EvaluateExprAsBool - Perform the usual unary conversions on the specified expression and compare the ...
void EmitPointerAuthOperandBundle(const CGPointerAuthInfo &Info, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerKind::SanitizerOrdinal > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs, const TrapReason *TR=nullptr)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock::iterator InsertPt) const
CGBuilder insert helper.
llvm::Value * emitArrayLength(const ArrayType *arrayType, QualType &baseType, Address &addr)
emitArrayLength - Compute the length of an array, even if it's a VLA, and drill down to the base elem...
bool HaveInsertPoint() const
HaveInsertPoint - True if an insertion point is defined.
bool AlwaysEmitXRayTypedEvents() const
AlwaysEmitXRayTypedEvents - Return true if clang must unconditionally emit XRay typed event handling ...
CGDebugInfo * getDebugInfo()
void EmitStartEHSpec(const Decl *D)
EmitStartEHSpec - Emit the start of the exception spec.
void EmitDestructorBody(FunctionArgList &Args)
EmitDestructorBody - Emits the body of the current destructor.
void EmitX86MultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
bool ShouldInstrumentFunction()
ShouldInstrumentFunction - Return true if the current function should be instrumented with __cyg_prof...
void maybeUpdateMCDCCondBitmap(const Expr *E, llvm::Value *Val)
Update the MCDC temp value with the condition's evaluated result.
void emitAlignmentAssumptionCheck(llvm::Value *Ptr, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue, llvm::Value *TheCheck, llvm::Instruction *Assumption)
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
llvm::ConstantInt * getUBSanFunctionTypeHash(QualType T) const
Return a type hash constant for a function instrumented by -fsanitize=function.
void EmitBranchToCounterBlock(const Expr *Cond, BinaryOperator::Opcode LOp, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount=0, Stmt::Likelihood LH=Stmt::LH_None, const Expr *CntrIdx=nullptr)
EmitBranchToCounterBlock - Emit a conditional branch to a new block that increments a profile counter...
VlaSizePair getVLASize(const VariableArrayType *vla)
Returns an LLVM value that corresponds to the size, in non-variably-sized elements,...
ASTContext & getContext() const
bool isMCDCBranchExpr(const Expr *E) const
void EmitMultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
static const Expr * stripCond(const Expr *C)
Ignore parentheses and logical-NOT to track conditions consistently.
void EmitFunctionProlog(const CGFunctionInfo &FI, llvm::Function *Fn, const FunctionArgList &Args)
EmitFunctionProlog - Emit the target specific LLVM code to load the arguments for the given function.
Address EmitAddressOfPFPField(Address RecordPtr, const PFPField &Field)
void SetFastMathFlags(FPOptions FPFeatures)
Set the codegen fast-math flags.
llvm::SmallVector< char, 256 > LifetimeExtendedCleanupStack
Address EmitVAListRef(const Expr *E)
void EmitLambdaInAllocaCallOpBody(const CXXMethodDecl *MD)
Address ReturnValuePointer
ReturnValuePointer - The temporary alloca to hold a pointer to sret.
static bool mightAddDeclToScope(const Stmt *S)
Determine if the given statement might introduce a declaration into the current scope,...
void EmitStmt(const Stmt *S, ArrayRef< const Attr * > Attrs={})
EmitStmt - Emit the code for the statement.
llvm::DenseMap< const ValueDecl *, FieldDecl * > LambdaCaptureFields
bool AutoreleaseResult
In ARC, whether we should autorelease the return value.
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
uint64_t getCurrentProfileCount()
Get the profiler's current count.
llvm::Type * ConvertTypeForMem(QualType T)
void EmitEndEHSpec(const Decl *D)
EmitEndEHSpec - Emit the end of the exception spec.
LValue EmitLValueForLambdaField(const FieldDecl *Field)
void emitPFPPostCopyUpdates(Address DestPtr, Address SrcPtr, QualType Ty)
Copy all PFP fields from SrcPtr to DestPtr while updating signatures, assuming that DestPtr was alrea...
Address EmitZOSVAListRef(const Expr *E)
Emit a "reference" to a __builtin_zos_va_list; this is always the address of the expression,...
CodeGenTypes & getTypes() const
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
bool IsSanitizerScope
True if CodeGen currently emits code implementing sanitizer checks.
static bool containsBreak(const Stmt *S)
containsBreak - Return true if the statement contains a break out of it.
void emitImplicitAssignmentOperatorBody(FunctionArgList &Args)
HLSLControlFlowHintAttr::Spelling HLSLControlFlowAttr
HLSL Branch attribute.
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
llvm::SmallVector< const ParmVarDecl *, 4 > FnArgs
Save Parameter Decl for coroutine.
const TargetInfo & Target
void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc, SourceLocation EndLoc, uint64_t RetKeyInstructionsSourceAtom)
EmitFunctionEpilog - Emit the target specific LLVM code to return the given temporary.
Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block,...
RawAddress NormalCleanupDest
i32s containing the indexes of the cleanup destinations.
llvm::Type * convertTypeForLoadStore(QualType ASTTy, llvm::Type *LLVMTy=nullptr)
VarBypassDetector Bypasses
llvm::BasicBlock * GetIndirectGotoBlock()
EHScopeStack::stable_iterator PrologueCleanupDepth
PrologueCleanupDepth - The cleanup depth enclosing all the cleanups associated with the parameters.
Address EmitMSVAListRef(const Expr *E)
Emit a "reference" to a __builtin_ms_va_list; this is always the value of the expression,...
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
const FunctionDecl * getCurrentFunctionDecl() const
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitTrapCallAndMakeUnreachable()
Emit a call to '@llvm.trap()' and clear the current insert point.
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
const CGFunctionInfo * CurFnInfo
uint64_t getProfileCount(const Stmt *S)
Get the profiler's count for the given statement.
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
bool ConstantFoldsToSimpleInteger(const Expr *Cond, bool &Result, bool AllowLabels=false)
ConstantFoldsToSimpleInteger - If the specified expression does not fold to a constant,...
void ErrorUnsupported(const Stmt *S, const char *Type)
ErrorUnsupported - Print out an error that codegen doesn't support the specified stmt yet.
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
bool ShouldXRayInstrumentFunction() const
ShouldXRayInstrument - Return true if the current function should be instrumented with XRay nop sleds...
void EnsureInsertPoint()
EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.
llvm::LLVMContext & getLLVMContext()
bool SawAsmBlock
Whether we processed a Microsoft-style asm block during CodeGen.
bool checkIfFunctionMustProgress()
Returns true if a function must make progress, which means the mustprogress attribute can be added.
void incrementProfileCounter(const Stmt *S, llvm::Value *StepV=nullptr)
Increment the profiler's counter for the given statement by StepV.
void emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue=nullptr)
bool isMCDCDecisionExpr(const Expr *E) const
void EmitVariablyModifiedType(QualType Ty)
EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...
void MaybeEmitDeferredVarDeclInit(const VarDecl *var)
void EmitBlockWithFallThrough(llvm::BasicBlock *BB, const Stmt *S)
When instrumenting to collect profile data, the counts for some blocks such as switch cases need to n...
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
LValue MakeNaturalAlignRawAddrLValue(llvm::Value *V, QualType T)
QualType BuildFunctionArgList(GlobalDecl GD, FunctionArgList &Args)
llvm::Value * EmitPointerAuthAuth(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
This class organizes the cross-function state that is used while generating LLVM code.
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CodeGenTypes & getTypes()
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
void GenKernelArgMetadata(llvm::Function *FN, const FunctionDecl *FD=nullptr, CodeGenFunction *CGF=nullptr)
OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument information in the program executab...
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
bool inheritingCtorHasParams(const InheritedConstructor &Inherited, CXXCtorType Type)
Determine if a C++ inheriting constructor should have parameters matching those of its inherited cons...
FunctionArgList - Type for representing both the decl and type of parameters to a function.
LValue - This represents an lvalue references.
llvm::Value * getPointer(CodeGenFunction &CGF) const
Address getAddress() const
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
virtual llvm::Constant * getUBSanFunctionSignature(CodeGen::CodeGenModule &CGM) const
Return a constant used by UBSan as a signature to identify functions possessing type information,...
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
Decl * getNonClosureContext()
Find the innermost non-closure ancestor of this declaration, walking up through blocks,...
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, bool AllowRelaxedEval=false) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
ExtVectorType - Extended vector type.
LangOptions::FPExceptionModeKind getExceptionMode() const
bool allowFPContractAcrossStatement() const
RoundingMode getRoundingMode() const
Represents a member of a struct/union/class.
Represents a function declaration or definition.
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
bool usesSEHTry() const
Indicates the function uses __try.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
FunctionEffectsRef getFunctionEffects() const
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
bool isDefaulted() const
Whether this function is defaulted.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Represents a prototype with parameter type info, e.g.
FunctionTypeExtraAttributeInfo getExtraAttributeInfo() const
Return the extra attribute information.
FunctionType - C99 6.7.5.3 - Function Declarators.
@ SME_PStateSMCompatibleMask
GlobalDecl - represents a global declaration.
CXXCtorType getCtorType() const
KernelReferenceKind getKernelReferenceKind() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Represents the declaration of a label.
FPExceptionModeKind
Possible floating point exception behavior.
@ FPE_Strict
Strictly preserve the floating-point exception semantics.
@ FPE_MayTrap
Transformations do not cause new exceptions but may hide some.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
RoundingMode getDefaultRoundingMode() const
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
@ Forbid
Profiling is forbidden using the noprofile attribute.
@ Skip
Profiling is skipped using the skipprofile attribute.
@ Allow
Profiling is allowed.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
field_range fields() const
Encodes a location in the source.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
StmtClass getStmtClass() const
Likelihood
The likelihood of a branch being taken.
@ LH_Unlikely
Branch has the [[unlikely]] attribute.
@ LH_None
No attribute set or branches of the IfStmt have the same attribute.
@ LH_Likely
Branch has the [[likely]] attribute.
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode, llvm::StringMap< bool > *FeatureMap=nullptr) const
Returns target-specific min and max values VScale_Range.
bool supportsIFunc() const
Identify whether this target supports IFuncs.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
virtual ParsedTargetAttr parseTargetAttr(StringRef Str) const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isObjCRetainableType() const
bool isFunctionNoProtoType() const
bool isCFIUncheckedCalleeFunctionType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represents a variable declaration or definition.
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
QualType getElementType() const
Defines the clang::TargetInfo interface.
void checkTargetFeatures(ASTContext &Ctx, DiagnosticsEngine &Diags, const LangOptions &LangOpts, const CallExpr *E, const FunctionDecl *Caller, const FunctionDecl *TargetDecl)
Check that a call to a target-specific builtin has the required target features enabled in the caller...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
TypeEvaluationKind
The kind of evaluation to perform on values of a particular type.
CGBuilderInserter CGBuilderInserterTy
constexpr XRayInstrMask Typed
constexpr XRayInstrMask FunctionExit
constexpr XRayInstrMask FunctionEntry
constexpr XRayInstrMask Custom
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
Top level wrappers for InstallAPI frontend operations.
bool isa(CodeGen::Address addr)
Expr * IgnoreBuiltinExpectSingleStep(Expr *E)
@ NonNull
Values of this type can never be null.
Expr * IgnoreExprNodes(Expr *E, FnTys &&... Fns)
Given an expression E and functions Fn_1,...,Fn_n : Expr * -> Expr *, Recursively apply each of the f...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
const FunctionProtoType * T
Expr * IgnoreImplicitCastsSingleStep(Expr *E)
Expr * IgnoreUOpLNotSingleStep(Expr *E)
Expr * IgnoreParensSingleStep(Expr *E)
llvm::fp::ExceptionBehavior ToConstrainedExceptMD(LangOptions::FPExceptionModeKind Kind)
U cast(CodeGen::Address addr)
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
@ Other
Other implicit parameter.
@ EST_None
no exception specification
@ Implicit
An implicit conversion.
A jump destination is an abstract label, branching to which may require a jump out through normal cle...
llvm::BasicBlock * getBlock() const
This structure provides a set of types that are commonly used during IR emission.
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * SizeTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
EvalResult is a struct with detailed info about an evaluated expression.
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
std::vector< std::string > Features
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.