38#include "llvm/ADT/ArrayRef.h"
39#include "llvm/ADT/ScopeExit.h"
40#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
41#include "llvm/IR/DataLayout.h"
42#include "llvm/IR/Dominators.h"
43#include "llvm/IR/FPEnv.h"
44#include "llvm/IR/Instruction.h"
45#include "llvm/IR/IntrinsicInst.h"
46#include "llvm/IR/Intrinsics.h"
47#include "llvm/IR/MDBuilder.h"
48#include "llvm/Support/CRC.h"
49#include "llvm/Support/xxhash.h"
50#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
51#include "llvm/Transforms/Utils/PromoteMemToReg.h"
55using namespace CodeGen;
65 if (CGOpts.DisableLifetimeMarkers)
69 if (CGOpts.SanitizeAddressUseAfterScope ||
75 return CGOpts.OptimizationLevel != 0;
78CodeGenFunction::CodeGenFunction(
CodeGenModule &cgm,
bool suppressNewContext)
80 Builder(cgm, cgm.getModule().getContext(),
llvm::ConstantFolder(),
82 SanOpts(CGM.getLangOpts().Sanitize), CurFPFeatures(CGM.getLangOpts()),
83 DebugInfo(CGM.getModuleDebugInfo()),
85 ShouldEmitLifetimeMarkers(
87 if (!suppressNewContext)
97 "missed to deactivate a cleanup");
113llvm::fp::ExceptionBehavior
121 llvm_unreachable(
"Unsupported FP Exception Behavior");
126 llvm::FastMathFlags FMF;
127 FMF.setAllowReassoc(FPFeatures.getAllowFPReassociate());
128 FMF.setNoNaNs(FPFeatures.getNoHonorNaNs());
129 FMF.setNoInfs(FPFeatures.getNoHonorInfs());
130 FMF.setNoSignedZeros(FPFeatures.getNoSignedZero());
131 FMF.setAllowReciprocal(FPFeatures.getAllowReciprocal());
132 FMF.setApproxFunc(FPFeatures.getAllowApproxFunc());
146 ConstructorHelper(FPFeatures);
149void CodeGenFunction::CGFPOptionsRAII::ConstructorHelper(
FPOptions FPFeatures) {
150 OldFPFeatures = CGF.CurFPFeatures;
151 CGF.CurFPFeatures = FPFeatures;
153 OldExcept = CGF.Builder.getDefaultConstrainedExcept();
154 OldRounding = CGF.Builder.getDefaultConstrainedRounding();
156 if (OldFPFeatures == FPFeatures)
159 FMFGuard.emplace(CGF.Builder);
162 CGF.Builder.setDefaultConstrainedRounding(NewRoundingBehavior);
163 auto NewExceptionBehavior =
165 CGF.Builder.setDefaultConstrainedExcept(NewExceptionBehavior);
167 CGF.SetFastMathFlags(FPFeatures);
169 assert((CGF.CurFuncDecl ==
nullptr || CGF.Builder.getIsFPConstrained() ||
170 isa<CXXConstructorDecl>(CGF.CurFuncDecl) ||
171 isa<CXXDestructorDecl>(CGF.CurFuncDecl) ||
172 (NewExceptionBehavior == llvm::fp::ebIgnore &&
173 NewRoundingBehavior == llvm::RoundingMode::NearestTiesToEven)) &&
174 "FPConstrained should be enabled on entire function");
176 auto mergeFnAttrValue = [&](StringRef Name,
bool Value) {
178 CGF.CurFn->getFnAttribute(Name).getValueAsBool();
179 auto NewValue = OldValue &
Value;
180 if (OldValue != NewValue)
181 CGF.CurFn->addFnAttr(Name, llvm::toStringRef(NewValue));
183 mergeFnAttrValue(
"no-infs-fp-math", FPFeatures.getNoHonorInfs());
184 mergeFnAttrValue(
"no-nans-fp-math", FPFeatures.getNoHonorNaNs());
185 mergeFnAttrValue(
"no-signed-zeros-fp-math", FPFeatures.getNoSignedZero());
188 FPFeatures.getAllowFPReassociate() && FPFeatures.getAllowReciprocal() &&
189 FPFeatures.getAllowApproxFunc() && 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,
250 llvm::Type *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:
295 case Type::ConstantArray:
296 case Type::IncompleteArray:
297 case Type::VariableArray:
299 case Type::ObjCObject:
300 case Type::ObjCInterface:
301 case Type::ArrayParameter:
306 type = cast<AtomicType>(
type)->getValueType();
309 llvm_unreachable(
"unknown type kind!");
316 llvm::BasicBlock *CurBB =
Builder.GetInsertBlock();
319 assert(!CurBB->getTerminator() &&
"Unexpected terminated block.");
329 return llvm::DebugLoc();
336 llvm::BranchInst *BI =
338 if (BI && BI->isUnconditional() &&
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!");
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);
434 CurFn->addFnAttr(
"instrument-function-exit",
"__cyg_profile_func_exit");
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(
479 Ptr->eraseFromParent();
483 if (PostAllocaInsertPt) {
484 llvm::Instruction *PostPtr = PostAllocaInsertPt;
485 PostAllocaInsertPt =
nullptr;
486 PostPtr->eraseFromParent();
491 if (IndirectBranch) {
492 llvm::PHINode *PN = cast<llvm::PHINode>(IndirectBranch->getAddress());
493 if (PN->getNumIncomingValues() == 0) {
494 PN->replaceAllUsesWith(llvm::PoisonValue::get(PN->getType()));
495 PN->eraseFromParent();
504 for (
const auto &FuncletAndParent : TerminateFunclets)
510 for (
const auto &R : DeferredReplacements) {
511 if (llvm::Value *Old = R.first) {
512 Old->replaceAllUsesWith(R.second);
513 cast<llvm::Instruction>(Old)->eraseFromParent();
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());
554 if (
getContext().getTargetInfo().getTriple().isX86())
555 CurFn->addFnAttr(
"min-legal-vector-width",
556 llvm::utostr(LargestVectorWidth));
566 if (RetAlloca && RetAlloca->use_empty()) {
567 RetAlloca->eraseFromParent();
620 llvm::raw_string_ostream Out(Mangled);
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>())
637 getContext().getTargetInfo().getTriple().isSPIRV())))
640 if (
const VecTypeHintAttr *A = FD->
getAttr<VecTypeHintAttr>()) {
641 QualType HintQTy = A->getTypeHint();
643 bool IsSignedInteger =
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) {
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) {
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())
697 return isa<ReturnStmt>(*LastStmt);
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())
741bool CodeGenFunction::hasInAllocaArg(
const CXXMethodDecl *MD) {
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;
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"
797 bool NoSanitizeCoverage =
false;
800 no_sanitize_mask |=
Attr->getMask();
802 if (
Attr->hasCoverage())
803 NoSanitizeCoverage =
true;
808 if (no_sanitize_mask & SanitizerKind::Address)
809 SanOpts.
set(SanitizerKind::KernelAddress,
false);
810 if (no_sanitize_mask & SanitizerKind::KernelAddress)
812 if (no_sanitize_mask & SanitizerKind::HWAddress)
813 SanOpts.
set(SanitizerKind::KernelHWAddress,
false);
814 if (no_sanitize_mask & SanitizerKind::KernelHWAddress)
818 Fn->addFnAttr(llvm::Attribute::NoSanitizeBounds);
821 Fn->addFnAttr(llvm::Attribute::NoSanitizeCoverage);
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);
837 SanitizerKind::KernelHWAddress))
838 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
840 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
842 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
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);
851 Fn->addFnAttr(llvm::Attribute::SafeStack);
852 if (
SanOpts.
has(SanitizerKind::ShadowCallStack))
853 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
859 Fn->addFnAttr(llvm::Attribute::SanitizeRealtime);
861 Fn->addFnAttr(llvm::Attribute::SanitizeRealtimeBlocking);
865 if (
SanOpts.
hasOneOf(SanitizerKind::Fuzzer | SanitizerKind::FuzzerNoLink))
866 Fn->addFnAttr(llvm::Attribute::OptForFuzzing);
871 if (
const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(
D)) {
872 const IdentifierInfo *II = OMD->getSelector().getIdentifierInfoForSlot(0);
875 (OMD->getSelector().isUnarySelector() && II->
isStr(
".cxx_destruct"))) {
884 if (
D &&
SanOpts.
has(SanitizerKind::CFIUnrelatedCast)) {
898 bool AlwaysXRayAttr =
false;
899 if (
const auto *XRayAttr =
D ?
D->
getAttr<XRayInstrumentAttr>() :
nullptr) {
905 Fn->addFnAttr(
"function-instrument",
"xray-always");
906 AlwaysXRayAttr =
true;
908 if (XRayAttr->neverXRayInstrument())
909 Fn->addFnAttr(
"function-instrument",
"xray-never");
910 if (
const auto *LogArgs =
D->
getAttr<XRayLogArgsAttr>())
912 Fn->addFnAttr(
"xray-log-args",
913 llvm::utostr(LogArgs->getArgumentCount()));
918 "xray-instruction-threshold",
924 Fn->addFnAttr(
"xray-ignore-loops");
928 Fn->addFnAttr(
"xray-skip-exit");
932 Fn->addFnAttr(
"xray-skip-entry");
935 if (FuncGroups > 1) {
937 CurFn->getName().bytes_end());
938 auto Group = crc32(FuncName) % FuncGroups;
941 Fn->addFnAttr(
"function-instrument",
"xray-never");
946 llvm::driver::ProfileInstrKind::ProfileNone) {
949 Fn->addFnAttr(llvm::Attribute::SkipProfile);
952 Fn->addFnAttr(llvm::Attribute::NoProfile);
959 unsigned Count, Offset;
961 if (
const auto *
Attr =
962 D ?
D->
getAttr<PatchableFunctionEntryAttr>() :
nullptr) {
963 Count =
Attr->getCount();
964 Offset =
Attr->getOffset();
965 Section =
Attr->getSection();
972 if (Count && Offset <= Count) {
973 Fn->addFnAttr(
"patchable-function-entry", std::to_string(Count - Offset));
975 Fn->addFnAttr(
"patchable-function-prefix", std::to_string(Offset));
976 if (!Section.empty())
977 Fn->addFnAttr(
"patchable-function-entry-section", Section);
984 getContext().getTargetInfo().getTriple().isX86() &&
985 getContext().getTargetInfo().getTriple().getEnvironment() !=
986 llvm::Triple::CODE16)
987 Fn->addFnAttr(
"patchable-function",
"prologue-short-redirect");
991 Fn->addFnAttr(
"no-jump-tables",
"true");
995 Fn->addFnAttr(
"no-inline-line-tables");
999 Fn->addFnAttr(
"profile-sample-accurate");
1002 Fn->addFnAttr(
"use-sample-profile");
1004 if (
D &&
D->
hasAttr<CFICanonicalJumpTableAttr>())
1005 Fn->addFnAttr(
"cfi-canonical-jump-table");
1007 if (
D &&
D->
hasAttr<NoProfileFunctionAttr>())
1008 Fn->addFnAttr(llvm::Attribute::NoProfile);
1010 if (
D &&
D->
hasAttr<HybridPatchableAttr>())
1011 Fn->addFnAttr(llvm::Attribute::HybridPatchable);
1015 if (
auto *A =
D->
getAttr<FunctionReturnThunksAttr>()) {
1016 switch (A->getThunkType()) {
1017 case FunctionReturnThunksAttr::Kind::Keep:
1019 case FunctionReturnThunksAttr::Kind::Extern:
1020 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1024 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1029 getContext().getTargetInfo().getTriple().isSPIRV()) ||
1033 EmitKernelMetadata(FD, Fn);
1036 if (FD && FD->
hasAttr<ClspvLibclcBuiltinAttr>()) {
1037 Fn->setMetadata(
"clspv_libclc_builtin",
1043 if (FD &&
SanOpts.
has(SanitizerKind::Function)) {
1045 llvm::LLVMContext &Ctx = Fn->getContext();
1046 llvm::MDBuilder MDB(Ctx);
1048 llvm::LLVMContext::MD_func_sanitize,
1049 MDB.createRTTIPointerPrologue(
1056 if (
SanOpts.
has(SanitizerKind::NullabilityReturn)) {
1060 if (!(
SanOpts.
has(SanitizerKind::ReturnsNonnullAttribute) &&
1062 RetValNullabilityPrecondition =
1085 Fn->addFnAttr(llvm::Attribute::NoRecurse);
1088 llvm::fp::ExceptionBehavior FPExceptionBehavior =
1090 Builder.setDefaultConstrainedRounding(RM);
1091 Builder.setDefaultConstrainedExcept(FPExceptionBehavior);
1093 (!FD && (FPExceptionBehavior != llvm::fp::ebIgnore ||
1094 RM != llvm::RoundingMode::NearestTiesToEven))) {
1095 Builder.setIsFPConstrained(
true);
1096 Fn->addFnAttr(llvm::Attribute::StrictFP);
1103 Fn->addFnAttr(
"stackrealign");
1107 Fn->removeFnAttr(
"zero-call-used-regs");
1110 llvm::StringMap<bool> FeatureMap;
1122 std::optional<std::pair<unsigned, unsigned>> VScaleRange =
1126 CurFn->addFnAttr(llvm::Attribute::getWithVScaleRangeArgs(
1135 llvm::Value *Poison = llvm::PoisonValue::get(
Int32Ty);
1140 Builder.SetInsertPoint(EntryBB);
1144 if (requiresReturnValueCheck()) {
1155 DI->emitFunctionStart(GD,
Loc, StartLoc,
1156 DI->getFunctionType(FD, RetTy, Args),
CurFn,
1162 CurFn->addFnAttr(
"instrument-function-entry",
"__cyg_profile_func_enter");
1164 CurFn->addFnAttr(
"instrument-function-entry-inlined",
1165 "__cyg_profile_func_enter");
1167 CurFn->addFnAttr(
"instrument-function-entry-inlined",
1168 "__cyg_profile_func_enter_bare");
1180 Fn->addFnAttr(
"fentry-call",
"true");
1182 Fn->addFnAttr(
"instrument-function-entry-inlined",
1188 <<
"-mnop-mcount" <<
"-mfentry";
1189 Fn->addFnAttr(
"mnop-mcount");
1195 <<
"-mrecord-mcount" <<
"-mfentry";
1196 Fn->addFnAttr(
"mrecord-mcount");
1202 if (
getContext().getTargetInfo().getTriple().getArch() !=
1203 llvm::Triple::systemz)
1205 <<
"-mpacked-stack";
1206 Fn->addFnAttr(
"packed-stack");
1211 Fn->addFnAttr(
"warn-stack-size",
1224 auto AI =
CurFn->arg_begin();
1240 llvm::Function::arg_iterator EI =
CurFn->arg_end();
1245 cast<llvm::GetElementPtrInst>(
Addr)->getResultElementType();
1272 if (FD->
hasAttr<HLSLShaderAttr>()) {
1279 if (
const CXXMethodDecl *MD = dyn_cast_if_present<CXXMethodDecl>(
D);
1300 CXXThisValue = ThisFieldLValue.
getPointer(*
this);
1309 if (FD->hasCapturedVLAType()) {
1312 auto VAT = FD->getCapturedVLAType();
1313 VLASizeMap[VAT->getSizeExpr()] = ExprArg;
1320 CXXThisValue = CXXABIThisValue;
1324 if (CXXABIThisValue) {
1326 SkippedChecks.
set(SanitizerKind::ObjectSize,
true);
1333 SkippedChecks.
set(SanitizerKind::Null,
true);
1337 Loc, CXXABIThisValue, ThisTy, CXXABIThisAlignment, SkippedChecks);
1344 if (!FD || !FD->
hasAttr<NakedAttr>()) {
1345 for (
const VarDecl *VD : Args) {
1350 if (
const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
1351 Ty = PVD->getOriginalType();
1361 DI->EmitLocation(
Builder, StartLoc);
1366 LargestVectorWidth = VecWidth->getVectorWidth();
1375 if (
const CompoundStmt *S = dyn_cast<CompoundStmt>(Body))
1387 llvm::BasicBlock *SkipCountBB =
nullptr;
1412 if (F->isInterposable())
return;
1414 for (llvm::BasicBlock &BB : *F)
1415 for (llvm::Instruction &I : BB)
1419 F->setDoesNotThrow();
1439 bool PassedParams =
true;
1441 if (
auto Inherited = CD->getInheritedConstructor())
1447 Args.push_back(Param);
1448 if (!Param->hasAttr<PassObjectSizeAttr>())
1452 getContext(), Param->getDeclContext(), Param->getLocation(),
1459 if (MD && (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)))
1467 assert(Fn &&
"generating code for null Function");
1480 std::string FDInlineName = (Fn->getName() +
".inline").str();
1481 llvm::Module *M = Fn->getParent();
1482 llvm::Function *Clone = M->getFunction(FDInlineName);
1484 Clone = llvm::Function::Create(Fn->getFunctionType(),
1485 llvm::GlobalValue::InternalLinkage,
1486 Fn->getAddressSpace(), FDInlineName, M);
1487 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
1489 Fn->setLinkage(llvm::GlobalValue::ExternalLinkage);
1499 if (LLVM_UNLIKELY(PD->isInlineBuiltinDeclaration())) {
1500 std::string FDInlineName = (Fn->getName() +
".inline").str();
1501 llvm::Module *M = Fn->getParent();
1502 if (llvm::Function *Clone = M->getFunction(FDInlineName)) {
1503 Clone->replaceAllUsesWith(Fn);
1504 Clone->eraseFromParent();
1512 if (FD->
hasAttr<NoDebugAttr>()) {
1515 Fn->setSubprogram(
nullptr);
1517 DebugInfo =
nullptr;
1520 auto Cleanup = llvm::make_scope_exit([
this] {
1522 DI->completeFunction();
1529 BodyRange = Body->getSourceRange();
1532 CurEHLocation = BodyRange.getEnd();
1544 if (SpecDecl->hasBody(SpecDecl))
1545 Loc = SpecDecl->getLocation();
1551 if (isa<CoroutineBodyStmt>(Body))
1552 ShouldEmitLifetimeMarkers =
true;
1556 if (ShouldEmitLifetimeMarkers)
1564 if (Body && isa_and_nonnull<CoroutineBodyStmt>(Body))
1572 CurFn->addFnAttr(llvm::Attribute::MustProgress);
1575 PGO->assignRegionCounters(GD,
CurFn);
1576 if (isa<CXXDestructorDecl>(FD))
1578 else if (isa<CXXConstructorDecl>(FD))
1582 FD->
hasAttr<CUDAGlobalAttr>())
1584 else if (isa<CXXMethodDecl>(FD) &&
1585 cast<CXXMethodDecl>(FD)->isLambdaStaticInvoker()) {
1589 }
else if (isa<CXXMethodDecl>(FD) &&
1592 cast<CXXMethodDecl>(FD)->getParent()->getLambdaStaticInvoker() &&
1593 hasInAllocaArg(cast<CXXMethodDecl>(FD))) {
1600 }
else if (FD->
isDefaulted() && isa<CXXMethodDecl>(FD) &&
1601 (cast<CXXMethodDecl>(FD)->isCopyAssignmentOperator() ||
1602 cast<CXXMethodDecl>(FD)->isMoveAssignmentOperator())) {
1606 }
else if (DeviceKernelAttr::isOpenCLSpelling(
1607 FD->
getAttr<DeviceKernelAttr>()) &&
1610 for (
unsigned i = 0; i < Args.size(); ++i) {
1612 QualType ArgQualType = Args[i]->getType();
1614 CallArgs.
add(ArgRValue, ArgQualType);
1620 CallArgs, FT,
false);
1622 llvm::Constant *GDStubFunctionPointer =
1630 llvm_unreachable(
"no definition for emitted function");
1640 bool ShouldEmitUnreachable =
1644 auto CheckOrdinal = SanitizerKind::SO_Return;
1645 auto CheckHandler = SanitizerHandler::MissingReturn;
1647 llvm::Value *IsFalse =
Builder.getFalse();
1648 EmitCheck(std::make_pair(IsFalse, CheckOrdinal), CheckHandler,
1650 }
else if (ShouldEmitUnreachable) {
1654 if (
SanOpts.
has(SanitizerKind::Return) || ShouldEmitUnreachable) {
1656 Builder.ClearInsertionPoint();
1663 PGO->verifyCounterMap();
1667 if (!
CurFn->doesNotThrow())
1676 if (!S)
return false;
1683 if (isa<LabelStmt>(S))
1688 if (isa<SwitchCase>(S) && !IgnoreCaseStmts)
1692 if (isa<SwitchStmt>(S))
1693 IgnoreCaseStmts =
true;
1696 for (
const Stmt *SubStmt : S->children())
1708 if (!S)
return false;
1712 if (isa<SwitchStmt>(S) || isa<WhileStmt>(S) || isa<DoStmt>(S) ||
1716 if (isa<BreakStmt>(S))
1720 for (
const Stmt *SubStmt : S->children())
1728 if (!S)
return false;
1734 if (isa<IfStmt>(S) || isa<SwitchStmt>(S) || isa<WhileStmt>(S) ||
1735 isa<DoStmt>(S) || isa<ForStmt>(S) || isa<CompoundStmt>(S) ||
1736 isa<CXXForRangeStmt>(S) || isa<CXXTryStmt>(S) ||
1737 isa<ObjCForCollectionStmt>(S) || isa<ObjCAtTryStmt>(S))
1740 if (isa<DeclStmt>(S))
1743 for (
const Stmt *SubStmt : S->children())
1763 llvm::APSInt ResultInt;
1767 ResultBool = ResultInt.getBoolValue();
1775 llvm::APSInt &ResultInt,
1783 llvm::APSInt Int =
Result.Val.getInt();
1787 PGO->markStmtMaybeUsed(Cond);
1794 while (
const UnaryOperator *Op = dyn_cast<UnaryOperator>(
C->IgnoreParens())) {
1795 if (Op->getOpcode() != UO_LNot)
1797 C = Op->getSubExpr();
1799 return C->IgnoreParens();
1815 llvm::BasicBlock *FalseBlock, uint64_t TrueCount ,
1822 const Stmt *CntrStmt = (CntrIdx ? CntrIdx : Cond);
1824 llvm::BasicBlock *ThenBlock =
nullptr;
1825 llvm::BasicBlock *ElseBlock =
nullptr;
1826 llvm::BasicBlock *NextBlock =
nullptr;
1843 if (LOp == BO_LAnd) {
1844 ThenBlock = CounterIncrBlock;
1845 ElseBlock = FalseBlock;
1846 NextBlock = TrueBlock;
1861 else if (LOp == BO_LOr) {
1862 ThenBlock = TrueBlock;
1863 ElseBlock = CounterIncrBlock;
1864 NextBlock = FalseBlock;
1866 llvm_unreachable(
"Expected Opcode must be that of a Logical Operator");
1890 const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock,
1892 const VarDecl *ConditionalDecl) {
1895 if (
const BinaryOperator *CondBOp = dyn_cast<BinaryOperator>(Cond)) {
1897 if (CondBOp->getOpcode() == BO_LAnd) {
1902 bool ConstantBool =
false;
1908 FalseBlock, TrueCount, LH);
1919 FalseBlock, TrueCount, LH, CondBOp);
1948 FalseBlock, TrueCount, LH);
1954 if (CondBOp->getOpcode() == BO_LOr) {
1959 bool ConstantBool =
false;
1965 FalseBlock, TrueCount, LH);
1976 FalseBlock, TrueCount, LH, CondBOp);
1988 uint64_t RHSCount = TrueCount - LHSCount;
2015 if (
const UnaryOperator *CondUOp = dyn_cast<UnaryOperator>(Cond)) {
2023 if (CondUOp->getOpcode() == UO_LNot && !MCDCCondition) {
2050 uint64_t LHSScaledTrueCount = 0;
2054 LHSScaledTrueCount = TrueCount * LHSRatio;
2063 LHSScaledTrueCount, LH, CondOp);
2070 TrueCount - LHSScaledTrueCount, LH, CondOp);
2076 if (
const CXXThrowExpr *Throw = dyn_cast<CXXThrowExpr>(Cond)) {
2098 const Expr *MCDCBaseExpr = Cond;
2105 MCDCBaseExpr = ConditionalOp;
2110 llvm::MDNode *Weights =
nullptr;
2111 llvm::MDNode *Unpredictable =
nullptr;
2118 auto *FD = dyn_cast_or_null<FunctionDecl>(
Call->getCalleeDecl());
2119 if (FD && FD->
getBuiltinID() == Builtin::BI__builtin_unpredictable) {
2121 Unpredictable = MDHelper.createUnpredictable();
2127 llvm::Value *NewCondV = emitCondLikelihoodViaExpectIntrinsic(CondV, LH);
2128 if (CondV != NewCondV)
2133 Weights = createProfileWeights(TrueCount, CurrentCount - TrueCount);
2136 llvm::Instruction *BrInst =
Builder.CreateCondBr(CondV, TrueBlock, FalseBlock,
2137 Weights, Unpredictable);
2141 case HLSLControlFlowHintAttr::Microsoft_branch:
2142 case HLSLControlFlowHintAttr::Microsoft_flatten: {
2145 llvm::ConstantInt *BranchHintConstant =
2147 HLSLControlFlowHintAttr::Spelling::Microsoft_branch
2152 {MDHelper.createString(
"hlsl.controlflow.hint"),
2153 MDHelper.createConstant(BranchHintConstant)});
2154 BrInst->setMetadata(
"hlsl.controlflow.hint",
2159 case HLSLControlFlowHintAttr::SpellingNotCalculated:
2179 llvm::Value *sizeInChars) {
2183 llvm::Value *baseSizeInChars
2189 sizeInChars,
"vla.end");
2191 llvm::BasicBlock *originBB = CGF.
Builder.GetInsertBlock();
2199 llvm::PHINode *cur =
Builder.CreatePHI(begin.
getType(), 2,
"vla.cur");
2214 llvm::Value *done =
Builder.CreateICmpEQ(next, end,
"vla-init.isdone");
2215 Builder.CreateCondBr(done, contBB, loopBB);
2216 cur->addIncoming(next, loopBB);
2234 llvm::Value *SizeVal;
2241 dyn_cast_or_null<VariableArrayType>(
2244 SizeVal = VlaSize.NumElts;
2246 if (!eltSize.
isOne())
2267 llvm::GlobalVariable *NullVariable =
2268 new llvm::GlobalVariable(
CGM.
getModule(), NullConstant->getType(),
2270 llvm::GlobalVariable::PrivateLinkage,
2271 NullConstant, Twine());
2273 NullVariable->setAlignment(NullAlign.
getAsAlign());
2291 if (!IndirectBranch)
2297 IndirectBranch->addDestination(BB);
2298 return llvm::BlockAddress::get(
CurFn->getType(), BB);
2303 if (IndirectBranch)
return IndirectBranch->getParent();
2308 llvm::Value *DestVal = TmpBuilder.CreatePHI(
Int8PtrTy, 0,
2309 "indirect.goto.dest");
2312 IndirectBranch = TmpBuilder.CreateIndirectBr(DestVal);
2313 return IndirectBranch->getParent();
2325 llvm::Value *numVLAElements =
nullptr;
2326 if (isa<VariableArrayType>(
arrayType)) {
2337 baseType = elementType;
2338 return numVLAElements;
2340 }
while (isa<VariableArrayType>(
arrayType));
2352 llvm::ConstantInt *zero =
Builder.getInt32(0);
2353 gepIndices.push_back(zero);
2355 uint64_t countFromCLAs = 1;
2358 llvm::ArrayType *llvmArrayType =
2360 while (llvmArrayType) {
2361 assert(isa<ConstantArrayType>(
arrayType));
2362 assert(cast<ConstantArrayType>(
arrayType)->getZExtSize() ==
2363 llvmArrayType->getNumElements());
2365 gepIndices.push_back(zero);
2366 countFromCLAs *= llvmArrayType->getNumElements();
2370 dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
2373 "LLVM and Clang types are out-of-synch");
2381 countFromCLAs *= cast<ConstantArrayType>(
arrayType)->getZExtSize();
2392 gepIndices,
"array.begin"),
2398 llvm::Value *numElements
2399 = llvm::ConstantInt::get(
SizeTy, countFromCLAs);
2403 numElements =
Builder.CreateNUWMul(numVLAElements, numElements);
2410 assert(vla &&
"type was not a variable array type!");
2417 llvm::Value *numElements =
nullptr;
2421 elementType =
type->getElementType();
2422 llvm::Value *vlaSize = VLASizeMap[
type->getSizeExpr()];
2423 assert(vlaSize &&
"no size for VLA!");
2424 assert(vlaSize->getType() ==
SizeTy);
2427 numElements = vlaSize;
2431 numElements =
Builder.CreateNUWMul(numElements, vlaSize);
2433 }
while ((
type =
getContext().getAsVariableArrayType(elementType)));
2435 return { numElements, elementType };
2441 assert(vla &&
"type was not a variable array type!");
2447 llvm::Value *VlaSize = VLASizeMap[Vla->
getSizeExpr()];
2448 assert(VlaSize &&
"no size for VLA!");
2449 assert(VlaSize->getType() ==
SizeTy);
2454 assert(
type->isVariablyModifiedType() &&
2455 "Must pass variably modified type to EmitVLASizes!");
2462 assert(
type->isVariablyModifiedType());
2464 const Type *ty =
type.getTypePtr();
2467#define TYPE(Class, Base)
2468#define ABSTRACT_TYPE(Class, Base)
2469#define NON_CANONICAL_TYPE(Class, Base)
2470#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2471#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
2472#include "clang/AST/TypeNodes.inc"
2473 llvm_unreachable(
"unexpected dependent type!");
2479 case Type::ExtVector:
2480 case Type::ConstantMatrix:
2484 case Type::TemplateSpecialization:
2485 case Type::ObjCTypeParam:
2486 case Type::ObjCObject:
2487 case Type::ObjCInterface:
2488 case Type::ObjCObjectPointer:
2490 case Type::HLSLInlineSpirv:
2491 case Type::PredefinedSugar:
2492 llvm_unreachable(
"type class is never variably-modified!");
2494 case Type::Adjusted:
2495 type = cast<AdjustedType>(ty)->getAdjustedType();
2499 type = cast<DecayedType>(ty)->getPointeeType();
2503 type = cast<PointerType>(ty)->getPointeeType();
2506 case Type::BlockPointer:
2507 type = cast<BlockPointerType>(ty)->getPointeeType();
2510 case Type::LValueReference:
2511 case Type::RValueReference:
2512 type = cast<ReferenceType>(ty)->getPointeeType();
2515 case Type::MemberPointer:
2516 type = cast<MemberPointerType>(ty)->getPointeeType();
2519 case Type::ArrayParameter:
2520 case Type::ConstantArray:
2521 case Type::IncompleteArray:
2523 type = cast<ArrayType>(ty)->getElementType();
2526 case Type::VariableArray: {
2535 llvm::Value *&entry = VLASizeMap[sizeExpr];
2544 auto CheckOrdinal = SanitizerKind::SO_VLABound;
2545 auto CheckHandler = SanitizerHandler::VLABoundNotPositive;
2547 llvm::Value *
Zero = llvm::Constant::getNullValue(size->getType());
2549 llvm::Value *CheckCondition =
2553 llvm::Constant *StaticArgs[] = {
2556 EmitCheck(std::make_pair(CheckCondition, CheckOrdinal),
2557 CheckHandler, StaticArgs, size);
2570 case Type::FunctionProto:
2571 case Type::FunctionNoProto:
2572 type = cast<FunctionType>(ty)->getReturnType();
2577 case Type::UnaryTransform:
2578 case Type::Attributed:
2579 case Type::BTFTagAttributed:
2580 case Type::HLSLAttributedResource:
2581 case Type::SubstTemplateTypeParm:
2582 case Type::MacroQualified:
2583 case Type::CountAttributed:
2589 case Type::Decltype:
2591 case Type::DeducedTemplateSpecialization:
2592 case Type::PackIndexing:
2596 case Type::TypeOfExpr:
2602 type = cast<AtomicType>(ty)->getValueType();
2606 type = cast<PipeType>(ty)->getElementType();
2609 }
while (
type->isVariablyModifiedType());
2613 if (
getContext().getBuiltinVaListType()->isArrayType())
2624 assert(
Init.hasValue() &&
"Invalid DeclRefExpr initializer!");
2627 Dbg->EmitGlobalVariable(
E->getDecl(),
Init);
2642 llvm::Instruction *inst =
new llvm::BitCastInst(value, value->getType(),
"",
2646 protection.Inst = inst;
2651 if (!protection.Inst)
return;
2654 protection.Inst->eraseFromParent();
2660 llvm::Value *Alignment,
2661 llvm::Value *OffsetValue) {
2662 if (Alignment->getType() !=
IntPtrTy)
2665 if (OffsetValue && OffsetValue->getType() !=
IntPtrTy)
2668 llvm::Value *TheCheck =
nullptr;
2670 llvm::Value *PtrIntValue =
2674 bool IsOffsetZero =
false;
2675 if (
const auto *CI = dyn_cast<llvm::ConstantInt>(OffsetValue))
2676 IsOffsetZero = CI->isZero();
2679 PtrIntValue =
Builder.CreateSub(PtrIntValue, OffsetValue,
"offsetptr");
2682 llvm::Value *
Zero = llvm::ConstantInt::get(
IntPtrTy, 0);
2685 llvm::Value *MaskedPtr =
Builder.CreateAnd(PtrIntValue, Mask,
"maskedptr");
2686 TheCheck =
Builder.CreateICmpEQ(MaskedPtr,
Zero,
"maskcond");
2688 llvm::Instruction *Assumption =
Builder.CreateAlignmentAssumption(
2694 OffsetValue, TheCheck, Assumption);
2700 llvm::Value *Alignment,
2701 llvm::Value *OffsetValue) {
2710 llvm::Value *AnnotatedVal,
2711 StringRef AnnotationStr,
2713 const AnnotateAttr *
Attr) {
2722 return Builder.CreateCall(AnnotationFn, Args);
2726 assert(
D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
2729 {V->getType(), CGM.ConstGlobalsPtrTy}),
2735 assert(
D->
hasAttr<AnnotateAttr>() &&
"no annotate attribute");
2736 llvm::Value *
V =
Addr.emitRawPointer(*
this);
2737 llvm::Type *VTy =
V->getType();
2738 auto *PTy = dyn_cast<llvm::PointerType>(VTy);
2739 unsigned AS = PTy ? PTy->getAddressSpace() : 0;
2740 llvm::PointerType *IntrinTy =
2749 if (VTy != IntrinTy)
2767 CGF->IsSanitizerScope =
false;
2771 const llvm::Twine &Name,
2772 llvm::BasicBlock::iterator InsertPt)
const {
2775 I->setNoSanitizeMetadata();
2779 llvm::Instruction *I,
const llvm::Twine &Name,
2780 llvm::BasicBlock::iterator InsertPt)
const {
2781 llvm::IRBuilderDefaultInserter::InsertHelper(I, Name, InsertPt);
2783 CGF->InsertHelper(I, Name, InsertPt);
2794 if (BuiltinID == X86::BI__builtin_ia32_cmpps ||
2795 BuiltinID == X86::BI__builtin_ia32_cmpss ||
2796 BuiltinID == X86::BI__builtin_ia32_cmppd ||
2797 BuiltinID == X86::BI__builtin_ia32_cmpsd) {
2799 llvm::StringMap<bool> TargetFetureMap;
2803 if (
Result.getSExtValue() > 7 && !TargetFetureMap.lookup(
"avx"))
2825 bool IsAlwaysInline = TargetDecl->
hasAttr<AlwaysInlineAttr>();
2826 bool IsFlatten = FD && FD->
hasAttr<FlattenAttr>();
2832 std::string MissingFeature;
2833 llvm::StringMap<bool> CallerFeatureMap;
2843 FeatureList, CallerFeatureMap) && !IsHipStdPar) {
2849 TargetDecl->
hasAttr<TargetAttr>()) {
2852 const TargetAttr *TD = TargetDecl->
getAttr<TargetAttr>();
2857 llvm::StringMap<bool> CalleeFeatureMap;
2861 if (F[0] ==
'+' && CalleeFeatureMap.lookup(F.substr(1)))
2862 ReqFeatures.push_back(StringRef(F).substr(1));
2865 for (
const auto &F : CalleeFeatureMap) {
2868 ReqFeatures.push_back(F.getKey());
2870 if (!llvm::all_of(ReqFeatures,
2872 if (!CallerFeatureMap.lookup(
Feature)) {
2873 MissingFeature = Feature.str();
2888 llvm::StringMap<bool> CalleeFeatureMap;
2891 for (
const auto &F : CalleeFeatureMap) {
2893 (!CallerFeatureMap.lookup(F.getKey()) ||
2894 !CallerFeatureMap.find(F.getKey())->getValue()) &&
2911 llvm::IRBuilder<> IRB(
Builder.GetInsertBlock(),
Builder.GetInsertPoint());
2912 IRB.SetCurrentDebugLocation(
Builder.getCurrentDebugLocation());
2925 Salt = Info.CFISalt;
2931CodeGenFunction::FormAArch64ResolverCondition(
const FMVResolverOption &RO) {
2932 return RO.Features.empty() ? nullptr : EmitAArch64CpuSupports(RO.Features);
2936CodeGenFunction::FormX86ResolverCondition(
const FMVResolverOption &RO) {
2939 if (RO.Architecture) {
2940 StringRef
Arch = *RO.Architecture;
2943 if (
Arch.starts_with(
"x86-64"))
2949 if (!RO.Features.empty()) {
2950 llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Features);
2958 llvm::Function *Resolver,
2960 llvm::Function *FuncToReturn,
2961 bool SupportsIFunc) {
2962 if (SupportsIFunc) {
2963 Builder.CreateRet(FuncToReturn);
2968 llvm::make_pointer_range(Resolver->args()));
2970 llvm::CallInst *
Result =
Builder.CreateCall(FuncToReturn, Args);
2971 Result->setTailCallKind(llvm::CallInst::TCK_MustTail);
2973 if (Resolver->getReturnType()->isVoidTy())
2982 llvm::Triple::ArchType ArchType =
2986 case llvm::Triple::x86:
2987 case llvm::Triple::x86_64:
2990 case llvm::Triple::aarch64:
2993 case llvm::Triple::riscv32:
2994 case llvm::Triple::riscv64:
2999 assert(
false &&
"Only implemented for x86, AArch64 and RISC-V targets");
3006 if (
getContext().getTargetInfo().getTriple().getOS() !=
3007 llvm::Triple::OSType::Linux) {
3013 Builder.SetInsertPoint(CurBlock);
3017 bool HasDefault =
false;
3018 unsigned DefaultIndex = 0;
3021 for (
unsigned Index = 0; Index < Options.size(); Index++) {
3023 if (Options[Index].Features.empty()) {
3025 DefaultIndex = Index;
3029 Builder.SetInsertPoint(CurBlock);
3055 for (StringRef Feat : Options[Index].Features) {
3056 std::vector<std::string> FeatStr =
3059 assert(FeatStr.size() == 1 &&
"Feature string not delimited");
3061 std::string &CurrFeat = FeatStr.front();
3062 if (CurrFeat[0] ==
'+')
3063 TargetAttrFeats.push_back(CurrFeat.substr(1));
3066 if (TargetAttrFeats.empty())
3069 for (std::string &Feat : TargetAttrFeats)
3070 CurrTargetAttrFeats.push_back(Feat);
3072 Builder.SetInsertPoint(CurBlock);
3075 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3078 Options[Index].
Function, SupportsIFunc);
3081 Builder.SetInsertPoint(CurBlock);
3082 Builder.CreateCondBr(FeatsCondition, RetBlock, ElseBlock);
3084 CurBlock = ElseBlock;
3089 Builder.SetInsertPoint(CurBlock);
3096 Builder.SetInsertPoint(CurBlock);
3097 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3098 TrapCall->setDoesNotReturn();
3099 TrapCall->setDoesNotThrow();
3101 Builder.ClearInsertionPoint();
3106 assert(!Options.empty() &&
"No multiversion resolver options found");
3107 assert(Options.back().Features.size() == 0 &&
"Default case must be last");
3109 assert(SupportsIFunc &&
3110 "Multiversion resolver requires target IFUNC support");
3111 bool AArch64CpuInitialized =
false;
3115 Builder.SetInsertPoint(CurBlock);
3116 llvm::Value *
Condition = FormAArch64ResolverCondition(RO);
3125 if (!AArch64CpuInitialized) {
3126 Builder.SetInsertPoint(CurBlock, CurBlock->begin());
3127 EmitAArch64CpuInit();
3128 AArch64CpuInitialized =
true;
3129 Builder.SetInsertPoint(CurBlock);
3132 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3141 Builder.SetInsertPoint(CurBlock);
3142 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3143 TrapCall->setDoesNotReturn();
3144 TrapCall->setDoesNotThrow();
3146 Builder.ClearInsertionPoint();
3156 Builder.SetInsertPoint(CurBlock);
3160 Builder.SetInsertPoint(CurBlock);
3161 llvm::Value *
Condition = FormX86ResolverCondition(RO);
3165 assert(&RO == Options.end() - 1 &&
3166 "Default or Generic case must be last");
3172 llvm::BasicBlock *RetBlock =
createBasicBlock(
"resolver_return", Resolver);
3181 Builder.SetInsertPoint(CurBlock);
3182 llvm::CallInst *TrapCall =
EmitTrapCall(llvm::Intrinsic::trap);
3183 TrapCall->setDoesNotReturn();
3184 TrapCall->setDoesNotThrow();
3186 Builder.ClearInsertionPoint();
3198 llvm::Value *OffsetValue, llvm::Value *TheCheck,
3199 llvm::Instruction *Assumption) {
3200 assert(isa_and_nonnull<llvm::CallInst>(Assumption) &&
3201 cast<llvm::CallInst>(Assumption)->getCalledOperand() ==
3202 llvm::Intrinsic::getOrInsertDeclaration(
3203 Builder.GetInsertBlock()->getParent()->getParent(),
3204 llvm::Intrinsic::assume) &&
3205 "Assumption should be a call to llvm.assume().");
3206 assert(&(
Builder.GetInsertBlock()->back()) == Assumption &&
3207 "Assumption should be the last instruction of the basic block, "
3208 "since the basic block is still being generated.");
3220 Assumption->removeFromParent();
3223 auto CheckOrdinal = SanitizerKind::SO_Alignment;
3224 auto CheckHandler = SanitizerHandler::AlignmentAssumption;
3228 OffsetValue =
Builder.getInt1(
false);
3233 llvm::Value *DynamicData[] = {Ptr, Alignment, OffsetValue};
3234 EmitCheck({std::make_pair(TheCheck, CheckOrdinal)}, CheckHandler,
3235 StaticData, DynamicData);
3246 return DI->SourceLocToDebugLoc(Location);
3248 return llvm::DebugLoc();
3252CodeGenFunction::emitCondLikelihoodViaExpectIntrinsic(llvm::Value *Cond,
3263 llvm::Type *CondTy = Cond->getType();
3264 assert(CondTy->isIntegerTy(1) &&
"expecting condition to be a boolean");
3265 llvm::Function *FnExpect =
3267 llvm::Value *ExpectedValueOfCond =
3269 return Builder.CreateCall(FnExpect, {Cond, ExpectedValueOfCond},
3270 Cond->getName() +
".expval");
3272 llvm_unreachable(
"Unknown Likelihood");
3276 unsigned NumElementsDst,
3277 const llvm::Twine &Name) {
3278 auto *SrcTy = cast<llvm::FixedVectorType>(SrcVec->getType());
3279 unsigned NumElementsSrc = SrcTy->getNumElements();
3280 if (NumElementsSrc == NumElementsDst)
3283 std::vector<int> ShuffleMask(NumElementsDst, -1);
3284 for (
unsigned MaskIdx = 0;
3285 MaskIdx < std::min<>(NumElementsDst, NumElementsSrc); ++MaskIdx)
3286 ShuffleMask[MaskIdx] = MaskIdx;
3288 return Builder.CreateShuffleVector(SrcVec, ShuffleMask, Name);
3303 llvm::Value *Args[] = {Key, Discriminator};
3304 Bundles.emplace_back(
"ptrauth", Args);
3310 unsigned IntrinsicID) {
3317 if (!Discriminator) {
3322 auto OrigType =
Pointer->getType();
3340 llvm::Intrinsic::ptrauth_sign);
3346 auto StripIntrinsic = CGF.
CGM.
getIntrinsic(llvm::Intrinsic::ptrauth_strip);
3350 auto OrigType =
Pointer->getType();
3367 llvm::Intrinsic::ptrauth_auth);
3371 llvm::Instruction *KeyInstruction, llvm::Value *Backup) {
3373 DI->addInstToCurrentSourceAtom(KeyInstruction, Backup);
3377 llvm::Instruction *KeyInstruction, llvm::Value *Backup, uint64_t Atom) {
3379 DI->addInstToSpecificSourceAtom(KeyInstruction, Backup, Atom);
3383 llvm::Value *Backup) {
3386 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....
llvm::MachO::Target Target
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 ...
ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const
Parses the target attributes passed in, and returns only the ones that are valid feature names.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
Builtin::Context & BuiltinInfo
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.
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)
const char * getRequiredFeatures(unsigned ID) const
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.
Represents a C++ struct/union/class.
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]).
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...
std::string SampleProfileFile
Name of the profile file to use with -fprofile-sample-use.
bool hasProfileClangInstr() const
Check if Clang profile instrumenation is on.
std::string PatchableFunctionEntrySection
Name of the patchable function entry section with -fpatchable-function-entry.
XRayInstrSet XRayInstrumentationBundle
Set of XRay instrumentation kinds to emit.
bool hasSanitizeCoverage() const
bool hasReducedDebugInfo() const
Check if type and variable info should be emitted.
bool hasSanitizeBinaryMetadata() const
unsigned getInAllocaFieldIndex() const
bool getIndirectByVal() const
@ 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...
bool isSRetAfterThis() const
CharUnits getIndirectAlign() const
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.
This is an IRBuilder insertion helper that forwards to CodeGenFunction::InsertHelper,...
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock::iterator InsertPt) const override
This forwards to CodeGenFunction::InsertHelper.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
Address CreateStructGEP(Address Addr, unsigned Index, const llvm::Twine &Name="")
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
llvm::ConstantInt * getSize(CharUnits N)
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
virtual void emitDeviceStub(CodeGenFunction &CGF, FunctionArgList &Args)=0
Emits a kernel launch stub.
Implements C++ ABI-specific code generation functions.
virtual bool hasMostDerivedReturn(GlobalDecl GD) const
virtual bool HasThisReturn(GlobalDecl GD) const
Returns true if the given constructor or destructor is one of the kinds that the ABI says returns 'th...
virtual void EmitInstanceFunctionProlog(CodeGenFunction &CGF)=0
Emit the ABI-specific prolog for the function.
@ RAA_DirectInMemory
Pass it on the stack using its defined layout.
void buildThisParam(CodeGenFunction &CGF, FunctionArgList &Params)
Build a parameter variable suitable for 'this'.
virtual void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy, FunctionArgList &Params)=0
Insert any ABI-specific implicit parameters into the parameter list for a function.
virtual RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const =0
Returns how an argument of the given record type should be passed.
MangleContext & getMangleContext()
Gets the mangle context.
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.
ABIArgInfo & getReturnInfo()
bool isReturnsRetained() const
In ARC, whether this function retains its return value.
CanQualType getReturnType() const
bool isDelegateCall() const
unsigned getMaxVectorWidth() const
Return the maximum vector width in the arguments.
llvm::StructType * getArgStruct() const
Get the struct type used to represent all the arguments in memory.
void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn)
virtual void functionFinished(CodeGenFunction &CGF)
Cleans up references to the objects in finished function.
llvm::OpenMPIRBuilder & getOMPBuilder()
virtual void emitFunctionProlog(CodeGenFunction &CGF, const Decl *D)
Emits OpenMP-specific function prolog.
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...
SanitizerSet SanOpts
Sanitizers enabled for this function.
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.
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.
SmallVector< const BinaryOperator *, 16 > MCDCLogOpStack
Stack to track the Logical Operator recursion nest for MC/DC.
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...
void incrementProfileCounter(const Stmt *S, llvm::Value *StepV=nullptr)
Increment the profiler's counter for the given statement by StepV.
VlaSizePair getVLASize(const VariableArrayType *vla)
Returns an LLVM value that corresponds to the size, in non-variably-sized elements,...
ASTContext & getContext() 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.
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 emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue=nullptr)
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.
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
llvm::Constant * EmitAnnotationArgs(const AnnotateAttr *Attr)
Emit additional args of the annotation.
llvm::Module & getModule() const
llvm::ConstantInt * CreateKCFITypeId(QualType T, StringRef Salt)
Generate a KCFI type identifier for T.
llvm::Constant * getRawFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return a function pointer for a reference to the given function.
DiagnosticsEngine & getDiags() const
void ErrorUnsupported(const Stmt *S, const char *Type)
Print out an error that codegen doesn't support the specified stmt yet.
const LangOptions & getLangOpts() const
CGCUDARuntime & getCUDARuntime()
Return a reference to the configured CUDA runtime.
llvm::Constant * EmitAnnotationLineNo(SourceLocation L)
Emit the annotation line number.
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CodeGenTypes & getTypes()
const llvm::DataLayout & getDataLayout() const
bool shouldEmitConvergenceTokens() const
CGCXXABI & getCXXABI() const
CGOpenMPRuntime & getOpenMPRuntime()
Return a reference to the configured OpenMP runtime.
bool imbueXRayAttrs(llvm::Function *Fn, SourceLocation Loc, StringRef Category=StringRef()) const
Imbue XRay attributes to a function, applying the always/never attribute lists in the process.
ProfileList::ExclusionType isFunctionBlockedFromProfileInstr(llvm::Function *Fn, SourceLocation Loc) const
ASTContext & getContext() const
llvm::SanitizerStatReport & getSanStats()
llvm::Constant * EmitAnnotationString(StringRef Str)
Emit an annotation string.
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
llvm::LLVMContext & getLLVMContext()
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::Constant * EmitNullConstant(QualType T)
Return the result of value-initializing the given type, i.e.
bool MayDropFunctionReturn(const ASTContext &Context, QualType ReturnType) const
Whether this function's return type has no side effects, and thus may be trivially discarded if it is...
llvm::Constant * EmitAnnotationUnit(SourceLocation Loc)
Emit the annotation's translation unit.
llvm::ConstantInt * getSize(CharUnits numChars)
Emit the given number of characters as a value of type size_t.
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
bool inheritingCtorHasParams(const InheritedConstructor &Inherited, CXXCtorType Type)
Determine if a C++ inheriting constructor should have parameters matching those of its inherited cons...
llvm::Type * convertTypeForLoadStore(QualType T, llvm::Type *LLVMTy=nullptr)
Given that T is a scalar type, return the IR type that should be used for load and store operations.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
const CGFunctionInfo & arrangeFreeFunctionCall(const CallArgList &Args, const FunctionType *Ty, bool ChainCall)
Figure out the rules for calling a function with the given formal type using the given arguments.
bool isZeroInitializable(QualType T)
IsZeroInitializable - Return whether a type can be zero-initialized (in the C++ sense) with an LLVM z...
void setCGF(CodeGenFunction *inCGF)
stable_iterator stable_begin() const
Create a stable reference to the top of the EH stack.
bool empty() const
Determines whether the exception-scopes stack is empty.
bool containsOnlyNoopCleanups(stable_iterator Old) const
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
void InsertHelper(llvm::Instruction *I) const
Function called by the CodeGenFunction when an instruction is created.
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.
llvm::Value * getPointer() const
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
virtual void setOCLKernelStubCallingConvention(const FunctionType *&FT) const
virtual void checkFunctionABI(CodeGenModule &CGM, const FunctionDecl *Decl) const
Any further codegen related checks that need to be done on a function signature in a target specific ...
virtual llvm::Constant * getUBSanFunctionSignature(CodeGen::CodeGenModule &CGM) const
Return a constant used by UBSan as a signature to identify functions possessing type information,...
void Init(CodeGenModule &CGM, const Stmt *Body)
Clear the object and pre-process for the given statement, usually function body statement.
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?: ternary operator.
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
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
ExtVectorType - Extended vector type.
LangOptions::FPExceptionModeKind getExceptionMode() const
bool allowFPContractAcrossStatement() const
RoundingMode getRoundingMode() const
Represents a member of a struct/union/class.
Represents a function declaration or definition.
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.
Represents a prototype with parameter type info, e.g.
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
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
virtual void mangleCanonicalTypeName(QualType T, raw_ostream &, bool NormalizeIntegers=false)=0
Generates a unique string for an externally visible type for use with TBAA or type uniquing.
virtual void startNewFunction()
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
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
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.
SourceLocation getBeginLoc() const LLVM_READONLY
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
The base class of the type hierarchy.
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...
bool isPointerType() const
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 isRecordType() const
bool isObjCRetainableType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
bool isFunctionNoProtoType() 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.
TypeEvaluationKind
The kind of evaluation to perform on values of a particular type.
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
Matches all kinds of arrays.
The JSON file list parser is used to communicate input to InstallAPI.
@ NonNull
Values of this type can never be null.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
const FunctionProtoType * T
llvm::fp::ExceptionBehavior ToConstrainedExceptMD(LangOptions::FPExceptionModeKind Kind)
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.
cl::opt< bool > EnableSingleByteCoverage
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 * ConstGlobalsPtrTy
void* in the address space for constant globals
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.
SanitizerMask Mask
Bitmask of enabled sanitizers.
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.
bool has(XRayInstrMask K) const