clang 19.0.0git
CodeGenFunction.cpp
Go to the documentation of this file.
1//===--- CodeGenFunction.cpp - Emit LLVM Code from ASTs for a Function ----===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This coordinates the per-function state used while generating code.
10//
11//===----------------------------------------------------------------------===//
12
13#include "CodeGenFunction.h"
14#include "CGBlocks.h"
15#include "CGCUDARuntime.h"
16#include "CGCXXABI.h"
17#include "CGCleanup.h"
18#include "CGDebugInfo.h"
19#include "CGHLSLRuntime.h"
20#include "CGOpenMPRuntime.h"
21#include "CodeGenModule.h"
22#include "CodeGenPGO.h"
23#include "TargetInfo.h"
25#include "clang/AST/ASTLambda.h"
26#include "clang/AST/Attr.h"
27#include "clang/AST/Decl.h"
28#include "clang/AST/DeclCXX.h"
29#include "clang/AST/Expr.h"
30#include "clang/AST/StmtCXX.h"
31#include "clang/AST/StmtObjC.h"
38#include "llvm/ADT/ArrayRef.h"
39#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
40#include "llvm/IR/DataLayout.h"
41#include "llvm/IR/Dominators.h"
42#include "llvm/IR/FPEnv.h"
43#include "llvm/IR/IntrinsicInst.h"
44#include "llvm/IR/Intrinsics.h"
45#include "llvm/IR/MDBuilder.h"
46#include "llvm/IR/Operator.h"
47#include "llvm/Support/CRC.h"
48#include "llvm/Support/xxhash.h"
49#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
50#include "llvm/Transforms/Utils/PromoteMemToReg.h"
51#include <optional>
52
53using namespace clang;
54using namespace CodeGen;
55
56namespace llvm {
57extern cl::opt<bool> EnableSingleByteCoverage;
58} // namespace llvm
59
60/// shouldEmitLifetimeMarkers - Decide whether we need emit the life-time
61/// markers.
62static bool shouldEmitLifetimeMarkers(const CodeGenOptions &CGOpts,
63 const LangOptions &LangOpts) {
64 if (CGOpts.DisableLifetimeMarkers)
65 return false;
66
67 // Sanitizers may use markers.
68 if (CGOpts.SanitizeAddressUseAfterScope ||
69 LangOpts.Sanitize.has(SanitizerKind::HWAddress) ||
70 LangOpts.Sanitize.has(SanitizerKind::Memory))
71 return true;
72
73 // For now, only in optimized builds.
74 return CGOpts.OptimizationLevel != 0;
75}
76
77CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext)
78 : CodeGenTypeCache(cgm), CGM(cgm), Target(cgm.getTarget()),
79 Builder(cgm, cgm.getModule().getContext(), llvm::ConstantFolder(),
81 SanOpts(CGM.getLangOpts().Sanitize), CurFPFeatures(CGM.getLangOpts()),
82 DebugInfo(CGM.getModuleDebugInfo()), PGO(cgm),
83 ShouldEmitLifetimeMarkers(
84 shouldEmitLifetimeMarkers(CGM.getCodeGenOpts(), CGM.getLangOpts())) {
85 if (!suppressNewContext)
86 CGM.getCXXABI().getMangleContext().startNewFunction();
87 EHStack.setCGF(this);
88
89 SetFastMathFlags(CurFPFeatures);
90}
91
92CodeGenFunction::~CodeGenFunction() {
93 assert(LifetimeExtendedCleanupStack.empty() && "failed to emit a cleanup");
94 assert(DeferredDeactivationCleanupStack.empty() &&
95 "missed to deactivate a cleanup");
96
97 if (getLangOpts().OpenMP && CurFn)
99
100 // If we have an OpenMPIRBuilder we want to finalize functions (incl.
101 // outlining etc) at some point. Doing it once the function codegen is done
102 // seems to be a reasonable spot. We do it here, as opposed to the deletion
103 // time of the CodeGenModule, because we have to ensure the IR has not yet
104 // been "emitted" to the outside, thus, modifications are still sensible.
105 if (CGM.getLangOpts().OpenMPIRBuilder && CurFn)
107}
108
109// Map the LangOption for exception behavior into
110// the corresponding enum in the IR.
111llvm::fp::ExceptionBehavior
113
114 switch (Kind) {
115 case LangOptions::FPE_Ignore: return llvm::fp::ebIgnore;
116 case LangOptions::FPE_MayTrap: return llvm::fp::ebMayTrap;
117 case LangOptions::FPE_Strict: return llvm::fp::ebStrict;
118 default:
119 llvm_unreachable("Unsupported FP Exception Behavior");
120 }
121}
122
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());
131 FMF.setAllowContract(FPFeatures.allowFPContractAcrossStatement());
132 Builder.setFastMathFlags(FMF);
133}
134
136 const Expr *E)
137 : CGF(CGF) {
138 ConstructorHelper(E->getFPFeaturesInEffect(CGF.getLangOpts()));
139}
140
142 FPOptions FPFeatures)
143 : CGF(CGF) {
144 ConstructorHelper(FPFeatures);
145}
146
147void CodeGenFunction::CGFPOptionsRAII::ConstructorHelper(FPOptions FPFeatures) {
148 OldFPFeatures = CGF.CurFPFeatures;
149 CGF.CurFPFeatures = FPFeatures;
150
151 OldExcept = CGF.Builder.getDefaultConstrainedExcept();
152 OldRounding = CGF.Builder.getDefaultConstrainedRounding();
153
154 if (OldFPFeatures == FPFeatures)
155 return;
156
157 FMFGuard.emplace(CGF.Builder);
158
159 llvm::RoundingMode NewRoundingBehavior = FPFeatures.getRoundingMode();
160 CGF.Builder.setDefaultConstrainedRounding(NewRoundingBehavior);
161 auto NewExceptionBehavior =
163 FPFeatures.getExceptionMode()));
164 CGF.Builder.setDefaultConstrainedExcept(NewExceptionBehavior);
165
166 CGF.SetFastMathFlags(FPFeatures);
167
168 assert((CGF.CurFuncDecl == nullptr || CGF.Builder.getIsFPConstrained() ||
169 isa<CXXConstructorDecl>(CGF.CurFuncDecl) ||
170 isa<CXXDestructorDecl>(CGF.CurFuncDecl) ||
171 (NewExceptionBehavior == llvm::fp::ebIgnore &&
172 NewRoundingBehavior == llvm::RoundingMode::NearestTiesToEven)) &&
173 "FPConstrained should be enabled on entire function");
174
175 auto mergeFnAttrValue = [&](StringRef Name, bool Value) {
176 auto OldValue =
177 CGF.CurFn->getFnAttribute(Name).getValueAsBool();
178 auto NewValue = OldValue & Value;
179 if (OldValue != NewValue)
180 CGF.CurFn->addFnAttr(Name, llvm::toStringRef(NewValue));
181 };
182 mergeFnAttrValue("no-infs-fp-math", FPFeatures.getNoHonorInfs());
183 mergeFnAttrValue("no-nans-fp-math", FPFeatures.getNoHonorNaNs());
184 mergeFnAttrValue("no-signed-zeros-fp-math", FPFeatures.getNoSignedZero());
185 mergeFnAttrValue(
186 "unsafe-fp-math",
187 FPFeatures.getAllowFPReassociate() && FPFeatures.getAllowReciprocal() &&
188 FPFeatures.getAllowApproxFunc() && FPFeatures.getNoSignedZero() &&
189 FPFeatures.allowFPContractAcrossStatement());
190}
191
193 CGF.CurFPFeatures = OldFPFeatures;
194 CGF.Builder.setDefaultConstrainedExcept(OldExcept);
195 CGF.Builder.setDefaultConstrainedRounding(OldRounding);
196}
197
199 bool ForPointeeType,
200 CodeGenFunction &CGF) {
201 LValueBaseInfo BaseInfo;
202 TBAAAccessInfo TBAAInfo;
203 CharUnits Alignment =
204 CGF.CGM.getNaturalTypeAlignment(T, &BaseInfo, &TBAAInfo, ForPointeeType);
205 Address Addr = Address(V, CGF.ConvertTypeForMem(T), Alignment);
206 return CGF.MakeAddrLValue(Addr, T, BaseInfo, TBAAInfo);
207}
208
210 return ::MakeNaturalAlignAddrLValue(V, T, /*ForPointeeType*/ false, *this);
211}
212
213LValue
215 return ::MakeNaturalAlignAddrLValue(V, T, /*ForPointeeType*/ true, *this);
216}
217
219 QualType T) {
220 return ::MakeNaturalAlignAddrLValue(V, T, /*ForPointeeType*/ false, *this);
221}
222
224 QualType T) {
225 return ::MakeNaturalAlignAddrLValue(V, T, /*ForPointeeType*/ true, *this);
226}
227
230}
231
233 return CGM.getTypes().ConvertType(T);
234}
235
237 type = type.getCanonicalType();
238 while (true) {
239 switch (type->getTypeClass()) {
240#define TYPE(name, parent)
241#define ABSTRACT_TYPE(name, parent)
242#define NON_CANONICAL_TYPE(name, parent) case Type::name:
243#define DEPENDENT_TYPE(name, parent) case Type::name:
244#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(name, parent) case Type::name:
245#include "clang/AST/TypeNodes.inc"
246 llvm_unreachable("non-canonical or dependent type in IR-generation");
247
248 case Type::Auto:
249 case Type::DeducedTemplateSpecialization:
250 llvm_unreachable("undeduced type in IR-generation");
251
252 // Various scalar types.
253 case Type::Builtin:
254 case Type::Pointer:
255 case Type::BlockPointer:
256 case Type::LValueReference:
257 case Type::RValueReference:
258 case Type::MemberPointer:
259 case Type::Vector:
260 case Type::ExtVector:
261 case Type::ConstantMatrix:
262 case Type::FunctionProto:
263 case Type::FunctionNoProto:
264 case Type::Enum:
265 case Type::ObjCObjectPointer:
266 case Type::Pipe:
267 case Type::BitInt:
268 return TEK_Scalar;
269
270 // Complexes.
271 case Type::Complex:
272 return TEK_Complex;
273
274 // Arrays, records, and Objective-C objects.
275 case Type::ConstantArray:
276 case Type::IncompleteArray:
277 case Type::VariableArray:
278 case Type::Record:
279 case Type::ObjCObject:
280 case Type::ObjCInterface:
281 case Type::ArrayParameter:
282 return TEK_Aggregate;
283
284 // We operate on atomic values according to their underlying type.
285 case Type::Atomic:
286 type = cast<AtomicType>(type)->getValueType();
287 continue;
288 }
289 llvm_unreachable("unknown type kind!");
290 }
291}
292
293llvm::DebugLoc CodeGenFunction::EmitReturnBlock() {
294 // For cleanliness, we try to avoid emitting the return block for
295 // simple cases.
296 llvm::BasicBlock *CurBB = Builder.GetInsertBlock();
297
298 if (CurBB) {
299 assert(!CurBB->getTerminator() && "Unexpected terminated block.");
300
301 // We have a valid insert point, reuse it if it is empty or there are no
302 // explicit jumps to the return block.
303 if (CurBB->empty() || ReturnBlock.getBlock()->use_empty()) {
304 ReturnBlock.getBlock()->replaceAllUsesWith(CurBB);
305 delete ReturnBlock.getBlock();
306 ReturnBlock = JumpDest();
307 } else
309 return llvm::DebugLoc();
310 }
311
312 // Otherwise, if the return block is the target of a single direct
313 // branch then we can just put the code in that block instead. This
314 // cleans up functions which started with a unified return block.
315 if (ReturnBlock.getBlock()->hasOneUse()) {
316 llvm::BranchInst *BI =
317 dyn_cast<llvm::BranchInst>(*ReturnBlock.getBlock()->user_begin());
318 if (BI && BI->isUnconditional() &&
319 BI->getSuccessor(0) == ReturnBlock.getBlock()) {
320 // Record/return the DebugLoc of the simple 'return' expression to be used
321 // later by the actual 'ret' instruction.
322 llvm::DebugLoc Loc = BI->getDebugLoc();
323 Builder.SetInsertPoint(BI->getParent());
324 BI->eraseFromParent();
325 delete ReturnBlock.getBlock();
326 ReturnBlock = JumpDest();
327 return Loc;
328 }
329 }
330
331 // FIXME: We are at an unreachable point, there is no reason to emit the block
332 // unless it has uses. However, we still need a place to put the debug
333 // region.end for now.
334
336 return llvm::DebugLoc();
337}
338
339static void EmitIfUsed(CodeGenFunction &CGF, llvm::BasicBlock *BB) {
340 if (!BB) return;
341 if (!BB->use_empty()) {
342 CGF.CurFn->insert(CGF.CurFn->end(), BB);
343 return;
344 }
345 delete BB;
346}
347
349 assert(BreakContinueStack.empty() &&
350 "mismatched push/pop in break/continue stack!");
351 assert(LifetimeExtendedCleanupStack.empty() &&
352 "mismatched push/pop of cleanups in EHStack!");
353 assert(DeferredDeactivationCleanupStack.empty() &&
354 "mismatched activate/deactivate of cleanups!");
355
357 ConvergenceTokenStack.pop_back();
358 assert(ConvergenceTokenStack.empty() &&
359 "mismatched push/pop in convergence stack!");
360 }
361
362 bool OnlySimpleReturnStmts = NumSimpleReturnExprs > 0
363 && NumSimpleReturnExprs == NumReturnExprs
364 && ReturnBlock.getBlock()->use_empty();
365 // Usually the return expression is evaluated before the cleanup
366 // code. If the function contains only a simple return statement,
367 // such as a constant, the location before the cleanup code becomes
368 // the last useful breakpoint in the function, because the simple
369 // return expression will be evaluated after the cleanup code. To be
370 // safe, set the debug location for cleanup code to the location of
371 // the return statement. Otherwise the cleanup code should be at the
372 // end of the function's lexical scope.
373 //
374 // If there are multiple branches to the return block, the branch
375 // instructions will get the location of the return statements and
376 // all will be fine.
377 if (CGDebugInfo *DI = getDebugInfo()) {
378 if (OnlySimpleReturnStmts)
379 DI->EmitLocation(Builder, LastStopPoint);
380 else
381 DI->EmitLocation(Builder, EndLoc);
382 }
383
384 // Pop any cleanups that might have been associated with the
385 // parameters. Do this in whatever block we're currently in; it's
386 // important to do this before we enter the return block or return
387 // edges will be *really* confused.
388 bool HasCleanups = EHStack.stable_begin() != PrologueCleanupDepth;
389 bool HasOnlyLifetimeMarkers =
391 bool EmitRetDbgLoc = !HasCleanups || HasOnlyLifetimeMarkers;
392
393 std::optional<ApplyDebugLocation> OAL;
394 if (HasCleanups) {
395 // Make sure the line table doesn't jump back into the body for
396 // the ret after it's been at EndLoc.
397 if (CGDebugInfo *DI = getDebugInfo()) {
398 if (OnlySimpleReturnStmts)
399 DI->EmitLocation(Builder, EndLoc);
400 else
401 // We may not have a valid end location. Try to apply it anyway, and
402 // fall back to an artificial location if needed.
404 }
405
407 }
408
409 // Emit function epilog (to return).
410 llvm::DebugLoc Loc = EmitReturnBlock();
411
413 if (CGM.getCodeGenOpts().InstrumentFunctions)
414 CurFn->addFnAttr("instrument-function-exit", "__cyg_profile_func_exit");
415 if (CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
416 CurFn->addFnAttr("instrument-function-exit-inlined",
417 "__cyg_profile_func_exit");
418 }
419
420 // Emit debug descriptor for function end.
421 if (CGDebugInfo *DI = getDebugInfo())
422 DI->EmitFunctionEnd(Builder, CurFn);
423
424 // Reset the debug location to that of the simple 'return' expression, if any
425 // rather than that of the end of the function's scope '}'.
426 ApplyDebugLocation AL(*this, Loc);
427 EmitFunctionEpilog(*CurFnInfo, EmitRetDbgLoc, EndLoc);
429
430 assert(EHStack.empty() &&
431 "did not remove all scopes from cleanup stack!");
432
433 // If someone did an indirect goto, emit the indirect goto block at the end of
434 // the function.
435 if (IndirectBranch) {
436 EmitBlock(IndirectBranch->getParent());
437 Builder.ClearInsertionPoint();
438 }
439
440 // If some of our locals escaped, insert a call to llvm.localescape in the
441 // entry block.
442 if (!EscapedLocals.empty()) {
443 // Invert the map from local to index into a simple vector. There should be
444 // no holes.
446 EscapeArgs.resize(EscapedLocals.size());
447 for (auto &Pair : EscapedLocals)
448 EscapeArgs[Pair.second] = Pair.first;
449 llvm::Function *FrameEscapeFn = llvm::Intrinsic::getDeclaration(
450 &CGM.getModule(), llvm::Intrinsic::localescape);
451 CGBuilderTy(*this, AllocaInsertPt).CreateCall(FrameEscapeFn, EscapeArgs);
452 }
453
454 // Remove the AllocaInsertPt instruction, which is just a convenience for us.
455 llvm::Instruction *Ptr = AllocaInsertPt;
456 AllocaInsertPt = nullptr;
457 Ptr->eraseFromParent();
458
459 // PostAllocaInsertPt, if created, was lazily created when it was required,
460 // remove it now since it was just created for our own convenience.
461 if (PostAllocaInsertPt) {
462 llvm::Instruction *PostPtr = PostAllocaInsertPt;
463 PostAllocaInsertPt = nullptr;
464 PostPtr->eraseFromParent();
465 }
466
467 // If someone took the address of a label but never did an indirect goto, we
468 // made a zero entry PHI node, which is illegal, zap it now.
469 if (IndirectBranch) {
470 llvm::PHINode *PN = cast<llvm::PHINode>(IndirectBranch->getAddress());
471 if (PN->getNumIncomingValues() == 0) {
472 PN->replaceAllUsesWith(llvm::UndefValue::get(PN->getType()));
473 PN->eraseFromParent();
474 }
475 }
476
478 EmitIfUsed(*this, TerminateLandingPad);
479 EmitIfUsed(*this, TerminateHandler);
480 EmitIfUsed(*this, UnreachableBlock);
481
482 for (const auto &FuncletAndParent : TerminateFunclets)
483 EmitIfUsed(*this, FuncletAndParent.second);
484
485 if (CGM.getCodeGenOpts().EmitDeclMetadata)
486 EmitDeclMetadata();
487
488 for (const auto &R : DeferredReplacements) {
489 if (llvm::Value *Old = R.first) {
490 Old->replaceAllUsesWith(R.second);
491 cast<llvm::Instruction>(Old)->eraseFromParent();
492 }
493 }
494 DeferredReplacements.clear();
495
496 // Eliminate CleanupDestSlot alloca by replacing it with SSA values and
497 // PHIs if the current function is a coroutine. We don't do it for all
498 // functions as it may result in slight increase in numbers of instructions
499 // if compiled with no optimizations. We do it for coroutine as the lifetime
500 // of CleanupDestSlot alloca make correct coroutine frame building very
501 // difficult.
503 llvm::DominatorTree DT(*CurFn);
504 llvm::PromoteMemToReg(
505 cast<llvm::AllocaInst>(NormalCleanupDest.getPointer()), DT);
507 }
508
509 // Scan function arguments for vector width.
510 for (llvm::Argument &A : CurFn->args())
511 if (auto *VT = dyn_cast<llvm::VectorType>(A.getType()))
512 LargestVectorWidth =
513 std::max((uint64_t)LargestVectorWidth,
514 VT->getPrimitiveSizeInBits().getKnownMinValue());
515
516 // Update vector width based on return type.
517 if (auto *VT = dyn_cast<llvm::VectorType>(CurFn->getReturnType()))
518 LargestVectorWidth =
519 std::max((uint64_t)LargestVectorWidth,
520 VT->getPrimitiveSizeInBits().getKnownMinValue());
521
522 if (CurFnInfo->getMaxVectorWidth() > LargestVectorWidth)
523 LargestVectorWidth = CurFnInfo->getMaxVectorWidth();
524
525 // Add the min-legal-vector-width attribute. This contains the max width from:
526 // 1. min-vector-width attribute used in the source program.
527 // 2. Any builtins used that have a vector width specified.
528 // 3. Values passed in and out of inline assembly.
529 // 4. Width of vector arguments and return types for this function.
530 // 5. Width of vector arguments and return types for functions called by this
531 // function.
532 if (getContext().getTargetInfo().getTriple().isX86())
533 CurFn->addFnAttr("min-legal-vector-width",
534 llvm::utostr(LargestVectorWidth));
535
536 // Add vscale_range attribute if appropriate.
537 std::optional<std::pair<unsigned, unsigned>> VScaleRange =
539 if (VScaleRange) {
540 CurFn->addFnAttr(llvm::Attribute::getWithVScaleRangeArgs(
541 getLLVMContext(), VScaleRange->first, VScaleRange->second));
542 }
543
544 // If we generated an unreachable return block, delete it now.
545 if (ReturnBlock.isValid() && ReturnBlock.getBlock()->use_empty()) {
546 Builder.ClearInsertionPoint();
547 ReturnBlock.getBlock()->eraseFromParent();
548 }
549 if (ReturnValue.isValid()) {
550 auto *RetAlloca =
551 dyn_cast<llvm::AllocaInst>(ReturnValue.emitRawPointer(*this));
552 if (RetAlloca && RetAlloca->use_empty()) {
553 RetAlloca->eraseFromParent();
555 }
556 }
557}
558
559/// ShouldInstrumentFunction - Return true if the current function should be
560/// instrumented with __cyg_profile_func_* calls
562 if (!CGM.getCodeGenOpts().InstrumentFunctions &&
563 !CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining &&
564 !CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
565 return false;
566 if (!CurFuncDecl || CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>())
567 return false;
568 return true;
569}
570
572 if (!CurFuncDecl)
573 return false;
574 return CurFuncDecl->hasAttr<DisableSanitizerInstrumentationAttr>();
575}
576
577/// ShouldXRayInstrument - Return true if the current function should be
578/// instrumented with XRay nop sleds.
580 return CGM.getCodeGenOpts().XRayInstrumentFunctions;
581}
582
583/// AlwaysEmitXRayCustomEvents - Return true if we should emit IR for calls to
584/// the __xray_customevent(...) builtin calls, when doing XRay instrumentation.
586 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
587 (CGM.getCodeGenOpts().XRayAlwaysEmitCustomEvents ||
590}
591
593 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
594 (CGM.getCodeGenOpts().XRayAlwaysEmitTypedEvents ||
597}
598
599llvm::ConstantInt *
601 // Remove any (C++17) exception specifications, to allow calling e.g. a
602 // noexcept function through a non-noexcept pointer.
603 if (!Ty->isFunctionNoProtoType())
605 std::string Mangled;
606 llvm::raw_string_ostream Out(Mangled);
608 return llvm::ConstantInt::get(
609 CGM.Int32Ty, static_cast<uint32_t>(llvm::xxh3_64bits(Mangled)));
610}
611
612void CodeGenFunction::EmitKernelMetadata(const FunctionDecl *FD,
613 llvm::Function *Fn) {
614 if (!FD->hasAttr<OpenCLKernelAttr>() && !FD->hasAttr<CUDAGlobalAttr>())
615 return;
616
617 llvm::LLVMContext &Context = getLLVMContext();
618
619 CGM.GenKernelArgMetadata(Fn, FD, this);
620
621 if (!getLangOpts().OpenCL)
622 return;
623
624 if (const VecTypeHintAttr *A = FD->getAttr<VecTypeHintAttr>()) {
625 QualType HintQTy = A->getTypeHint();
626 const ExtVectorType *HintEltQTy = HintQTy->getAs<ExtVectorType>();
627 bool IsSignedInteger =
628 HintQTy->isSignedIntegerType() ||
629 (HintEltQTy && HintEltQTy->getElementType()->isSignedIntegerType());
630 llvm::Metadata *AttrMDArgs[] = {
631 llvm::ConstantAsMetadata::get(llvm::UndefValue::get(
632 CGM.getTypes().ConvertType(A->getTypeHint()))),
633 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
634 llvm::IntegerType::get(Context, 32),
635 llvm::APInt(32, (uint64_t)(IsSignedInteger ? 1 : 0))))};
636 Fn->setMetadata("vec_type_hint", llvm::MDNode::get(Context, AttrMDArgs));
637 }
638
639 if (const WorkGroupSizeHintAttr *A = FD->getAttr<WorkGroupSizeHintAttr>()) {
640 llvm::Metadata *AttrMDArgs[] = {
641 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())),
642 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())),
643 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))};
644 Fn->setMetadata("work_group_size_hint", llvm::MDNode::get(Context, AttrMDArgs));
645 }
646
647 if (const ReqdWorkGroupSizeAttr *A = FD->getAttr<ReqdWorkGroupSizeAttr>()) {
648 llvm::Metadata *AttrMDArgs[] = {
649 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())),
650 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())),
651 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))};
652 Fn->setMetadata("reqd_work_group_size", llvm::MDNode::get(Context, AttrMDArgs));
653 }
654
655 if (const OpenCLIntelReqdSubGroupSizeAttr *A =
656 FD->getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
657 llvm::Metadata *AttrMDArgs[] = {
658 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getSubGroupSize()))};
659 Fn->setMetadata("intel_reqd_sub_group_size",
660 llvm::MDNode::get(Context, AttrMDArgs));
661 }
662}
663
664/// Determine whether the function F ends with a return stmt.
665static bool endsWithReturn(const Decl* F) {
666 const Stmt *Body = nullptr;
667 if (auto *FD = dyn_cast_or_null<FunctionDecl>(F))
668 Body = FD->getBody();
669 else if (auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(F))
670 Body = OMD->getBody();
671
672 if (auto *CS = dyn_cast_or_null<CompoundStmt>(Body)) {
673 auto LastStmt = CS->body_rbegin();
674 if (LastStmt != CS->body_rend())
675 return isa<ReturnStmt>(*LastStmt);
676 }
677 return false;
678}
679
681 if (SanOpts.has(SanitizerKind::Thread)) {
682 Fn->addFnAttr("sanitize_thread_no_checking_at_run_time");
683 Fn->removeFnAttr(llvm::Attribute::SanitizeThread);
684 }
685}
686
687/// Check if the return value of this function requires sanitization.
688bool CodeGenFunction::requiresReturnValueCheck() const {
689 return requiresReturnValueNullabilityCheck() ||
690 (SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) && CurCodeDecl &&
691 CurCodeDecl->getAttr<ReturnsNonNullAttr>());
692}
693
694static bool matchesStlAllocatorFn(const Decl *D, const ASTContext &Ctx) {
695 auto *MD = dyn_cast_or_null<CXXMethodDecl>(D);
696 if (!MD || !MD->getDeclName().getAsIdentifierInfo() ||
697 !MD->getDeclName().getAsIdentifierInfo()->isStr("allocate") ||
698 (MD->getNumParams() != 1 && MD->getNumParams() != 2))
699 return false;
700
701 if (MD->parameters()[0]->getType().getCanonicalType() != Ctx.getSizeType())
702 return false;
703
704 if (MD->getNumParams() == 2) {
705 auto *PT = MD->parameters()[1]->getType()->getAs<PointerType>();
706 if (!PT || !PT->isVoidPointerType() ||
707 !PT->getPointeeType().isConstQualified())
708 return false;
709 }
710
711 return true;
712}
713
714bool CodeGenFunction::isInAllocaArgument(CGCXXABI &ABI, QualType Ty) {
715 const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
716 return RD && ABI.getRecordArgABI(RD) == CGCXXABI::RAA_DirectInMemory;
717}
718
719bool CodeGenFunction::hasInAllocaArg(const CXXMethodDecl *MD) {
720 return getTarget().getTriple().getArch() == llvm::Triple::x86 &&
722 llvm::any_of(MD->parameters(), [&](ParmVarDecl *P) {
723 return isInAllocaArgument(CGM.getCXXABI(), P->getType());
724 });
725}
726
727/// Return the UBSan prologue signature for \p FD if one is available.
728static llvm::Constant *getPrologueSignature(CodeGenModule &CGM,
729 const FunctionDecl *FD) {
730 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD))
731 if (!MD->isStatic())
732 return nullptr;
734}
735
737 llvm::Function *Fn,
738 const CGFunctionInfo &FnInfo,
739 const FunctionArgList &Args,
741 SourceLocation StartLoc) {
742 assert(!CurFn &&
743 "Do not use a CodeGenFunction object for more than one function");
744
745 const Decl *D = GD.getDecl();
746
747 DidCallStackSave = false;
748 CurCodeDecl = D;
749 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
750 if (FD && FD->usesSEHTry())
751 CurSEHParent = GD;
752 CurFuncDecl = (D ? D->getNonClosureContext() : nullptr);
753 FnRetTy = RetTy;
754 CurFn = Fn;
755 CurFnInfo = &FnInfo;
756 assert(CurFn->isDeclaration() && "Function already has body?");
757
758 // If this function is ignored for any of the enabled sanitizers,
759 // disable the sanitizer for the function.
760 do {
761#define SANITIZER(NAME, ID) \
762 if (SanOpts.empty()) \
763 break; \
764 if (SanOpts.has(SanitizerKind::ID)) \
765 if (CGM.isInNoSanitizeList(SanitizerKind::ID, Fn, Loc)) \
766 SanOpts.set(SanitizerKind::ID, false);
767
768#include "clang/Basic/Sanitizers.def"
769#undef SANITIZER
770 } while (false);
771
772 if (D) {
773 const bool SanitizeBounds = SanOpts.hasOneOf(SanitizerKind::Bounds);
774 SanitizerMask no_sanitize_mask;
775 bool NoSanitizeCoverage = false;
776
777 for (auto *Attr : D->specific_attrs<NoSanitizeAttr>()) {
778 no_sanitize_mask |= Attr->getMask();
779 // SanitizeCoverage is not handled by SanOpts.
780 if (Attr->hasCoverage())
781 NoSanitizeCoverage = true;
782 }
783
784 // Apply the no_sanitize* attributes to SanOpts.
785 SanOpts.Mask &= ~no_sanitize_mask;
786 if (no_sanitize_mask & SanitizerKind::Address)
787 SanOpts.set(SanitizerKind::KernelAddress, false);
788 if (no_sanitize_mask & SanitizerKind::KernelAddress)
789 SanOpts.set(SanitizerKind::Address, false);
790 if (no_sanitize_mask & SanitizerKind::HWAddress)
791 SanOpts.set(SanitizerKind::KernelHWAddress, false);
792 if (no_sanitize_mask & SanitizerKind::KernelHWAddress)
793 SanOpts.set(SanitizerKind::HWAddress, false);
794
795 if (SanitizeBounds && !SanOpts.hasOneOf(SanitizerKind::Bounds))
796 Fn->addFnAttr(llvm::Attribute::NoSanitizeBounds);
797
798 if (NoSanitizeCoverage && CGM.getCodeGenOpts().hasSanitizeCoverage())
799 Fn->addFnAttr(llvm::Attribute::NoSanitizeCoverage);
800
801 // Some passes need the non-negated no_sanitize attribute. Pass them on.
803 if (no_sanitize_mask & SanitizerKind::Thread)
804 Fn->addFnAttr("no_sanitize_thread");
805 }
806 }
807
809 CurFn->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
810 } else {
811 // Apply sanitizer attributes to the function.
812 if (SanOpts.hasOneOf(SanitizerKind::Address | SanitizerKind::KernelAddress))
813 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
814 if (SanOpts.hasOneOf(SanitizerKind::HWAddress |
815 SanitizerKind::KernelHWAddress))
816 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
817 if (SanOpts.has(SanitizerKind::MemtagStack))
818 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
819 if (SanOpts.has(SanitizerKind::Thread))
820 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
821 if (SanOpts.hasOneOf(SanitizerKind::Memory | SanitizerKind::KernelMemory))
822 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
823 }
824 if (SanOpts.has(SanitizerKind::SafeStack))
825 Fn->addFnAttr(llvm::Attribute::SafeStack);
826 if (SanOpts.has(SanitizerKind::ShadowCallStack))
827 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
828
829 // Apply fuzzing attribute to the function.
830 if (SanOpts.hasOneOf(SanitizerKind::Fuzzer | SanitizerKind::FuzzerNoLink))
831 Fn->addFnAttr(llvm::Attribute::OptForFuzzing);
832
833 // Ignore TSan memory acesses from within ObjC/ObjC++ dealloc, initialize,
834 // .cxx_destruct, __destroy_helper_block_ and all of their calees at run time.
835 if (SanOpts.has(SanitizerKind::Thread)) {
836 if (const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
837 const IdentifierInfo *II = OMD->getSelector().getIdentifierInfoForSlot(0);
838 if (OMD->getMethodFamily() == OMF_dealloc ||
839 OMD->getMethodFamily() == OMF_initialize ||
840 (OMD->getSelector().isUnarySelector() && II->isStr(".cxx_destruct"))) {
842 }
843 }
844 }
845
846 // Ignore unrelated casts in STL allocate() since the allocator must cast
847 // from void* to T* before object initialization completes. Don't match on the
848 // namespace because not all allocators are in std::
849 if (D && SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
851 SanOpts.Mask &= ~SanitizerKind::CFIUnrelatedCast;
852 }
853
854 // Ignore null checks in coroutine functions since the coroutines passes
855 // are not aware of how to move the extra UBSan instructions across the split
856 // coroutine boundaries.
857 if (D && SanOpts.has(SanitizerKind::Null))
858 if (FD && FD->getBody() &&
859 FD->getBody()->getStmtClass() == Stmt::CoroutineBodyStmtClass)
860 SanOpts.Mask &= ~SanitizerKind::Null;
861
862 // Apply xray attributes to the function (as a string, for now)
863 bool AlwaysXRayAttr = false;
864 if (const auto *XRayAttr = D ? D->getAttr<XRayInstrumentAttr>() : nullptr) {
869 if (XRayAttr->alwaysXRayInstrument() && ShouldXRayInstrumentFunction()) {
870 Fn->addFnAttr("function-instrument", "xray-always");
871 AlwaysXRayAttr = true;
872 }
873 if (XRayAttr->neverXRayInstrument())
874 Fn->addFnAttr("function-instrument", "xray-never");
875 if (const auto *LogArgs = D->getAttr<XRayLogArgsAttr>())
877 Fn->addFnAttr("xray-log-args",
878 llvm::utostr(LogArgs->getArgumentCount()));
879 }
880 } else {
882 Fn->addFnAttr(
883 "xray-instruction-threshold",
884 llvm::itostr(CGM.getCodeGenOpts().XRayInstructionThreshold));
885 }
886
888 if (CGM.getCodeGenOpts().XRayIgnoreLoops)
889 Fn->addFnAttr("xray-ignore-loops");
890
893 Fn->addFnAttr("xray-skip-exit");
894
897 Fn->addFnAttr("xray-skip-entry");
898
899 auto FuncGroups = CGM.getCodeGenOpts().XRayTotalFunctionGroups;
900 if (FuncGroups > 1) {
901 auto FuncName = llvm::ArrayRef<uint8_t>(CurFn->getName().bytes_begin(),
902 CurFn->getName().bytes_end());
903 auto Group = crc32(FuncName) % FuncGroups;
904 if (Group != CGM.getCodeGenOpts().XRaySelectedFunctionGroup &&
905 !AlwaysXRayAttr)
906 Fn->addFnAttr("function-instrument", "xray-never");
907 }
908 }
909
910 if (CGM.getCodeGenOpts().getProfileInstr() != CodeGenOptions::ProfileNone) {
913 Fn->addFnAttr(llvm::Attribute::SkipProfile);
914 break;
916 Fn->addFnAttr(llvm::Attribute::NoProfile);
917 break;
919 break;
920 }
921 }
922
923 unsigned Count, Offset;
924 if (const auto *Attr =
925 D ? D->getAttr<PatchableFunctionEntryAttr>() : nullptr) {
926 Count = Attr->getCount();
927 Offset = Attr->getOffset();
928 } else {
929 Count = CGM.getCodeGenOpts().PatchableFunctionEntryCount;
930 Offset = CGM.getCodeGenOpts().PatchableFunctionEntryOffset;
931 }
932 if (Count && Offset <= Count) {
933 Fn->addFnAttr("patchable-function-entry", std::to_string(Count - Offset));
934 if (Offset)
935 Fn->addFnAttr("patchable-function-prefix", std::to_string(Offset));
936 }
937 // Instruct that functions for COFF/CodeView targets should start with a
938 // patchable instruction, but only on x86/x64. Don't forward this to ARM/ARM64
939 // backends as they don't need it -- instructions on these architectures are
940 // always atomically patchable at runtime.
941 if (CGM.getCodeGenOpts().HotPatch &&
942 getContext().getTargetInfo().getTriple().isX86() &&
943 getContext().getTargetInfo().getTriple().getEnvironment() !=
944 llvm::Triple::CODE16)
945 Fn->addFnAttr("patchable-function", "prologue-short-redirect");
946
947 // Add no-jump-tables value.
948 if (CGM.getCodeGenOpts().NoUseJumpTables)
949 Fn->addFnAttr("no-jump-tables", "true");
950
951 // Add no-inline-line-tables value.
952 if (CGM.getCodeGenOpts().NoInlineLineTables)
953 Fn->addFnAttr("no-inline-line-tables");
954
955 // Add profile-sample-accurate value.
956 if (CGM.getCodeGenOpts().ProfileSampleAccurate)
957 Fn->addFnAttr("profile-sample-accurate");
958
959 if (!CGM.getCodeGenOpts().SampleProfileFile.empty())
960 Fn->addFnAttr("use-sample-profile");
961
962 if (D && D->hasAttr<CFICanonicalJumpTableAttr>())
963 Fn->addFnAttr("cfi-canonical-jump-table");
964
965 if (D && D->hasAttr<NoProfileFunctionAttr>())
966 Fn->addFnAttr(llvm::Attribute::NoProfile);
967
968 if (D) {
969 // Function attributes take precedence over command line flags.
970 if (auto *A = D->getAttr<FunctionReturnThunksAttr>()) {
971 switch (A->getThunkType()) {
972 case FunctionReturnThunksAttr::Kind::Keep:
973 break;
974 case FunctionReturnThunksAttr::Kind::Extern:
975 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
976 break;
977 }
978 } else if (CGM.getCodeGenOpts().FunctionReturnThunks)
979 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
980 }
981
982 if (FD && (getLangOpts().OpenCL ||
983 (getLangOpts().HIP && getLangOpts().CUDAIsDevice))) {
984 // Add metadata for a kernel function.
985 EmitKernelMetadata(FD, Fn);
986 }
987
988 if (FD && FD->hasAttr<ClspvLibclcBuiltinAttr>()) {
989 Fn->setMetadata("clspv_libclc_builtin",
990 llvm::MDNode::get(getLLVMContext(), {}));
991 }
992
993 // If we are checking function types, emit a function type signature as
994 // prologue data.
995 if (FD && SanOpts.has(SanitizerKind::Function)) {
996 if (llvm::Constant *PrologueSig = getPrologueSignature(CGM, FD)) {
997 llvm::LLVMContext &Ctx = Fn->getContext();
998 llvm::MDBuilder MDB(Ctx);
999 Fn->setMetadata(
1000 llvm::LLVMContext::MD_func_sanitize,
1001 MDB.createRTTIPointerPrologue(
1002 PrologueSig, getUBSanFunctionTypeHash(FD->getType())));
1003 }
1004 }
1005
1006 // If we're checking nullability, we need to know whether we can check the
1007 // return value. Initialize the flag to 'true' and refine it in EmitParmDecl.
1008 if (SanOpts.has(SanitizerKind::NullabilityReturn)) {
1010 if (Nullability && *Nullability == NullabilityKind::NonNull &&
1011 !FnRetTy->isRecordType()) {
1012 if (!(SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) &&
1013 CurCodeDecl && CurCodeDecl->getAttr<ReturnsNonNullAttr>()))
1014 RetValNullabilityPrecondition =
1015 llvm::ConstantInt::getTrue(getLLVMContext());
1016 }
1017 }
1018
1019 // If we're in C++ mode and the function name is "main", it is guaranteed
1020 // to be norecurse by the standard (3.6.1.3 "The function main shall not be
1021 // used within a program").
1022 //
1023 // OpenCL C 2.0 v2.2-11 s6.9.i:
1024 // Recursion is not supported.
1025 //
1026 // SYCL v1.2.1 s3.10:
1027 // kernels cannot include RTTI information, exception classes,
1028 // recursive code, virtual functions or make use of C++ libraries that
1029 // are not compiled for the device.
1030 if (FD && ((getLangOpts().CPlusPlus && FD->isMain()) ||
1031 getLangOpts().OpenCL || getLangOpts().SYCLIsDevice ||
1032 (getLangOpts().CUDA && FD->hasAttr<CUDAGlobalAttr>())))
1033 Fn->addFnAttr(llvm::Attribute::NoRecurse);
1034
1035 llvm::RoundingMode RM = getLangOpts().getDefaultRoundingMode();
1036 llvm::fp::ExceptionBehavior FPExceptionBehavior =
1037 ToConstrainedExceptMD(getLangOpts().getDefaultExceptionMode());
1038 Builder.setDefaultConstrainedRounding(RM);
1039 Builder.setDefaultConstrainedExcept(FPExceptionBehavior);
1040 if ((FD && (FD->UsesFPIntrin() || FD->hasAttr<StrictFPAttr>())) ||
1041 (!FD && (FPExceptionBehavior != llvm::fp::ebIgnore ||
1042 RM != llvm::RoundingMode::NearestTiesToEven))) {
1043 Builder.setIsFPConstrained(true);
1044 Fn->addFnAttr(llvm::Attribute::StrictFP);
1045 }
1046
1047 // If a custom alignment is used, force realigning to this alignment on
1048 // any main function which certainly will need it.
1049 if (FD && ((FD->isMain() || FD->isMSVCRTEntryPoint()) &&
1050 CGM.getCodeGenOpts().StackAlignment))
1051 Fn->addFnAttr("stackrealign");
1052
1053 // "main" doesn't need to zero out call-used registers.
1054 if (FD && FD->isMain())
1055 Fn->removeFnAttr("zero-call-used-regs");
1056
1057 llvm::BasicBlock *EntryBB = createBasicBlock("entry", CurFn);
1058
1059 // Create a marker to make it easy to insert allocas into the entryblock
1060 // later. Don't create this with the builder, because we don't want it
1061 // folded.
1062 llvm::Value *Undef = llvm::UndefValue::get(Int32Ty);
1063 AllocaInsertPt = new llvm::BitCastInst(Undef, Int32Ty, "allocapt", EntryBB);
1064
1066
1067 Builder.SetInsertPoint(EntryBB);
1068
1069 // If we're checking the return value, allocate space for a pointer to a
1070 // precise source location of the checked return statement.
1071 if (requiresReturnValueCheck()) {
1072 ReturnLocation = CreateDefaultAlignTempAlloca(Int8PtrTy, "return.sloc.ptr");
1073 Builder.CreateStore(llvm::ConstantPointerNull::get(Int8PtrTy),
1074 ReturnLocation);
1075 }
1076
1077 // Emit subprogram debug descriptor.
1078 if (CGDebugInfo *DI = getDebugInfo()) {
1079 // Reconstruct the type from the argument list so that implicit parameters,
1080 // such as 'this' and 'vtt', show up in the debug info. Preserve the calling
1081 // convention.
1082 DI->emitFunctionStart(GD, Loc, StartLoc,
1083 DI->getFunctionType(FD, RetTy, Args), CurFn,
1085 }
1086
1088 if (CGM.getCodeGenOpts().InstrumentFunctions)
1089 CurFn->addFnAttr("instrument-function-entry", "__cyg_profile_func_enter");
1090 if (CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
1091 CurFn->addFnAttr("instrument-function-entry-inlined",
1092 "__cyg_profile_func_enter");
1093 if (CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
1094 CurFn->addFnAttr("instrument-function-entry-inlined",
1095 "__cyg_profile_func_enter_bare");
1096 }
1097
1098 // Since emitting the mcount call here impacts optimizations such as function
1099 // inlining, we just add an attribute to insert a mcount call in backend.
1100 // The attribute "counting-function" is set to mcount function name which is
1101 // architecture dependent.
1102 if (CGM.getCodeGenOpts().InstrumentForProfiling) {
1103 // Calls to fentry/mcount should not be generated if function has
1104 // the no_instrument_function attribute.
1105 if (!CurFuncDecl || !CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>()) {
1106 if (CGM.getCodeGenOpts().CallFEntry)
1107 Fn->addFnAttr("fentry-call", "true");
1108 else {
1109 Fn->addFnAttr("instrument-function-entry-inlined",
1110 getTarget().getMCountName());
1111 }
1112 if (CGM.getCodeGenOpts().MNopMCount) {
1113 if (!CGM.getCodeGenOpts().CallFEntry)
1114 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1115 << "-mnop-mcount" << "-mfentry";
1116 Fn->addFnAttr("mnop-mcount");
1117 }
1118
1119 if (CGM.getCodeGenOpts().RecordMCount) {
1120 if (!CGM.getCodeGenOpts().CallFEntry)
1121 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1122 << "-mrecord-mcount" << "-mfentry";
1123 Fn->addFnAttr("mrecord-mcount");
1124 }
1125 }
1126 }
1127
1128 if (CGM.getCodeGenOpts().PackedStack) {
1129 if (getContext().getTargetInfo().getTriple().getArch() !=
1130 llvm::Triple::systemz)
1131 CGM.getDiags().Report(diag::err_opt_not_valid_on_target)
1132 << "-mpacked-stack";
1133 Fn->addFnAttr("packed-stack");
1134 }
1135
1136 if (CGM.getCodeGenOpts().WarnStackSize != UINT_MAX &&
1137 !CGM.getDiags().isIgnored(diag::warn_fe_backend_frame_larger_than, Loc))
1138 Fn->addFnAttr("warn-stack-size",
1139 std::to_string(CGM.getCodeGenOpts().WarnStackSize));
1140
1141 if (RetTy->isVoidType()) {
1142 // Void type; nothing to return.
1144
1145 // Count the implicit return.
1146 if (!endsWithReturn(D))
1147 ++NumReturnExprs;
1149 // Indirect return; emit returned value directly into sret slot.
1150 // This reduces code size, and affects correctness in C++.
1151 auto AI = CurFn->arg_begin();
1153 ++AI;
1155 &*AI, RetTy, CurFnInfo->getReturnInfo().getIndirectAlign(), false,
1156 nullptr, nullptr, KnownNonNull);
1162 }
1165 // Load the sret pointer from the argument struct and return into that.
1166 unsigned Idx = CurFnInfo->getReturnInfo().getInAllocaFieldIndex();
1167 llvm::Function::arg_iterator EI = CurFn->arg_end();
1168 --EI;
1169 llvm::Value *Addr = Builder.CreateStructGEP(
1170 CurFnInfo->getArgStruct(), &*EI, Idx);
1171 llvm::Type *Ty =
1172 cast<llvm::GetElementPtrInst>(Addr)->getResultElementType();
1174 Addr = Builder.CreateAlignedLoad(Ty, Addr, getPointerAlign(), "agg.result");
1175 ReturnValue = Address(Addr, ConvertType(RetTy),
1177 } else {
1178 ReturnValue = CreateIRTemp(RetTy, "retval");
1179
1180 // Tell the epilog emitter to autorelease the result. We do this
1181 // now so that various specialized functions can suppress it
1182 // during their IR-generation.
1183 if (getLangOpts().ObjCAutoRefCount &&
1185 RetTy->isObjCRetainableType())
1186 AutoreleaseResult = true;
1187 }
1188
1190
1192
1193 // Emit OpenMP specific initialization of the device functions.
1194 if (getLangOpts().OpenMP && CurCodeDecl)
1196
1197 // Handle emitting HLSL entry functions.
1198 if (D && D->hasAttr<HLSLShaderAttr>())
1200
1202
1203 if (const CXXMethodDecl *MD = dyn_cast_if_present<CXXMethodDecl>(D);
1204 MD && !MD->isStatic()) {
1205 bool IsInLambda =
1206 MD->getParent()->isLambda() && MD->getOverloadedOperator() == OO_Call;
1209 if (IsInLambda) {
1210 // We're in a lambda; figure out the captures.
1214 // If the lambda captures the object referred to by '*this' - either by
1215 // value or by reference, make sure CXXThisValue points to the correct
1216 // object.
1217
1218 // Get the lvalue for the field (which is a copy of the enclosing object
1219 // or contains the address of the enclosing object).
1222 // If the enclosing object was captured by value, just use its
1223 // address. Sign this pointer.
1224 CXXThisValue = ThisFieldLValue.getPointer(*this);
1225 } else {
1226 // Load the lvalue pointed to by the field, since '*this' was captured
1227 // by reference.
1228 CXXThisValue =
1229 EmitLoadOfLValue(ThisFieldLValue, SourceLocation()).getScalarVal();
1230 }
1231 }
1232 for (auto *FD : MD->getParent()->fields()) {
1233 if (FD->hasCapturedVLAType()) {
1234 auto *ExprArg = EmitLoadOfLValue(EmitLValueForLambdaField(FD),
1236 auto VAT = FD->getCapturedVLAType();
1237 VLASizeMap[VAT->getSizeExpr()] = ExprArg;
1238 }
1239 }
1240 } else if (MD->isImplicitObjectMemberFunction()) {
1241 // Not in a lambda; just use 'this' from the method.
1242 // FIXME: Should we generate a new load for each use of 'this'? The
1243 // fast register allocator would be happier...
1244 CXXThisValue = CXXABIThisValue;
1245 }
1246
1247 // Check the 'this' pointer once per function, if it's available.
1248 if (CXXABIThisValue) {
1249 SanitizerSet SkippedChecks;
1250 SkippedChecks.set(SanitizerKind::ObjectSize, true);
1251 QualType ThisTy = MD->getThisType();
1252
1253 // If this is the call operator of a lambda with no captures, it
1254 // may have a static invoker function, which may call this operator with
1255 // a null 'this' pointer.
1257 SkippedChecks.set(SanitizerKind::Null, true);
1258
1260 isa<CXXConstructorDecl>(MD) ? TCK_ConstructorCall : TCK_MemberCall,
1261 Loc, CXXABIThisValue, ThisTy, CXXABIThisAlignment, SkippedChecks);
1262 }
1263 }
1264
1265 // If any of the arguments have a variably modified type, make sure to
1266 // emit the type size, but only if the function is not naked. Naked functions
1267 // have no prolog to run this evaluation.
1268 if (!FD || !FD->hasAttr<NakedAttr>()) {
1269 for (const VarDecl *VD : Args) {
1270 // Dig out the type as written from ParmVarDecls; it's unclear whether
1271 // the standard (C99 6.9.1p10) requires this, but we're following the
1272 // precedent set by gcc.
1273 QualType Ty;
1274 if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
1275 Ty = PVD->getOriginalType();
1276 else
1277 Ty = VD->getType();
1278
1279 if (Ty->isVariablyModifiedType())
1281 }
1282 }
1283 // Emit a location at the end of the prologue.
1284 if (CGDebugInfo *DI = getDebugInfo())
1285 DI->EmitLocation(Builder, StartLoc);
1286 // TODO: Do we need to handle this in two places like we do with
1287 // target-features/target-cpu?
1288 if (CurFuncDecl)
1289 if (const auto *VecWidth = CurFuncDecl->getAttr<MinVectorWidthAttr>())
1290 LargestVectorWidth = VecWidth->getVectorWidth();
1291
1293 ConvergenceTokenStack.push_back(getOrEmitConvergenceEntryToken(CurFn));
1294}
1295
1296void CodeGenFunction::EmitFunctionBody(const Stmt *Body) {
1299 if (const CompoundStmt *S = dyn_cast<CompoundStmt>(Body))
1301 else
1302 EmitStmt(Body);
1303}
1304
1305/// When instrumenting to collect profile data, the counts for some blocks
1306/// such as switch cases need to not include the fall-through counts, so
1307/// emit a branch around the instrumentation code. When not instrumenting,
1308/// this just calls EmitBlock().
1309void CodeGenFunction::EmitBlockWithFallThrough(llvm::BasicBlock *BB,
1310 const Stmt *S) {
1311 llvm::BasicBlock *SkipCountBB = nullptr;
1312 // Do not skip over the instrumentation when single byte coverage mode is
1313 // enabled.
1316 // When instrumenting for profiling, the fallthrough to certain
1317 // statements needs to skip over the instrumentation code so that we
1318 // get an accurate count.
1319 SkipCountBB = createBasicBlock("skipcount");
1320 EmitBranch(SkipCountBB);
1321 }
1322 EmitBlock(BB);
1323 uint64_t CurrentCount = getCurrentProfileCount();
1326 if (SkipCountBB)
1327 EmitBlock(SkipCountBB);
1328}
1329
1330/// Tries to mark the given function nounwind based on the
1331/// non-existence of any throwing calls within it. We believe this is
1332/// lightweight enough to do at -O0.
1333static void TryMarkNoThrow(llvm::Function *F) {
1334 // LLVM treats 'nounwind' on a function as part of the type, so we
1335 // can't do this on functions that can be overwritten.
1336 if (F->isInterposable()) return;
1337
1338 for (llvm::BasicBlock &BB : *F)
1339 for (llvm::Instruction &I : BB)
1340 if (I.mayThrow())
1341 return;
1342
1343 F->setDoesNotThrow();
1344}
1345
1347 FunctionArgList &Args) {
1348 const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
1349 QualType ResTy = FD->getReturnType();
1350
1351 const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
1352 if (MD && MD->isImplicitObjectMemberFunction()) {
1353 if (CGM.getCXXABI().HasThisReturn(GD))
1354 ResTy = MD->getThisType();
1355 else if (CGM.getCXXABI().hasMostDerivedReturn(GD))
1356 ResTy = CGM.getContext().VoidPtrTy;
1357 CGM.getCXXABI().buildThisParam(*this, Args);
1358 }
1359
1360 // The base version of an inheriting constructor whose constructed base is a
1361 // virtual base is not passed any arguments (because it doesn't actually call
1362 // the inherited constructor).
1363 bool PassedParams = true;
1364 if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD))
1365 if (auto Inherited = CD->getInheritedConstructor())
1366 PassedParams =
1367 getTypes().inheritingCtorHasParams(Inherited, GD.getCtorType());
1368
1369 if (PassedParams) {
1370 for (auto *Param : FD->parameters()) {
1371 Args.push_back(Param);
1372 if (!Param->hasAttr<PassObjectSizeAttr>())
1373 continue;
1374
1376 getContext(), Param->getDeclContext(), Param->getLocation(),
1377 /*Id=*/nullptr, getContext().getSizeType(), ImplicitParamKind::Other);
1378 SizeArguments[Param] = Implicit;
1379 Args.push_back(Implicit);
1380 }
1381 }
1382
1383 if (MD && (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)))
1384 CGM.getCXXABI().addImplicitStructorParams(*this, ResTy, Args);
1385
1386 return ResTy;
1387}
1388
1389void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
1390 const CGFunctionInfo &FnInfo) {
1391 assert(Fn && "generating code for null Function");
1392 const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
1393 CurGD = GD;
1394
1395 FunctionArgList Args;
1396 QualType ResTy = BuildFunctionArgList(GD, Args);
1397
1399
1400 if (FD->isInlineBuiltinDeclaration()) {
1401 // When generating code for a builtin with an inline declaration, use a
1402 // mangled name to hold the actual body, while keeping an external
1403 // definition in case the function pointer is referenced somewhere.
1404 std::string FDInlineName = (Fn->getName() + ".inline").str();
1405 llvm::Module *M = Fn->getParent();
1406 llvm::Function *Clone = M->getFunction(FDInlineName);
1407 if (!Clone) {
1408 Clone = llvm::Function::Create(Fn->getFunctionType(),
1409 llvm::GlobalValue::InternalLinkage,
1410 Fn->getAddressSpace(), FDInlineName, M);
1411 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
1412 }
1413 Fn->setLinkage(llvm::GlobalValue::ExternalLinkage);
1414 Fn = Clone;
1415 } else {
1416 // Detect the unusual situation where an inline version is shadowed by a
1417 // non-inline version. In that case we should pick the external one
1418 // everywhere. That's GCC behavior too. Unfortunately, I cannot find a way
1419 // to detect that situation before we reach codegen, so do some late
1420 // replacement.
1421 for (const FunctionDecl *PD = FD->getPreviousDecl(); PD;
1422 PD = PD->getPreviousDecl()) {
1423 if (LLVM_UNLIKELY(PD->isInlineBuiltinDeclaration())) {
1424 std::string FDInlineName = (Fn->getName() + ".inline").str();
1425 llvm::Module *M = Fn->getParent();
1426 if (llvm::Function *Clone = M->getFunction(FDInlineName)) {
1427 Clone->replaceAllUsesWith(Fn);
1428 Clone->eraseFromParent();
1429 }
1430 break;
1431 }
1432 }
1433 }
1434
1435 // Check if we should generate debug info for this function.
1436 if (FD->hasAttr<NoDebugAttr>()) {
1437 // Clear non-distinct debug info that was possibly attached to the function
1438 // due to an earlier declaration without the nodebug attribute
1439 Fn->setSubprogram(nullptr);
1440 // Disable debug info indefinitely for this function
1441 DebugInfo = nullptr;
1442 }
1443
1444 // The function might not have a body if we're generating thunks for a
1445 // function declaration.
1446 SourceRange BodyRange;
1447 if (Stmt *Body = FD->getBody())
1448 BodyRange = Body->getSourceRange();
1449 else
1450 BodyRange = FD->getLocation();
1451 CurEHLocation = BodyRange.getEnd();
1452
1453 // Use the location of the start of the function to determine where
1454 // the function definition is located. By default use the location
1455 // of the declaration as the location for the subprogram. A function
1456 // may lack a declaration in the source code if it is created by code
1457 // gen. (examples: _GLOBAL__I_a, __cxx_global_array_dtor, thunk).
1459
1460 // If this is a function specialization then use the pattern body
1461 // as the location for the function.
1462 if (const FunctionDecl *SpecDecl = FD->getTemplateInstantiationPattern())
1463 if (SpecDecl->hasBody(SpecDecl))
1464 Loc = SpecDecl->getLocation();
1465
1466 Stmt *Body = FD->getBody();
1467
1468 if (Body) {
1469 // Coroutines always emit lifetime markers.
1470 if (isa<CoroutineBodyStmt>(Body))
1471 ShouldEmitLifetimeMarkers = true;
1472
1473 // Initialize helper which will detect jumps which can cause invalid
1474 // lifetime markers.
1475 if (ShouldEmitLifetimeMarkers)
1476 Bypasses.Init(Body);
1477 }
1478
1479 // Emit the standard function prologue.
1480 StartFunction(GD, ResTy, Fn, FnInfo, Args, Loc, BodyRange.getBegin());
1481
1482 // Save parameters for coroutine function.
1483 if (Body && isa_and_nonnull<CoroutineBodyStmt>(Body))
1484 llvm::append_range(FnArgs, FD->parameters());
1485
1486 // Ensure that the function adheres to the forward progress guarantee, which
1487 // is required by certain optimizations.
1488 // In C++11 and up, the attribute will be removed if the body contains a
1489 // trivial empty loop.
1491 CurFn->addFnAttr(llvm::Attribute::MustProgress);
1492
1493 // Generate the body of the function.
1494 PGO.assignRegionCounters(GD, CurFn);
1495 if (isa<CXXDestructorDecl>(FD))
1496 EmitDestructorBody(Args);
1497 else if (isa<CXXConstructorDecl>(FD))
1498 EmitConstructorBody(Args);
1499 else if (getLangOpts().CUDA &&
1500 !getLangOpts().CUDAIsDevice &&
1501 FD->hasAttr<CUDAGlobalAttr>())
1502 CGM.getCUDARuntime().emitDeviceStub(*this, Args);
1503 else if (isa<CXXMethodDecl>(FD) &&
1504 cast<CXXMethodDecl>(FD)->isLambdaStaticInvoker()) {
1505 // The lambda static invoker function is special, because it forwards or
1506 // clones the body of the function call operator (but is actually static).
1507 EmitLambdaStaticInvokeBody(cast<CXXMethodDecl>(FD));
1508 } else if (isa<CXXMethodDecl>(FD) &&
1509 isLambdaCallOperator(cast<CXXMethodDecl>(FD)) &&
1510 !FnInfo.isDelegateCall() &&
1511 cast<CXXMethodDecl>(FD)->getParent()->getLambdaStaticInvoker() &&
1512 hasInAllocaArg(cast<CXXMethodDecl>(FD))) {
1513 // If emitting a lambda with static invoker on X86 Windows, change
1514 // the call operator body.
1515 // Make sure that this is a call operator with an inalloca arg and check
1516 // for delegate call to make sure this is the original call op and not the
1517 // new forwarding function for the static invoker.
1518 EmitLambdaInAllocaCallOpBody(cast<CXXMethodDecl>(FD));
1519 } else if (FD->isDefaulted() && isa<CXXMethodDecl>(FD) &&
1520 (cast<CXXMethodDecl>(FD)->isCopyAssignmentOperator() ||
1521 cast<CXXMethodDecl>(FD)->isMoveAssignmentOperator())) {
1522 // Implicit copy-assignment gets the same special treatment as implicit
1523 // copy-constructors.
1525 } else if (Body) {
1526 EmitFunctionBody(Body);
1527 } else
1528 llvm_unreachable("no definition for emitted function");
1529
1530 // C++11 [stmt.return]p2:
1531 // Flowing off the end of a function [...] results in undefined behavior in
1532 // a value-returning function.
1533 // C11 6.9.1p12:
1534 // If the '}' that terminates a function is reached, and the value of the
1535 // function call is used by the caller, the behavior is undefined.
1537 !FD->getReturnType()->isVoidType() && Builder.GetInsertBlock()) {
1538 bool ShouldEmitUnreachable =
1539 CGM.getCodeGenOpts().StrictReturn ||
1541 if (SanOpts.has(SanitizerKind::Return)) {
1542 SanitizerScope SanScope(this);
1543 llvm::Value *IsFalse = Builder.getFalse();
1544 EmitCheck(std::make_pair(IsFalse, SanitizerKind::Return),
1545 SanitizerHandler::MissingReturn,
1546 EmitCheckSourceLocation(FD->getLocation()), std::nullopt);
1547 } else if (ShouldEmitUnreachable) {
1548 if (CGM.getCodeGenOpts().OptimizationLevel == 0)
1549 EmitTrapCall(llvm::Intrinsic::trap);
1550 }
1551 if (SanOpts.has(SanitizerKind::Return) || ShouldEmitUnreachable) {
1552 Builder.CreateUnreachable();
1553 Builder.ClearInsertionPoint();
1554 }
1555 }
1556
1557 // Emit the standard function epilogue.
1558 FinishFunction(BodyRange.getEnd());
1559
1560 // If we haven't marked the function nothrow through other means, do
1561 // a quick pass now to see if we can.
1562 if (!CurFn->doesNotThrow())
1564}
1565
1566/// ContainsLabel - Return true if the statement contains a label in it. If
1567/// this statement is not executed normally, it not containing a label means
1568/// that we can just remove the code.
1569bool CodeGenFunction::ContainsLabel(const Stmt *S, bool IgnoreCaseStmts) {
1570 // Null statement, not a label!
1571 if (!S) return false;
1572
1573 // If this is a label, we have to emit the code, consider something like:
1574 // if (0) { ... foo: bar(); } goto foo;
1575 //
1576 // TODO: If anyone cared, we could track __label__'s, since we know that you
1577 // can't jump to one from outside their declared region.
1578 if (isa<LabelStmt>(S))
1579 return true;
1580
1581 // If this is a case/default statement, and we haven't seen a switch, we have
1582 // to emit the code.
1583 if (isa<SwitchCase>(S) && !IgnoreCaseStmts)
1584 return true;
1585
1586 // If this is a switch statement, we want to ignore cases below it.
1587 if (isa<SwitchStmt>(S))
1588 IgnoreCaseStmts = true;
1589
1590 // Scan subexpressions for verboten labels.
1591 for (const Stmt *SubStmt : S->children())
1592 if (ContainsLabel(SubStmt, IgnoreCaseStmts))
1593 return true;
1594
1595 return false;
1596}
1597
1598/// containsBreak - Return true if the statement contains a break out of it.
1599/// If the statement (recursively) contains a switch or loop with a break
1600/// inside of it, this is fine.
1601bool CodeGenFunction::containsBreak(const Stmt *S) {
1602 // Null statement, not a label!
1603 if (!S) return false;
1604
1605 // If this is a switch or loop that defines its own break scope, then we can
1606 // include it and anything inside of it.
1607 if (isa<SwitchStmt>(S) || isa<WhileStmt>(S) || isa<DoStmt>(S) ||
1608 isa<ForStmt>(S))
1609 return false;
1610
1611 if (isa<BreakStmt>(S))
1612 return true;
1613
1614 // Scan subexpressions for verboten breaks.
1615 for (const Stmt *SubStmt : S->children())
1616 if (containsBreak(SubStmt))
1617 return true;
1618
1619 return false;
1620}
1621
1623 if (!S) return false;
1624
1625 // Some statement kinds add a scope and thus never add a decl to the current
1626 // scope. Note, this list is longer than the list of statements that might
1627 // have an unscoped decl nested within them, but this way is conservatively
1628 // correct even if more statement kinds are added.
1629 if (isa<IfStmt>(S) || isa<SwitchStmt>(S) || isa<WhileStmt>(S) ||
1630 isa<DoStmt>(S) || isa<ForStmt>(S) || isa<CompoundStmt>(S) ||
1631 isa<CXXForRangeStmt>(S) || isa<CXXTryStmt>(S) ||
1632 isa<ObjCForCollectionStmt>(S) || isa<ObjCAtTryStmt>(S))
1633 return false;
1634
1635 if (isa<DeclStmt>(S))
1636 return true;
1637
1638 for (const Stmt *SubStmt : S->children())
1639 if (mightAddDeclToScope(SubStmt))
1640 return true;
1641
1642 return false;
1643}
1644
1645/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
1646/// to a constant, or if it does but contains a label, return false. If it
1647/// constant folds return true and set the boolean result in Result.
1649 bool &ResultBool,
1650 bool AllowLabels) {
1651 // If MC/DC is enabled, disable folding so that we can instrument all
1652 // conditions to yield complete test vectors. We still keep track of
1653 // folded conditions during region mapping and visualization.
1654 if (!AllowLabels && CGM.getCodeGenOpts().hasProfileClangInstr() &&
1655 CGM.getCodeGenOpts().MCDCCoverage)
1656 return false;
1657
1658 llvm::APSInt ResultInt;
1659 if (!ConstantFoldsToSimpleInteger(Cond, ResultInt, AllowLabels))
1660 return false;
1661
1662 ResultBool = ResultInt.getBoolValue();
1663 return true;
1664}
1665
1666/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
1667/// to a constant, or if it does but contains a label, return false. If it
1668/// constant folds return true and set the folded value.
1670 llvm::APSInt &ResultInt,
1671 bool AllowLabels) {
1672 // FIXME: Rename and handle conversion of other evaluatable things
1673 // to bool.
1675 if (!Cond->EvaluateAsInt(Result, getContext()))
1676 return false; // Not foldable, not integer or not fully evaluatable.
1677
1678 llvm::APSInt Int = Result.Val.getInt();
1679 if (!AllowLabels && CodeGenFunction::ContainsLabel(Cond))
1680 return false; // Contains a label.
1681
1682 ResultInt = Int;
1683 return true;
1684}
1685
1686/// Strip parentheses and simplistic logical-NOT operators.
1687const Expr *CodeGenFunction::stripCond(const Expr *C) {
1688 while (const UnaryOperator *Op = dyn_cast<UnaryOperator>(C->IgnoreParens())) {
1689 if (Op->getOpcode() != UO_LNot)
1690 break;
1691 C = Op->getSubExpr();
1692 }
1693 return C->IgnoreParens();
1694}
1695
1696/// Determine whether the given condition is an instrumentable condition
1697/// (i.e. no "&&" or "||").
1699 const BinaryOperator *BOp = dyn_cast<BinaryOperator>(stripCond(C));
1700 return (!BOp || !BOp->isLogicalOp());
1701}
1702
1703/// EmitBranchToCounterBlock - Emit a conditional branch to a new block that
1704/// increments a profile counter based on the semantics of the given logical
1705/// operator opcode. This is used to instrument branch condition coverage for
1706/// logical operators.
1708 const Expr *Cond, BinaryOperator::Opcode LOp, llvm::BasicBlock *TrueBlock,
1709 llvm::BasicBlock *FalseBlock, uint64_t TrueCount /* = 0 */,
1710 Stmt::Likelihood LH /* =None */, const Expr *CntrIdx /* = nullptr */) {
1711 // If not instrumenting, just emit a branch.
1712 bool InstrumentRegions = CGM.getCodeGenOpts().hasProfileClangInstr();
1713 if (!InstrumentRegions || !isInstrumentedCondition(Cond))
1714 return EmitBranchOnBoolExpr(Cond, TrueBlock, FalseBlock, TrueCount, LH);
1715
1716 llvm::BasicBlock *ThenBlock = nullptr;
1717 llvm::BasicBlock *ElseBlock = nullptr;
1718 llvm::BasicBlock *NextBlock = nullptr;
1719
1720 // Create the block we'll use to increment the appropriate counter.
1721 llvm::BasicBlock *CounterIncrBlock = createBasicBlock("lop.rhscnt");
1722
1723 // Set block pointers according to Logical-AND (BO_LAnd) semantics. This
1724 // means we need to evaluate the condition and increment the counter on TRUE:
1725 //
1726 // if (Cond)
1727 // goto CounterIncrBlock;
1728 // else
1729 // goto FalseBlock;
1730 //
1731 // CounterIncrBlock:
1732 // Counter++;
1733 // goto TrueBlock;
1734
1735 if (LOp == BO_LAnd) {
1736 ThenBlock = CounterIncrBlock;
1737 ElseBlock = FalseBlock;
1738 NextBlock = TrueBlock;
1739 }
1740
1741 // Set block pointers according to Logical-OR (BO_LOr) semantics. This means
1742 // we need to evaluate the condition and increment the counter on FALSE:
1743 //
1744 // if (Cond)
1745 // goto TrueBlock;
1746 // else
1747 // goto CounterIncrBlock;
1748 //
1749 // CounterIncrBlock:
1750 // Counter++;
1751 // goto FalseBlock;
1752
1753 else if (LOp == BO_LOr) {
1754 ThenBlock = TrueBlock;
1755 ElseBlock = CounterIncrBlock;
1756 NextBlock = FalseBlock;
1757 } else {
1758 llvm_unreachable("Expected Opcode must be that of a Logical Operator");
1759 }
1760
1761 // Emit Branch based on condition.
1762 EmitBranchOnBoolExpr(Cond, ThenBlock, ElseBlock, TrueCount, LH);
1763
1764 // Emit the block containing the counter increment(s).
1765 EmitBlock(CounterIncrBlock);
1766
1767 // Increment corresponding counter; if index not provided, use Cond as index.
1768 incrementProfileCounter(CntrIdx ? CntrIdx : Cond);
1769
1770 // Go to the next block.
1771 EmitBranch(NextBlock);
1772}
1773
1774/// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an if
1775/// statement) to the specified blocks. Based on the condition, this might try
1776/// to simplify the codegen of the conditional based on the branch.
1777/// \param LH The value of the likelihood attribute on the True branch.
1778/// \param ConditionalOp Used by MC/DC code coverage to track the result of the
1779/// ConditionalOperator (ternary) through a recursive call for the operator's
1780/// LHS and RHS nodes.
1782 const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock,
1783 uint64_t TrueCount, Stmt::Likelihood LH, const Expr *ConditionalOp) {
1784 Cond = Cond->IgnoreParens();
1785
1786 if (const BinaryOperator *CondBOp = dyn_cast<BinaryOperator>(Cond)) {
1787 // Handle X && Y in a condition.
1788 if (CondBOp->getOpcode() == BO_LAnd) {
1789 MCDCLogOpStack.push_back(CondBOp);
1790
1791 // If we have "1 && X", simplify the code. "0 && X" would have constant
1792 // folded if the case was simple enough.
1793 bool ConstantBool = false;
1794 if (ConstantFoldsToSimpleInteger(CondBOp->getLHS(), ConstantBool) &&
1795 ConstantBool) {
1796 // br(1 && X) -> br(X).
1797 incrementProfileCounter(CondBOp);
1798 EmitBranchToCounterBlock(CondBOp->getRHS(), BO_LAnd, TrueBlock,
1799 FalseBlock, TrueCount, LH);
1800 MCDCLogOpStack.pop_back();
1801 return;
1802 }
1803
1804 // If we have "X && 1", simplify the code to use an uncond branch.
1805 // "X && 0" would have been constant folded to 0.
1806 if (ConstantFoldsToSimpleInteger(CondBOp->getRHS(), ConstantBool) &&
1807 ConstantBool) {
1808 // br(X && 1) -> br(X).
1809 EmitBranchToCounterBlock(CondBOp->getLHS(), BO_LAnd, TrueBlock,
1810 FalseBlock, TrueCount, LH, CondBOp);
1811 MCDCLogOpStack.pop_back();
1812 return;
1813 }
1814
1815 // Emit the LHS as a conditional. If the LHS conditional is false, we
1816 // want to jump to the FalseBlock.
1817 llvm::BasicBlock *LHSTrue = createBasicBlock("land.lhs.true");
1818 // The counter tells us how often we evaluate RHS, and all of TrueCount
1819 // can be propagated to that branch.
1820 uint64_t RHSCount = getProfileCount(CondBOp->getRHS());
1821
1822 ConditionalEvaluation eval(*this);
1823 {
1824 ApplyDebugLocation DL(*this, Cond);
1825 // Propagate the likelihood attribute like __builtin_expect
1826 // __builtin_expect(X && Y, 1) -> X and Y are likely
1827 // __builtin_expect(X && Y, 0) -> only Y is unlikely
1828 EmitBranchOnBoolExpr(CondBOp->getLHS(), LHSTrue, FalseBlock, RHSCount,
1829 LH == Stmt::LH_Unlikely ? Stmt::LH_None : LH);
1830 EmitBlock(LHSTrue);
1831 }
1832
1833 incrementProfileCounter(CondBOp);
1834 setCurrentProfileCount(getProfileCount(CondBOp->getRHS()));
1835
1836 // Any temporaries created here are conditional.
1837 eval.begin(*this);
1838 EmitBranchToCounterBlock(CondBOp->getRHS(), BO_LAnd, TrueBlock,
1839 FalseBlock, TrueCount, LH);
1840 eval.end(*this);
1841 MCDCLogOpStack.pop_back();
1842 return;
1843 }
1844
1845 if (CondBOp->getOpcode() == BO_LOr) {
1846 MCDCLogOpStack.push_back(CondBOp);
1847
1848 // If we have "0 || X", simplify the code. "1 || X" would have constant
1849 // folded if the case was simple enough.
1850 bool ConstantBool = false;
1851 if (ConstantFoldsToSimpleInteger(CondBOp->getLHS(), ConstantBool) &&
1852 !ConstantBool) {
1853 // br(0 || X) -> br(X).
1854 incrementProfileCounter(CondBOp);
1855 EmitBranchToCounterBlock(CondBOp->getRHS(), BO_LOr, TrueBlock,
1856 FalseBlock, TrueCount, LH);
1857 MCDCLogOpStack.pop_back();
1858 return;
1859 }
1860
1861 // If we have "X || 0", simplify the code to use an uncond branch.
1862 // "X || 1" would have been constant folded to 1.
1863 if (ConstantFoldsToSimpleInteger(CondBOp->getRHS(), ConstantBool) &&
1864 !ConstantBool) {
1865 // br(X || 0) -> br(X).
1866 EmitBranchToCounterBlock(CondBOp->getLHS(), BO_LOr, TrueBlock,
1867 FalseBlock, TrueCount, LH, CondBOp);
1868 MCDCLogOpStack.pop_back();
1869 return;
1870 }
1871 // Emit the LHS as a conditional. If the LHS conditional is true, we
1872 // want to jump to the TrueBlock.
1873 llvm::BasicBlock *LHSFalse = createBasicBlock("lor.lhs.false");
1874 // We have the count for entry to the RHS and for the whole expression
1875 // being true, so we can divy up True count between the short circuit and
1876 // the RHS.
1877 uint64_t LHSCount =
1878 getCurrentProfileCount() - getProfileCount(CondBOp->getRHS());
1879 uint64_t RHSCount = TrueCount - LHSCount;
1880
1881 ConditionalEvaluation eval(*this);
1882 {
1883 // Propagate the likelihood attribute like __builtin_expect
1884 // __builtin_expect(X || Y, 1) -> only Y is likely
1885 // __builtin_expect(X || Y, 0) -> both X and Y are unlikely
1886 ApplyDebugLocation DL(*this, Cond);
1887 EmitBranchOnBoolExpr(CondBOp->getLHS(), TrueBlock, LHSFalse, LHSCount,
1888 LH == Stmt::LH_Likely ? Stmt::LH_None : LH);
1889 EmitBlock(LHSFalse);
1890 }
1891
1892 incrementProfileCounter(CondBOp);
1893 setCurrentProfileCount(getProfileCount(CondBOp->getRHS()));
1894
1895 // Any temporaries created here are conditional.
1896 eval.begin(*this);
1897 EmitBranchToCounterBlock(CondBOp->getRHS(), BO_LOr, TrueBlock, FalseBlock,
1898 RHSCount, LH);
1899
1900 eval.end(*this);
1901 MCDCLogOpStack.pop_back();
1902 return;
1903 }
1904 }
1905
1906 if (const UnaryOperator *CondUOp = dyn_cast<UnaryOperator>(Cond)) {
1907 // br(!x, t, f) -> br(x, f, t)
1908 // Avoid doing this optimization when instrumenting a condition for MC/DC.
1909 // LNot is taken as part of the condition for simplicity, and changing its
1910 // sense negatively impacts test vector tracking.
1911 bool MCDCCondition = CGM.getCodeGenOpts().hasProfileClangInstr() &&
1912 CGM.getCodeGenOpts().MCDCCoverage &&
1914 if (CondUOp->getOpcode() == UO_LNot && !MCDCCondition) {
1915 // Negate the count.
1916 uint64_t FalseCount = getCurrentProfileCount() - TrueCount;
1917 // The values of the enum are chosen to make this negation possible.
1918 LH = static_cast<Stmt::Likelihood>(-LH);
1919 // Negate the condition and swap the destination blocks.
1920 return EmitBranchOnBoolExpr(CondUOp->getSubExpr(), FalseBlock, TrueBlock,
1921 FalseCount, LH);
1922 }
1923 }
1924
1925 if (const ConditionalOperator *CondOp = dyn_cast<ConditionalOperator>(Cond)) {
1926 // br(c ? x : y, t, f) -> br(c, br(x, t, f), br(y, t, f))
1927 llvm::BasicBlock *LHSBlock = createBasicBlock("cond.true");
1928 llvm::BasicBlock *RHSBlock = createBasicBlock("cond.false");
1929
1930 // The ConditionalOperator itself has no likelihood information for its
1931 // true and false branches. This matches the behavior of __builtin_expect.
1932 ConditionalEvaluation cond(*this);
1933 EmitBranchOnBoolExpr(CondOp->getCond(), LHSBlock, RHSBlock,
1935
1936 // When computing PGO branch weights, we only know the overall count for
1937 // the true block. This code is essentially doing tail duplication of the
1938 // naive code-gen, introducing new edges for which counts are not
1939 // available. Divide the counts proportionally between the LHS and RHS of
1940 // the conditional operator.
1941 uint64_t LHSScaledTrueCount = 0;
1942 if (TrueCount) {
1943 double LHSRatio =
1945 LHSScaledTrueCount = TrueCount * LHSRatio;
1946 }
1947
1948 cond.begin(*this);
1949 EmitBlock(LHSBlock);
1951 {
1952 ApplyDebugLocation DL(*this, Cond);
1953 EmitBranchOnBoolExpr(CondOp->getLHS(), TrueBlock, FalseBlock,
1954 LHSScaledTrueCount, LH, CondOp);
1955 }
1956 cond.end(*this);
1957
1958 cond.begin(*this);
1959 EmitBlock(RHSBlock);
1960 EmitBranchOnBoolExpr(CondOp->getRHS(), TrueBlock, FalseBlock,
1961 TrueCount - LHSScaledTrueCount, LH, CondOp);
1962 cond.end(*this);
1963
1964 return;
1965 }
1966
1967 if (const CXXThrowExpr *Throw = dyn_cast<CXXThrowExpr>(Cond)) {
1968 // Conditional operator handling can give us a throw expression as a
1969 // condition for a case like:
1970 // br(c ? throw x : y, t, f) -> br(c, br(throw x, t, f), br(y, t, f)
1971 // Fold this to:
1972 // br(c, throw x, br(y, t, f))
1973 EmitCXXThrowExpr(Throw, /*KeepInsertionPoint*/false);
1974 return;
1975 }
1976
1977 // Emit the code with the fully general case.
1978 llvm::Value *CondV;
1979 {
1980 ApplyDebugLocation DL(*this, Cond);
1981 CondV = EvaluateExprAsBool(Cond);
1982 }
1983
1984 // If not at the top of the logical operator nest, update MCDC temp with the
1985 // boolean result of the evaluated condition.
1986 if (!MCDCLogOpStack.empty()) {
1987 const Expr *MCDCBaseExpr = Cond;
1988 // When a nested ConditionalOperator (ternary) is encountered in a boolean
1989 // expression, MC/DC tracks the result of the ternary, and this is tied to
1990 // the ConditionalOperator expression and not the ternary's LHS or RHS. If
1991 // this is the case, the ConditionalOperator expression is passed through
1992 // the ConditionalOp parameter and then used as the MCDC base expression.
1993 if (ConditionalOp)
1994 MCDCBaseExpr = ConditionalOp;
1995
1996 maybeUpdateMCDCCondBitmap(MCDCBaseExpr, CondV);
1997 }
1998
1999 llvm::MDNode *Weights = nullptr;
2000 llvm::MDNode *Unpredictable = nullptr;
2001
2002 // If the branch has a condition wrapped by __builtin_unpredictable,
2003 // create metadata that specifies that the branch is unpredictable.
2004 // Don't bother if not optimizing because that metadata would not be used.
2005 auto *Call = dyn_cast<CallExpr>(Cond->IgnoreImpCasts());
2006 if (Call && CGM.getCodeGenOpts().OptimizationLevel != 0) {
2007 auto *FD = dyn_cast_or_null<FunctionDecl>(Call->getCalleeDecl());
2008 if (FD && FD->getBuiltinID() == Builtin::BI__builtin_unpredictable) {
2009 llvm::MDBuilder MDHelper(getLLVMContext());
2010 Unpredictable = MDHelper.createUnpredictable();
2011 }
2012 }
2013
2014 // If there is a Likelihood knowledge for the cond, lower it.
2015 // Note that if not optimizing this won't emit anything.
2016 llvm::Value *NewCondV = emitCondLikelihoodViaExpectIntrinsic(CondV, LH);
2017 if (CondV != NewCondV)
2018 CondV = NewCondV;
2019 else {
2020 // Otherwise, lower profile counts. Note that we do this even at -O0.
2021 uint64_t CurrentCount = std::max(getCurrentProfileCount(), TrueCount);
2022 Weights = createProfileWeights(TrueCount, CurrentCount - TrueCount);
2023 }
2024
2025 Builder.CreateCondBr(CondV, TrueBlock, FalseBlock, Weights, Unpredictable);
2026}
2027
2028/// ErrorUnsupported - Print out an error that codegen doesn't support the
2029/// specified stmt yet.
2030void CodeGenFunction::ErrorUnsupported(const Stmt *S, const char *Type) {
2032}
2033
2034/// emitNonZeroVLAInit - Emit the "zero" initialization of a
2035/// variable-length array whose elements have a non-zero bit-pattern.
2036///
2037/// \param baseType the inner-most element type of the array
2038/// \param src - a char* pointing to the bit-pattern for a single
2039/// base element of the array
2040/// \param sizeInChars - the total size of the VLA, in chars
2042 Address dest, Address src,
2043 llvm::Value *sizeInChars) {
2045
2046 CharUnits baseSize = CGF.getContext().getTypeSizeInChars(baseType);
2047 llvm::Value *baseSizeInChars
2048 = llvm::ConstantInt::get(CGF.IntPtrTy, baseSize.getQuantity());
2049
2050 Address begin = dest.withElementType(CGF.Int8Ty);
2051 llvm::Value *end = Builder.CreateInBoundsGEP(begin.getElementType(),
2052 begin.emitRawPointer(CGF),
2053 sizeInChars, "vla.end");
2054
2055 llvm::BasicBlock *originBB = CGF.Builder.GetInsertBlock();
2056 llvm::BasicBlock *loopBB = CGF.createBasicBlock("vla-init.loop");
2057 llvm::BasicBlock *contBB = CGF.createBasicBlock("vla-init.cont");
2058
2059 // Make a loop over the VLA. C99 guarantees that the VLA element
2060 // count must be nonzero.
2061 CGF.EmitBlock(loopBB);
2062
2063 llvm::PHINode *cur = Builder.CreatePHI(begin.getType(), 2, "vla.cur");
2064 cur->addIncoming(begin.emitRawPointer(CGF), originBB);
2065
2066 CharUnits curAlign =
2067 dest.getAlignment().alignmentOfArrayElement(baseSize);
2068
2069 // memcpy the individual element bit-pattern.
2070 Builder.CreateMemCpy(Address(cur, CGF.Int8Ty, curAlign), src, baseSizeInChars,
2071 /*volatile*/ false);
2072
2073 // Go to the next element.
2074 llvm::Value *next =
2075 Builder.CreateInBoundsGEP(CGF.Int8Ty, cur, baseSizeInChars, "vla.next");
2076
2077 // Leave if that's the end of the VLA.
2078 llvm::Value *done = Builder.CreateICmpEQ(next, end, "vla-init.isdone");
2079 Builder.CreateCondBr(done, contBB, loopBB);
2080 cur->addIncoming(next, loopBB);
2081
2082 CGF.EmitBlock(contBB);
2083}
2084
2085void
2087 // Ignore empty classes in C++.
2088 if (getLangOpts().CPlusPlus) {
2089 if (const RecordType *RT = Ty->getAs<RecordType>()) {
2090 if (cast<CXXRecordDecl>(RT->getDecl())->isEmpty())
2091 return;
2092 }
2093 }
2094
2095 if (DestPtr.getElementType() != Int8Ty)
2096 DestPtr = DestPtr.withElementType(Int8Ty);
2097
2098 // Get size and alignment info for this aggregate.
2100
2101 llvm::Value *SizeVal;
2102 const VariableArrayType *vla;
2103
2104 // Don't bother emitting a zero-byte memset.
2105 if (size.isZero()) {
2106 // But note that getTypeInfo returns 0 for a VLA.
2107 if (const VariableArrayType *vlaType =
2108 dyn_cast_or_null<VariableArrayType>(
2109 getContext().getAsArrayType(Ty))) {
2110 auto VlaSize = getVLASize(vlaType);
2111 SizeVal = VlaSize.NumElts;
2112 CharUnits eltSize = getContext().getTypeSizeInChars(VlaSize.Type);
2113 if (!eltSize.isOne())
2114 SizeVal = Builder.CreateNUWMul(SizeVal, CGM.getSize(eltSize));
2115 vla = vlaType;
2116 } else {
2117 return;
2118 }
2119 } else {
2120 SizeVal = CGM.getSize(size);
2121 vla = nullptr;
2122 }
2123
2124 // If the type contains a pointer to data member we can't memset it to zero.
2125 // Instead, create a null constant and copy it to the destination.
2126 // TODO: there are other patterns besides zero that we can usefully memset,
2127 // like -1, which happens to be the pattern used by member-pointers.
2128 if (!CGM.getTypes().isZeroInitializable(Ty)) {
2129 // For a VLA, emit a single element, then splat that over the VLA.
2130 if (vla) Ty = getContext().getBaseElementType(vla);
2131
2132 llvm::Constant *NullConstant = CGM.EmitNullConstant(Ty);
2133
2134 llvm::GlobalVariable *NullVariable =
2135 new llvm::GlobalVariable(CGM.getModule(), NullConstant->getType(),
2136 /*isConstant=*/true,
2137 llvm::GlobalVariable::PrivateLinkage,
2138 NullConstant, Twine());
2139 CharUnits NullAlign = DestPtr.getAlignment();
2140 NullVariable->setAlignment(NullAlign.getAsAlign());
2141 Address SrcPtr(NullVariable, Builder.getInt8Ty(), NullAlign);
2142
2143 if (vla) return emitNonZeroVLAInit(*this, Ty, DestPtr, SrcPtr, SizeVal);
2144
2145 // Get and call the appropriate llvm.memcpy overload.
2146 Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal, false);
2147 return;
2148 }
2149
2150 // Otherwise, just memset the whole thing to zero. This is legal
2151 // because in LLVM, all default initializers (other than the ones we just
2152 // handled above) are guaranteed to have a bit pattern of all zeros.
2153 Builder.CreateMemSet(DestPtr, Builder.getInt8(0), SizeVal, false);
2154}
2155
2156llvm::BlockAddress *CodeGenFunction::GetAddrOfLabel(const LabelDecl *L) {
2157 // Make sure that there is a block for the indirect goto.
2158 if (!IndirectBranch)
2160
2161 llvm::BasicBlock *BB = getJumpDestForLabel(L).getBlock();
2162
2163 // Make sure the indirect branch includes all of the address-taken blocks.
2164 IndirectBranch->addDestination(BB);
2165 return llvm::BlockAddress::get(CurFn, BB);
2166}
2167
2168llvm::BasicBlock *CodeGenFunction::GetIndirectGotoBlock() {
2169 // If we already made the indirect branch for indirect goto, return its block.
2170 if (IndirectBranch) return IndirectBranch->getParent();
2171
2172 CGBuilderTy TmpBuilder(*this, createBasicBlock("indirectgoto"));
2173
2174 // Create the PHI node that indirect gotos will add entries to.
2175 llvm::Value *DestVal = TmpBuilder.CreatePHI(Int8PtrTy, 0,
2176 "indirect.goto.dest");
2177
2178 // Create the indirect branch instruction.
2179 IndirectBranch = TmpBuilder.CreateIndirectBr(DestVal);
2180 return IndirectBranch->getParent();
2181}
2182
2183/// Computes the length of an array in elements, as well as the base
2184/// element type and a properly-typed first element pointer.
2185llvm::Value *CodeGenFunction::emitArrayLength(const ArrayType *origArrayType,
2186 QualType &baseType,
2187 Address &addr) {
2188 const ArrayType *arrayType = origArrayType;
2189
2190 // If it's a VLA, we have to load the stored size. Note that
2191 // this is the size of the VLA in bytes, not its size in elements.
2192 llvm::Value *numVLAElements = nullptr;
2193 if (isa<VariableArrayType>(arrayType)) {
2194 numVLAElements = getVLASize(cast<VariableArrayType>(arrayType)).NumElts;
2195
2196 // Walk into all VLAs. This doesn't require changes to addr,
2197 // which has type T* where T is the first non-VLA element type.
2198 do {
2199 QualType elementType = arrayType->getElementType();
2200 arrayType = getContext().getAsArrayType(elementType);
2201
2202 // If we only have VLA components, 'addr' requires no adjustment.
2203 if (!arrayType) {
2204 baseType = elementType;
2205 return numVLAElements;
2206 }
2207 } while (isa<VariableArrayType>(arrayType));
2208
2209 // We get out here only if we find a constant array type
2210 // inside the VLA.
2211 }
2212
2213 // We have some number of constant-length arrays, so addr should
2214 // have LLVM type [M x [N x [...]]]*. Build a GEP that walks
2215 // down to the first element of addr.
2217
2218 // GEP down to the array type.
2219 llvm::ConstantInt *zero = Builder.getInt32(0);
2220 gepIndices.push_back(zero);
2221
2222 uint64_t countFromCLAs = 1;
2223 QualType eltType;
2224
2225 llvm::ArrayType *llvmArrayType =
2226 dyn_cast<llvm::ArrayType>(addr.getElementType());
2227 while (llvmArrayType) {
2228 assert(isa<ConstantArrayType>(arrayType));
2229 assert(cast<ConstantArrayType>(arrayType)->getZExtSize() ==
2230 llvmArrayType->getNumElements());
2231
2232 gepIndices.push_back(zero);
2233 countFromCLAs *= llvmArrayType->getNumElements();
2234 eltType = arrayType->getElementType();
2235
2236 llvmArrayType =
2237 dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
2238 arrayType = getContext().getAsArrayType(arrayType->getElementType());
2239 assert((!llvmArrayType || arrayType) &&
2240 "LLVM and Clang types are out-of-synch");
2241 }
2242
2243 if (arrayType) {
2244 // From this point onwards, the Clang array type has been emitted
2245 // as some other type (probably a packed struct). Compute the array
2246 // size, and just emit the 'begin' expression as a bitcast.
2247 while (arrayType) {
2248 countFromCLAs *= cast<ConstantArrayType>(arrayType)->getZExtSize();
2249 eltType = arrayType->getElementType();
2250 arrayType = getContext().getAsArrayType(eltType);
2251 }
2252
2253 llvm::Type *baseType = ConvertType(eltType);
2254 addr = addr.withElementType(baseType);
2255 } else {
2256 // Create the actual GEP.
2258 addr.emitRawPointer(*this),
2259 gepIndices, "array.begin"),
2260 ConvertTypeForMem(eltType), addr.getAlignment());
2261 }
2262
2263 baseType = eltType;
2264
2265 llvm::Value *numElements
2266 = llvm::ConstantInt::get(SizeTy, countFromCLAs);
2267
2268 // If we had any VLA dimensions, factor them in.
2269 if (numVLAElements)
2270 numElements = Builder.CreateNUWMul(numVLAElements, numElements);
2271
2272 return numElements;
2273}
2274
2275CodeGenFunction::VlaSizePair CodeGenFunction::getVLASize(QualType type) {
2277 assert(vla && "type was not a variable array type!");
2278 return getVLASize(vla);
2279}
2280
2281CodeGenFunction::VlaSizePair
2283 // The number of elements so far; always size_t.
2284 llvm::Value *numElements = nullptr;
2285
2286 QualType elementType;
2287 do {
2288 elementType = type->getElementType();
2289 llvm::Value *vlaSize = VLASizeMap[type->getSizeExpr()];
2290 assert(vlaSize && "no size for VLA!");
2291 assert(vlaSize->getType() == SizeTy);
2292
2293 if (!numElements) {
2294 numElements = vlaSize;
2295 } else {
2296 // It's undefined behavior if this wraps around, so mark it that way.
2297 // FIXME: Teach -fsanitize=undefined to trap this.
2298 numElements = Builder.CreateNUWMul(numElements, vlaSize);
2299 }
2300 } while ((type = getContext().getAsVariableArrayType(elementType)));
2301
2302 return { numElements, elementType };
2303}
2304
2305CodeGenFunction::VlaSizePair
2308 assert(vla && "type was not a variable array type!");
2309 return getVLAElements1D(vla);
2310}
2311
2312CodeGenFunction::VlaSizePair
2314 llvm::Value *VlaSize = VLASizeMap[Vla->getSizeExpr()];
2315 assert(VlaSize && "no size for VLA!");
2316 assert(VlaSize->getType() == SizeTy);
2317 return { VlaSize, Vla->getElementType() };
2318}
2319
2321 assert(type->isVariablyModifiedType() &&
2322 "Must pass variably modified type to EmitVLASizes!");
2323
2325
2326 // We're going to walk down into the type and look for VLA
2327 // expressions.
2328 do {
2329 assert(type->isVariablyModifiedType());
2330
2331 const Type *ty = type.getTypePtr();
2332 switch (ty->getTypeClass()) {
2333
2334#define TYPE(Class, Base)
2335#define ABSTRACT_TYPE(Class, Base)
2336#define NON_CANONICAL_TYPE(Class, Base)
2337#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2338#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
2339#include "clang/AST/TypeNodes.inc"
2340 llvm_unreachable("unexpected dependent type!");
2341
2342 // These types are never variably-modified.
2343 case Type::Builtin:
2344 case Type::Complex:
2345 case Type::Vector:
2346 case Type::ExtVector:
2347 case Type::ConstantMatrix:
2348 case Type::Record:
2349 case Type::Enum:
2350 case Type::Using:
2351 case Type::TemplateSpecialization:
2352 case Type::ObjCTypeParam:
2353 case Type::ObjCObject:
2354 case Type::ObjCInterface:
2355 case Type::ObjCObjectPointer:
2356 case Type::BitInt:
2357 llvm_unreachable("type class is never variably-modified!");
2358
2359 case Type::Elaborated:
2360 type = cast<ElaboratedType>(ty)->getNamedType();
2361 break;
2362
2363 case Type::Adjusted:
2364 type = cast<AdjustedType>(ty)->getAdjustedType();
2365 break;
2366
2367 case Type::Decayed:
2368 type = cast<DecayedType>(ty)->getPointeeType();
2369 break;
2370
2371 case Type::Pointer:
2372 type = cast<PointerType>(ty)->getPointeeType();
2373 break;
2374
2375 case Type::BlockPointer:
2376 type = cast<BlockPointerType>(ty)->getPointeeType();
2377 break;
2378
2379 case Type::LValueReference:
2380 case Type::RValueReference:
2381 type = cast<ReferenceType>(ty)->getPointeeType();
2382 break;
2383
2384 case Type::MemberPointer:
2385 type = cast<MemberPointerType>(ty)->getPointeeType();
2386 break;
2387
2388 case Type::ArrayParameter:
2389 case Type::ConstantArray:
2390 case Type::IncompleteArray:
2391 // Losing element qualification here is fine.
2392 type = cast<ArrayType>(ty)->getElementType();
2393 break;
2394
2395 case Type::VariableArray: {
2396 // Losing element qualification here is fine.
2397 const VariableArrayType *vat = cast<VariableArrayType>(ty);
2398
2399 // Unknown size indication requires no size computation.
2400 // Otherwise, evaluate and record it.
2401 if (const Expr *sizeExpr = vat->getSizeExpr()) {
2402 // It's possible that we might have emitted this already,
2403 // e.g. with a typedef and a pointer to it.
2404 llvm::Value *&entry = VLASizeMap[sizeExpr];
2405 if (!entry) {
2406 llvm::Value *size = EmitScalarExpr(sizeExpr);
2407
2408 // C11 6.7.6.2p5:
2409 // If the size is an expression that is not an integer constant
2410 // expression [...] each time it is evaluated it shall have a value
2411 // greater than zero.
2412 if (SanOpts.has(SanitizerKind::VLABound)) {
2413 SanitizerScope SanScope(this);
2414 llvm::Value *Zero = llvm::Constant::getNullValue(size->getType());
2415 clang::QualType SEType = sizeExpr->getType();
2416 llvm::Value *CheckCondition =
2417 SEType->isSignedIntegerType()
2418 ? Builder.CreateICmpSGT(size, Zero)
2419 : Builder.CreateICmpUGT(size, Zero);
2420 llvm::Constant *StaticArgs[] = {
2421 EmitCheckSourceLocation(sizeExpr->getBeginLoc()),
2422 EmitCheckTypeDescriptor(SEType)};
2423 EmitCheck(std::make_pair(CheckCondition, SanitizerKind::VLABound),
2424 SanitizerHandler::VLABoundNotPositive, StaticArgs, size);
2425 }
2426
2427 // Always zexting here would be wrong if it weren't
2428 // undefined behavior to have a negative bound.
2429 // FIXME: What about when size's type is larger than size_t?
2430 entry = Builder.CreateIntCast(size, SizeTy, /*signed*/ false);
2431 }
2432 }
2433 type = vat->getElementType();
2434 break;
2435 }
2436
2437 case Type::FunctionProto:
2438 case Type::FunctionNoProto:
2439 type = cast<FunctionType>(ty)->getReturnType();
2440 break;
2441
2442 case Type::Paren:
2443 case Type::TypeOf:
2444 case Type::UnaryTransform:
2445 case Type::Attributed:
2446 case Type::BTFTagAttributed:
2447 case Type::SubstTemplateTypeParm:
2448 case Type::MacroQualified:
2449 case Type::CountAttributed:
2450 // Keep walking after single level desugaring.
2451 type = type.getSingleStepDesugaredType(getContext());
2452 break;
2453
2454 case Type::Typedef:
2455 case Type::Decltype:
2456 case Type::Auto:
2457 case Type::DeducedTemplateSpecialization:
2458 case Type::PackIndexing:
2459 // Stop walking: nothing to do.
2460 return;
2461
2462 case Type::TypeOfExpr:
2463 // Stop walking: emit typeof expression.
2464 EmitIgnoredExpr(cast<TypeOfExprType>(ty)->getUnderlyingExpr());
2465 return;
2466
2467 case Type::Atomic:
2468 type = cast<AtomicType>(ty)->getValueType();
2469 break;
2470
2471 case Type::Pipe:
2472 type = cast<PipeType>(ty)->getElementType();
2473 break;
2474 }
2475 } while (type->isVariablyModifiedType());
2476}
2477
2479 if (getContext().getBuiltinVaListType()->isArrayType())
2480 return EmitPointerWithAlignment(E);
2481 return EmitLValue(E).getAddress(*this);
2482}
2483
2485 return EmitLValue(E).getAddress(*this);
2486}
2487
2489 const APValue &Init) {
2490 assert(Init.hasValue() && "Invalid DeclRefExpr initializer!");
2491 if (CGDebugInfo *Dbg = getDebugInfo())
2493 Dbg->EmitGlobalVariable(E->getDecl(), Init);
2494}
2495
2496CodeGenFunction::PeepholeProtection
2498 // At the moment, the only aggressive peephole we do in IR gen
2499 // is trunc(zext) folding, but if we add more, we can easily
2500 // extend this protection.
2501
2502 if (!rvalue.isScalar()) return PeepholeProtection();
2503 llvm::Value *value = rvalue.getScalarVal();
2504 if (!isa<llvm::ZExtInst>(value)) return PeepholeProtection();
2505
2506 // Just make an extra bitcast.
2507 assert(HaveInsertPoint());
2508 llvm::Instruction *inst = new llvm::BitCastInst(value, value->getType(), "",
2509 Builder.GetInsertBlock());
2510
2511 PeepholeProtection protection;
2512 protection.Inst = inst;
2513 return protection;
2514}
2515
2516void CodeGenFunction::unprotectFromPeepholes(PeepholeProtection protection) {
2517 if (!protection.Inst) return;
2518
2519 // In theory, we could try to duplicate the peepholes now, but whatever.
2520 protection.Inst->eraseFromParent();
2521}
2522
2523void CodeGenFunction::emitAlignmentAssumption(llvm::Value *PtrValue,
2525 SourceLocation AssumptionLoc,
2526 llvm::Value *Alignment,
2527 llvm::Value *OffsetValue) {
2528 if (Alignment->getType() != IntPtrTy)
2529 Alignment =
2530 Builder.CreateIntCast(Alignment, IntPtrTy, false, "casted.align");
2531 if (OffsetValue && OffsetValue->getType() != IntPtrTy)
2532 OffsetValue =
2533 Builder.CreateIntCast(OffsetValue, IntPtrTy, true, "casted.offset");
2534 llvm::Value *TheCheck = nullptr;
2535 if (SanOpts.has(SanitizerKind::Alignment)) {
2536 llvm::Value *PtrIntValue =
2537 Builder.CreatePtrToInt(PtrValue, IntPtrTy, "ptrint");
2538
2539 if (OffsetValue) {
2540 bool IsOffsetZero = false;
2541 if (const auto *CI = dyn_cast<llvm::ConstantInt>(OffsetValue))
2542 IsOffsetZero = CI->isZero();
2543
2544 if (!IsOffsetZero)
2545 PtrIntValue = Builder.CreateSub(PtrIntValue, OffsetValue, "offsetptr");
2546 }
2547
2548 llvm::Value *Zero = llvm::ConstantInt::get(IntPtrTy, 0);
2549 llvm::Value *Mask =
2550 Builder.CreateSub(Alignment, llvm::ConstantInt::get(IntPtrTy, 1));
2551 llvm::Value *MaskedPtr = Builder.CreateAnd(PtrIntValue, Mask, "maskedptr");
2552 TheCheck = Builder.CreateICmpEQ(MaskedPtr, Zero, "maskcond");
2553 }
2554 llvm::Instruction *Assumption = Builder.CreateAlignmentAssumption(
2555 CGM.getDataLayout(), PtrValue, Alignment, OffsetValue);
2556
2557 if (!SanOpts.has(SanitizerKind::Alignment))
2558 return;
2559 emitAlignmentAssumptionCheck(PtrValue, Ty, Loc, AssumptionLoc, Alignment,
2560 OffsetValue, TheCheck, Assumption);
2561}
2562
2563void CodeGenFunction::emitAlignmentAssumption(llvm::Value *PtrValue,
2564 const Expr *E,
2565 SourceLocation AssumptionLoc,
2566 llvm::Value *Alignment,
2567 llvm::Value *OffsetValue) {
2568 QualType Ty = E->getType();
2570
2571 emitAlignmentAssumption(PtrValue, Ty, Loc, AssumptionLoc, Alignment,
2572 OffsetValue);
2573}
2574
2575llvm::Value *CodeGenFunction::EmitAnnotationCall(llvm::Function *AnnotationFn,
2576 llvm::Value *AnnotatedVal,
2577 StringRef AnnotationStr,
2578 SourceLocation Location,
2579 const AnnotateAttr *Attr) {
2581 AnnotatedVal,
2582 CGM.EmitAnnotationString(AnnotationStr),
2583 CGM.EmitAnnotationUnit(Location),
2584 CGM.EmitAnnotationLineNo(Location),
2585 };
2586 if (Attr)
2587 Args.push_back(CGM.EmitAnnotationArgs(Attr));
2588 return Builder.CreateCall(AnnotationFn, Args);
2589}
2590
2591void CodeGenFunction::EmitVarAnnotations(const VarDecl *D, llvm::Value *V) {
2592 assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
2593 for (const auto *I : D->specific_attrs<AnnotateAttr>())
2594 EmitAnnotationCall(CGM.getIntrinsic(llvm::Intrinsic::var_annotation,
2595 {V->getType(), CGM.ConstGlobalsPtrTy}),
2596 V, I->getAnnotation(), D->getLocation(), I);
2597}
2598
2600 Address Addr) {
2601 assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
2602 llvm::Value *V = Addr.emitRawPointer(*this);
2603 llvm::Type *VTy = V->getType();
2604 auto *PTy = dyn_cast<llvm::PointerType>(VTy);
2605 unsigned AS = PTy ? PTy->getAddressSpace() : 0;
2606 llvm::PointerType *IntrinTy =
2607 llvm::PointerType::get(CGM.getLLVMContext(), AS);
2608 llvm::Function *F = CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation,
2609 {IntrinTy, CGM.ConstGlobalsPtrTy});
2610
2611 for (const auto *I : D->specific_attrs<AnnotateAttr>()) {
2612 // FIXME Always emit the cast inst so we can differentiate between
2613 // annotation on the first field of a struct and annotation on the struct
2614 // itself.
2615 if (VTy != IntrinTy)
2616 V = Builder.CreateBitCast(V, IntrinTy);
2617 V = EmitAnnotationCall(F, V, I->getAnnotation(), D->getLocation(), I);
2618 V = Builder.CreateBitCast(V, VTy);
2619 }
2620
2621 return Address(V, Addr.getElementType(), Addr.getAlignment());
2622}
2623
2625
2627 : CGF(CGF) {
2628 assert(!CGF->IsSanitizerScope);
2629 CGF->IsSanitizerScope = true;
2630}
2631
2633 CGF->IsSanitizerScope = false;
2634}
2635
2636void CodeGenFunction::InsertHelper(llvm::Instruction *I,
2637 const llvm::Twine &Name,
2638 llvm::BasicBlock *BB,
2639 llvm::BasicBlock::iterator InsertPt) const {
2641 if (IsSanitizerScope)
2642 I->setNoSanitizeMetadata();
2643}
2644
2646 llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock *BB,
2647 llvm::BasicBlock::iterator InsertPt) const {
2648 llvm::IRBuilderDefaultInserter::InsertHelper(I, Name, BB, InsertPt);
2649 if (CGF)
2650 CGF->InsertHelper(I, Name, BB, InsertPt);
2651}
2652
2653// Emits an error if we don't have a valid set of target features for the
2654// called function.
2656 const FunctionDecl *TargetDecl) {
2657 // SemaChecking cannot handle below x86 builtins because they have different
2658 // parameter ranges with different TargetAttribute of caller.
2659 if (CGM.getContext().getTargetInfo().getTriple().isX86()) {
2660 unsigned BuiltinID = TargetDecl->getBuiltinID();
2661 if (BuiltinID == X86::BI__builtin_ia32_cmpps ||
2662 BuiltinID == X86::BI__builtin_ia32_cmpss ||
2663 BuiltinID == X86::BI__builtin_ia32_cmppd ||
2664 BuiltinID == X86::BI__builtin_ia32_cmpsd) {
2665 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
2666 llvm::StringMap<bool> TargetFetureMap;
2667 CGM.getContext().getFunctionFeatureMap(TargetFetureMap, FD);
2668 llvm::APSInt Result =
2670 if (Result.getSExtValue() > 7 && !TargetFetureMap.lookup("avx"))
2671 CGM.getDiags().Report(E->getBeginLoc(), diag::err_builtin_needs_feature)
2672 << TargetDecl->getDeclName() << "avx";
2673 }
2674 }
2675 return checkTargetFeatures(E->getBeginLoc(), TargetDecl);
2676}
2677
2678// Emits an error if we don't have a valid set of target features for the
2679// called function.
2681 const FunctionDecl *TargetDecl) {
2682 // Early exit if this is an indirect call.
2683 if (!TargetDecl)
2684 return;
2685
2686 // Get the current enclosing function if it exists. If it doesn't
2687 // we can't check the target features anyhow.
2688 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
2689 if (!FD)
2690 return;
2691
2692 // Grab the required features for the call. For a builtin this is listed in
2693 // the td file with the default cpu, for an always_inline function this is any
2694 // listed cpu and any listed features.
2695 unsigned BuiltinID = TargetDecl->getBuiltinID();
2696 std::string MissingFeature;
2697 llvm::StringMap<bool> CallerFeatureMap;
2698 CGM.getContext().getFunctionFeatureMap(CallerFeatureMap, FD);
2699 // When compiling in HipStdPar mode we have to be conservative in rejecting
2700 // target specific features in the FE, and defer the possible error to the
2701 // AcceleratorCodeSelection pass, wherein iff an unsupported target builtin is
2702 // referenced by an accelerator executable function, we emit an error.
2703 bool IsHipStdPar = getLangOpts().HIPStdPar && getLangOpts().CUDAIsDevice;
2704 if (BuiltinID) {
2705 StringRef FeatureList(CGM.getContext().BuiltinInfo.getRequiredFeatures(BuiltinID));
2707 FeatureList, CallerFeatureMap) && !IsHipStdPar) {
2708 CGM.getDiags().Report(Loc, diag::err_builtin_needs_feature)
2709 << TargetDecl->getDeclName()
2710 << FeatureList;
2711 }
2712 } else if (!TargetDecl->isMultiVersion() &&
2713 TargetDecl->hasAttr<TargetAttr>()) {
2714 // Get the required features for the callee.
2715
2716 const TargetAttr *TD = TargetDecl->getAttr<TargetAttr>();
2719
2720 SmallVector<StringRef, 1> ReqFeatures;
2721 llvm::StringMap<bool> CalleeFeatureMap;
2722 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
2723
2724 for (const auto &F : ParsedAttr.Features) {
2725 if (F[0] == '+' && CalleeFeatureMap.lookup(F.substr(1)))
2726 ReqFeatures.push_back(StringRef(F).substr(1));
2727 }
2728
2729 for (const auto &F : CalleeFeatureMap) {
2730 // Only positive features are "required".
2731 if (F.getValue())
2732 ReqFeatures.push_back(F.getKey());
2733 }
2734 if (!llvm::all_of(ReqFeatures, [&](StringRef Feature) {
2735 if (!CallerFeatureMap.lookup(Feature)) {
2736 MissingFeature = Feature.str();
2737 return false;
2738 }
2739 return true;
2740 }) && !IsHipStdPar)
2741 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
2742 << FD->getDeclName() << TargetDecl->getDeclName() << MissingFeature;
2743 } else if (!FD->isMultiVersion() && FD->hasAttr<TargetAttr>()) {
2744 llvm::StringMap<bool> CalleeFeatureMap;
2745 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
2746
2747 for (const auto &F : CalleeFeatureMap) {
2748 if (F.getValue() && (!CallerFeatureMap.lookup(F.getKey()) ||
2749 !CallerFeatureMap.find(F.getKey())->getValue()) &&
2750 !IsHipStdPar)
2751 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
2752 << FD->getDeclName() << TargetDecl->getDeclName() << F.getKey();
2753 }
2754 }
2755}
2756
2757void CodeGenFunction::EmitSanitizerStatReport(llvm::SanitizerStatKind SSK) {
2758 if (!CGM.getCodeGenOpts().SanitizeStats)
2759 return;
2760
2761 llvm::IRBuilder<> IRB(Builder.GetInsertBlock(), Builder.GetInsertPoint());
2762 IRB.SetCurrentDebugLocation(Builder.getCurrentDebugLocation());
2763 CGM.getSanStats().create(IRB, SSK);
2764}
2765
2767 const CGCallee &Callee, SmallVectorImpl<llvm::OperandBundleDef> &Bundles) {
2768 const FunctionProtoType *FP =
2769 Callee.getAbstractInfo().getCalleeFunctionProtoType();
2770 if (FP)
2771 Bundles.emplace_back("kcfi", CGM.CreateKCFITypeId(FP->desugar()));
2772}
2773
2774llvm::Value *CodeGenFunction::FormAArch64ResolverCondition(
2775 const MultiVersionResolverOption &RO) {
2777 for (const StringRef &Feature : RO.Conditions.Features) {
2778 // Optimize the Function Multi Versioning resolver by creating conditions
2779 // only for features that are not enabled in the target. The exception is
2780 // for features whose extension instructions are executed as NOP on targets
2781 // without extension support.
2782 if (!getContext().getTargetInfo().hasFeature(Feature) || Feature == "bti" ||
2783 Feature == "memtag" || Feature == "memtag2" || Feature == "memtag3" ||
2784 Feature == "dgh")
2785 CondFeatures.push_back(Feature);
2786 }
2787 if (!CondFeatures.empty()) {
2788 return EmitAArch64CpuSupports(CondFeatures);
2789 }
2790 return nullptr;
2791}
2792
2793llvm::Value *CodeGenFunction::FormX86ResolverCondition(
2794 const MultiVersionResolverOption &RO) {
2795 llvm::Value *Condition = nullptr;
2796
2797 if (!RO.Conditions.Architecture.empty()) {
2798 StringRef Arch = RO.Conditions.Architecture;
2799 // If arch= specifies an x86-64 micro-architecture level, test the feature
2800 // with __builtin_cpu_supports, otherwise use __builtin_cpu_is.
2801 if (Arch.starts_with("x86-64"))
2802 Condition = EmitX86CpuSupports({Arch});
2803 else
2804 Condition = EmitX86CpuIs(Arch);
2805 }
2806
2807 if (!RO.Conditions.Features.empty()) {
2808 llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Conditions.Features);
2809 Condition =
2810 Condition ? Builder.CreateAnd(Condition, FeatureCond) : FeatureCond;
2811 }
2812 return Condition;
2813}
2814
2816 llvm::Function *Resolver,
2818 llvm::Function *FuncToReturn,
2819 bool SupportsIFunc) {
2820 if (SupportsIFunc) {
2821 Builder.CreateRet(FuncToReturn);
2822 return;
2823 }
2824
2826 llvm::make_pointer_range(Resolver->args()));
2827
2828 llvm::CallInst *Result = Builder.CreateCall(FuncToReturn, Args);
2829 Result->setTailCallKind(llvm::CallInst::TCK_MustTail);
2830
2831 if (Resolver->getReturnType()->isVoidTy())
2832 Builder.CreateRetVoid();
2833 else
2834 Builder.CreateRet(Result);
2835}
2836
2838 llvm::Function *Resolver, ArrayRef<MultiVersionResolverOption> Options) {
2839
2840 llvm::Triple::ArchType ArchType =
2841 getContext().getTargetInfo().getTriple().getArch();
2842
2843 switch (ArchType) {
2844 case llvm::Triple::x86:
2845 case llvm::Triple::x86_64:
2846 EmitX86MultiVersionResolver(Resolver, Options);
2847 return;
2848 case llvm::Triple::aarch64:
2849 EmitAArch64MultiVersionResolver(Resolver, Options);
2850 return;
2851
2852 default:
2853 assert(false && "Only implemented for x86 and AArch64 targets");
2854 }
2855}
2856
2858 llvm::Function *Resolver, ArrayRef<MultiVersionResolverOption> Options) {
2859 assert(!Options.empty() && "No multiversion resolver options found");
2860 assert(Options.back().Conditions.Features.size() == 0 &&
2861 "Default case must be last");
2862 bool SupportsIFunc = getContext().getTargetInfo().supportsIFunc();
2863 assert(SupportsIFunc &&
2864 "Multiversion resolver requires target IFUNC support");
2865 bool AArch64CpuInitialized = false;
2866 llvm::BasicBlock *CurBlock = createBasicBlock("resolver_entry", Resolver);
2867
2868 for (const MultiVersionResolverOption &RO : Options) {
2869 Builder.SetInsertPoint(CurBlock);
2870 llvm::Value *Condition = FormAArch64ResolverCondition(RO);
2871
2872 // The 'default' or 'all features enabled' case.
2873 if (!Condition) {
2874 CreateMultiVersionResolverReturn(CGM, Resolver, Builder, RO.Function,
2875 SupportsIFunc);
2876 return;
2877 }
2878
2879 if (!AArch64CpuInitialized) {
2880 Builder.SetInsertPoint(CurBlock, CurBlock->begin());
2881 EmitAArch64CpuInit();
2882 AArch64CpuInitialized = true;
2883 Builder.SetInsertPoint(CurBlock);
2884 }
2885
2886 llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver);
2887 CGBuilderTy RetBuilder(*this, RetBlock);
2888 CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, RO.Function,
2889 SupportsIFunc);
2890 CurBlock = createBasicBlock("resolver_else", Resolver);
2891 Builder.CreateCondBr(Condition, RetBlock, CurBlock);
2892 }
2893
2894 // If no default, emit an unreachable.
2895 Builder.SetInsertPoint(CurBlock);
2896 llvm::CallInst *TrapCall = EmitTrapCall(llvm::Intrinsic::trap);
2897 TrapCall->setDoesNotReturn();
2898 TrapCall->setDoesNotThrow();
2899 Builder.CreateUnreachable();
2900 Builder.ClearInsertionPoint();
2901}
2902
2904 llvm::Function *Resolver, ArrayRef<MultiVersionResolverOption> Options) {
2905
2906 bool SupportsIFunc = getContext().getTargetInfo().supportsIFunc();
2907
2908 // Main function's basic block.
2909 llvm::BasicBlock *CurBlock = createBasicBlock("resolver_entry", Resolver);
2910 Builder.SetInsertPoint(CurBlock);
2911 EmitX86CpuInit();
2912
2913 for (const MultiVersionResolverOption &RO : Options) {
2914 Builder.SetInsertPoint(CurBlock);
2915 llvm::Value *Condition = FormX86ResolverCondition(RO);
2916
2917 // The 'default' or 'generic' case.
2918 if (!Condition) {
2919 assert(&RO == Options.end() - 1 &&
2920 "Default or Generic case must be last");
2921 CreateMultiVersionResolverReturn(CGM, Resolver, Builder, RO.Function,
2922 SupportsIFunc);
2923 return;
2924 }
2925
2926 llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver);
2927 CGBuilderTy RetBuilder(*this, RetBlock);
2928 CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, RO.Function,
2929 SupportsIFunc);
2930 CurBlock = createBasicBlock("resolver_else", Resolver);
2931 Builder.CreateCondBr(Condition, RetBlock, CurBlock);
2932 }
2933
2934 // If no generic/default, emit an unreachable.
2935 Builder.SetInsertPoint(CurBlock);
2936 llvm::CallInst *TrapCall = EmitTrapCall(llvm::Intrinsic::trap);
2937 TrapCall->setDoesNotReturn();
2938 TrapCall->setDoesNotThrow();
2939 Builder.CreateUnreachable();
2940 Builder.ClearInsertionPoint();
2941}
2942
2943// Loc - where the diagnostic will point, where in the source code this
2944// alignment has failed.
2945// SecondaryLoc - if present (will be present if sufficiently different from
2946// Loc), the diagnostic will additionally point a "Note:" to this location.
2947// It should be the location where the __attribute__((assume_aligned))
2948// was written e.g.
2950 llvm::Value *Ptr, QualType Ty, SourceLocation Loc,
2951 SourceLocation SecondaryLoc, llvm::Value *Alignment,
2952 llvm::Value *OffsetValue, llvm::Value *TheCheck,
2953 llvm::Instruction *Assumption) {
2954 assert(Assumption && isa<llvm::CallInst>(Assumption) &&
2955 cast<llvm::CallInst>(Assumption)->getCalledOperand() ==
2956 llvm::Intrinsic::getDeclaration(
2957 Builder.GetInsertBlock()->getParent()->getParent(),
2958 llvm::Intrinsic::assume) &&
2959 "Assumption should be a call to llvm.assume().");
2960 assert(&(Builder.GetInsertBlock()->back()) == Assumption &&
2961 "Assumption should be the last instruction of the basic block, "
2962 "since the basic block is still being generated.");
2963
2964 if (!SanOpts.has(SanitizerKind::Alignment))
2965 return;
2966
2967 // Don't check pointers to volatile data. The behavior here is implementation-
2968 // defined.
2970 return;
2971
2972 // We need to temorairly remove the assumption so we can insert the
2973 // sanitizer check before it, else the check will be dropped by optimizations.
2974 Assumption->removeFromParent();
2975
2976 {
2977 SanitizerScope SanScope(this);
2978
2979 if (!OffsetValue)
2980 OffsetValue = Builder.getInt1(false); // no offset.
2981
2982 llvm::Constant *StaticData[] = {EmitCheckSourceLocation(Loc),
2983 EmitCheckSourceLocation(SecondaryLoc),
2985 llvm::Value *DynamicData[] = {EmitCheckValue(Ptr),
2986 EmitCheckValue(Alignment),
2987 EmitCheckValue(OffsetValue)};
2988 EmitCheck({std::make_pair(TheCheck, SanitizerKind::Alignment)},
2989 SanitizerHandler::AlignmentAssumption, StaticData, DynamicData);
2990 }
2991
2992 // We are now in the (new, empty) "cont" basic block.
2993 // Reintroduce the assumption.
2994 Builder.Insert(Assumption);
2995 // FIXME: Assumption still has it's original basic block as it's Parent.
2996}
2997
2999 if (CGDebugInfo *DI = getDebugInfo())
3000 return DI->SourceLocToDebugLoc(Location);
3001
3002 return llvm::DebugLoc();
3003}
3004
3005llvm::Value *
3006CodeGenFunction::emitCondLikelihoodViaExpectIntrinsic(llvm::Value *Cond,
3007 Stmt::Likelihood LH) {
3008 switch (LH) {
3009 case Stmt::LH_None:
3010 return Cond;
3011 case Stmt::LH_Likely:
3012 case Stmt::LH_Unlikely:
3013 // Don't generate llvm.expect on -O0 as the backend won't use it for
3014 // anything.
3015 if (CGM.getCodeGenOpts().OptimizationLevel == 0)
3016 return Cond;
3017 llvm::Type *CondTy = Cond->getType();
3018 assert(CondTy->isIntegerTy(1) && "expecting condition to be a boolean");
3019 llvm::Function *FnExpect =
3020 CGM.getIntrinsic(llvm::Intrinsic::expect, CondTy);
3021 llvm::Value *ExpectedValueOfCond =
3022 llvm::ConstantInt::getBool(CondTy, LH == Stmt::LH_Likely);
3023 return Builder.CreateCall(FnExpect, {Cond, ExpectedValueOfCond},
3024 Cond->getName() + ".expval");
3025 }
3026 llvm_unreachable("Unknown Likelihood");
3027}
3028
3029llvm::Value *CodeGenFunction::emitBoolVecConversion(llvm::Value *SrcVec,
3030 unsigned NumElementsDst,
3031 const llvm::Twine &Name) {
3032 auto *SrcTy = cast<llvm::FixedVectorType>(SrcVec->getType());
3033 unsigned NumElementsSrc = SrcTy->getNumElements();
3034 if (NumElementsSrc == NumElementsDst)
3035 return SrcVec;
3036
3037 std::vector<int> ShuffleMask(NumElementsDst, -1);
3038 for (unsigned MaskIdx = 0;
3039 MaskIdx < std::min<>(NumElementsDst, NumElementsSrc); ++MaskIdx)
3040 ShuffleMask[MaskIdx] = MaskIdx;
3041
3042 return Builder.CreateShuffleVector(SrcVec, ShuffleMask, Name);
3043}
Defines the clang::ASTContext interface.
#define V(N, I)
Definition: ASTContext.h:3285
This file provides some common utility functions for processing Lambda related AST Constructs.
StringRef P
Defines enum values for all the target-independent builtin functions.
static void CreateMultiVersionResolverReturn(CodeGenModule &CGM, llvm::Function *Resolver, CGBuilderTy &Builder, llvm::Function *FuncToReturn, bool SupportsIFunc)
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 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
Definition: MachO.h:50
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
Definition: Module.cpp:100
SourceLocation Loc
Definition: SemaObjC.cpp:755
Defines the Objective-C statement AST node classes.
Enumerates target-specific builtins in their own namespaces within namespace clang.
__device__ double
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition: APValue.h:122
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:182
ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const
Parses the target attributes passed in, and returns only the ones that are valid feature names.
CanQualType VoidPtrTy
Definition: ASTContext.h:1118
Builtin::Context & BuiltinInfo
Definition: ASTContext.h:646
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.
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
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
Definition: ASTContext.h:2771
const TargetInfo & getTargetInfo() const
Definition: ASTContext.h:757
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: Type.h:3518
QualType getElementType() const
Definition: Type.h:3530
Attr - This represents one attribute.
Definition: Attr.h:42
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3840
static bool isLogicalOp(Opcode Opc)
Definition: Expr.h:3972
const char * getRequiredFeatures(unsigned ID) const
Definition: Builtins.h:255
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2535
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2060
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
Definition: DeclCXX.cpp:2462
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition: DeclCXX.h:2186
QualType getThisType() const
Return the type of the this pointer.
Definition: DeclCXX.cpp:2565
bool isStatic() const
Definition: DeclCXX.cpp:2186
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
bool isLambda() const
Determine whether this class describes a lambda function object.
Definition: DeclCXX.h:1022
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...
Definition: DeclCXX.cpp:1641
bool isCapturelessLambda() const
Definition: DeclCXX.h:1068
A C++ throw-expression (C++ [except.throw]).
Definition: ExprCXX.h:1202
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2820
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition: Expr.h:3011
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Expr.cpp:1638
CharUnits - This is an opaque type for sizes expressed in character units.
Definition: CharUnits.h:38
bool isZero() const
isZero - Test whether the quantity equals zero.
Definition: CharUnits.h:122
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
Definition: CharUnits.h:189
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Definition: CharUnits.h:185
CharUnits alignmentOfArrayElement(CharUnits elementSize) const
Given that this is the alignment of the first element of an array, return the minimum alignment of an...
Definition: CharUnits.h:214
bool isOne() const
isOne - Test whether the quantity equals one.
Definition: CharUnits.h:125
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.
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
@ 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...
CharUnits getIndirectAlign() const
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition: Address.h:111
static Address invalid()
Definition: Address.h:153
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
Definition: Address.h:220
CharUnits getAlignment() const
Definition: Address.h:166
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Definition: Address.h:184
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
Definition: Address.h:241
bool isValid() const
Definition: Address.h:154
llvm::PointerType * getType() const
Return the type of the pointer value.
Definition: Address.h:176
A scoped helper to set the current debug location to the specified location or preferred location of ...
Definition: CGDebugInfo.h:824
static ApplyDebugLocation CreateDefaultArtificial(CodeGenFunction &CGF, SourceLocation TemporaryLocation)
Apply TemporaryLocation if it is valid.
Definition: CGDebugInfo.h:871
This is an IRBuilder insertion helper that forwards to CodeGenFunction::InsertHelper,...
Definition: CGBuilder.h:29
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock *BB, llvm::BasicBlock::iterator InsertPt) const override
This forwards to CodeGenFunction::InsertHelper.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Definition: CGBuilder.h:136
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
Definition: CGBuilder.h:397
Address CreateStructGEP(Address Addr, unsigned Index, const llvm::Twine &Name="")
Definition: CGBuilder.h:219
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
Definition: CGBuilder.h:364
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Definition: CGBuilder.h:128
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
Definition: CGBuilder.h:345
virtual void emitDeviceStub(CodeGenFunction &CGF, FunctionArgList &Args)=0
Emits a kernel launch stub.
Implements C++ ABI-specific code generation functions.
Definition: CGCXXABI.h:43
virtual bool hasMostDerivedReturn(GlobalDecl GD) const
Definition: CGCXXABI.h:131
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...
Definition: CGCXXABI.h:123
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.
Definition: CGCXXABI.h:158
void buildThisParam(CodeGenFunction &CGF, FunctionArgList &Params)
Build a parameter variable suitable for 'this'.
Definition: CGCXXABI.cpp:128
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.
Definition: CGCXXABI.h:113
All available information about a concrete callee.
Definition: CGCall.h:62
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
Definition: CGDebugInfo.h:55
CGFunctionInfo - Class to encapsulate the information about a function definition.
bool isReturnsRetained() const
In ARC, whether this function retains its return value.
CanQualType getReturnType() 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.
CGFPOptionsRAII(CodeGenFunction &CGF, FPOptions FPFeatures)
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void EmitDestructorBody(FunctionArgList &Args)
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 FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
void EmitNullInitialization(Address DestPtr, QualType Ty)
EmitNullInitialization - Generate code to set a value of the given type to null, If the type contains...
GlobalDecl CurGD
CurGD - The GlobalDecl for the current function being compiled.
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts=false)
ContainsLabel - Return true if the statement contains a label in it.
void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount, Stmt::Likelihood LH=Stmt::LH_None, const Expr *ConditionalOp=nullptr)
EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g.
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID)
Emit a call to trap or debugtrap and attach function attribute "trap-func-name" if specified.
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...
void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK)
SanitizerSet SanOpts
Sanitizers enabled for this function.
void unprotectFromPeepholes(PeepholeProtection protection)
void EmitLambdaStaticInvokeBody(const CXXMethodDecl *MD)
bool ShouldInstrumentFunction()
ShouldInstrumentFunction - Return true if the current function should be instrumented with __cyg_prof...
Address EmitCompoundStmtWithoutScope(const CompoundStmt &S, bool GetLast=false, AggValueSlot AVS=AggValueSlot::ignored())
static bool hasScalarEvaluationKind(QualType T)
LValue MakeNaturalAlignPointeeRawAddrLValue(llvm::Value *V, QualType T)
Same as MakeNaturalAlignPointeeAddrLValue except that the pointer is known to be unsigned.
void EmitKCFIOperandBundle(const CGCallee &Callee, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
void emitAlignmentAssumptionCheck(llvm::Value *Ptr, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue, llvm::Value *TheCheck, llvm::Instruction *Assumption)
llvm::BlockAddress * GetAddrOfLabel(const LabelDecl *L)
RawAddress CreateDefaultAlignTempAlloca(llvm::Type *Ty, const Twine &Name="tmp")
CreateDefaultAlignedTempAlloca - This creates an alloca with the default ABI alignment of the given L...
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...
VlaSizePair getVLASize(const VariableArrayType *vla)
Returns an LLVM value that corresponds to the size, in non-variably-sized elements,...
void EmitEndEHSpec(const Decl *D)
EmitEndEHSpec - Emit the end of the exception spec.
bool CurFuncIsThunk
In C++, whether we are code generating a thunk.
void EmitAArch64MultiVersionResolver(llvm::Function *Resolver, ArrayRef< MultiVersionResolverOption > Options)
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack
void EmitVariablyModifiedType(QualType Ty)
EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock *BB, llvm::BasicBlock::iterator InsertPt) const
CGBuilder insert helper.
const LangOptions & getLangOpts() const
void EmitFunctionEpilog(const CGFunctionInfo &FI, bool EmitRetDbgLoc, SourceLocation EndLoc)
EmitFunctionEpilog - Emit the target specific LLVM code to return the given temporary.
llvm::Constant * EmitCheckTypeDescriptor(QualType T)
Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.
llvm::BasicBlock * EHResumeBlock
EHResumeBlock - Unified block containing a call to llvm.eh.resume.
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
static bool isInstrumentedCondition(const Expr *C)
isInstrumentedCondition - Determine whether the given condition is an instrumentable condition (i....
void EmitX86MultiVersionResolver(llvm::Function *Resolver, ArrayRef< MultiVersionResolverOption > Options)
void EmitFunctionBody(const Stmt *Body)
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.
RValue EmitLoadOfLValue(LValue V, SourceLocation Loc)
EmitLoadOfLValue - Given an expression that represents a value lvalue, this method emits the address ...
@ 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.
void setCurrentProfileCount(uint64_t Count)
Set the profiler's current count.
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
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.
llvm::Type * ConvertTypeForMem(QualType T)
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...
bool AlwaysEmitXRayCustomEvents() const
AlwaysEmitXRayCustomEvents - Return true if we must unconditionally emit XRay custom event handling c...
JumpDest ReturnBlock
ReturnBlock - Unified return block.
void EmitVarAnnotations(const VarDecl *D, llvm::Value *V)
Emit local annotations for the local variable V, declared by D.
static const Expr * stripCond(const Expr *C)
Ignore parentheses and logical-NOT to track conditions consistently.
PeepholeProtection protectFromPeepholes(RValue rvalue)
protectFromPeepholes - Protect a value that we're intending to store to the side, but which will prob...
const TargetInfo & getTarget() const
llvm::DebugLoc SourceLocToDebugLoc(SourceLocation Location)
Converts Location to a DebugLoc, if debug information is enabled.
void EmitFunctionProlog(const CGFunctionInfo &FI, llvm::Function *Fn, const FunctionArgList &Args)
EmitFunctionProlog - Emit the target specific LLVM code to load the arguments for the given function.
Address 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 EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerMask > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
void EmitBlockWithFallThrough(llvm::BasicBlock *BB, const Stmt *S)
bool ShouldSkipSanitizerInstrumentation()
ShouldSkipSanitizerInstrumentation - Return true if the current function should not be instrumented w...
uint64_t getCurrentProfileCount()
Get the profiler's current count.
SmallVector< const BinaryOperator *, 16 > MCDCLogOpStack
Stack to track the Logical Operator recursion nest for MC/DC.
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.
bool HaveInsertPoint() const
HaveInsertPoint - True if an insertion point is defined.
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
void markAsIgnoreThreadCheckingAtRuntime(llvm::Function *Fn)
Annotate the function with an attribute that disables TSan checking at runtime.
void ErrorUnsupported(const Stmt *S, const char *Type)
ErrorUnsupported - Print out an error that codegen doesn't support the specified stmt yet.
Address EmitVAListRef(const Expr *E)
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block,...
void maybeCreateMCDCCondBitmap()
Allocate a temp value on the stack that MCDC can use to track condition results.
SmallVector< llvm::IntrinsicInst *, 4 > ConvergenceTokenStack
Stack to track the controlled convergence tokens.
void emitAlignmentAssumption(llvm::Value *PtrValue, QualType Ty, SourceLocation Loc, SourceLocation AssumptionLoc, llvm::Value *Alignment, llvm::Value *OffsetValue=nullptr)
llvm::Value * emitBoolVecConversion(llvm::Value *SrcVec, unsigned NumElementsDst, const llvm::Twine &Name="")
LValue MakeNaturalAlignRawAddrLValue(llvm::Value *V, QualType T)
bool ShouldXRayInstrumentFunction() const
ShouldXRayInstrument - Return true if the current function should be instrumented with XRay nop sleds...
void EmitStartEHSpec(const Decl *D)
EmitStartEHSpec - Emit the start of the exception spec.
void EmitMultiVersionResolver(llvm::Function *Resolver, ArrayRef< MultiVersionResolverOption > Options)
llvm::Value * EmitCheckValue(llvm::Value *V)
Convert a value into a format suitable for passing to a runtime sanitizer handler.
VlaSizePair getVLAElements1D(const VariableArrayType *vla)
Return the number of elements for a single dimension for the given array type.
bool AlwaysEmitXRayTypedEvents() const
AlwaysEmitXRayTypedEvents - Return true if clang must unconditionally emit XRay typed event handling ...
void EmitConstructorBody(FunctionArgList &Args)
void SetFastMathFlags(FPOptions FPFeatures)
Set the codegen fast-math flags.
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
void maybeUpdateMCDCCondBitmap(const Expr *E, llvm::Value *Val)
Update the MCDC temp value with the condition's evaluated result.
void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl)
void EmitLambdaInAllocaCallOpBody(const CXXMethodDecl *MD)
llvm::SmallVector< char, 256 > LifetimeExtendedCleanupStack
void EmitDeclRefExprDbgValue(const DeclRefExpr *E, const APValue &Init)
void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint=true)
bool ConstantFoldsToSimpleInteger(const Expr *Cond, bool &Result, bool AllowLabels=false)
ConstantFoldsToSimpleInteger - If the specified expression does not fold to a constant,...
Address ReturnValuePointer
ReturnValuePointer - The temporary alloca to hold a pointer to sret.
llvm::ConstantInt * getUBSanFunctionTypeHash(QualType T) const
Return a type hash constant for a function instrumented by -fsanitize=function.
JumpDest getJumpDestForLabel(const LabelDecl *S)
getBasicBlockForLabel - Return the LLVM basicblock that the specified label maps to.
llvm::DenseMap< const ValueDecl *, FieldDecl * > LambdaCaptureFields
bool AutoreleaseResult
In ARC, whether we should autorelease the return value.
llvm::Type * ConvertType(QualType T)
CodeGenTypes & getTypes() const
bool IsSanitizerScope
True if CodeGen currently emits code implementing sanitizer checks.
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T)
llvm::SmallVector< const ParmVarDecl *, 4 > FnArgs
Save Parameter Decl for coroutine.
QualType BuildFunctionArgList(GlobalDecl GD, FunctionArgList &Args)
RawAddress NormalCleanupDest
i32s containing the indexes of the cleanup destinations.
llvm::Value * EvaluateExprAsBool(const Expr *E)
EvaluateExprAsBool - Perform the usual unary conversions on the specified expression and compare the ...
Address EmitMSVAListRef(const Expr *E)
Emit a "reference" to a __builtin_ms_va_list; this is always the value of the expression,...
EHScopeStack::stable_iterator PrologueCleanupDepth
PrologueCleanupDepth - The cleanup depth enclosing all the cleanups associated with the parameters.
static bool mightAddDeclToScope(const Stmt *S)
Determine if the given statement might introduce a declaration into the current scope,...
uint64_t getProfileCount(const Stmt *S)
Get the profiler's count for the given statement.
RawAddress CreateIRTemp(QualType T, const Twine &Name="tmp")
CreateIRTemp - Create a temporary IR object of the given type, with appropriate alignment.
void emitImplicitAssignmentOperatorBody(FunctionArgList &Args)
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
const CGFunctionInfo * CurFnInfo
Address EmitFieldAnnotations(const FieldDecl *D, Address V)
Emit field annotations for the given field & value.
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
void EmitStmt(const Stmt *S, ArrayRef< const Attr * > Attrs=std::nullopt)
EmitStmt - Emit the code for the statement.
void EnsureInsertPoint()
EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.
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 ...
llvm::LLVMContext & getLLVMContext()
bool SawAsmBlock
Whether we processed a Microsoft-style asm block during CodeGen.
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
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.
llvm::Value * EmitAnnotationCall(llvm::Function *AnnotationFn, llvm::Value *AnnotatedVal, StringRef AnnotationStr, SourceLocation Location, const AnnotateAttr *Attr)
Emit an annotation call (intrinsic).
llvm::BasicBlock * GetIndirectGotoBlock()
llvm::DebugLoc EmitReturnBlock()
Emit the unified return block, trying to avoid its emission when possible.
void GenerateCode(GlobalDecl GD, llvm::Function *Fn, const CGFunctionInfo &FnInfo)
LValue EmitLValueForLambdaField(const FieldDecl *Field)
static bool containsBreak(const Stmt *S)
containsBreak - Return true if the statement contains a break out of it.
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
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)
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::Constant * EmitNullConstant(QualType T)
Return the result of value-initializing the given type, i.e.
llvm::ConstantInt * CreateKCFITypeId(QualType T)
Generate a KCFI type identifier for T.
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys=std::nullopt)
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...
Definition: CGCall.cpp:1821
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.
void assignRegionCounters(GlobalDecl GD, llvm::Function *Fn)
Assign counters to regions and configure them for PGO of a given function.
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...
Definition: CGCall.cpp:324
bool isZeroInitializable(QualType T)
IsZeroInitializable - Return whether a type can be zero-initialized (in the C++ sense) with an LLVM z...
llvm::Type * ConvertTypeForMem(QualType T, bool ForBitField=false)
ConvertTypeForMem - Convert type T into a llvm::Type.
stable_iterator stable_begin() const
Create a stable reference to the top of the EH stack.
Definition: EHScopeStack.h:393
bool containsOnlyLifetimeMarkers(stable_iterator Old) const
Definition: CGCleanup.cpp:115
bool empty() const
Determines whether the exception-scopes stack is empty.
Definition: EHScopeStack.h:359
FunctionArgList - Type for representing both the decl and type of parameters to a function.
Definition: CGCall.h:352
LValue - This represents an lvalue references.
Definition: CGValue.h:181
Address getAddress(CodeGenFunction &CGF) const
Definition: CGValue.h:370
llvm::Value * getPointer(CodeGenFunction &CGF) const
Definition: CGValue.h:361
void InsertHelper(llvm::Instruction *I) const
Function called by the CodeGenFunction when an instruction is created.
Definition: CGLoopInfo.cpp:829
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
Definition: CGValue.h:41
bool isScalar() const
Definition: CGValue.h:63
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
Definition: CGValue.h:70
llvm::Value * getPointer() const
Definition: Address.h:65
bool isValid() const
Definition: Address.h:61
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 ...
Definition: TargetInfo.h:89
virtual llvm::Constant * getUBSanFunctionSignature(CodeGen::CodeGenModule &CGM) const
Return a constant used by UBSan as a signature to identify functions possessing type information,...
Definition: TargetInfo.h:218
void Init(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 }.
Definition: Stmt.h:1606
ConditionalOperator - The ?: ternary operator.
Definition: Expr.h:4179
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1260
ValueDecl * getDecl()
Definition: Expr.h:1328
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
T * getAttr() const
Definition: DeclBase.h:579
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:501
Decl * getNonClosureContext()
Find the innermost non-closure ancestor of this declaration, walking up through blocks,...
Definition: DeclBase.cpp:1191
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
Definition: DeclBase.h:565
SourceLocation getLocation() const
Definition: DeclBase.h:445
bool hasAttr() const
Definition: DeclBase.h:583
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1547
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition: Diagnostic.h:916
This represents one expression.
Definition: Expr.h:110
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
Definition: Expr.cpp:3846
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition: Expr.cpp:3055
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
Definition: Expr.cpp:3039
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:277
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
QualType getType() const
Definition: Expr.h:142
ExtVectorType - Extended vector type.
Definition: Type.h:4061
LangOptions::FPExceptionModeKind getExceptionMode() const
Definition: LangOptions.h:861
bool allowFPContractAcrossStatement() const
Definition: LangOptions.h:836
RoundingMode getRoundingMode() const
Definition: LangOptions.h:849
Represents a member of a struct/union/class.
Definition: Decl.h:3057
Represents a function declaration or definition.
Definition: Decl.h:1971
bool isMultiVersion() const
True if this function is considered a multiversioned function.
Definition: Decl.h:2599
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition: Decl.cpp:3236
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
Definition: Decl.cpp:3632
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
Definition: Decl.h:2818
bool usesSEHTry() const
Indicates the function uses __try.
Definition: Decl.h:2480
QualType getReturnType() const
Definition: Decl.h:2754
ArrayRef< ParmVarDecl * > parameters() const
Definition: Decl.h:2683
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
Definition: Decl.cpp:4113
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
Definition: Decl.cpp:3314
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
Definition: Decl.cpp:3449
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
Definition: Decl.h:2390
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
Definition: Decl.cpp:3306
bool isDefaulted() const
Whether this function is defaulted.
Definition: Decl.h:2347
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition: Decl.cpp:3979
Represents a prototype with parameter type info, e.g.
Definition: Type.h:4656
QualType desugar() const
Definition: Type.h:5123
GlobalDecl - represents a global declaration.
Definition: GlobalDecl.h:56
CXXCtorType getCtorType() const
Definition: GlobalDecl.h:105
const Decl * getDecl() const
Definition: GlobalDecl.h:103
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.
Definition: Decl.cpp:5379
Represents the declaration of a label.
Definition: Decl.h:499
FPExceptionModeKind
Possible floating point exception behavior.
Definition: LangOptions.h:276
@ FPE_Strict
Strictly preserve the floating-point exception semantics.
Definition: LangOptions.h:282
@ FPE_MayTrap
Transformations do not cause new exceptions but may hide some.
Definition: LangOptions.h:280
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Definition: LangOptions.h:278
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:461
SanitizerSet Sanitize
Set of enabled sanitizers.
Definition: LangOptions.h:467
RoundingMode getDefaultRoundingMode() const
Definition: LangOptions.h:748
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.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition: Decl.h:315
Represents a parameter to a function.
Definition: Decl.h:1761
ParsedAttr - Represents a syntactic attribute.
Definition: ParsedAttr.h:129
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition: Type.h:3139
@ Forbid
Profiling is forbidden using the noprofile attribute.
Definition: ProfileList.h:37
@ Skip
Profiling is skipped using the skipprofile attribute.
Definition: ProfileList.h:35
@ Allow
Profiling is allowed.
Definition: ProfileList.h:33
A (possibly-)qualified type.
Definition: Type.h:940
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition: Type.h:7443
field_range fields() const
Definition: Decl.h:4374
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:5549
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Definition: Redeclarable.h:204
Encodes a location in the source.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
Definition: Stmt.h:84
StmtClass getStmtClass() const
Definition: Stmt.h:1358
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition: Stmt.cpp:326
Likelihood
The likelihood of a branch being taken.
Definition: Stmt.h:1301
@ LH_Unlikely
Branch has the [[unlikely]] attribute.
Definition: Stmt.h:1302
@ LH_None
No attribute set or branches of the IfStmt have the same attribute.
Definition: Stmt.h:1303
@ LH_Likely
Branch has the [[likely]] attribute.
Definition: Stmt.h:1305
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Definition: TargetCXXABI.h:136
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Definition: TargetInfo.h:1256
bool supportsIFunc() const
Identify whether this target supports IFuncs.
Definition: TargetInfo.h:1488
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
Definition: TargetInfo.h:1327
virtual std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts) const
Returns target-specific min and max values VScale_Range.
Definition: TargetInfo.h:1017
The base class of the type hierarchy.
Definition: Type.h:1813
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.cpp:1871
bool isVoidType() const
Definition: Type.h:7905
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
Definition: Type.cpp:2135
bool isPointerType() const
Definition: Type.h:7612
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition: Type.cpp:695
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition: Type.h:2671
TypeClass getTypeClass() const
Definition: Type.h:2300
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8126
bool isRecordType() const
Definition: Type.h:7706
bool isObjCRetainableType() const
Definition: Type.cpp:4878
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Definition: Type.cpp:4625
bool isFunctionNoProtoType() const
Definition: Type.h:2493
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition: Expr.h:2183
QualType getType() const
Definition: Decl.h:717
Represents a variable declaration or definition.
Definition: Decl.h:918
Represents a C array with a specified size that is not an integer-constant-expression.
Definition: Type.h:3747
Expr * getSizeExpr() const
Definition: Type.h:3766
QualType getElementType() const
Definition: Type.h:3983
Defines the clang::TargetInfo interface.
#define UINT_MAX
Definition: limits.h:64
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
Definition: XRayInstr.h:42
constexpr XRayInstrMask FunctionExit
Definition: XRayInstr.h:40
constexpr XRayInstrMask FunctionEntry
Definition: XRayInstr.h:39
constexpr XRayInstrMask Custom
Definition: XRayInstr.h:41
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
Matches all kinds of arrays.
bool Zero(InterpState &S, CodePtr OpPC)
Definition: Interp.h:1873
The JSON file list parser is used to communicate input to InstallAPI.
@ OpenCL
Definition: LangStandard.h:65
@ CPlusPlus
Definition: LangStandard.h:55
@ NonNull
Values of this type can never be null.
BinaryOperatorKind
@ OMF_initialize
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition: ASTLambda.h:27
@ Result
The result type of a method or function.
const FunctionProtoType * T
llvm::fp::ExceptionBehavior ToConstrainedExceptMD(LangOptions::FPExceptionModeKind Kind)
@ Other
Other implicit parameter.
@ EST_None
no exception specification
@ Implicit
An implicit conversion.
unsigned long uint64_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
cl::opt< bool > EnableSingleByteCoverage
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
EvalResult is a struct with detailed info about an evaluated expression.
Definition: Expr.h:642
Contains information gathered from parsing the contents of TargetAttr.
Definition: TargetInfo.h:57
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
Definition: Sanitizers.h:168
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
Definition: Sanitizers.h:159
SanitizerMask Mask
Bitmask of enabled sanitizers.
Definition: Sanitizers.h:182
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.
Definition: Sanitizers.h:165
XRayInstrMask Mask
Definition: XRayInstr.h:65
bool has(XRayInstrMask K) const
Definition: XRayInstr.h:48