39#include "llvm/ADT/ArrayRef.h"
40#include "llvm/ADT/ScopeExit.h"
41#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
42#include "llvm/IR/DataLayout.h"
43#include "llvm/IR/Dominators.h"
44#include "llvm/IR/FPEnv.h"
45#include "llvm/IR/Instruction.h"
46#include "llvm/IR/IntrinsicInst.h"
47#include "llvm/IR/Intrinsics.h"
48#include "llvm/IR/IntrinsicsPowerPC.h"
49#include "llvm/IR/MDBuilder.h"
50#include "llvm/Support/CRC.h"
51#include "llvm/Support/SaveAndRestore.h"
52#include "llvm/Support/SipHash.h"
53#include "llvm/Support/xxhash.h"
54#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
55#include "llvm/Transforms/Utils/PromoteMemToReg.h"
65 if (CGOpts.DisableLifetimeMarkers)
69 if (CGOpts.SanitizeAddressUseAfterScope ||
76 return CGOpts.OptimizationLevel != 0;
79CodeGenFunction::CodeGenFunction(
CodeGenModule &cgm,
bool suppressNewContext)
83 DebugInfo(
CGM.getModuleDebugInfo()),
85 ShouldEmitLifetimeMarkers(
87 if (!suppressNewContext)
88 CGM.getCXXABI().getMangleContext().startNewFunction();
95 const auto *FD = dyn_cast_or_null<FunctionDecl>(
CurCodeDecl);
104 "missed to deactivate a cleanup");
107 CGM.getOpenMPRuntime().functionFinished(*
this);
114 if (
CGM.getLangOpts().OpenMPIRBuilder &&
CurFn)
115 CGM.getOpenMPRuntime().getOMPBuilder().finalize(
CurFn);
120llvm::fp::ExceptionBehavior
128 llvm_unreachable(
"Unsupported FP Exception Behavior");
133 llvm::FastMathFlags FMF;
134 FMF.setAllowReassoc(FPFeatures.getAllowFPReassociate());
135 FMF.setNoNaNs(FPFeatures.getNoHonorNaNs());
136 FMF.setNoInfs(FPFeatures.getNoHonorInfs());
137 FMF.setNoSignedZeros(FPFeatures.getNoSignedZero());
138 FMF.setAllowReciprocal(FPFeatures.getAllowReciprocal());
139 FMF.setApproxFunc(FPFeatures.getAllowApproxFunc());
153 ConstructorHelper(FPFeatures);
156void CodeGenFunction::CGFPOptionsRAII::ConstructorHelper(
FPOptions FPFeatures) {
157 OldFPFeatures = CGF.CurFPFeatures;
158 CGF.CurFPFeatures = FPFeatures;
160 OldExcept = CGF.Builder.getDefaultConstrainedExcept();
161 OldRounding = CGF.Builder.getDefaultConstrainedRounding();
163 if (OldFPFeatures == FPFeatures)
166 FMFGuard.emplace(CGF.Builder);
169 CGF.Builder.setDefaultConstrainedRounding(NewRoundingBehavior);
170 auto NewExceptionBehavior =
172 CGF.Builder.setDefaultConstrainedExcept(NewExceptionBehavior);
174 CGF.SetFastMathFlags(FPFeatures);
176 assert((CGF.CurFuncDecl ==
nullptr || CGF.Builder.getIsFPConstrained() ||
179 (NewExceptionBehavior == llvm::fp::ebIgnore &&
180 NewRoundingBehavior == llvm::RoundingMode::NearestTiesToEven)) &&
181 "FPConstrained should be enabled on entire function");
183 auto mergeFnAttrValue = [&](StringRef Name,
bool Value) {
185 CGF.CurFn->getFnAttribute(Name).getValueAsBool();
186 auto NewValue = OldValue &
Value;
187 if (OldValue != NewValue)
188 CGF.CurFn->addFnAttr(Name, llvm::toStringRef(NewValue));
190 mergeFnAttrValue(
"no-signed-zeros-fp-math", FPFeatures.getNoSignedZero());
194 CGF.CurFPFeatures = OldFPFeatures;
195 CGF.Builder.setDefaultConstrainedExcept(OldExcept);
196 CGF.Builder.setDefaultConstrainedRounding(OldRounding);
210 nullptr, IsKnownNonNull)
218 return ::makeNaturalAlignAddrLValue(
V, T,
false,
225 return ::makeNaturalAlignAddrLValue(
V, T,
true,
231 return ::makeNaturalAlignAddrLValue(
V, T,
false,
237 return ::makeNaturalAlignAddrLValue(
V, T,
true,
242 return CGM.getTypes().ConvertTypeForMem(T);
246 return CGM.getTypes().ConvertType(T);
250 llvm::Type *LLVMTy) {
251 return CGM.getTypes().convertTypeForLoadStore(ASTTy, LLVMTy);
257 switch (
type->getTypeClass()) {
258#define TYPE(name, parent)
259#define ABSTRACT_TYPE(name, parent)
260#define NON_CANONICAL_TYPE(name, parent) case Type::name:
261#define DEPENDENT_TYPE(name, parent) case Type::name:
262#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(name, parent) case Type::name:
263#include "clang/AST/TypeNodes.inc"
264 llvm_unreachable(
"non-canonical or dependent type in IR-generation");
267 case Type::DeducedTemplateSpecialization:
268 llvm_unreachable(
"undeduced type in IR-generation");
273 case Type::BlockPointer:
274 case Type::LValueReference:
275 case Type::RValueReference:
276 case Type::MemberPointer:
278 case Type::ExtVector:
279 case Type::ConstantMatrix:
280 case Type::FunctionProto:
281 case Type::FunctionNoProto:
283 case Type::ObjCObjectPointer:
286 case Type::HLSLAttributedResource:
287 case Type::HLSLInlineSpirv:
288 case Type::OverflowBehavior:
296 case Type::ConstantArray:
297 case Type::IncompleteArray:
298 case Type::VariableArray:
300 case Type::ObjCObject:
301 case Type::ObjCInterface:
302 case Type::ArrayParameter:
310 llvm_unreachable(
"unknown type kind!");
317 llvm::BasicBlock *CurBB =
Builder.GetInsertBlock();
320 assert(!CurBB->hasTerminator() &&
"Unexpected terminated block.");
324 if (CurBB->empty() ||
ReturnBlock.getBlock()->use_empty()) {
330 return llvm::DebugLoc();
338 dyn_cast<llvm::UncondBrInst>(*
ReturnBlock.getBlock()->user_begin());
339 if (BI && BI->getSuccessor(0) ==
ReturnBlock.getBlock()) {
342 llvm::DebugLoc Loc = BI->getDebugLoc();
343 Builder.SetInsertPoint(BI->getParent());
344 BI->eraseFromParent();
356 return llvm::DebugLoc();
361 if (!BB->use_empty()) {
369 assert(BreakContinueStack.empty() &&
370 "mismatched push/pop in break/continue stack!");
372 "mismatched push/pop of cleanups in EHStack!");
374 "mismatched activate/deactivate of cleanups!");
376 if (
CGM.shouldEmitConvergenceTokens()) {
379 "mismatched push/pop in convergence stack!");
382 bool OnlySimpleReturnStmts = NumSimpleReturnExprs > 0
383 && NumSimpleReturnExprs == NumReturnExprs
398 if (OnlySimpleReturnStmts)
399 DI->EmitLocation(
Builder, LastStopPoint);
401 DI->EmitLocation(
Builder, EndLoc);
409 bool HasOnlyNoopCleanups =
411 bool EmitRetDbgLoc = !HasCleanups || HasOnlyNoopCleanups;
413 std::optional<ApplyDebugLocation> OAL;
418 if (OnlySimpleReturnStmts)
419 DI->EmitLocation(
Builder, EndLoc);
433 if (
CGM.getCodeGenOpts().InstrumentFunctions)
434 CurFn->addFnAttr(
"instrument-function-exit",
"__cyg_profile_func_exit");
435 if (
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
436 CurFn->addFnAttr(
"instrument-function-exit-inlined",
437 "__cyg_profile_func_exit");
446 uint64_t RetKeyInstructionsAtomGroup = Loc ? Loc->getAtomGroup() : 0;
449 RetKeyInstructionsAtomGroup);
453 "did not remove all scopes from cleanup stack!");
457 if (IndirectBranch) {
464 if (!EscapedLocals.empty()) {
468 EscapeArgs.resize(EscapedLocals.size());
469 for (
auto &Pair : EscapedLocals)
470 EscapeArgs[Pair.second] = Pair.first;
471 llvm::Function *FrameEscapeFn = llvm::Intrinsic::getOrInsertDeclaration(
472 &
CGM.getModule(), llvm::Intrinsic::localescape);
479 Ptr->eraseFromParent();
483 if (PostAllocaInsertPt) {
484 llvm::Instruction *PostPtr = PostAllocaInsertPt;
485 PostAllocaInsertPt =
nullptr;
486 PostPtr->eraseFromParent();
491 if (IndirectBranch) {
493 if (PN->getNumIncomingValues() == 0) {
494 PN->replaceAllUsesWith(llvm::PoisonValue::get(PN->getType()));
495 PN->eraseFromParent();
504 for (
const auto &FuncletAndParent : TerminateFunclets)
507 if (
CGM.getCodeGenOpts().EmitDeclMetadata)
510 for (
const auto &R : DeferredReplacements) {
511 if (llvm::Value *Old = R.first) {
512 Old->replaceAllUsesWith(R.second);
516 DeferredReplacements.clear();
525 llvm::DominatorTree DT(*
CurFn);
526 llvm::PromoteMemToReg(
532 for (llvm::Argument &A :
CurFn->args())
533 if (
auto *VT = dyn_cast<llvm::VectorType>(A.getType()))
535 std::max((uint64_t)LargestVectorWidth,
536 VT->getPrimitiveSizeInBits().getKnownMinValue());
539 if (
auto *VT = dyn_cast<llvm::VectorType>(
CurFn->getReturnType()))
541 std::max((uint64_t)LargestVectorWidth,
542 VT->getPrimitiveSizeInBits().getKnownMinValue());
544 if (
CurFnInfo->getMaxVectorWidth() > LargestVectorWidth)
545 LargestVectorWidth =
CurFnInfo->getMaxVectorWidth();
555 CurFn->addFnAttr(
"min-legal-vector-width",
556 llvm::utostr(LargestVectorWidth));
565 dyn_cast<llvm::AllocaInst>(
ReturnValue.emitRawPointer(*
this));
566 if (RetAlloca && RetAlloca->use_empty()) {
567 RetAlloca->eraseFromParent();
576 if (!
CGM.getCodeGenOpts().InstrumentFunctions &&
577 !
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining &&
578 !
CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
588 return CurFuncDecl->hasAttr<DisableSanitizerInstrumentationAttr>();
594 return CGM.getCodeGenOpts().XRayInstrumentFunctions;
600 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
601 (
CGM.getCodeGenOpts().XRayAlwaysEmitCustomEvents ||
602 CGM.getCodeGenOpts().XRayInstrumentationBundle.Mask ==
607 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
608 (
CGM.getCodeGenOpts().XRayAlwaysEmitTypedEvents ||
609 CGM.getCodeGenOpts().XRayInstrumentationBundle.Mask ==
620 llvm::raw_string_ostream Out(Mangled);
621 CGM.getCXXABI().getMangleContext().mangleCanonicalTypeName(Ty, Out,
false);
622 return llvm::ConstantInt::get(
623 CGM.Int32Ty,
static_cast<uint32_t
>(llvm::xxh3_64bits(Mangled)));
626void CodeGenFunction::EmitKernelMetadata(
const FunctionDecl *FD,
627 llvm::Function *Fn) {
628 if (!FD->
hasAttr<DeviceKernelAttr>() && !FD->
hasAttr<CUDAGlobalAttr>())
640 if (
const VecTypeHintAttr *A = FD->
getAttr<VecTypeHintAttr>()) {
641 QualType HintQTy = A->getTypeHint();
643 bool IsSignedInteger =
645 (HintEltQTy && HintEltQTy->
getElementType()->isSignedIntegerType());
646 llvm::Metadata *AttrMDArgs[] = {
647 llvm::ConstantAsMetadata::get(llvm::PoisonValue::get(
649 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
650 llvm::IntegerType::get(Context, 32),
651 llvm::APInt(32, (uint64_t)(IsSignedInteger ? 1 : 0))))};
652 Fn->setMetadata(
"vec_type_hint", llvm::MDNode::get(Context, AttrMDArgs));
655 if (
const WorkGroupSizeHintAttr *A = FD->
getAttr<WorkGroupSizeHintAttr>()) {
656 auto Eval = [&](
Expr *E) {
657 return E->EvaluateKnownConstInt(FD->
getASTContext()).getExtValue();
659 llvm::Metadata *AttrMDArgs[] = {
660 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getXDim()))),
661 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getYDim()))),
662 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getZDim())))};
663 Fn->setMetadata(
"work_group_size_hint", llvm::MDNode::get(Context, AttrMDArgs));
666 if (
const ReqdWorkGroupSizeAttr *A = FD->
getAttr<ReqdWorkGroupSizeAttr>()) {
667 auto Eval = [&](Expr *E) {
668 return E->EvaluateKnownConstInt(FD->
getASTContext()).getExtValue();
670 llvm::Metadata *AttrMDArgs[] = {
671 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getXDim()))),
672 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getYDim()))),
673 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getZDim())))};
674 Fn->setMetadata(
"reqd_work_group_size", llvm::MDNode::get(Context, AttrMDArgs));
677 if (
const OpenCLIntelReqdSubGroupSizeAttr *A =
678 FD->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
679 llvm::Metadata *AttrMDArgs[] = {
680 llvm::ConstantAsMetadata::get(
Builder.getInt32(A->getSubGroupSize()))};
681 Fn->setMetadata(
"intel_reqd_sub_group_size",
682 llvm::MDNode::get(Context, AttrMDArgs));
688 const Stmt *Body =
nullptr;
689 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(F))
691 else if (
auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(F))
692 Body = OMD->getBody();
694 if (
auto *CS = dyn_cast_or_null<CompoundStmt>(Body)) {
695 auto LastStmt = CS->body_rbegin();
696 if (LastStmt != CS->body_rend())
703 if (
SanOpts.has(SanitizerKind::Thread)) {
704 Fn->addFnAttr(
"sanitize_thread_no_checking_at_run_time");
705 Fn->removeFnAttr(llvm::Attribute::SanitizeThread);
710bool CodeGenFunction::requiresReturnValueCheck()
const {
711 return requiresReturnValueNullabilityCheck() ||
717 auto *MD = dyn_cast_or_null<CXXMethodDecl>(D);
718 if (!MD || !MD->getDeclName().getAsIdentifierInfo() ||
719 !MD->getDeclName().getAsIdentifierInfo()->isStr(
"allocate") ||
720 (MD->getNumParams() != 1 && MD->getNumParams() != 2))
726 if (MD->getNumParams() == 2) {
727 auto *PT = MD->parameters()[1]->getType()->getAs<
PointerType>();
728 if (!PT || !PT->isVoidPointerType() ||
729 !PT->getPointeeType().isConstQualified())
736bool CodeGenFunction::isInAllocaArgument(
CGCXXABI &ABI, QualType Ty) {
741bool CodeGenFunction::hasInAllocaArg(
const CXXMethodDecl *MD) {
744 llvm::any_of(MD->
parameters(), [&](ParmVarDecl *P) {
745 return isInAllocaArgument(CGM.getCXXABI(), P->getType());
752 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
765 "Do not use a CodeGenFunction object for more than one function");
769 DidCallStackSave =
false;
771 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
778 assert(
CurFn->isDeclaration() &&
"Function already has body?");
783#define SANITIZER(NAME, ID) \
784 if (SanOpts.empty()) \
786 if (SanOpts.has(SanitizerKind::ID)) \
787 if (CGM.isInNoSanitizeList(SanitizerKind::ID, Fn, Loc)) \
788 SanOpts.set(SanitizerKind::ID, false);
790#include "clang/Basic/Sanitizers.def"
795 const bool SanitizeBounds =
SanOpts.hasOneOf(SanitizerKind::Bounds);
797 bool NoSanitizeCoverage =
false;
800 no_sanitize_mask |=
Attr->getMask();
802 if (
Attr->hasCoverage())
803 NoSanitizeCoverage =
true;
807 SanOpts.Mask &= ~no_sanitize_mask;
808 if (no_sanitize_mask & SanitizerKind::Address)
809 SanOpts.set(SanitizerKind::KernelAddress,
false);
810 if (no_sanitize_mask & SanitizerKind::KernelAddress)
811 SanOpts.set(SanitizerKind::Address,
false);
812 if (no_sanitize_mask & SanitizerKind::HWAddress)
813 SanOpts.set(SanitizerKind::KernelHWAddress,
false);
814 if (no_sanitize_mask & SanitizerKind::KernelHWAddress)
815 SanOpts.set(SanitizerKind::HWAddress,
false);
817 if (SanitizeBounds && !
SanOpts.hasOneOf(SanitizerKind::Bounds))
818 Fn->addFnAttr(llvm::Attribute::NoSanitizeBounds);
820 if (NoSanitizeCoverage &&
CGM.getCodeGenOpts().hasSanitizeCoverage())
821 Fn->addFnAttr(llvm::Attribute::NoSanitizeCoverage);
824 if (
CGM.getCodeGenOpts().hasSanitizeBinaryMetadata()) {
825 if (no_sanitize_mask & SanitizerKind::Thread)
826 Fn->addFnAttr(
"no_sanitize_thread");
831 CurFn->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
834 if (
SanOpts.hasOneOf(SanitizerKind::Address | SanitizerKind::KernelAddress))
835 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
836 if (
SanOpts.hasOneOf(SanitizerKind::HWAddress |
837 SanitizerKind::KernelHWAddress))
838 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
839 if (
SanOpts.has(SanitizerKind::MemtagStack))
840 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
841 if (
SanOpts.has(SanitizerKind::Thread))
842 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
843 if (
SanOpts.has(SanitizerKind::Type))
844 Fn->addFnAttr(llvm::Attribute::SanitizeType);
845 if (
SanOpts.has(SanitizerKind::NumericalStability))
846 Fn->addFnAttr(llvm::Attribute::SanitizeNumericalStability);
847 if (
SanOpts.hasOneOf(SanitizerKind::Memory | SanitizerKind::KernelMemory))
848 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
849 if (
SanOpts.has(SanitizerKind::AllocToken))
850 Fn->addFnAttr(llvm::Attribute::SanitizeAllocToken);
852 if (
SanOpts.has(SanitizerKind::SafeStack))
853 Fn->addFnAttr(llvm::Attribute::SafeStack);
854 if (
SanOpts.has(SanitizerKind::ShadowCallStack))
855 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
857 if (
SanOpts.has(SanitizerKind::Realtime))
861 Fn->addFnAttr(llvm::Attribute::SanitizeRealtime);
863 Fn->addFnAttr(llvm::Attribute::SanitizeRealtimeBlocking);
867 if (
SanOpts.hasOneOf(SanitizerKind::Fuzzer | SanitizerKind::FuzzerNoLink))
868 Fn->addFnAttr(llvm::Attribute::OptForFuzzing);
872 if (
SanOpts.has(SanitizerKind::Thread)) {
873 if (
const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
874 const IdentifierInfo *II = OMD->getSelector().getIdentifierInfoForSlot(0);
877 (OMD->getSelector().isUnarySelector() && II->
isStr(
".cxx_destruct"))) {
886 if (D &&
SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
894 if (D &&
SanOpts.has(SanitizerKind::Null))
900 bool AlwaysXRayAttr =
false;
901 if (
const auto *XRayAttr = D ? D->
getAttr<XRayInstrumentAttr>() :
nullptr) {
902 if (
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
904 CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
907 Fn->addFnAttr(
"function-instrument",
"xray-always");
908 AlwaysXRayAttr =
true;
910 if (XRayAttr->neverXRayInstrument())
911 Fn->addFnAttr(
"function-instrument",
"xray-never");
912 if (
const auto *LogArgs = D->
getAttr<XRayLogArgsAttr>())
914 Fn->addFnAttr(
"xray-log-args",
915 llvm::utostr(LogArgs->getArgumentCount()));
920 "xray-instruction-threshold",
921 llvm::itostr(
CGM.getCodeGenOpts().XRayInstructionThreshold));
925 if (
CGM.getCodeGenOpts().XRayIgnoreLoops)
926 Fn->addFnAttr(
"xray-ignore-loops");
928 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
930 Fn->addFnAttr(
"xray-skip-exit");
932 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
934 Fn->addFnAttr(
"xray-skip-entry");
936 auto FuncGroups =
CGM.getCodeGenOpts().XRayTotalFunctionGroups;
937 if (FuncGroups > 1) {
939 CurFn->getName().bytes_end());
940 auto Group = crc32(FuncName) % FuncGroups;
941 if (Group !=
CGM.getCodeGenOpts().XRaySelectedFunctionGroup &&
943 Fn->addFnAttr(
"function-instrument",
"xray-never");
947 if (
CGM.getCodeGenOpts().getProfileInstr() !=
948 llvm::driver::ProfileInstrKind::ProfileNone) {
949 switch (
CGM.isFunctionBlockedFromProfileInstr(Fn, Loc)) {
951 Fn->addFnAttr(llvm::Attribute::SkipProfile);
954 Fn->addFnAttr(llvm::Attribute::NoProfile);
961 unsigned Count, Offset;
963 if (
const auto *
Attr =
964 D ? D->
getAttr<PatchableFunctionEntryAttr>() :
nullptr) {
965 Count =
Attr->getCount();
966 Offset =
Attr->getOffset();
967 Section =
Attr->getSection();
969 Count =
CGM.getCodeGenOpts().PatchableFunctionEntryCount;
970 Offset =
CGM.getCodeGenOpts().PatchableFunctionEntryOffset;
973 Section =
CGM.getCodeGenOpts().PatchableFunctionEntrySection;
974 if (Count && Offset <= Count) {
975 Fn->addFnAttr(
"patchable-function-entry", std::to_string(Count - Offset));
977 Fn->addFnAttr(
"patchable-function-prefix", std::to_string(Offset));
978 if (!Section.empty())
979 Fn->addFnAttr(
"patchable-function-entry-section", Section);
985 if (
CGM.getCodeGenOpts().HotPatch &&
988 llvm::Triple::CODE16)
989 Fn->addFnAttr(
"patchable-function",
"prologue-short-redirect");
992 if (
CGM.getCodeGenOpts().NoUseJumpTables)
993 Fn->addFnAttr(
"no-jump-tables",
"true");
996 if (
CGM.getCodeGenOpts().NoInlineLineTables)
997 Fn->addFnAttr(
"no-inline-line-tables");
1000 if (
CGM.getCodeGenOpts().ProfileSampleAccurate)
1001 Fn->addFnAttr(
"profile-sample-accurate");
1003 if (!
CGM.getCodeGenOpts().SampleProfileFile.empty())
1004 Fn->addFnAttr(
"use-sample-profile");
1006 if (D && D->
hasAttr<CFICanonicalJumpTableAttr>())
1007 Fn->addFnAttr(
"cfi-canonical-jump-table");
1009 if (D && D->
hasAttr<NoProfileFunctionAttr>())
1010 Fn->addFnAttr(llvm::Attribute::NoProfile);
1012 if (D && D->
hasAttr<HybridPatchableAttr>())
1013 Fn->addFnAttr(llvm::Attribute::HybridPatchable);
1017 if (
auto *A = D->
getAttr<FunctionReturnThunksAttr>()) {
1018 switch (A->getThunkType()) {
1019 case FunctionReturnThunksAttr::Kind::Keep:
1021 case FunctionReturnThunksAttr::Kind::Extern:
1022 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1025 }
else if (
CGM.getCodeGenOpts().FunctionReturnThunks)
1026 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1035 EmitKernelMetadata(FD, Fn);
1038 if (FD && FD->
hasAttr<ClspvLibclcBuiltinAttr>()) {
1039 Fn->setMetadata(
"clspv_libclc_builtin",
1046 if (FD &&
SanOpts.has(SanitizerKind::Function) &&
1048 llvm::isCallableCC(Fn->getCallingConv())) {
1050 llvm::LLVMContext &Ctx = Fn->getContext();
1051 llvm::MDBuilder MDB(Ctx);
1053 llvm::LLVMContext::MD_func_sanitize,
1054 MDB.createRTTIPointerPrologue(
1061 if (
SanOpts.has(SanitizerKind::NullabilityReturn)) {
1062 auto Nullability =
FnRetTy->getNullability();
1065 if (!(
SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) &&
1067 RetValNullabilityPrecondition =
1090 Fn->addFnAttr(llvm::Attribute::NoRecurse);
1093 llvm::fp::ExceptionBehavior FPExceptionBehavior =
1095 Builder.setDefaultConstrainedRounding(RM);
1096 Builder.setDefaultConstrainedExcept(FPExceptionBehavior);
1098 (!FD && (FPExceptionBehavior != llvm::fp::ebIgnore ||
1099 RM != llvm::RoundingMode::NearestTiesToEven))) {
1100 Builder.setIsFPConstrained(
true);
1101 Fn->addFnAttr(llvm::Attribute::StrictFP);
1107 CGM.getCodeGenOpts().StackAlignment))
1108 Fn->addFnAttr(
"stackrealign");
1112 Fn->removeFnAttr(
"zero-call-used-regs");
1115 llvm::StringMap<bool> FeatureMap;
1120 if (T->getAArch64SMEAttributes() &
1127 std::optional<std::pair<unsigned, unsigned>> VScaleRange =
1131 CurFn->addFnAttr(llvm::Attribute::getWithVScaleRangeArgs(
1140 llvm::Value *Poison = llvm::PoisonValue::get(
Int32Ty);
1145 Builder.SetInsertPoint(EntryBB);
1149 if (requiresReturnValueCheck()) {
1160 DI->emitFunctionStart(GD, Loc, StartLoc,
1161 DI->getFunctionType(FD, RetTy, Args),
CurFn,
1166 if (
CGM.getCodeGenOpts().InstrumentFunctions)
1167 CurFn->addFnAttr(
"instrument-function-entry",
"__cyg_profile_func_enter");
1168 if (
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
1169 CurFn->addFnAttr(
"instrument-function-entry-inlined",
1170 "__cyg_profile_func_enter");
1171 if (
CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
1172 CurFn->addFnAttr(
"instrument-function-entry-inlined",
1173 "__cyg_profile_func_enter_bare");
1180 if (
CGM.getCodeGenOpts().InstrumentForProfiling) {
1184 if (
CGM.getCodeGenOpts().CallFEntry)
1185 Fn->addFnAttr(
"fentry-call",
"true");
1187 Fn->addFnAttr(
"instrument-function-entry-inlined",
1190 if (
CGM.getCodeGenOpts().MNopMCount) {
1191 if (!
CGM.getCodeGenOpts().CallFEntry)
1192 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1193 <<
"-mnop-mcount" <<
"-mfentry";
1194 Fn->addFnAttr(
"mnop-mcount");
1197 if (
CGM.getCodeGenOpts().RecordMCount) {
1198 if (!
CGM.getCodeGenOpts().CallFEntry)
1199 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1200 <<
"-mrecord-mcount" <<
"-mfentry";
1201 Fn->addFnAttr(
"mrecord-mcount");
1206 if (
CGM.getCodeGenOpts().PackedStack) {
1208 llvm::Triple::systemz)
1209 CGM.getDiags().Report(diag::err_opt_not_valid_on_target)
1210 <<
"-mpacked-stack";
1211 Fn->addFnAttr(
"packed-stack");
1214 if (!
CGM.getCodeGenOpts().ZOSPPA1Name)
1215 Fn->addFnAttr(
"zos-ppa1-name",
"");
1217 if (
CGM.getCodeGenOpts().WarnStackSize !=
UINT_MAX &&
1218 !
CGM.getDiags().isIgnored(diag::warn_fe_backend_frame_larger_than, Loc))
1219 Fn->addFnAttr(
"warn-stack-size",
1220 std::to_string(
CGM.getCodeGenOpts().WarnStackSize));
1232 auto AI =
CurFn->arg_begin();
1233 if (
CurFnInfo->getReturnInfo().isSRetAfterThis())
1236 &*AI, RetTy,
CurFnInfo->getReturnInfo().getIndirectAlign(),
false,
1238 if (!
CurFnInfo->getReturnInfo().getIndirectByVal()) {
1247 unsigned Idx =
CurFnInfo->getReturnInfo().getInAllocaFieldIndex();
1248 llvm::Function::arg_iterator EI =
CurFn->arg_end();
1280 if (FD->
hasAttr<HLSLShaderAttr>()) {
1281 CGM.getHLSLRuntime().emitEntryFunction(FD, Fn);
1287 if (
const CXXMethodDecl *MD = dyn_cast_if_present<CXXMethodDecl>(D);
1292 CGM.getCXXABI().EmitInstanceFunctionProlog(*
this);
1308 CXXThisValue = ThisFieldLValue.
getPointer(*
this);
1317 if (FD->hasCapturedVLAType()) {
1320 auto VAT = FD->getCapturedVLAType();
1321 VLASizeMap[VAT->getSizeExpr()] = ExprArg;
1328 CXXThisValue = CXXABIThisValue;
1332 if (CXXABIThisValue) {
1334 SkippedChecks.
set(SanitizerKind::ObjectSize,
true);
1341 SkippedChecks.
set(SanitizerKind::Null,
true);
1345 Loc, CXXABIThisValue, ThisTy, CXXABIThisAlignment, SkippedChecks);
1352 if (!FD || !FD->
hasAttr<NakedAttr>()) {
1353 for (
const VarDecl *VD : Args) {
1358 if (
const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
1359 Ty = PVD->getOriginalType();
1369 DI->EmitLocation(
Builder, StartLoc);
1373 if (
const auto *VecWidth =
CurFuncDecl->getAttr<MinVectorWidthAttr>())
1374 LargestVectorWidth = VecWidth->getVectorWidth();
1376 if (
CGM.shouldEmitConvergenceTokens())
1383 if (
const CompoundStmt *S = dyn_cast<CompoundStmt>(Body))
1395 llvm::BasicBlock *SkipCountBB =
nullptr;
1417 if (F->isInterposable())
return;
1419 for (llvm::BasicBlock &BB : *F)
1420 for (llvm::Instruction &I : BB)
1424 F->setDoesNotThrow();
1434 if (
CGM.getCXXABI().HasThisReturn(GD))
1436 else if (
CGM.getCXXABI().hasMostDerivedReturn(GD))
1437 ResTy =
CGM.getContext().VoidPtrTy;
1438 CGM.getCXXABI().buildThisParam(*
this, Args);
1444 bool PassedParams =
true;
1446 if (
auto Inherited = CD->getInheritedConstructor())
1452 Args.push_back(Param);
1453 if (!Param->hasAttr<PassObjectSizeAttr>())
1457 getContext(), Param->getDeclContext(), Param->getLocation(),
1465 CGM.getCXXABI().addImplicitStructorParams(*
this, ResTy, Args);
1472 assert(Fn &&
"generating code for null Function");
1479 CGM.getTargetCodeGenInfo().checkFunctionABI(
CGM, FD);
1485 std::string FDInlineName = (Fn->getName() +
".inline").str();
1486 llvm::Module *M = Fn->getParent();
1487 llvm::Function *Clone = M->getFunction(FDInlineName);
1489 Clone = llvm::Function::Create(Fn->getFunctionType(),
1490 llvm::GlobalValue::InternalLinkage,
1491 Fn->getAddressSpace(), FDInlineName, M);
1492 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
1494 Fn->setLinkage(llvm::GlobalValue::ExternalLinkage);
1504 if (LLVM_UNLIKELY(PD->isInlineBuiltinDeclaration())) {
1505 std::string FDInlineName = (Fn->getName() +
".inline").str();
1506 llvm::Module *M = Fn->getParent();
1507 if (llvm::Function *Clone = M->getFunction(FDInlineName)) {
1508 Clone->replaceAllUsesWith(Fn);
1509 Clone->eraseFromParent();
1517 if (FD->
hasAttr<NoDebugAttr>()) {
1520 Fn->setSubprogram(
nullptr);
1522 DebugInfo =
nullptr;
1525 llvm::scope_exit Cleanup([
this] {
1527 DI->completeFunction();
1534 BodyRange = Body->getSourceRange();
1537 CurEHLocation = BodyRange.getEnd();
1549 if (SpecDecl->hasBody(SpecDecl))
1550 Loc = SpecDecl->getLocation();
1557 ShouldEmitLifetimeMarkers =
true;
1561 if (ShouldEmitLifetimeMarkers)
1566 StartFunction(GD, ResTy, Fn, FnInfo, Args, Loc, BodyRange.getBegin());
1569 if (Body && isa_and_nonnull<CoroutineBodyStmt>(Body))
1577 CurFn->addFnAttr(llvm::Attribute::MustProgress);
1580 PGO->assignRegionCounters(GD,
CurFn);
1587 FD->
hasAttr<CUDAGlobalAttr>())
1588 CGM.getCUDARuntime().emitDeviceStub(*
this, Args);
1611 }
else if (DeviceKernelAttr::isOpenCLSpelling(
1612 FD->
getAttr<DeviceKernelAttr>()) &&
1615 for (
unsigned i = 0; i < Args.size(); ++i) {
1617 QualType ArgQualType = Args[i]->getType();
1619 CallArgs.
add(ArgRValue, ArgQualType);
1623 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FT);
1626 llvm::FunctionType *FTy =
CGM.getTypes().GetFunctionType(FnInfo);
1627 llvm::Constant *GDStubFunctionPointer =
1628 CGM.getRawFunctionPointer(GDStub, FTy);
1635 llvm_unreachable(
"no definition for emitted function");
1645 bool ShouldEmitUnreachable =
1646 CGM.getCodeGenOpts().StrictReturn ||
1648 if (
SanOpts.has(SanitizerKind::Return)) {
1649 auto CheckOrdinal = SanitizerKind::SO_Return;
1650 auto CheckHandler = SanitizerHandler::MissingReturn;
1652 llvm::Value *IsFalse =
Builder.getFalse();
1653 EmitCheck(std::make_pair(IsFalse, CheckOrdinal), CheckHandler,
1655 }
else if (ShouldEmitUnreachable) {
1656 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
1659 if (
SanOpts.has(SanitizerKind::Return) || ShouldEmitUnreachable) {
1661 Builder.ClearInsertionPoint();
1668 PGO->verifyCounterMap();
1671 StringRef Identifier =
1672 CurCodeDecl->getAttr<PersonalityAttr>()->getRoutine()->getName();
1673 llvm::FunctionCallee PersonalityRoutine =
1674 CGM.CreateRuntimeFunction(llvm::FunctionType::get(
CGM.Int32Ty,
true),
1675 Identifier, {},
true);
1681 if (!
CurFn->doesNotThrow())
1690 if (!S)
return false;
1707 IgnoreCaseStmts =
true;
1722 if (!S)
return false;
1742 if (!S)
return false;
1773 if (!AllowLabels &&
CGM.getCodeGenOpts().hasProfileClangInstr() &&
1774 CGM.getCodeGenOpts().MCDCCoverage)
1777 llvm::APSInt ResultInt;
1781 ResultBool = ResultInt.getBoolValue();
1789 llvm::APSInt &ResultInt,
1797 llvm::APSInt Int =
Result.Val.getInt();
1801 PGO->markStmtMaybeUsed(
Cond);
1802 ResultInt = std::move(Int);
1831 llvm::BasicBlock *FalseBlock, uint64_t TrueCount ,
1834 bool InstrumentRegions =
CGM.getCodeGenOpts().hasProfileClangInstr();
1838 const Stmt *CntrStmt = (CntrIdx ? CntrIdx :
Cond);
1840 llvm::BasicBlock *ThenBlock =
nullptr;
1841 llvm::BasicBlock *ElseBlock =
nullptr;
1842 llvm::BasicBlock *NextBlock =
nullptr;
1847 llvm::BasicBlock *SkipIncrBlock =
1849 llvm::BasicBlock *SkipNextBlock =
nullptr;
1863 if (LOp == BO_LAnd) {
1864 SkipNextBlock = FalseBlock;
1865 ThenBlock = CounterIncrBlock;
1866 ElseBlock = (SkipIncrBlock ? SkipIncrBlock : SkipNextBlock);
1867 NextBlock = TrueBlock;
1882 else if (LOp == BO_LOr) {
1883 SkipNextBlock = TrueBlock;
1884 ThenBlock = (SkipIncrBlock ? SkipIncrBlock : SkipNextBlock);
1885 ElseBlock = CounterIncrBlock;
1886 NextBlock = FalseBlock;
1888 llvm_unreachable(
"Expected Opcode must be that of a Logical Operator");
1894 if (SkipIncrBlock) {
1918 const Expr *
Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock,
1920 const VarDecl *ConditionalDecl) {
1927 if (CondBOp->getOpcode() == BO_LAnd) {
1930 bool ConstantBool =
false;
1936 FalseBlock, TrueCount, LH);
1946 FalseBlock, TrueCount, LH, CondBOp);
1953 llvm::BasicBlock *LHSFalse =
1981 FalseBlock, TrueCount, LH);
1986 if (CondBOp->getOpcode() == BO_LOr) {
1989 bool ConstantBool =
false;
1995 FalseBlock, TrueCount, LH);
2005 FalseBlock, TrueCount, LH, CondBOp);
2010 llvm::BasicBlock *LHSTrue =
2018 uint64_t RHSCount = TrueCount - LHSCount;
2054 bool MCDCCondition =
CGM.getCodeGenOpts().hasProfileClangInstr() &&
2055 CGM.getCodeGenOpts().MCDCCoverage &&
2057 if (CondUOp->getOpcode() == UO_LNot && !MCDCCondition) {
2084 uint64_t LHSScaledTrueCount = 0;
2088 LHSScaledTrueCount = TrueCount * LHSRatio;
2097 LHSScaledTrueCount, LH, CondOp);
2105 TrueCount - LHSScaledTrueCount, LH, CondOp);
2140 MCDCBaseExpr = ConditionalOp;
2147 llvm::MDNode *Weights =
nullptr;
2148 llvm::MDNode *Unpredictable =
nullptr;
2153 auto *
Call = dyn_cast<CallExpr>(
Cond->IgnoreImpCasts());
2154 if (
Call &&
CGM.getCodeGenOpts().OptimizationLevel != 0) {
2155 auto *FD = dyn_cast_or_null<FunctionDecl>(
Call->getCalleeDecl());
2156 if (FD && FD->
getBuiltinID() == Builtin::BI__builtin_unpredictable) {
2158 Unpredictable = MDHelper.createUnpredictable();
2164 llvm::Value *NewCondV = emitCondLikelihoodViaExpectIntrinsic(CondV, LH);
2165 if (CondV != NewCondV)
2170 Weights = createProfileWeights(TrueCount, CurrentCount - TrueCount);
2173 llvm::Instruction *BrInst =
Builder.CreateCondBr(CondV, TrueBlock, FalseBlock,
2174 Weights, Unpredictable);
2178 case HLSLControlFlowHintAttr::Microsoft_branch:
2179 case HLSLControlFlowHintAttr::Microsoft_flatten: {
2180 llvm::MDBuilder MDHelper(
CGM.getLLVMContext());
2182 llvm::ConstantInt *BranchHintConstant =
2184 HLSLControlFlowHintAttr::Spelling::Microsoft_branch
2185 ? llvm::ConstantInt::get(
CGM.Int32Ty, 1)
2186 : llvm::ConstantInt::get(
CGM.Int32Ty, 2);
2189 {MDHelper.createString(
"hlsl.controlflow.hint"),
2190 MDHelper.createConstant(BranchHintConstant)});
2191 BrInst->setMetadata(
"hlsl.controlflow.hint",
2192 llvm::MDNode::get(
CGM.getLLVMContext(), Vals));
2196 case HLSLControlFlowHintAttr::SpellingNotCalculated:
2204 llvm::Value *Arg =
nullptr;
2205 if ((ICEArguments & (1 << Idx)) == 0) {
2210 std::optional<llvm::APSInt>
Result =
2212 assert(
Result &&
"Expected argument to be a constant");
2221 CGM.ErrorUnsupported(S,
Type);
2233 llvm::Value *sizeInChars) {
2237 llvm::Value *baseSizeInChars
2241 llvm::Value *end = Builder.CreateInBoundsGEP(begin.
getElementType(),
2243 sizeInChars,
"vla.end");
2245 llvm::BasicBlock *originBB = CGF.
Builder.GetInsertBlock();
2253 llvm::PHINode *cur = Builder.CreatePHI(begin.
getType(), 2,
"vla.cur");
2260 Builder.CreateMemCpy(
Address(cur, CGF.
Int8Ty, curAlign), src, baseSizeInChars,
2265 Builder.CreateInBoundsGEP(CGF.
Int8Ty, cur, baseSizeInChars,
"vla.next");
2268 llvm::Value *done = Builder.CreateICmpEQ(next, end,
"vla-init.isdone");
2269 Builder.CreateCondBr(done, contBB, loopBB);
2270 cur->addIncoming(next, loopBB);
2288 if (
CGM.getContext().arePFPFieldsTriviallyCopyable(Field->getParent())) {
2289 uint64_t FieldSignature =
2290 llvm::getPointerAuthStableSipHash(
CGM.getPFPFieldName(Field));
2291 Disc = llvm::ConstantInt::get(
CGM.Int64Ty, FieldSignature);
2295 llvm::GlobalValue *DS =
CGM.getPFPDeactivationSymbol(Field);
2296 llvm::OperandBundleDef DSBundle(
"deactivation-symbol", DS);
2299 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::protected_field_ptr,
2318 llvm::Value *SizeVal;
2325 dyn_cast_or_null<VariableArrayType>(
2328 SizeVal = VlaSize.NumElts;
2330 if (!eltSize.
isOne())
2331 SizeVal =
Builder.CreateNUWMul(SizeVal,
CGM.getSize(eltSize));
2337 SizeVal =
CGM.getSize(size);
2345 if (!
CGM.getTypes().isZeroInitializable(Ty)) {
2349 llvm::Constant *NullConstant =
CGM.EmitNullConstant(Ty);
2351 llvm::GlobalVariable *NullVariable =
2352 new llvm::GlobalVariable(
CGM.getModule(), NullConstant->getType(),
2354 llvm::GlobalVariable::PrivateLinkage,
2355 NullConstant, Twine());
2357 NullVariable->setAlignment(NullAlign.
getAsAlign());
2363 Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal,
false);
2369 Builder.CreateMemSet(DestPtr,
Builder.getInt8(0), SizeVal,
false);
2382 if (!IndirectBranch)
2388 IndirectBranch->addDestination(BB);
2389 return llvm::BlockAddress::get(
CurFn->getType(), BB);
2394 if (IndirectBranch)
return IndirectBranch->getParent();
2399 llvm::Value *DestVal = TmpBuilder.CreatePHI(
Int8PtrTy, 0,
2400 "indirect.goto.dest");
2403 IndirectBranch = TmpBuilder.CreateIndirectBr(DestVal);
2404 return IndirectBranch->getParent();
2416 llvm::Value *numVLAElements =
nullptr;
2428 baseType = elementType;
2429 return numVLAElements;
2443 llvm::ConstantInt *zero =
Builder.getInt32(0);
2444 gepIndices.push_back(zero);
2446 uint64_t countFromCLAs = 1;
2449 llvm::ArrayType *llvmArrayType =
2451 while (llvmArrayType) {
2454 llvmArrayType->getNumElements());
2456 gepIndices.push_back(zero);
2457 countFromCLAs *= llvmArrayType->getNumElements();
2461 dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
2464 "LLVM and Clang types are out-of-synch");
2483 gepIndices,
"array.begin"),
2489 llvm::Value *numElements
2490 = llvm::ConstantInt::get(
SizeTy, countFromCLAs);
2494 numElements =
Builder.CreateNUWMul(numVLAElements, numElements);
2501 assert(vla &&
"type was not a variable array type!");
2508 llvm::Value *numElements =
nullptr;
2512 elementType =
type->getElementType();
2513 llvm::Value *vlaSize = VLASizeMap[
type->getSizeExpr()];
2514 assert(vlaSize &&
"no size for VLA!");
2515 assert(vlaSize->getType() ==
SizeTy);
2518 numElements = vlaSize;
2522 numElements =
Builder.CreateNUWMul(numElements, vlaSize);
2524 }
while ((
type =
getContext().getAsVariableArrayType(elementType)));
2526 return { numElements, elementType };
2532 assert(vla &&
"type was not a variable array type!");
2538 llvm::Value *VlaSize = VLASizeMap[Vla->
getSizeExpr()];
2539 assert(VlaSize &&
"no size for VLA!");
2540 assert(VlaSize->getType() ==
SizeTy);
2545 assert(
type->isVariablyModifiedType() &&
2546 "Must pass variably modified type to EmitVLASizes!");
2553 assert(
type->isVariablyModifiedType());
2555 const Type *ty =
type.getTypePtr();
2558#define TYPE(Class, Base)
2559#define ABSTRACT_TYPE(Class, Base)
2560#define NON_CANONICAL_TYPE(Class, Base)
2561#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2562#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
2563#include "clang/AST/TypeNodes.inc"
2564 llvm_unreachable(
"unexpected dependent type!");
2570 case Type::ExtVector:
2571 case Type::ConstantMatrix:
2575 case Type::TemplateSpecialization:
2576 case Type::ObjCTypeParam:
2577 case Type::ObjCObject:
2578 case Type::ObjCInterface:
2579 case Type::ObjCObjectPointer:
2581 case Type::HLSLInlineSpirv:
2582 case Type::PredefinedSugar:
2583 llvm_unreachable(
"type class is never variably-modified!");
2585 case Type::Adjusted:
2597 case Type::BlockPointer:
2601 case Type::LValueReference:
2602 case Type::RValueReference:
2606 case Type::MemberPointer:
2610 case Type::ArrayParameter:
2611 case Type::ConstantArray:
2612 case Type::IncompleteArray:
2617 case Type::VariableArray: {
2626 llvm::Value *&entry = VLASizeMap[sizeExpr];
2634 if (
SanOpts.has(SanitizerKind::VLABound)) {
2635 auto CheckOrdinal = SanitizerKind::SO_VLABound;
2636 auto CheckHandler = SanitizerHandler::VLABoundNotPositive;
2638 llvm::Value *
Zero = llvm::Constant::getNullValue(size->getType());
2640 llvm::Value *CheckCondition =
2644 llvm::Constant *StaticArgs[] = {
2647 EmitCheck(std::make_pair(CheckCondition, CheckOrdinal),
2648 CheckHandler, StaticArgs, size);
2661 case Type::FunctionProto:
2662 case Type::FunctionNoProto:
2668 case Type::UnaryTransform:
2669 case Type::Attributed:
2670 case Type::BTFTagAttributed:
2671 case Type::OverflowBehavior:
2672 case Type::HLSLAttributedResource:
2673 case Type::SubstTemplateTypeParm:
2674 case Type::MacroQualified:
2675 case Type::CountAttributed:
2681 case Type::Decltype:
2683 case Type::DeducedTemplateSpecialization:
2684 case Type::PackIndexing:
2688 case Type::TypeOfExpr:
2701 }
while (
type->isVariablyModifiedType());
2705 if (
getContext().getBuiltinVaListType()->isArrayType())
2720 assert(
Init.hasValue() &&
"Invalid DeclRefExpr initializer!");
2722 if (
CGM.getCodeGenOpts().hasReducedDebugInfo())
2738 llvm::Instruction *inst =
new llvm::BitCastInst(value, value->getType(),
"",
2742 protection.Inst = inst;
2747 if (!protection.Inst)
return;
2750 protection.Inst->eraseFromParent();
2756 llvm::Value *Alignment,
2757 llvm::Value *OffsetValue) {
2758 if (Alignment->getType() !=
IntPtrTy)
2761 if (OffsetValue && OffsetValue->getType() !=
IntPtrTy)
2764 llvm::Value *TheCheck =
nullptr;
2765 if (
SanOpts.has(SanitizerKind::Alignment)) {
2766 llvm::Value *PtrIntValue =
2770 bool IsOffsetZero =
false;
2771 if (
const auto *CI = dyn_cast<llvm::ConstantInt>(OffsetValue))
2772 IsOffsetZero = CI->isZero();
2775 PtrIntValue =
Builder.CreateSub(PtrIntValue, OffsetValue,
"offsetptr");
2778 llvm::Value *
Zero = llvm::ConstantInt::get(
IntPtrTy, 0);
2781 llvm::Value *MaskedPtr =
Builder.CreateAnd(PtrIntValue, Mask,
"maskedptr");
2782 TheCheck =
Builder.CreateICmpEQ(MaskedPtr,
Zero,
"maskcond");
2784 llvm::Instruction *Assumption =
Builder.CreateAlignmentAssumption(
2785 CGM.getDataLayout(), PtrValue, Alignment, OffsetValue);
2787 if (!
SanOpts.has(SanitizerKind::Alignment))
2790 OffsetValue, TheCheck, Assumption);
2796 llvm::Value *Alignment,
2797 llvm::Value *OffsetValue) {
2806 llvm::Value *AnnotatedVal,
2807 StringRef AnnotationStr,
2809 const AnnotateAttr *
Attr) {
2812 CGM.EmitAnnotationString(AnnotationStr),
2813 CGM.EmitAnnotationUnit(Location),
2814 CGM.EmitAnnotationLineNo(Location),
2817 Args.push_back(
CGM.EmitAnnotationArgs(
Attr));
2818 return Builder.CreateCall(AnnotationFn, Args);
2822 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
2825 {V->getType(), CGM.ConstGlobalsPtrTy}),
2831 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
2832 llvm::Value *
V =
Addr.emitRawPointer(*
this);
2833 llvm::Type *VTy =
V->getType();
2834 auto *PTy = dyn_cast<llvm::PointerType>(VTy);
2835 unsigned AS = PTy ? PTy->getAddressSpace() : 0;
2836 llvm::PointerType *IntrinTy =
2837 llvm::PointerType::get(
CGM.getLLVMContext(), AS);
2838 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation,
2839 {IntrinTy,
CGM.ConstGlobalsPtrTy});
2845 if (VTy != IntrinTy)
2858 assert(!CGF->IsSanitizerScope);
2859 CGF->IsSanitizerScope =
true;
2863 CGF->IsSanitizerScope =
false;
2867 const llvm::Twine &Name,
2868 llvm::BasicBlock::iterator InsertPt)
const {
2871 I->setNoSanitizeMetadata();
2875 llvm::Instruction *I,
const llvm::Twine &Name,
2876 llvm::BasicBlock::iterator InsertPt)
const {
2877 llvm::IRBuilderDefaultInserter::InsertHelper(I, Name, InsertPt);
2879 CGF->InsertHelper(I, Name, InsertPt);
2888 if (
CGM.getContext().getTargetInfo().getTriple().isX86()) {
2890 if (BuiltinID == X86::BI__builtin_ia32_cmpps ||
2891 BuiltinID == X86::BI__builtin_ia32_cmpss ||
2892 BuiltinID == X86::BI__builtin_ia32_cmppd ||
2893 BuiltinID == X86::BI__builtin_ia32_cmpsd) {
2895 llvm::StringMap<bool> TargetFetureMap;
2896 CGM.getContext().getFunctionFeatureMap(TargetFetureMap, FD);
2898 *(E->
getArg(2)->getIntegerConstantExpr(
CGM.getContext()));
2899 if (
Result.getSExtValue() > 7 && !TargetFetureMap.lookup(
"avx"))
2900 CGM.getDiags().Report(E->
getBeginLoc(), diag::err_builtin_needs_feature)
2921 bool IsAlwaysInline = TargetDecl->
hasAttr<AlwaysInlineAttr>();
2922 bool IsFlatten = FD && FD->
hasAttr<FlattenAttr>();
2928 std::string MissingFeature;
2929 llvm::StringMap<bool> CallerFeatureMap;
2930 CGM.getContext().getFunctionFeatureMap(CallerFeatureMap, FD);
2937 StringRef FeatureList(
CGM.getContext().BuiltinInfo.getRequiredFeatures(BuiltinID));
2939 FeatureList, CallerFeatureMap) && !IsHipStdPar) {
2940 CGM.getDiags().Report(Loc, diag::err_builtin_needs_feature)
2945 TargetDecl->
hasAttr<TargetAttr>()) {
2948 const TargetAttr *TD = TargetDecl->
getAttr<TargetAttr>();
2950 CGM.getContext().filterFunctionTargetAttrs(TD);
2953 llvm::StringMap<bool> CalleeFeatureMap;
2954 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
2957 if (F[0] ==
'+' && CalleeFeatureMap.lookup(F.substr(1)))
2958 ReqFeatures.push_back(StringRef(F).substr(1));
2961 for (
const auto &F : CalleeFeatureMap) {
2964 ReqFeatures.push_back(F.getKey());
2966 if (!llvm::all_of(ReqFeatures,
2968 if (!CallerFeatureMap.lookup(
Feature)) {
2969 MissingFeature =
Feature.str();
2976 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
2979 CGM.getDiags().Report(Loc, diag::err_flatten_function_needs_feature)
2984 llvm::StringMap<bool> CalleeFeatureMap;
2985 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
2987 for (
const auto &F : CalleeFeatureMap) {
2989 (!CallerFeatureMap.lookup(F.getKey()) ||
2990 !CallerFeatureMap.find(F.getKey())->getValue()) &&
2993 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
2996 CGM.getDiags().Report(Loc, diag::err_flatten_function_needs_feature)
3004 if (!
CGM.getCodeGenOpts().SanitizeStats)
3007 llvm::IRBuilder<> IRB(
Builder.GetInsertBlock(),
Builder.GetInsertPoint());
3008 IRB.SetCurrentDebugLocation(
Builder.getCurrentDebugLocation());
3009 CGM.getSanStats().create(IRB, SSK);
3021 Salt = Info.CFISalt;
3023 Bundles.emplace_back(
"kcfi",
CGM.CreateKCFITypeId(FP->
desugar(), Salt));
3027CodeGenFunction::FormAArch64ResolverCondition(
const FMVResolverOption &RO) {
3028 return RO.Features.empty() ?
nullptr : EmitAArch64CpuSupports(RO.Features);
3032CodeGenFunction::FormX86ResolverCondition(
const FMVResolverOption &RO) {
3035 if (RO.Architecture) {
3036 StringRef
Arch = *RO.Architecture;
3039 if (
Arch.starts_with(
"x86-64"))
3045 if (!RO.Features.empty()) {
3046 llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Features);
3054 llvm::Function *Resolver,
3056 llvm::Function *FuncToReturn,
3057 bool SupportsIFunc) {
3058 if (SupportsIFunc) {
3059 Builder.CreateRet(FuncToReturn);
3064 llvm::make_pointer_range(Resolver->args()));
3066 llvm::CallInst *
Result = Builder.CreateCall(FuncToReturn, Args);
3067 Result->setTailCallKind(llvm::CallInst::TCK_MustTail);
3069 if (Resolver->getReturnType()->isVoidTy())
3070 Builder.CreateRetVoid();
3072 Builder.CreateRet(
Result);
3078 llvm::Triple::ArchType ArchType =
3082 case llvm::Triple::x86:
3083 case llvm::Triple::x86_64:
3086 case llvm::Triple::aarch64:
3089 case llvm::Triple::riscv32:
3090 case llvm::Triple::riscv64:
3091 case llvm::Triple::riscv32be:
3092 case llvm::Triple::riscv64be:
3095 case llvm::Triple::ppc:
3096 case llvm::Triple::ppc64:
3104 "Only implemented for x86, AArch64, RISC-V, and PowerPC AIX");
3132 Builder.SetInsertPoint(CurBlock);
3134 if (!RO.Architecture && RO.Features.empty()) {
3137 assert(&RO == Options.end() - 1 &&
3138 "Default or Generic case must be last");
3139 Builder.CreateRet(RO.Function);
3148 assert(RO.Features.size() == 1 &&
3149 "for now one feature requirement per version");
3151 assert(RO.Features[0].starts_with(
"cpu="));
3152 StringRef CPU = RO.Features[0].split(
"=").second.trim();
3153 StringRef
Feature = llvm::StringSwitch<StringRef>(CPU)
3154 .Case(
"pwr7",
"arch_2_06")
3155 .Case(
"pwr8",
"arch_2_07")
3156 .Case(
"pwr9",
"arch_3_00")
3157 .Case(
"pwr10",
"arch_3_1")
3158 .Case(
"pwr11",
"arch_3_1")
3162 Builtin::BI__builtin_cpu_supports,
Builder.getInt1Ty(),
Feature);
3168 Builder.SetInsertPoint(ThenBlock);
3169 Builder.CreateRet(RO.Function);
3172 llvm_unreachable(
"Default case missing");
3179 llvm::Triple::OSType::Linux) {
3180 CGM.getDiags().Report(diag::err_os_unsupport_riscv_fmv);
3185 Builder.SetInsertPoint(CurBlock);
3189 bool HasDefault =
false;
3190 unsigned DefaultIndex = 0;
3193 for (
unsigned Index = 0; Index < Options.size(); Index++) {
3195 if (Options[Index].Features.empty()) {
3197 DefaultIndex = Index;
3201 Builder.SetInsertPoint(CurBlock);
3227 for (StringRef Feat : Options[Index].Features) {
3228 std::vector<std::string> FeatStr =
3231 assert(FeatStr.size() == 1 &&
"Feature string not delimited");
3233 std::string &CurrFeat = FeatStr.front();
3234 if (CurrFeat[0] ==
'+')
3235 TargetAttrFeats.push_back(CurrFeat.substr(1));
3238 if (TargetAttrFeats.empty())
3241 for (std::string &Feat : TargetAttrFeats)
3242 CurrTargetAttrFeats.push_back(Feat);
3244 Builder.SetInsertPoint(CurBlock);
3247 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3250 Options[Index].
Function, SupportsIFunc);
3253 Builder.SetInsertPoint(CurBlock);
3254 Builder.CreateCondBr(FeatsCondition, RetBlock, ElseBlock);
3256 CurBlock = ElseBlock;
3261 Builder.SetInsertPoint(CurBlock);
3268 Builder.SetInsertPoint(CurBlock);
3269 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3270 TrapCall->setDoesNotReturn();
3271 TrapCall->setDoesNotThrow();
3273 Builder.ClearInsertionPoint();
3278 assert(!Options.empty() &&
"No multiversion resolver options found");
3279 assert(Options.back().Features.size() == 0 &&
"Default case must be last");
3281 assert(SupportsIFunc &&
3282 "Multiversion resolver requires target IFUNC support");
3283 bool AArch64CpuInitialized =
false;
3287 Builder.SetInsertPoint(CurBlock);
3288 llvm::Value *
Condition = FormAArch64ResolverCondition(RO);
3297 if (!AArch64CpuInitialized) {
3298 Builder.SetInsertPoint(CurBlock, CurBlock->begin());
3299 EmitAArch64CpuInit();
3300 AArch64CpuInitialized =
true;
3301 Builder.SetInsertPoint(CurBlock);
3305 if (RO.Function ==
nullptr)
3308 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3317 Builder.SetInsertPoint(CurBlock);
3318 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3319 TrapCall->setDoesNotReturn();
3320 TrapCall->setDoesNotThrow();
3322 Builder.ClearInsertionPoint();
3332 Builder.SetInsertPoint(CurBlock);
3336 Builder.SetInsertPoint(CurBlock);
3337 llvm::Value *
Condition = FormX86ResolverCondition(RO);
3341 assert(&RO == Options.end() - 1 &&
3342 "Default or Generic case must be last");
3348 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3357 Builder.SetInsertPoint(CurBlock);
3358 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3359 TrapCall->setDoesNotReturn();
3360 TrapCall->setDoesNotThrow();
3362 Builder.ClearInsertionPoint();
3374 llvm::Value *OffsetValue, llvm::Value *TheCheck,
3375 llvm::Instruction *Assumption) {
3376 assert(isa_and_nonnull<llvm::CallInst>(Assumption) &&
3378 llvm::Intrinsic::getOrInsertDeclaration(
3379 Builder.GetInsertBlock()->getParent()->getParent(),
3380 llvm::Intrinsic::assume) &&
3381 "Assumption should be a call to llvm.assume().");
3382 assert(&(
Builder.GetInsertBlock()->back()) == Assumption &&
3383 "Assumption should be the last instruction of the basic block, "
3384 "since the basic block is still being generated.");
3386 if (!
SanOpts.has(SanitizerKind::Alignment))
3396 Assumption->removeFromParent();
3399 auto CheckOrdinal = SanitizerKind::SO_Alignment;
3400 auto CheckHandler = SanitizerHandler::AlignmentAssumption;
3404 OffsetValue =
Builder.getInt1(
false);
3409 llvm::Value *DynamicData[] = {Ptr, Alignment, OffsetValue};
3410 EmitCheck({std::make_pair(TheCheck, CheckOrdinal)}, CheckHandler,
3411 StaticData, DynamicData);
3422 return DI->SourceLocToDebugLoc(Location);
3424 return llvm::DebugLoc();
3428CodeGenFunction::emitCondLikelihoodViaExpectIntrinsic(llvm::Value *
Cond,
3439 llvm::Type *CondTy =
Cond->getType();
3440 assert(CondTy->isIntegerTy(1) &&
"expecting condition to be a boolean");
3441 llvm::Function *FnExpect =
3443 llvm::Value *ExpectedValueOfCond =
3445 return Builder.CreateCall(FnExpect, {
Cond, ExpectedValueOfCond},
3446 Cond->getName() +
".expval");
3448 llvm_unreachable(
"Unknown Likelihood");
3452 unsigned NumElementsDst,
3453 const llvm::Twine &Name) {
3455 unsigned NumElementsSrc = SrcTy->getNumElements();
3456 if (NumElementsSrc == NumElementsDst)
3459 std::vector<int> ShuffleMask(NumElementsDst, -1);
3460 for (
unsigned MaskIdx = 0;
3461 MaskIdx < std::min<>(NumElementsDst, NumElementsSrc); ++MaskIdx)
3462 ShuffleMask[MaskIdx] = MaskIdx;
3464 return Builder.CreateShuffleVector(SrcVec, ShuffleMask, Name);
3477 Discriminator =
Builder.getSize(0);
3479 llvm::Value *Args[] = {Key, Discriminator};
3480 Bundles.emplace_back(
"ptrauth", Args);
3486 unsigned IntrinsicID) {
3493 if (!Discriminator) {
3498 auto OrigType =
Pointer->getType();
3516 llvm::Intrinsic::ptrauth_sign);
3522 auto StripIntrinsic = CGF.
CGM.
getIntrinsic(llvm::Intrinsic::ptrauth_strip);
3526 auto OrigType =
Pointer->getType();
3543 llvm::Intrinsic::ptrauth_auth);
3547 llvm::Instruction *KeyInstruction, llvm::Value *Backup) {
3549 DI->addInstToCurrentSourceAtom(KeyInstruction, Backup);
3553 llvm::Instruction *KeyInstruction, llvm::Value *Backup, uint64_t Atom) {
3555 DI->addInstToSpecificSourceAtom(KeyInstruction, Backup, Atom);
3559 llvm::Value *Backup) {
3562 DI->addInstToCurrentSourceAtom(KeyInstruction, Backup);
3569 if (
getContext().arePFPFieldsTriviallyCopyable(Field.Field->getParent()))
3573 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 shouldEmitLifetimeMarkers(const CodeGenOptions &CGOpts, const LangOptions &LangOpts)
shouldEmitLifetimeMarkers - Decide whether we need emit the life-time markers.
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.
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.
SourceLocation getBeginLoc() const
CharUnits - This is an opaque type for sizes expressed in character units.
bool isZero() const
isZero - Test whether the quantity equals zero.
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - 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
isOne - Test whether the quantity equals one.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
@ 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::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
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID)
Emit a call to trap or debugtrap and attach function attribute "trap-func-name" if specified.
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
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.
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
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.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
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.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
SanitizerSet Sanitize
Set of enabled sanitizers.
RoundingMode getDefaultRoundingMode() const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represents a parameter to a function.
ParsedAttr - Represents a syntactic attribute.
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.
bool evaluateRequiredTargetFeatures(llvm::StringRef RequiredFatures, const llvm::StringMap< bool > &TargetFetureMap)
Returns true if the required target features of a builtin function are enabled.
@ 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
The JSON file list parser is used to communicate input to InstallAPI.
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.
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....
Contains information gathered from parsing the contents of TargetAttr.
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.