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/MDBuilder.h"
49#include "llvm/Support/CRC.h"
50#include "llvm/Support/xxhash.h"
51#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
52#include "llvm/Transforms/Utils/PromoteMemToReg.h"
62 if (CGOpts.DisableLifetimeMarkers)
66 if (CGOpts.SanitizeAddressUseAfterScope ||
73 return CGOpts.OptimizationLevel != 0;
76CodeGenFunction::CodeGenFunction(
CodeGenModule &cgm,
bool suppressNewContext)
81 DebugInfo(
CGM.getModuleDebugInfo()),
83 ShouldEmitLifetimeMarkers(
85 if (!suppressNewContext)
86 CGM.getCXXABI().getMangleContext().startNewFunction();
95 "missed to deactivate a cleanup");
98 CGM.getOpenMPRuntime().functionFinished(*
this);
105 if (
CGM.getLangOpts().OpenMPIRBuilder &&
CurFn)
106 CGM.getOpenMPRuntime().getOMPBuilder().finalize(
CurFn);
111llvm::fp::ExceptionBehavior
119 llvm_unreachable(
"Unsupported FP Exception Behavior");
124 llvm::FastMathFlags FMF;
125 FMF.setAllowReassoc(FPFeatures.getAllowFPReassociate());
126 FMF.setNoNaNs(FPFeatures.getNoHonorNaNs());
127 FMF.setNoInfs(FPFeatures.getNoHonorInfs());
128 FMF.setNoSignedZeros(FPFeatures.getNoSignedZero());
129 FMF.setAllowReciprocal(FPFeatures.getAllowReciprocal());
130 FMF.setApproxFunc(FPFeatures.getAllowApproxFunc());
144 ConstructorHelper(FPFeatures);
147void CodeGenFunction::CGFPOptionsRAII::ConstructorHelper(
FPOptions FPFeatures) {
148 OldFPFeatures = CGF.CurFPFeatures;
149 CGF.CurFPFeatures = FPFeatures;
151 OldExcept = CGF.Builder.getDefaultConstrainedExcept();
152 OldRounding = CGF.Builder.getDefaultConstrainedRounding();
154 if (OldFPFeatures == FPFeatures)
157 FMFGuard.emplace(CGF.Builder);
160 CGF.Builder.setDefaultConstrainedRounding(NewRoundingBehavior);
161 auto NewExceptionBehavior =
163 CGF.Builder.setDefaultConstrainedExcept(NewExceptionBehavior);
165 CGF.SetFastMathFlags(FPFeatures);
167 assert((CGF.CurFuncDecl ==
nullptr || CGF.Builder.getIsFPConstrained() ||
170 (NewExceptionBehavior == llvm::fp::ebIgnore &&
171 NewRoundingBehavior == llvm::RoundingMode::NearestTiesToEven)) &&
172 "FPConstrained should be enabled on entire function");
174 auto mergeFnAttrValue = [&](StringRef Name,
bool Value) {
176 CGF.CurFn->getFnAttribute(Name).getValueAsBool();
177 auto NewValue = OldValue &
Value;
178 if (OldValue != NewValue)
179 CGF.CurFn->addFnAttr(Name, llvm::toStringRef(NewValue));
181 mergeFnAttrValue(
"no-infs-fp-math", FPFeatures.getNoHonorInfs());
182 mergeFnAttrValue(
"no-nans-fp-math", FPFeatures.getNoHonorNaNs());
183 mergeFnAttrValue(
"no-signed-zeros-fp-math", FPFeatures.getNoSignedZero());
187 CGF.CurFPFeatures = OldFPFeatures;
188 CGF.Builder.setDefaultConstrainedExcept(OldExcept);
189 CGF.Builder.setDefaultConstrainedRounding(OldRounding);
203 nullptr, IsKnownNonNull)
211 return ::makeNaturalAlignAddrLValue(
V,
T,
false,
218 return ::makeNaturalAlignAddrLValue(
V,
T,
true,
224 return ::makeNaturalAlignAddrLValue(
V,
T,
false,
230 return ::makeNaturalAlignAddrLValue(
V,
T,
true,
235 return CGM.getTypes().ConvertTypeForMem(
T);
239 return CGM.getTypes().ConvertType(
T);
243 llvm::Type *LLVMTy) {
244 return CGM.getTypes().convertTypeForLoadStore(ASTTy, LLVMTy);
250 switch (
type->getTypeClass()) {
251#define TYPE(name, parent)
252#define ABSTRACT_TYPE(name, parent)
253#define NON_CANONICAL_TYPE(name, parent) case Type::name:
254#define DEPENDENT_TYPE(name, parent) case Type::name:
255#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(name, parent) case Type::name:
256#include "clang/AST/TypeNodes.inc"
257 llvm_unreachable(
"non-canonical or dependent type in IR-generation");
260 case Type::DeducedTemplateSpecialization:
261 llvm_unreachable(
"undeduced type in IR-generation");
266 case Type::BlockPointer:
267 case Type::LValueReference:
268 case Type::RValueReference:
269 case Type::MemberPointer:
271 case Type::ExtVector:
272 case Type::ConstantMatrix:
273 case Type::FunctionProto:
274 case Type::FunctionNoProto:
276 case Type::ObjCObjectPointer:
279 case Type::HLSLAttributedResource:
280 case Type::HLSLInlineSpirv:
288 case Type::ConstantArray:
289 case Type::IncompleteArray:
290 case Type::VariableArray:
292 case Type::ObjCObject:
293 case Type::ObjCInterface:
294 case Type::ArrayParameter:
302 llvm_unreachable(
"unknown type kind!");
309 llvm::BasicBlock *CurBB =
Builder.GetInsertBlock();
312 assert(!CurBB->getTerminator() &&
"Unexpected terminated block.");
316 if (CurBB->empty() ||
ReturnBlock.getBlock()->use_empty()) {
322 return llvm::DebugLoc();
329 llvm::BranchInst *BI =
330 dyn_cast<llvm::BranchInst>(*
ReturnBlock.getBlock()->user_begin());
331 if (BI && BI->isUnconditional() &&
335 llvm::DebugLoc Loc = BI->getDebugLoc();
336 Builder.SetInsertPoint(BI->getParent());
337 BI->eraseFromParent();
349 return llvm::DebugLoc();
354 if (!BB->use_empty()) {
362 assert(BreakContinueStack.empty() &&
363 "mismatched push/pop in break/continue stack!");
365 "mismatched push/pop of cleanups in EHStack!");
367 "mismatched activate/deactivate of cleanups!");
369 if (
CGM.shouldEmitConvergenceTokens()) {
372 "mismatched push/pop in convergence stack!");
375 bool OnlySimpleReturnStmts = NumSimpleReturnExprs > 0
376 && NumSimpleReturnExprs == NumReturnExprs
391 if (OnlySimpleReturnStmts)
392 DI->EmitLocation(
Builder, LastStopPoint);
394 DI->EmitLocation(
Builder, EndLoc);
402 bool HasOnlyNoopCleanups =
404 bool EmitRetDbgLoc = !HasCleanups || HasOnlyNoopCleanups;
406 std::optional<ApplyDebugLocation> OAL;
411 if (OnlySimpleReturnStmts)
412 DI->EmitLocation(
Builder, EndLoc);
426 if (
CGM.getCodeGenOpts().InstrumentFunctions)
427 CurFn->addFnAttr(
"instrument-function-exit",
"__cyg_profile_func_exit");
428 if (
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
429 CurFn->addFnAttr(
"instrument-function-exit-inlined",
430 "__cyg_profile_func_exit");
439 uint64_t RetKeyInstructionsAtomGroup = Loc ? Loc->getAtomGroup() : 0;
442 RetKeyInstructionsAtomGroup);
446 "did not remove all scopes from cleanup stack!");
450 if (IndirectBranch) {
457 if (!EscapedLocals.empty()) {
461 EscapeArgs.resize(EscapedLocals.size());
462 for (
auto &Pair : EscapedLocals)
463 EscapeArgs[Pair.second] = Pair.first;
464 llvm::Function *FrameEscapeFn = llvm::Intrinsic::getOrInsertDeclaration(
465 &
CGM.getModule(), llvm::Intrinsic::localescape);
472 Ptr->eraseFromParent();
476 if (PostAllocaInsertPt) {
477 llvm::Instruction *PostPtr = PostAllocaInsertPt;
478 PostAllocaInsertPt =
nullptr;
479 PostPtr->eraseFromParent();
484 if (IndirectBranch) {
486 if (PN->getNumIncomingValues() == 0) {
487 PN->replaceAllUsesWith(llvm::PoisonValue::get(PN->getType()));
488 PN->eraseFromParent();
497 for (
const auto &FuncletAndParent : TerminateFunclets)
500 if (
CGM.getCodeGenOpts().EmitDeclMetadata)
503 for (
const auto &R : DeferredReplacements) {
504 if (llvm::Value *Old = R.first) {
505 Old->replaceAllUsesWith(R.second);
509 DeferredReplacements.clear();
518 llvm::DominatorTree DT(*
CurFn);
519 llvm::PromoteMemToReg(
525 for (llvm::Argument &A :
CurFn->args())
526 if (
auto *VT = dyn_cast<llvm::VectorType>(A.getType()))
528 std::max((uint64_t)LargestVectorWidth,
529 VT->getPrimitiveSizeInBits().getKnownMinValue());
532 if (
auto *VT = dyn_cast<llvm::VectorType>(
CurFn->getReturnType()))
534 std::max((uint64_t)LargestVectorWidth,
535 VT->getPrimitiveSizeInBits().getKnownMinValue());
537 if (
CurFnInfo->getMaxVectorWidth() > LargestVectorWidth)
538 LargestVectorWidth =
CurFnInfo->getMaxVectorWidth();
547 if (
getContext().getTargetInfo().getTriple().isX86())
548 CurFn->addFnAttr(
"min-legal-vector-width",
549 llvm::utostr(LargestVectorWidth));
558 dyn_cast<llvm::AllocaInst>(
ReturnValue.emitRawPointer(*
this));
559 if (RetAlloca && RetAlloca->use_empty()) {
560 RetAlloca->eraseFromParent();
569 if (!
CGM.getCodeGenOpts().InstrumentFunctions &&
570 !
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining &&
571 !
CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
581 return CurFuncDecl->hasAttr<DisableSanitizerInstrumentationAttr>();
587 return CGM.getCodeGenOpts().XRayInstrumentFunctions;
593 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
594 (
CGM.getCodeGenOpts().XRayAlwaysEmitCustomEvents ||
595 CGM.getCodeGenOpts().XRayInstrumentationBundle.Mask ==
600 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
601 (
CGM.getCodeGenOpts().XRayAlwaysEmitTypedEvents ||
602 CGM.getCodeGenOpts().XRayInstrumentationBundle.Mask ==
613 llvm::raw_string_ostream Out(Mangled);
614 CGM.getCXXABI().getMangleContext().mangleCanonicalTypeName(Ty, Out,
false);
615 return llvm::ConstantInt::get(
616 CGM.Int32Ty,
static_cast<uint32_t
>(llvm::xxh3_64bits(Mangled)));
619void CodeGenFunction::EmitKernelMetadata(
const FunctionDecl *FD,
620 llvm::Function *Fn) {
621 if (!FD->
hasAttr<DeviceKernelAttr>() && !FD->
hasAttr<CUDAGlobalAttr>())
630 getContext().getTargetInfo().getTriple().isSPIRV())))
633 if (
const VecTypeHintAttr *A = FD->
getAttr<VecTypeHintAttr>()) {
634 QualType HintQTy = A->getTypeHint();
636 bool IsSignedInteger =
638 (HintEltQTy && HintEltQTy->
getElementType()->isSignedIntegerType());
639 llvm::Metadata *AttrMDArgs[] = {
640 llvm::ConstantAsMetadata::get(llvm::PoisonValue::get(
642 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
643 llvm::IntegerType::get(Context, 32),
644 llvm::APInt(32, (uint64_t)(IsSignedInteger ? 1 : 0))))};
645 Fn->setMetadata(
"vec_type_hint", llvm::MDNode::get(Context, AttrMDArgs));
648 if (
const WorkGroupSizeHintAttr *A = FD->
getAttr<WorkGroupSizeHintAttr>()) {
649 auto Eval = [&](
Expr *E) {
650 return E->EvaluateKnownConstInt(FD->
getASTContext()).getExtValue();
652 llvm::Metadata *AttrMDArgs[] = {
653 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getXDim()))),
654 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getYDim()))),
655 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getZDim())))};
656 Fn->setMetadata(
"work_group_size_hint", llvm::MDNode::get(Context, AttrMDArgs));
659 if (
const ReqdWorkGroupSizeAttr *A = FD->
getAttr<ReqdWorkGroupSizeAttr>()) {
660 auto Eval = [&](Expr *E) {
661 return E->EvaluateKnownConstInt(FD->
getASTContext()).getExtValue();
663 llvm::Metadata *AttrMDArgs[] = {
664 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getXDim()))),
665 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getYDim()))),
666 llvm::ConstantAsMetadata::get(
Builder.getInt32(Eval(A->getZDim())))};
667 Fn->setMetadata(
"reqd_work_group_size", llvm::MDNode::get(Context, AttrMDArgs));
670 if (
const OpenCLIntelReqdSubGroupSizeAttr *A =
671 FD->
getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
672 llvm::Metadata *AttrMDArgs[] = {
673 llvm::ConstantAsMetadata::get(
Builder.getInt32(A->getSubGroupSize()))};
674 Fn->setMetadata(
"intel_reqd_sub_group_size",
675 llvm::MDNode::get(Context, AttrMDArgs));
681 const Stmt *Body =
nullptr;
682 if (
auto *FD = dyn_cast_or_null<FunctionDecl>(F))
684 else if (
auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(F))
685 Body = OMD->getBody();
687 if (
auto *CS = dyn_cast_or_null<CompoundStmt>(Body)) {
688 auto LastStmt = CS->body_rbegin();
689 if (LastStmt != CS->body_rend())
696 if (
SanOpts.has(SanitizerKind::Thread)) {
697 Fn->addFnAttr(
"sanitize_thread_no_checking_at_run_time");
698 Fn->removeFnAttr(llvm::Attribute::SanitizeThread);
703bool CodeGenFunction::requiresReturnValueCheck()
const {
704 return requiresReturnValueNullabilityCheck() ||
710 auto *MD = dyn_cast_or_null<CXXMethodDecl>(D);
711 if (!MD || !MD->getDeclName().getAsIdentifierInfo() ||
712 !MD->getDeclName().getAsIdentifierInfo()->isStr(
"allocate") ||
713 (MD->getNumParams() != 1 && MD->getNumParams() != 2))
719 if (MD->getNumParams() == 2) {
720 auto *PT = MD->parameters()[1]->getType()->getAs<
PointerType>();
721 if (!PT || !PT->isVoidPointerType() ||
722 !PT->getPointeeType().isConstQualified())
729bool CodeGenFunction::isInAllocaArgument(
CGCXXABI &ABI, QualType Ty) {
734bool CodeGenFunction::hasInAllocaArg(
const CXXMethodDecl *MD) {
737 llvm::any_of(MD->
parameters(), [&](ParmVarDecl *P) {
738 return isInAllocaArgument(CGM.getCXXABI(), P->getType());
745 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD))
758 "Do not use a CodeGenFunction object for more than one function");
762 DidCallStackSave =
false;
764 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
771 assert(
CurFn->isDeclaration() &&
"Function already has body?");
776#define SANITIZER(NAME, ID) \
777 if (SanOpts.empty()) \
779 if (SanOpts.has(SanitizerKind::ID)) \
780 if (CGM.isInNoSanitizeList(SanitizerKind::ID, Fn, Loc)) \
781 SanOpts.set(SanitizerKind::ID, false);
783#include "clang/Basic/Sanitizers.def"
788 const bool SanitizeBounds =
SanOpts.hasOneOf(SanitizerKind::Bounds);
790 bool NoSanitizeCoverage =
false;
793 no_sanitize_mask |=
Attr->getMask();
795 if (
Attr->hasCoverage())
796 NoSanitizeCoverage =
true;
800 SanOpts.Mask &= ~no_sanitize_mask;
801 if (no_sanitize_mask & SanitizerKind::Address)
802 SanOpts.set(SanitizerKind::KernelAddress,
false);
803 if (no_sanitize_mask & SanitizerKind::KernelAddress)
804 SanOpts.set(SanitizerKind::Address,
false);
805 if (no_sanitize_mask & SanitizerKind::HWAddress)
806 SanOpts.set(SanitizerKind::KernelHWAddress,
false);
807 if (no_sanitize_mask & SanitizerKind::KernelHWAddress)
808 SanOpts.set(SanitizerKind::HWAddress,
false);
810 if (SanitizeBounds && !
SanOpts.hasOneOf(SanitizerKind::Bounds))
811 Fn->addFnAttr(llvm::Attribute::NoSanitizeBounds);
813 if (NoSanitizeCoverage &&
CGM.getCodeGenOpts().hasSanitizeCoverage())
814 Fn->addFnAttr(llvm::Attribute::NoSanitizeCoverage);
817 if (
CGM.getCodeGenOpts().hasSanitizeBinaryMetadata()) {
818 if (no_sanitize_mask & SanitizerKind::Thread)
819 Fn->addFnAttr(
"no_sanitize_thread");
824 CurFn->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
827 if (
SanOpts.hasOneOf(SanitizerKind::Address | SanitizerKind::KernelAddress))
828 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
829 if (
SanOpts.hasOneOf(SanitizerKind::HWAddress |
830 SanitizerKind::KernelHWAddress))
831 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
832 if (
SanOpts.has(SanitizerKind::MemtagStack))
833 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
834 if (
SanOpts.has(SanitizerKind::Thread))
835 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
836 if (
SanOpts.has(SanitizerKind::Type))
837 Fn->addFnAttr(llvm::Attribute::SanitizeType);
838 if (
SanOpts.has(SanitizerKind::NumericalStability))
839 Fn->addFnAttr(llvm::Attribute::SanitizeNumericalStability);
840 if (
SanOpts.hasOneOf(SanitizerKind::Memory | SanitizerKind::KernelMemory))
841 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
842 if (
SanOpts.has(SanitizerKind::AllocToken))
843 Fn->addFnAttr(llvm::Attribute::SanitizeAllocToken);
845 if (
SanOpts.has(SanitizerKind::SafeStack))
846 Fn->addFnAttr(llvm::Attribute::SafeStack);
847 if (
SanOpts.has(SanitizerKind::ShadowCallStack))
848 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
850 if (
SanOpts.has(SanitizerKind::Realtime))
854 Fn->addFnAttr(llvm::Attribute::SanitizeRealtime);
856 Fn->addFnAttr(llvm::Attribute::SanitizeRealtimeBlocking);
860 if (
SanOpts.hasOneOf(SanitizerKind::Fuzzer | SanitizerKind::FuzzerNoLink))
861 Fn->addFnAttr(llvm::Attribute::OptForFuzzing);
865 if (
SanOpts.has(SanitizerKind::Thread)) {
866 if (
const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
867 const IdentifierInfo *II = OMD->getSelector().getIdentifierInfoForSlot(0);
870 (OMD->getSelector().isUnarySelector() && II->
isStr(
".cxx_destruct"))) {
879 if (D &&
SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
887 if (D &&
SanOpts.has(SanitizerKind::Null))
893 bool AlwaysXRayAttr =
false;
894 if (
const auto *XRayAttr = D ? D->
getAttr<XRayInstrumentAttr>() :
nullptr) {
895 if (
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
897 CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
900 Fn->addFnAttr(
"function-instrument",
"xray-always");
901 AlwaysXRayAttr =
true;
903 if (XRayAttr->neverXRayInstrument())
904 Fn->addFnAttr(
"function-instrument",
"xray-never");
905 if (
const auto *LogArgs = D->
getAttr<XRayLogArgsAttr>())
907 Fn->addFnAttr(
"xray-log-args",
908 llvm::utostr(LogArgs->getArgumentCount()));
913 "xray-instruction-threshold",
914 llvm::itostr(
CGM.getCodeGenOpts().XRayInstructionThreshold));
918 if (
CGM.getCodeGenOpts().XRayIgnoreLoops)
919 Fn->addFnAttr(
"xray-ignore-loops");
921 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
923 Fn->addFnAttr(
"xray-skip-exit");
925 if (!
CGM.getCodeGenOpts().XRayInstrumentationBundle.has(
927 Fn->addFnAttr(
"xray-skip-entry");
929 auto FuncGroups =
CGM.getCodeGenOpts().XRayTotalFunctionGroups;
930 if (FuncGroups > 1) {
932 CurFn->getName().bytes_end());
933 auto Group = crc32(FuncName) % FuncGroups;
934 if (Group !=
CGM.getCodeGenOpts().XRaySelectedFunctionGroup &&
936 Fn->addFnAttr(
"function-instrument",
"xray-never");
940 if (
CGM.getCodeGenOpts().getProfileInstr() !=
941 llvm::driver::ProfileInstrKind::ProfileNone) {
942 switch (
CGM.isFunctionBlockedFromProfileInstr(Fn, Loc)) {
944 Fn->addFnAttr(llvm::Attribute::SkipProfile);
947 Fn->addFnAttr(llvm::Attribute::NoProfile);
954 unsigned Count, Offset;
956 if (
const auto *
Attr =
957 D ? D->
getAttr<PatchableFunctionEntryAttr>() :
nullptr) {
958 Count =
Attr->getCount();
959 Offset =
Attr->getOffset();
960 Section =
Attr->getSection();
962 Count =
CGM.getCodeGenOpts().PatchableFunctionEntryCount;
963 Offset =
CGM.getCodeGenOpts().PatchableFunctionEntryOffset;
966 Section =
CGM.getCodeGenOpts().PatchableFunctionEntrySection;
967 if (Count && Offset <= Count) {
968 Fn->addFnAttr(
"patchable-function-entry", std::to_string(Count - Offset));
970 Fn->addFnAttr(
"patchable-function-prefix", std::to_string(Offset));
971 if (!Section.empty())
972 Fn->addFnAttr(
"patchable-function-entry-section", Section);
978 if (
CGM.getCodeGenOpts().HotPatch &&
979 getContext().getTargetInfo().getTriple().isX86() &&
980 getContext().getTargetInfo().getTriple().getEnvironment() !=
981 llvm::Triple::CODE16)
982 Fn->addFnAttr(
"patchable-function",
"prologue-short-redirect");
985 if (
CGM.getCodeGenOpts().NoUseJumpTables)
986 Fn->addFnAttr(
"no-jump-tables",
"true");
989 if (
CGM.getCodeGenOpts().NoInlineLineTables)
990 Fn->addFnAttr(
"no-inline-line-tables");
993 if (
CGM.getCodeGenOpts().ProfileSampleAccurate)
994 Fn->addFnAttr(
"profile-sample-accurate");
996 if (!
CGM.getCodeGenOpts().SampleProfileFile.empty())
997 Fn->addFnAttr(
"use-sample-profile");
999 if (D && D->
hasAttr<CFICanonicalJumpTableAttr>())
1000 Fn->addFnAttr(
"cfi-canonical-jump-table");
1002 if (D && D->
hasAttr<NoProfileFunctionAttr>())
1003 Fn->addFnAttr(llvm::Attribute::NoProfile);
1005 if (D && D->
hasAttr<HybridPatchableAttr>())
1006 Fn->addFnAttr(llvm::Attribute::HybridPatchable);
1010 if (
auto *A = D->
getAttr<FunctionReturnThunksAttr>()) {
1011 switch (A->getThunkType()) {
1012 case FunctionReturnThunksAttr::Kind::Keep:
1014 case FunctionReturnThunksAttr::Kind::Extern:
1015 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1018 }
else if (
CGM.getCodeGenOpts().FunctionReturnThunks)
1019 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1024 getContext().getTargetInfo().getTriple().isSPIRV()) ||
1028 EmitKernelMetadata(FD, Fn);
1031 if (FD && FD->
hasAttr<ClspvLibclcBuiltinAttr>()) {
1032 Fn->setMetadata(
"clspv_libclc_builtin",
1038 if (FD &&
SanOpts.has(SanitizerKind::Function) &&
1041 llvm::LLVMContext &Ctx = Fn->getContext();
1042 llvm::MDBuilder MDB(Ctx);
1044 llvm::LLVMContext::MD_func_sanitize,
1045 MDB.createRTTIPointerPrologue(
1052 if (
SanOpts.has(SanitizerKind::NullabilityReturn)) {
1053 auto Nullability =
FnRetTy->getNullability();
1056 if (!(
SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) &&
1058 RetValNullabilityPrecondition =
1081 Fn->addFnAttr(llvm::Attribute::NoRecurse);
1084 llvm::fp::ExceptionBehavior FPExceptionBehavior =
1086 Builder.setDefaultConstrainedRounding(RM);
1087 Builder.setDefaultConstrainedExcept(FPExceptionBehavior);
1089 (!FD && (FPExceptionBehavior != llvm::fp::ebIgnore ||
1090 RM != llvm::RoundingMode::NearestTiesToEven))) {
1091 Builder.setIsFPConstrained(
true);
1092 Fn->addFnAttr(llvm::Attribute::StrictFP);
1098 CGM.getCodeGenOpts().StackAlignment))
1099 Fn->addFnAttr(
"stackrealign");
1103 Fn->removeFnAttr(
"zero-call-used-regs");
1106 llvm::StringMap<bool> FeatureMap;
1111 if (
T->getAArch64SMEAttributes() &
1118 std::optional<std::pair<unsigned, unsigned>> VScaleRange =
1122 CurFn->addFnAttr(llvm::Attribute::getWithVScaleRangeArgs(
1131 llvm::Value *Poison = llvm::PoisonValue::get(
Int32Ty);
1136 Builder.SetInsertPoint(EntryBB);
1140 if (requiresReturnValueCheck()) {
1151 DI->emitFunctionStart(GD, Loc, StartLoc,
1152 DI->getFunctionType(FD, RetTy, Args),
CurFn,
1157 if (
CGM.getCodeGenOpts().InstrumentFunctions)
1158 CurFn->addFnAttr(
"instrument-function-entry",
"__cyg_profile_func_enter");
1159 if (
CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
1160 CurFn->addFnAttr(
"instrument-function-entry-inlined",
1161 "__cyg_profile_func_enter");
1162 if (
CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
1163 CurFn->addFnAttr(
"instrument-function-entry-inlined",
1164 "__cyg_profile_func_enter_bare");
1171 if (
CGM.getCodeGenOpts().InstrumentForProfiling) {
1175 if (
CGM.getCodeGenOpts().CallFEntry)
1176 Fn->addFnAttr(
"fentry-call",
"true");
1178 Fn->addFnAttr(
"instrument-function-entry-inlined",
1181 if (
CGM.getCodeGenOpts().MNopMCount) {
1182 if (!
CGM.getCodeGenOpts().CallFEntry)
1183 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1184 <<
"-mnop-mcount" <<
"-mfentry";
1185 Fn->addFnAttr(
"mnop-mcount");
1188 if (
CGM.getCodeGenOpts().RecordMCount) {
1189 if (!
CGM.getCodeGenOpts().CallFEntry)
1190 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1191 <<
"-mrecord-mcount" <<
"-mfentry";
1192 Fn->addFnAttr(
"mrecord-mcount");
1197 if (
CGM.getCodeGenOpts().PackedStack) {
1198 if (
getContext().getTargetInfo().getTriple().getArch() !=
1199 llvm::Triple::systemz)
1200 CGM.getDiags().Report(diag::err_opt_not_valid_on_target)
1201 <<
"-mpacked-stack";
1202 Fn->addFnAttr(
"packed-stack");
1205 if (
CGM.getCodeGenOpts().WarnStackSize !=
UINT_MAX &&
1206 !
CGM.getDiags().isIgnored(diag::warn_fe_backend_frame_larger_than, Loc))
1207 Fn->addFnAttr(
"warn-stack-size",
1208 std::to_string(
CGM.getCodeGenOpts().WarnStackSize));
1220 auto AI =
CurFn->arg_begin();
1221 if (
CurFnInfo->getReturnInfo().isSRetAfterThis())
1224 &*AI, RetTy,
CurFnInfo->getReturnInfo().getIndirectAlign(),
false,
1226 if (!
CurFnInfo->getReturnInfo().getIndirectByVal()) {
1235 unsigned Idx =
CurFnInfo->getReturnInfo().getInAllocaFieldIndex();
1236 llvm::Function::arg_iterator EI =
CurFn->arg_end();
1268 if (FD->
hasAttr<HLSLShaderAttr>()) {
1269 CGM.getHLSLRuntime().emitEntryFunction(FD, Fn);
1275 if (
const CXXMethodDecl *MD = dyn_cast_if_present<CXXMethodDecl>(D);
1280 CGM.getCXXABI().EmitInstanceFunctionProlog(*
this);
1296 CXXThisValue = ThisFieldLValue.
getPointer(*
this);
1305 if (FD->hasCapturedVLAType()) {
1308 auto VAT = FD->getCapturedVLAType();
1309 VLASizeMap[VAT->getSizeExpr()] = ExprArg;
1316 CXXThisValue = CXXABIThisValue;
1320 if (CXXABIThisValue) {
1322 SkippedChecks.
set(SanitizerKind::ObjectSize,
true);
1329 SkippedChecks.
set(SanitizerKind::Null,
true);
1333 Loc, CXXABIThisValue, ThisTy, CXXABIThisAlignment, SkippedChecks);
1340 if (!FD || !FD->
hasAttr<NakedAttr>()) {
1341 for (
const VarDecl *VD : Args) {
1346 if (
const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
1347 Ty = PVD->getOriginalType();
1357 DI->EmitLocation(
Builder, StartLoc);
1361 if (
const auto *VecWidth =
CurFuncDecl->getAttr<MinVectorWidthAttr>())
1362 LargestVectorWidth = VecWidth->getVectorWidth();
1364 if (
CGM.shouldEmitConvergenceTokens())
1371 if (
const CompoundStmt *S = dyn_cast<CompoundStmt>(Body))
1383 llvm::BasicBlock *SkipCountBB =
nullptr;
1405 if (F->isInterposable())
return;
1407 for (llvm::BasicBlock &BB : *F)
1408 for (llvm::Instruction &I : BB)
1412 F->setDoesNotThrow();
1422 if (
CGM.getCXXABI().HasThisReturn(GD))
1424 else if (
CGM.getCXXABI().hasMostDerivedReturn(GD))
1425 ResTy =
CGM.getContext().VoidPtrTy;
1426 CGM.getCXXABI().buildThisParam(*
this, Args);
1432 bool PassedParams =
true;
1434 if (
auto Inherited = CD->getInheritedConstructor())
1440 Args.push_back(Param);
1441 if (!Param->hasAttr<PassObjectSizeAttr>())
1445 getContext(), Param->getDeclContext(), Param->getLocation(),
1453 CGM.getCXXABI().addImplicitStructorParams(*
this, ResTy, Args);
1460 assert(Fn &&
"generating code for null Function");
1467 CGM.getTargetCodeGenInfo().checkFunctionABI(
CGM, FD);
1473 std::string FDInlineName = (Fn->getName() +
".inline").str();
1474 llvm::Module *M = Fn->getParent();
1475 llvm::Function *Clone = M->getFunction(FDInlineName);
1477 Clone = llvm::Function::Create(Fn->getFunctionType(),
1478 llvm::GlobalValue::InternalLinkage,
1479 Fn->getAddressSpace(), FDInlineName, M);
1480 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
1482 Fn->setLinkage(llvm::GlobalValue::ExternalLinkage);
1492 if (LLVM_UNLIKELY(PD->isInlineBuiltinDeclaration())) {
1493 std::string FDInlineName = (Fn->getName() +
".inline").str();
1494 llvm::Module *M = Fn->getParent();
1495 if (llvm::Function *Clone = M->getFunction(FDInlineName)) {
1496 Clone->replaceAllUsesWith(Fn);
1497 Clone->eraseFromParent();
1505 if (FD->
hasAttr<NoDebugAttr>()) {
1508 Fn->setSubprogram(
nullptr);
1510 DebugInfo =
nullptr;
1513 llvm::scope_exit Cleanup([
this] {
1515 DI->completeFunction();
1522 BodyRange = Body->getSourceRange();
1525 CurEHLocation = BodyRange.getEnd();
1537 if (SpecDecl->hasBody(SpecDecl))
1538 Loc = SpecDecl->getLocation();
1545 ShouldEmitLifetimeMarkers =
true;
1549 if (ShouldEmitLifetimeMarkers)
1554 StartFunction(GD, ResTy, Fn, FnInfo, Args, Loc, BodyRange.getBegin());
1557 if (Body && isa_and_nonnull<CoroutineBodyStmt>(Body))
1565 CurFn->addFnAttr(llvm::Attribute::MustProgress);
1568 PGO->assignRegionCounters(GD,
CurFn);
1575 FD->
hasAttr<CUDAGlobalAttr>())
1576 CGM.getCUDARuntime().emitDeviceStub(*
this, Args);
1599 }
else if (DeviceKernelAttr::isOpenCLSpelling(
1600 FD->
getAttr<DeviceKernelAttr>()) &&
1603 for (
unsigned i = 0; i < Args.size(); ++i) {
1605 QualType ArgQualType = Args[i]->getType();
1607 CallArgs.
add(ArgRValue, ArgQualType);
1611 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FT);
1613 CallArgs, FT,
false);
1614 llvm::FunctionType *FTy =
CGM.getTypes().GetFunctionType(FnInfo);
1615 llvm::Constant *GDStubFunctionPointer =
1616 CGM.getRawFunctionPointer(GDStub, FTy);
1623 llvm_unreachable(
"no definition for emitted function");
1633 bool ShouldEmitUnreachable =
1634 CGM.getCodeGenOpts().StrictReturn ||
1636 if (
SanOpts.has(SanitizerKind::Return)) {
1637 auto CheckOrdinal = SanitizerKind::SO_Return;
1638 auto CheckHandler = SanitizerHandler::MissingReturn;
1640 llvm::Value *IsFalse =
Builder.getFalse();
1641 EmitCheck(std::make_pair(IsFalse, CheckOrdinal), CheckHandler,
1643 }
else if (ShouldEmitUnreachable) {
1644 if (
CGM.getCodeGenOpts().OptimizationLevel == 0)
1647 if (
SanOpts.has(SanitizerKind::Return) || ShouldEmitUnreachable) {
1649 Builder.ClearInsertionPoint();
1656 PGO->verifyCounterMap();
1660 if (!
CurFn->doesNotThrow())
1669 if (!S)
return false;
1686 IgnoreCaseStmts =
true;
1701 if (!S)
return false;
1721 if (!S)
return false;
1752 if (!AllowLabels &&
CGM.getCodeGenOpts().hasProfileClangInstr() &&
1753 CGM.getCodeGenOpts().MCDCCoverage)
1756 llvm::APSInt ResultInt;
1760 ResultBool = ResultInt.getBoolValue();
1768 llvm::APSInt &ResultInt,
1776 llvm::APSInt Int =
Result.Val.getInt();
1780 PGO->markStmtMaybeUsed(
Cond);
1810 llvm::BasicBlock *FalseBlock, uint64_t TrueCount ,
1813 bool InstrumentRegions =
CGM.getCodeGenOpts().hasProfileClangInstr();
1817 const Stmt *CntrStmt = (CntrIdx ? CntrIdx :
Cond);
1819 llvm::BasicBlock *ThenBlock =
nullptr;
1820 llvm::BasicBlock *ElseBlock =
nullptr;
1821 llvm::BasicBlock *NextBlock =
nullptr;
1826 llvm::BasicBlock *SkipIncrBlock =
1828 llvm::BasicBlock *SkipNextBlock =
nullptr;
1842 if (LOp == BO_LAnd) {
1843 SkipNextBlock = FalseBlock;
1844 ThenBlock = CounterIncrBlock;
1845 ElseBlock = (SkipIncrBlock ? SkipIncrBlock : SkipNextBlock);
1846 NextBlock = TrueBlock;
1861 else if (LOp == BO_LOr) {
1862 SkipNextBlock = TrueBlock;
1863 ThenBlock = (SkipIncrBlock ? SkipIncrBlock : SkipNextBlock);
1864 ElseBlock = CounterIncrBlock;
1865 NextBlock = FalseBlock;
1867 llvm_unreachable(
"Expected Opcode must be that of a Logical Operator");
1873 if (SkipIncrBlock) {
1897 const Expr *
Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock,
1899 const VarDecl *ConditionalDecl) {
1906 if (CondBOp->getOpcode() == BO_LAnd) {
1909 bool ConstantBool =
false;
1915 FalseBlock, TrueCount, LH);
1925 FalseBlock, TrueCount, LH, CondBOp);
1932 llvm::BasicBlock *LHSFalse =
1960 FalseBlock, TrueCount, LH);
1965 if (CondBOp->getOpcode() == BO_LOr) {
1968 bool ConstantBool =
false;
1974 FalseBlock, TrueCount, LH);
1984 FalseBlock, TrueCount, LH, CondBOp);
1989 llvm::BasicBlock *LHSTrue =
1997 uint64_t RHSCount = TrueCount - LHSCount;
2033 bool MCDCCondition =
CGM.getCodeGenOpts().hasProfileClangInstr() &&
2034 CGM.getCodeGenOpts().MCDCCoverage &&
2036 if (CondUOp->getOpcode() == UO_LNot && !MCDCCondition) {
2063 uint64_t LHSScaledTrueCount = 0;
2067 LHSScaledTrueCount = TrueCount * LHSRatio;
2076 LHSScaledTrueCount, LH, CondOp);
2084 TrueCount - LHSScaledTrueCount, LH, CondOp);
2119 MCDCBaseExpr = ConditionalOp;
2126 llvm::MDNode *Weights =
nullptr;
2127 llvm::MDNode *Unpredictable =
nullptr;
2132 auto *
Call = dyn_cast<CallExpr>(
Cond->IgnoreImpCasts());
2133 if (
Call &&
CGM.getCodeGenOpts().OptimizationLevel != 0) {
2134 auto *FD = dyn_cast_or_null<FunctionDecl>(
Call->getCalleeDecl());
2135 if (FD && FD->
getBuiltinID() == Builtin::BI__builtin_unpredictable) {
2137 Unpredictable = MDHelper.createUnpredictable();
2143 llvm::Value *NewCondV = emitCondLikelihoodViaExpectIntrinsic(CondV, LH);
2144 if (CondV != NewCondV)
2149 Weights = createProfileWeights(TrueCount, CurrentCount - TrueCount);
2152 llvm::Instruction *BrInst =
Builder.CreateCondBr(CondV, TrueBlock, FalseBlock,
2153 Weights, Unpredictable);
2157 case HLSLControlFlowHintAttr::Microsoft_branch:
2158 case HLSLControlFlowHintAttr::Microsoft_flatten: {
2159 llvm::MDBuilder MDHelper(
CGM.getLLVMContext());
2161 llvm::ConstantInt *BranchHintConstant =
2163 HLSLControlFlowHintAttr::Spelling::Microsoft_branch
2164 ? llvm::ConstantInt::get(
CGM.Int32Ty, 1)
2165 : llvm::ConstantInt::get(
CGM.Int32Ty, 2);
2168 {MDHelper.createString(
"hlsl.controlflow.hint"),
2169 MDHelper.createConstant(BranchHintConstant)});
2170 BrInst->setMetadata(
"hlsl.controlflow.hint",
2171 llvm::MDNode::get(
CGM.getLLVMContext(), Vals));
2175 case HLSLControlFlowHintAttr::SpellingNotCalculated:
2183 llvm::Value *Arg =
nullptr;
2184 if ((ICEArguments & (1 << Idx)) == 0) {
2189 std::optional<llvm::APSInt>
Result =
2191 assert(
Result &&
"Expected argument to be a constant");
2200 CGM.ErrorUnsupported(S,
Type);
2212 llvm::Value *sizeInChars) {
2216 llvm::Value *baseSizeInChars
2220 llvm::Value *end = Builder.CreateInBoundsGEP(begin.
getElementType(),
2222 sizeInChars,
"vla.end");
2224 llvm::BasicBlock *originBB = CGF.
Builder.GetInsertBlock();
2232 llvm::PHINode *cur = Builder.CreatePHI(begin.
getType(), 2,
"vla.cur");
2239 Builder.CreateMemCpy(
Address(cur, CGF.
Int8Ty, curAlign), src, baseSizeInChars,
2244 Builder.CreateInBoundsGEP(CGF.
Int8Ty, cur, baseSizeInChars,
"vla.next");
2247 llvm::Value *done = Builder.CreateICmpEQ(next, end,
"vla-init.isdone");
2248 Builder.CreateCondBr(done, contBB, loopBB);
2249 cur->addIncoming(next, loopBB);
2267 llvm::Value *SizeVal;
2274 dyn_cast_or_null<VariableArrayType>(
2277 SizeVal = VlaSize.NumElts;
2279 if (!eltSize.
isOne())
2280 SizeVal =
Builder.CreateNUWMul(SizeVal,
CGM.getSize(eltSize));
2286 SizeVal =
CGM.getSize(size);
2294 if (!
CGM.getTypes().isZeroInitializable(Ty)) {
2298 llvm::Constant *NullConstant =
CGM.EmitNullConstant(Ty);
2300 llvm::GlobalVariable *NullVariable =
2301 new llvm::GlobalVariable(
CGM.getModule(), NullConstant->getType(),
2303 llvm::GlobalVariable::PrivateLinkage,
2304 NullConstant, Twine());
2306 NullVariable->setAlignment(NullAlign.
getAsAlign());
2312 Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal,
false);
2319 Builder.CreateMemSet(DestPtr,
Builder.getInt8(0), SizeVal,
false);
2324 if (!IndirectBranch)
2330 IndirectBranch->addDestination(BB);
2331 return llvm::BlockAddress::get(
CurFn->getType(), BB);
2336 if (IndirectBranch)
return IndirectBranch->getParent();
2341 llvm::Value *DestVal = TmpBuilder.CreatePHI(
Int8PtrTy, 0,
2342 "indirect.goto.dest");
2345 IndirectBranch = TmpBuilder.CreateIndirectBr(DestVal);
2346 return IndirectBranch->getParent();
2358 llvm::Value *numVLAElements =
nullptr;
2370 baseType = elementType;
2371 return numVLAElements;
2385 llvm::ConstantInt *zero =
Builder.getInt32(0);
2386 gepIndices.push_back(zero);
2388 uint64_t countFromCLAs = 1;
2391 llvm::ArrayType *llvmArrayType =
2393 while (llvmArrayType) {
2396 llvmArrayType->getNumElements());
2398 gepIndices.push_back(zero);
2399 countFromCLAs *= llvmArrayType->getNumElements();
2403 dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
2406 "LLVM and Clang types are out-of-synch");
2425 gepIndices,
"array.begin"),
2431 llvm::Value *numElements
2432 = llvm::ConstantInt::get(
SizeTy, countFromCLAs);
2436 numElements =
Builder.CreateNUWMul(numVLAElements, numElements);
2443 assert(vla &&
"type was not a variable array type!");
2450 llvm::Value *numElements =
nullptr;
2454 elementType =
type->getElementType();
2455 llvm::Value *vlaSize = VLASizeMap[
type->getSizeExpr()];
2456 assert(vlaSize &&
"no size for VLA!");
2457 assert(vlaSize->getType() ==
SizeTy);
2460 numElements = vlaSize;
2464 numElements =
Builder.CreateNUWMul(numElements, vlaSize);
2466 }
while ((
type =
getContext().getAsVariableArrayType(elementType)));
2468 return { numElements, elementType };
2474 assert(vla &&
"type was not a variable array type!");
2480 llvm::Value *VlaSize = VLASizeMap[Vla->
getSizeExpr()];
2481 assert(VlaSize &&
"no size for VLA!");
2482 assert(VlaSize->getType() ==
SizeTy);
2487 assert(
type->isVariablyModifiedType() &&
2488 "Must pass variably modified type to EmitVLASizes!");
2495 assert(
type->isVariablyModifiedType());
2497 const Type *ty =
type.getTypePtr();
2500#define TYPE(Class, Base)
2501#define ABSTRACT_TYPE(Class, Base)
2502#define NON_CANONICAL_TYPE(Class, Base)
2503#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2504#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
2505#include "clang/AST/TypeNodes.inc"
2506 llvm_unreachable(
"unexpected dependent type!");
2512 case Type::ExtVector:
2513 case Type::ConstantMatrix:
2517 case Type::TemplateSpecialization:
2518 case Type::ObjCTypeParam:
2519 case Type::ObjCObject:
2520 case Type::ObjCInterface:
2521 case Type::ObjCObjectPointer:
2523 case Type::HLSLInlineSpirv:
2524 case Type::PredefinedSugar:
2525 llvm_unreachable(
"type class is never variably-modified!");
2527 case Type::Adjusted:
2539 case Type::BlockPointer:
2543 case Type::LValueReference:
2544 case Type::RValueReference:
2548 case Type::MemberPointer:
2552 case Type::ArrayParameter:
2553 case Type::ConstantArray:
2554 case Type::IncompleteArray:
2559 case Type::VariableArray: {
2568 llvm::Value *&entry = VLASizeMap[sizeExpr];
2576 if (
SanOpts.has(SanitizerKind::VLABound)) {
2577 auto CheckOrdinal = SanitizerKind::SO_VLABound;
2578 auto CheckHandler = SanitizerHandler::VLABoundNotPositive;
2580 llvm::Value *
Zero = llvm::Constant::getNullValue(size->getType());
2582 llvm::Value *CheckCondition =
2586 llvm::Constant *StaticArgs[] = {
2589 EmitCheck(std::make_pair(CheckCondition, CheckOrdinal),
2590 CheckHandler, StaticArgs, size);
2603 case Type::FunctionProto:
2604 case Type::FunctionNoProto:
2610 case Type::UnaryTransform:
2611 case Type::Attributed:
2612 case Type::BTFTagAttributed:
2613 case Type::HLSLAttributedResource:
2614 case Type::SubstTemplateTypeParm:
2615 case Type::MacroQualified:
2616 case Type::CountAttributed:
2622 case Type::Decltype:
2624 case Type::DeducedTemplateSpecialization:
2625 case Type::PackIndexing:
2629 case Type::TypeOfExpr:
2642 }
while (
type->isVariablyModifiedType());
2646 if (
getContext().getBuiltinVaListType()->isArrayType())
2657 assert(
Init.hasValue() &&
"Invalid DeclRefExpr initializer!");
2659 if (
CGM.getCodeGenOpts().hasReducedDebugInfo())
2675 llvm::Instruction *inst =
new llvm::BitCastInst(value, value->getType(),
"",
2679 protection.Inst = inst;
2684 if (!protection.Inst)
return;
2687 protection.Inst->eraseFromParent();
2693 llvm::Value *Alignment,
2694 llvm::Value *OffsetValue) {
2695 if (Alignment->getType() !=
IntPtrTy)
2698 if (OffsetValue && OffsetValue->getType() !=
IntPtrTy)
2701 llvm::Value *TheCheck =
nullptr;
2702 if (
SanOpts.has(SanitizerKind::Alignment)) {
2703 llvm::Value *PtrIntValue =
2707 bool IsOffsetZero =
false;
2708 if (
const auto *CI = dyn_cast<llvm::ConstantInt>(OffsetValue))
2709 IsOffsetZero = CI->isZero();
2712 PtrIntValue =
Builder.CreateSub(PtrIntValue, OffsetValue,
"offsetptr");
2715 llvm::Value *
Zero = llvm::ConstantInt::get(
IntPtrTy, 0);
2718 llvm::Value *MaskedPtr =
Builder.CreateAnd(PtrIntValue, Mask,
"maskedptr");
2719 TheCheck =
Builder.CreateICmpEQ(MaskedPtr,
Zero,
"maskcond");
2721 llvm::Instruction *Assumption =
Builder.CreateAlignmentAssumption(
2722 CGM.getDataLayout(), PtrValue, Alignment, OffsetValue);
2724 if (!
SanOpts.has(SanitizerKind::Alignment))
2727 OffsetValue, TheCheck, Assumption);
2733 llvm::Value *Alignment,
2734 llvm::Value *OffsetValue) {
2743 llvm::Value *AnnotatedVal,
2744 StringRef AnnotationStr,
2746 const AnnotateAttr *
Attr) {
2749 CGM.EmitAnnotationString(AnnotationStr),
2750 CGM.EmitAnnotationUnit(Location),
2751 CGM.EmitAnnotationLineNo(Location),
2754 Args.push_back(
CGM.EmitAnnotationArgs(
Attr));
2755 return Builder.CreateCall(AnnotationFn, Args);
2759 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
2762 {V->getType(), CGM.ConstGlobalsPtrTy}),
2768 assert(D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
2769 llvm::Value *
V =
Addr.emitRawPointer(*
this);
2770 llvm::Type *VTy =
V->getType();
2771 auto *PTy = dyn_cast<llvm::PointerType>(VTy);
2772 unsigned AS = PTy ? PTy->getAddressSpace() : 0;
2773 llvm::PointerType *IntrinTy =
2774 llvm::PointerType::get(
CGM.getLLVMContext(), AS);
2775 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation,
2776 {IntrinTy,
CGM.ConstGlobalsPtrTy});
2782 if (VTy != IntrinTy)
2795 assert(!CGF->IsSanitizerScope);
2796 CGF->IsSanitizerScope =
true;
2800 CGF->IsSanitizerScope =
false;
2804 const llvm::Twine &Name,
2805 llvm::BasicBlock::iterator InsertPt)
const {
2808 I->setNoSanitizeMetadata();
2812 llvm::Instruction *I,
const llvm::Twine &Name,
2813 llvm::BasicBlock::iterator InsertPt)
const {
2814 llvm::IRBuilderDefaultInserter::InsertHelper(I, Name, InsertPt);
2816 CGF->InsertHelper(I, Name, InsertPt);
2825 if (
CGM.getContext().getTargetInfo().getTriple().isX86()) {
2827 if (BuiltinID == X86::BI__builtin_ia32_cmpps ||
2828 BuiltinID == X86::BI__builtin_ia32_cmpss ||
2829 BuiltinID == X86::BI__builtin_ia32_cmppd ||
2830 BuiltinID == X86::BI__builtin_ia32_cmpsd) {
2832 llvm::StringMap<bool> TargetFetureMap;
2833 CGM.getContext().getFunctionFeatureMap(TargetFetureMap, FD);
2835 *(E->
getArg(2)->getIntegerConstantExpr(
CGM.getContext()));
2836 if (
Result.getSExtValue() > 7 && !TargetFetureMap.lookup(
"avx"))
2837 CGM.getDiags().Report(E->
getBeginLoc(), diag::err_builtin_needs_feature)
2858 bool IsAlwaysInline = TargetDecl->
hasAttr<AlwaysInlineAttr>();
2859 bool IsFlatten = FD && FD->
hasAttr<FlattenAttr>();
2865 std::string MissingFeature;
2866 llvm::StringMap<bool> CallerFeatureMap;
2867 CGM.getContext().getFunctionFeatureMap(CallerFeatureMap, FD);
2874 StringRef FeatureList(
CGM.getContext().BuiltinInfo.getRequiredFeatures(BuiltinID));
2876 FeatureList, CallerFeatureMap) && !IsHipStdPar) {
2877 CGM.getDiags().Report(Loc, diag::err_builtin_needs_feature)
2882 TargetDecl->
hasAttr<TargetAttr>()) {
2885 const TargetAttr *TD = TargetDecl->
getAttr<TargetAttr>();
2887 CGM.getContext().filterFunctionTargetAttrs(TD);
2890 llvm::StringMap<bool> CalleeFeatureMap;
2891 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
2894 if (F[0] ==
'+' && CalleeFeatureMap.lookup(F.substr(1)))
2895 ReqFeatures.push_back(StringRef(F).substr(1));
2898 for (
const auto &F : CalleeFeatureMap) {
2901 ReqFeatures.push_back(F.getKey());
2903 if (!llvm::all_of(ReqFeatures,
2905 if (!CallerFeatureMap.lookup(
Feature)) {
2906 MissingFeature =
Feature.str();
2913 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
2916 CGM.getDiags().Report(Loc, diag::err_flatten_function_needs_feature)
2921 llvm::StringMap<bool> CalleeFeatureMap;
2922 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
2924 for (
const auto &F : CalleeFeatureMap) {
2926 (!CallerFeatureMap.lookup(F.getKey()) ||
2927 !CallerFeatureMap.find(F.getKey())->getValue()) &&
2930 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
2933 CGM.getDiags().Report(Loc, diag::err_flatten_function_needs_feature)
2941 if (!
CGM.getCodeGenOpts().SanitizeStats)
2944 llvm::IRBuilder<> IRB(
Builder.GetInsertBlock(),
Builder.GetInsertPoint());
2945 IRB.SetCurrentDebugLocation(
Builder.getCurrentDebugLocation());
2946 CGM.getSanStats().create(IRB, SSK);
2958 Salt = Info.CFISalt;
2960 Bundles.emplace_back(
"kcfi",
CGM.CreateKCFITypeId(FP->
desugar(), Salt));
2964CodeGenFunction::FormAArch64ResolverCondition(
const FMVResolverOption &RO) {
2965 return RO.Features.empty() ?
nullptr : EmitAArch64CpuSupports(RO.Features);
2969CodeGenFunction::FormX86ResolverCondition(
const FMVResolverOption &RO) {
2972 if (RO.Architecture) {
2973 StringRef
Arch = *RO.Architecture;
2976 if (
Arch.starts_with(
"x86-64"))
2982 if (!RO.Features.empty()) {
2983 llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Features);
2991 llvm::Function *Resolver,
2993 llvm::Function *FuncToReturn,
2994 bool SupportsIFunc) {
2995 if (SupportsIFunc) {
2996 Builder.CreateRet(FuncToReturn);
3001 llvm::make_pointer_range(Resolver->args()));
3003 llvm::CallInst *Result = Builder.CreateCall(FuncToReturn, Args);
3004 Result->setTailCallKind(llvm::CallInst::TCK_MustTail);
3006 if (Resolver->getReturnType()->isVoidTy())
3007 Builder.CreateRetVoid();
3009 Builder.CreateRet(Result);
3015 llvm::Triple::ArchType ArchType =
3019 case llvm::Triple::x86:
3020 case llvm::Triple::x86_64:
3023 case llvm::Triple::aarch64:
3026 case llvm::Triple::riscv32:
3027 case llvm::Triple::riscv64:
3032 assert(
false &&
"Only implemented for x86, AArch64 and RISC-V targets");
3039 if (
getContext().getTargetInfo().getTriple().getOS() !=
3040 llvm::Triple::OSType::Linux) {
3041 CGM.getDiags().Report(diag::err_os_unsupport_riscv_fmv);
3046 Builder.SetInsertPoint(CurBlock);
3050 bool HasDefault =
false;
3051 unsigned DefaultIndex = 0;
3054 for (
unsigned Index = 0; Index < Options.size(); Index++) {
3056 if (Options[Index].Features.empty()) {
3058 DefaultIndex = Index;
3062 Builder.SetInsertPoint(CurBlock);
3088 for (StringRef Feat : Options[Index].Features) {
3089 std::vector<std::string> FeatStr =
3092 assert(FeatStr.size() == 1 &&
"Feature string not delimited");
3094 std::string &CurrFeat = FeatStr.front();
3095 if (CurrFeat[0] ==
'+')
3096 TargetAttrFeats.push_back(CurrFeat.substr(1));
3099 if (TargetAttrFeats.empty())
3102 for (std::string &Feat : TargetAttrFeats)
3103 CurrTargetAttrFeats.push_back(Feat);
3105 Builder.SetInsertPoint(CurBlock);
3108 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3111 Options[Index].
Function, SupportsIFunc);
3114 Builder.SetInsertPoint(CurBlock);
3115 Builder.CreateCondBr(FeatsCondition, RetBlock, ElseBlock);
3117 CurBlock = ElseBlock;
3122 Builder.SetInsertPoint(CurBlock);
3129 Builder.SetInsertPoint(CurBlock);
3130 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3131 TrapCall->setDoesNotReturn();
3132 TrapCall->setDoesNotThrow();
3134 Builder.ClearInsertionPoint();
3139 assert(!Options.empty() &&
"No multiversion resolver options found");
3140 assert(Options.back().Features.size() == 0 &&
"Default case must be last");
3142 assert(SupportsIFunc &&
3143 "Multiversion resolver requires target IFUNC support");
3144 bool AArch64CpuInitialized =
false;
3148 Builder.SetInsertPoint(CurBlock);
3149 llvm::Value *
Condition = FormAArch64ResolverCondition(RO);
3158 if (!AArch64CpuInitialized) {
3159 Builder.SetInsertPoint(CurBlock, CurBlock->begin());
3160 EmitAArch64CpuInit();
3161 AArch64CpuInitialized =
true;
3162 Builder.SetInsertPoint(CurBlock);
3166 if (RO.Function ==
nullptr)
3169 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3178 Builder.SetInsertPoint(CurBlock);
3179 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3180 TrapCall->setDoesNotReturn();
3181 TrapCall->setDoesNotThrow();
3183 Builder.ClearInsertionPoint();
3193 Builder.SetInsertPoint(CurBlock);
3197 Builder.SetInsertPoint(CurBlock);
3198 llvm::Value *
Condition = FormX86ResolverCondition(RO);
3202 assert(&RO == Options.end() - 1 &&
3203 "Default or Generic case must be last");
3209 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3218 Builder.SetInsertPoint(CurBlock);
3219 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3220 TrapCall->setDoesNotReturn();
3221 TrapCall->setDoesNotThrow();
3223 Builder.ClearInsertionPoint();
3235 llvm::Value *OffsetValue, llvm::Value *TheCheck,
3236 llvm::Instruction *Assumption) {
3237 assert(isa_and_nonnull<llvm::CallInst>(Assumption) &&
3239 llvm::Intrinsic::getOrInsertDeclaration(
3240 Builder.GetInsertBlock()->getParent()->getParent(),
3241 llvm::Intrinsic::assume) &&
3242 "Assumption should be a call to llvm.assume().");
3243 assert(&(
Builder.GetInsertBlock()->back()) == Assumption &&
3244 "Assumption should be the last instruction of the basic block, "
3245 "since the basic block is still being generated.");
3247 if (!
SanOpts.has(SanitizerKind::Alignment))
3257 Assumption->removeFromParent();
3260 auto CheckOrdinal = SanitizerKind::SO_Alignment;
3261 auto CheckHandler = SanitizerHandler::AlignmentAssumption;
3265 OffsetValue =
Builder.getInt1(
false);
3270 llvm::Value *DynamicData[] = {Ptr, Alignment, OffsetValue};
3271 EmitCheck({std::make_pair(TheCheck, CheckOrdinal)}, CheckHandler,
3272 StaticData, DynamicData);
3283 return DI->SourceLocToDebugLoc(Location);
3285 return llvm::DebugLoc();
3289CodeGenFunction::emitCondLikelihoodViaExpectIntrinsic(llvm::Value *
Cond,
3300 llvm::Type *CondTy =
Cond->getType();
3301 assert(CondTy->isIntegerTy(1) &&
"expecting condition to be a boolean");
3302 llvm::Function *FnExpect =
3304 llvm::Value *ExpectedValueOfCond =
3306 return Builder.CreateCall(FnExpect, {
Cond, ExpectedValueOfCond},
3307 Cond->getName() +
".expval");
3309 llvm_unreachable(
"Unknown Likelihood");
3313 unsigned NumElementsDst,
3314 const llvm::Twine &Name) {
3316 unsigned NumElementsSrc = SrcTy->getNumElements();
3317 if (NumElementsSrc == NumElementsDst)
3320 std::vector<int> ShuffleMask(NumElementsDst, -1);
3321 for (
unsigned MaskIdx = 0;
3322 MaskIdx < std::min<>(NumElementsDst, NumElementsSrc); ++MaskIdx)
3323 ShuffleMask[MaskIdx] = MaskIdx;
3325 return Builder.CreateShuffleVector(SrcVec, ShuffleMask, Name);
3338 Discriminator =
Builder.getSize(0);
3340 llvm::Value *Args[] = {Key, Discriminator};
3341 Bundles.emplace_back(
"ptrauth", Args);
3347 unsigned IntrinsicID) {
3354 if (!Discriminator) {
3359 auto OrigType =
Pointer->getType();
3377 llvm::Intrinsic::ptrauth_sign);
3383 auto StripIntrinsic = CGF.
CGM.
getIntrinsic(llvm::Intrinsic::ptrauth_strip);
3387 auto OrigType =
Pointer->getType();
3404 llvm::Intrinsic::ptrauth_auth);
3408 llvm::Instruction *KeyInstruction, llvm::Value *Backup) {
3410 DI->addInstToCurrentSourceAtom(KeyInstruction, Backup);
3414 llvm::Instruction *KeyInstruction, llvm::Value *Backup, uint64_t Atom) {
3416 DI->addInstToSpecificSourceAtom(KeyInstruction, Backup, Atom);
3420 llvm::Value *Backup) {
3423 DI->addInstToCurrentSourceAtom(KeyInstruction, Backup);
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....
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 * 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...
RawAddress CreateIRTemp(QualType T, const Twine &Name="tmp")
CreateIRTemp - Create a temporary IR object of the given type, with appropriate alignment.
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.
bool ShouldSkipSanitizerInstrumentation()
ShouldSkipSanitizerInstrumentation - Return true if the current function should not be instrumented w...
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.
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.
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)
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,...
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, 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.
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.
Diagnostic wrappers for TextAPI types for error reporting.
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::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.