clang 20.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/Instruction.h"
44#include "llvm/IR/IntrinsicInst.h"
45#include "llvm/IR/Intrinsics.h"
46#include "llvm/IR/MDBuilder.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
198static LValue
199makeNaturalAlignAddrLValue(llvm::Value *V, QualType T, bool ForPointeeType,
200 bool MightBeSigned, CodeGenFunction &CGF,
201 KnownNonNull_t IsKnownNonNull = NotKnownNonNull) {
202 LValueBaseInfo BaseInfo;
203 TBAAAccessInfo TBAAInfo;
204 CharUnits Alignment =
205 CGF.CGM.getNaturalTypeAlignment(T, &BaseInfo, &TBAAInfo, ForPointeeType);
206 Address Addr =
207 MightBeSigned
208 ? CGF.makeNaturalAddressForPointer(V, T, Alignment, false, nullptr,
209 nullptr, IsKnownNonNull)
210 : Address(V, CGF.ConvertTypeForMem(T), Alignment, IsKnownNonNull);
211 return CGF.MakeAddrLValue(Addr, T, BaseInfo, TBAAInfo);
212}
213
214LValue
216 KnownNonNull_t IsKnownNonNull) {
217 return ::makeNaturalAlignAddrLValue(V, T, /*ForPointeeType*/ false,
218 /*MightBeSigned*/ true, *this,
219 IsKnownNonNull);
220}
221
222LValue
224 return ::makeNaturalAlignAddrLValue(V, T, /*ForPointeeType*/ true,
225 /*MightBeSigned*/ true, *this);
226}
227
229 QualType T) {
230 return ::makeNaturalAlignAddrLValue(V, T, /*ForPointeeType*/ false,
231 /*MightBeSigned*/ false, *this);
232}
233
235 QualType T) {
236 return ::makeNaturalAlignAddrLValue(V, T, /*ForPointeeType*/ true,
237 /*MightBeSigned*/ false, *this);
238}
239
242}
243
245 return CGM.getTypes().ConvertType(T);
246}
247
249 llvm::Type *LLVMTy) {
250 return CGM.getTypes().convertTypeForLoadStore(ASTTy, LLVMTy);
251}
252
254 type = type.getCanonicalType();
255 while (true) {
256 switch (type->getTypeClass()) {
257#define TYPE(name, parent)
258#define ABSTRACT_TYPE(name, parent)
259#define NON_CANONICAL_TYPE(name, parent) case Type::name:
260#define DEPENDENT_TYPE(name, parent) case Type::name:
261#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(name, parent) case Type::name:
262#include "clang/AST/TypeNodes.inc"
263 llvm_unreachable("non-canonical or dependent type in IR-generation");
264
265 case Type::Auto:
266 case Type::DeducedTemplateSpecialization:
267 llvm_unreachable("undeduced type in IR-generation");
268
269 // Various scalar types.
270 case Type::Builtin:
271 case Type::Pointer:
272 case Type::BlockPointer:
273 case Type::LValueReference:
274 case Type::RValueReference:
275 case Type::MemberPointer:
276 case Type::Vector:
277 case Type::ExtVector:
278 case Type::ConstantMatrix:
279 case Type::FunctionProto:
280 case Type::FunctionNoProto:
281 case Type::Enum:
282 case Type::ObjCObjectPointer:
283 case Type::Pipe:
284 case Type::BitInt:
285 case Type::HLSLAttributedResource:
286 return TEK_Scalar;
287
288 // Complexes.
289 case Type::Complex:
290 return TEK_Complex;
291
292 // Arrays, records, and Objective-C objects.
293 case Type::ConstantArray:
294 case Type::IncompleteArray:
295 case Type::VariableArray:
296 case Type::Record:
297 case Type::ObjCObject:
298 case Type::ObjCInterface:
299 case Type::ArrayParameter:
300 return TEK_Aggregate;
301
302 // We operate on atomic values according to their underlying type.
303 case Type::Atomic:
304 type = cast<AtomicType>(type)->getValueType();
305 continue;
306 }
307 llvm_unreachable("unknown type kind!");
308 }
309}
310
311llvm::DebugLoc CodeGenFunction::EmitReturnBlock() {
312 // For cleanliness, we try to avoid emitting the return block for
313 // simple cases.
314 llvm::BasicBlock *CurBB = Builder.GetInsertBlock();
315
316 if (CurBB) {
317 assert(!CurBB->getTerminator() && "Unexpected terminated block.");
318
319 // We have a valid insert point, reuse it if it is empty or there are no
320 // explicit jumps to the return block.
321 if (CurBB->empty() || ReturnBlock.getBlock()->use_empty()) {
322 ReturnBlock.getBlock()->replaceAllUsesWith(CurBB);
323 delete ReturnBlock.getBlock();
324 ReturnBlock = JumpDest();
325 } else
327 return llvm::DebugLoc();
328 }
329
330 // Otherwise, if the return block is the target of a single direct
331 // branch then we can just put the code in that block instead. This
332 // cleans up functions which started with a unified return block.
333 if (ReturnBlock.getBlock()->hasOneUse()) {
334 llvm::BranchInst *BI =
335 dyn_cast<llvm::BranchInst>(*ReturnBlock.getBlock()->user_begin());
336 if (BI && BI->isUnconditional() &&
337 BI->getSuccessor(0) == ReturnBlock.getBlock()) {
338 // Record/return the DebugLoc of the simple 'return' expression to be used
339 // later by the actual 'ret' instruction.
340 llvm::DebugLoc Loc = BI->getDebugLoc();
341 Builder.SetInsertPoint(BI->getParent());
342 BI->eraseFromParent();
343 delete ReturnBlock.getBlock();
344 ReturnBlock = JumpDest();
345 return Loc;
346 }
347 }
348
349 // FIXME: We are at an unreachable point, there is no reason to emit the block
350 // unless it has uses. However, we still need a place to put the debug
351 // region.end for now.
352
354 return llvm::DebugLoc();
355}
356
357static void EmitIfUsed(CodeGenFunction &CGF, llvm::BasicBlock *BB) {
358 if (!BB) return;
359 if (!BB->use_empty()) {
360 CGF.CurFn->insert(CGF.CurFn->end(), BB);
361 return;
362 }
363 delete BB;
364}
365
367 assert(BreakContinueStack.empty() &&
368 "mismatched push/pop in break/continue stack!");
369 assert(LifetimeExtendedCleanupStack.empty() &&
370 "mismatched push/pop of cleanups in EHStack!");
371 assert(DeferredDeactivationCleanupStack.empty() &&
372 "mismatched activate/deactivate of cleanups!");
373
375 ConvergenceTokenStack.pop_back();
376 assert(ConvergenceTokenStack.empty() &&
377 "mismatched push/pop in convergence stack!");
378 }
379
380 bool OnlySimpleReturnStmts = NumSimpleReturnExprs > 0
381 && NumSimpleReturnExprs == NumReturnExprs
382 && ReturnBlock.getBlock()->use_empty();
383 // Usually the return expression is evaluated before the cleanup
384 // code. If the function contains only a simple return statement,
385 // such as a constant, the location before the cleanup code becomes
386 // the last useful breakpoint in the function, because the simple
387 // return expression will be evaluated after the cleanup code. To be
388 // safe, set the debug location for cleanup code to the location of
389 // the return statement. Otherwise the cleanup code should be at the
390 // end of the function's lexical scope.
391 //
392 // If there are multiple branches to the return block, the branch
393 // instructions will get the location of the return statements and
394 // all will be fine.
395 if (CGDebugInfo *DI = getDebugInfo()) {
396 if (OnlySimpleReturnStmts)
397 DI->EmitLocation(Builder, LastStopPoint);
398 else
399 DI->EmitLocation(Builder, EndLoc);
400 }
401
402 // Pop any cleanups that might have been associated with the
403 // parameters. Do this in whatever block we're currently in; it's
404 // important to do this before we enter the return block or return
405 // edges will be *really* confused.
406 bool HasCleanups = EHStack.stable_begin() != PrologueCleanupDepth;
407 bool HasOnlyLifetimeMarkers =
409 bool EmitRetDbgLoc = !HasCleanups || HasOnlyLifetimeMarkers;
410
411 std::optional<ApplyDebugLocation> OAL;
412 if (HasCleanups) {
413 // Make sure the line table doesn't jump back into the body for
414 // the ret after it's been at EndLoc.
415 if (CGDebugInfo *DI = getDebugInfo()) {
416 if (OnlySimpleReturnStmts)
417 DI->EmitLocation(Builder, EndLoc);
418 else
419 // We may not have a valid end location. Try to apply it anyway, and
420 // fall back to an artificial location if needed.
422 }
423
425 }
426
427 // Emit function epilog (to return).
428 llvm::DebugLoc Loc = EmitReturnBlock();
429
431 if (CGM.getCodeGenOpts().InstrumentFunctions)
432 CurFn->addFnAttr("instrument-function-exit", "__cyg_profile_func_exit");
433 if (CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
434 CurFn->addFnAttr("instrument-function-exit-inlined",
435 "__cyg_profile_func_exit");
436 }
437
438 // Emit debug descriptor for function end.
439 if (CGDebugInfo *DI = getDebugInfo())
440 DI->EmitFunctionEnd(Builder, CurFn);
441
442 // Reset the debug location to that of the simple 'return' expression, if any
443 // rather than that of the end of the function's scope '}'.
444 ApplyDebugLocation AL(*this, Loc);
445 EmitFunctionEpilog(*CurFnInfo, EmitRetDbgLoc, EndLoc);
447
448 assert(EHStack.empty() &&
449 "did not remove all scopes from cleanup stack!");
450
451 // If someone did an indirect goto, emit the indirect goto block at the end of
452 // the function.
453 if (IndirectBranch) {
454 EmitBlock(IndirectBranch->getParent());
455 Builder.ClearInsertionPoint();
456 }
457
458 // If some of our locals escaped, insert a call to llvm.localescape in the
459 // entry block.
460 if (!EscapedLocals.empty()) {
461 // Invert the map from local to index into a simple vector. There should be
462 // no holes.
464 EscapeArgs.resize(EscapedLocals.size());
465 for (auto &Pair : EscapedLocals)
466 EscapeArgs[Pair.second] = Pair.first;
467 llvm::Function *FrameEscapeFn = llvm::Intrinsic::getOrInsertDeclaration(
468 &CGM.getModule(), llvm::Intrinsic::localescape);
469 CGBuilderTy(*this, AllocaInsertPt).CreateCall(FrameEscapeFn, EscapeArgs);
470 }
471
472 // Remove the AllocaInsertPt instruction, which is just a convenience for us.
473 llvm::Instruction *Ptr = AllocaInsertPt;
474 AllocaInsertPt = nullptr;
475 Ptr->eraseFromParent();
476
477 // PostAllocaInsertPt, if created, was lazily created when it was required,
478 // remove it now since it was just created for our own convenience.
479 if (PostAllocaInsertPt) {
480 llvm::Instruction *PostPtr = PostAllocaInsertPt;
481 PostAllocaInsertPt = nullptr;
482 PostPtr->eraseFromParent();
483 }
484
485 // If someone took the address of a label but never did an indirect goto, we
486 // made a zero entry PHI node, which is illegal, zap it now.
487 if (IndirectBranch) {
488 llvm::PHINode *PN = cast<llvm::PHINode>(IndirectBranch->getAddress());
489 if (PN->getNumIncomingValues() == 0) {
490 PN->replaceAllUsesWith(llvm::PoisonValue::get(PN->getType()));
491 PN->eraseFromParent();
492 }
493 }
494
496 EmitIfUsed(*this, TerminateLandingPad);
497 EmitIfUsed(*this, TerminateHandler);
498 EmitIfUsed(*this, UnreachableBlock);
499
500 for (const auto &FuncletAndParent : TerminateFunclets)
501 EmitIfUsed(*this, FuncletAndParent.second);
502
503 if (CGM.getCodeGenOpts().EmitDeclMetadata)
504 EmitDeclMetadata();
505
506 for (const auto &R : DeferredReplacements) {
507 if (llvm::Value *Old = R.first) {
508 Old->replaceAllUsesWith(R.second);
509 cast<llvm::Instruction>(Old)->eraseFromParent();
510 }
511 }
512 DeferredReplacements.clear();
513
514 // Eliminate CleanupDestSlot alloca by replacing it with SSA values and
515 // PHIs if the current function is a coroutine. We don't do it for all
516 // functions as it may result in slight increase in numbers of instructions
517 // if compiled with no optimizations. We do it for coroutine as the lifetime
518 // of CleanupDestSlot alloca make correct coroutine frame building very
519 // difficult.
521 llvm::DominatorTree DT(*CurFn);
522 llvm::PromoteMemToReg(
523 cast<llvm::AllocaInst>(NormalCleanupDest.getPointer()), DT);
525 }
526
527 // Scan function arguments for vector width.
528 for (llvm::Argument &A : CurFn->args())
529 if (auto *VT = dyn_cast<llvm::VectorType>(A.getType()))
530 LargestVectorWidth =
531 std::max((uint64_t)LargestVectorWidth,
532 VT->getPrimitiveSizeInBits().getKnownMinValue());
533
534 // Update vector width based on return type.
535 if (auto *VT = dyn_cast<llvm::VectorType>(CurFn->getReturnType()))
536 LargestVectorWidth =
537 std::max((uint64_t)LargestVectorWidth,
538 VT->getPrimitiveSizeInBits().getKnownMinValue());
539
540 if (CurFnInfo->getMaxVectorWidth() > LargestVectorWidth)
541 LargestVectorWidth = CurFnInfo->getMaxVectorWidth();
542
543 // Add the min-legal-vector-width attribute. This contains the max width from:
544 // 1. min-vector-width attribute used in the source program.
545 // 2. Any builtins used that have a vector width specified.
546 // 3. Values passed in and out of inline assembly.
547 // 4. Width of vector arguments and return types for this function.
548 // 5. Width of vector arguments and return types for functions called by this
549 // function.
550 if (getContext().getTargetInfo().getTriple().isX86())
551 CurFn->addFnAttr("min-legal-vector-width",
552 llvm::utostr(LargestVectorWidth));
553
554 // Add vscale_range attribute if appropriate.
555 std::optional<std::pair<unsigned, unsigned>> VScaleRange =
557 if (VScaleRange) {
558 CurFn->addFnAttr(llvm::Attribute::getWithVScaleRangeArgs(
559 getLLVMContext(), VScaleRange->first, VScaleRange->second));
560 }
561
562 // If we generated an unreachable return block, delete it now.
563 if (ReturnBlock.isValid() && ReturnBlock.getBlock()->use_empty()) {
564 Builder.ClearInsertionPoint();
565 ReturnBlock.getBlock()->eraseFromParent();
566 }
567 if (ReturnValue.isValid()) {
568 auto *RetAlloca =
569 dyn_cast<llvm::AllocaInst>(ReturnValue.emitRawPointer(*this));
570 if (RetAlloca && RetAlloca->use_empty()) {
571 RetAlloca->eraseFromParent();
573 }
574 }
575}
576
577/// ShouldInstrumentFunction - Return true if the current function should be
578/// instrumented with __cyg_profile_func_* calls
580 if (!CGM.getCodeGenOpts().InstrumentFunctions &&
581 !CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining &&
582 !CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
583 return false;
584 if (!CurFuncDecl || CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>())
585 return false;
586 return true;
587}
588
590 if (!CurFuncDecl)
591 return false;
592 return CurFuncDecl->hasAttr<DisableSanitizerInstrumentationAttr>();
593}
594
595/// ShouldXRayInstrument - Return true if the current function should be
596/// instrumented with XRay nop sleds.
598 return CGM.getCodeGenOpts().XRayInstrumentFunctions;
599}
600
601/// AlwaysEmitXRayCustomEvents - Return true if we should emit IR for calls to
602/// the __xray_customevent(...) builtin calls, when doing XRay instrumentation.
604 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
605 (CGM.getCodeGenOpts().XRayAlwaysEmitCustomEvents ||
608}
609
611 return CGM.getCodeGenOpts().XRayInstrumentFunctions &&
612 (CGM.getCodeGenOpts().XRayAlwaysEmitTypedEvents ||
615}
616
617llvm::ConstantInt *
619 // Remove any (C++17) exception specifications, to allow calling e.g. a
620 // noexcept function through a non-noexcept pointer.
621 if (!Ty->isFunctionNoProtoType())
623 std::string Mangled;
624 llvm::raw_string_ostream Out(Mangled);
626 return llvm::ConstantInt::get(
627 CGM.Int32Ty, static_cast<uint32_t>(llvm::xxh3_64bits(Mangled)));
628}
629
630void CodeGenFunction::EmitKernelMetadata(const FunctionDecl *FD,
631 llvm::Function *Fn) {
632 if (!FD->hasAttr<OpenCLKernelAttr>() && !FD->hasAttr<CUDAGlobalAttr>())
633 return;
634
635 llvm::LLVMContext &Context = getLLVMContext();
636
637 CGM.GenKernelArgMetadata(Fn, FD, this);
638
639 if (!(getLangOpts().OpenCL ||
640 (getLangOpts().CUDA &&
641 getContext().getTargetInfo().getTriple().isSPIRV())))
642 return;
643
644 if (const VecTypeHintAttr *A = FD->getAttr<VecTypeHintAttr>()) {
645 QualType HintQTy = A->getTypeHint();
646 const ExtVectorType *HintEltQTy = HintQTy->getAs<ExtVectorType>();
647 bool IsSignedInteger =
648 HintQTy->isSignedIntegerType() ||
649 (HintEltQTy && HintEltQTy->getElementType()->isSignedIntegerType());
650 llvm::Metadata *AttrMDArgs[] = {
651 llvm::ConstantAsMetadata::get(llvm::UndefValue::get(
652 CGM.getTypes().ConvertType(A->getTypeHint()))),
653 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
654 llvm::IntegerType::get(Context, 32),
655 llvm::APInt(32, (uint64_t)(IsSignedInteger ? 1 : 0))))};
656 Fn->setMetadata("vec_type_hint", llvm::MDNode::get(Context, AttrMDArgs));
657 }
658
659 if (const WorkGroupSizeHintAttr *A = FD->getAttr<WorkGroupSizeHintAttr>()) {
660 llvm::Metadata *AttrMDArgs[] = {
661 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())),
662 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())),
663 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))};
664 Fn->setMetadata("work_group_size_hint", llvm::MDNode::get(Context, AttrMDArgs));
665 }
666
667 if (const ReqdWorkGroupSizeAttr *A = FD->getAttr<ReqdWorkGroupSizeAttr>()) {
668 llvm::Metadata *AttrMDArgs[] = {
669 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())),
670 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())),
671 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))};
672 Fn->setMetadata("reqd_work_group_size", llvm::MDNode::get(Context, AttrMDArgs));
673 }
674
675 if (const OpenCLIntelReqdSubGroupSizeAttr *A =
676 FD->getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) {
677 llvm::Metadata *AttrMDArgs[] = {
678 llvm::ConstantAsMetadata::get(Builder.getInt32(A->getSubGroupSize()))};
679 Fn->setMetadata("intel_reqd_sub_group_size",
680 llvm::MDNode::get(Context, AttrMDArgs));
681 }
682}
683
684/// Determine whether the function F ends with a return stmt.
685static bool endsWithReturn(const Decl* F) {
686 const Stmt *Body = nullptr;
687 if (auto *FD = dyn_cast_or_null<FunctionDecl>(F))
688 Body = FD->getBody();
689 else if (auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(F))
690 Body = OMD->getBody();
691
692 if (auto *CS = dyn_cast_or_null<CompoundStmt>(Body)) {
693 auto LastStmt = CS->body_rbegin();
694 if (LastStmt != CS->body_rend())
695 return isa<ReturnStmt>(*LastStmt);
696 }
697 return false;
698}
699
701 if (SanOpts.has(SanitizerKind::Thread)) {
702 Fn->addFnAttr("sanitize_thread_no_checking_at_run_time");
703 Fn->removeFnAttr(llvm::Attribute::SanitizeThread);
704 }
705}
706
707/// Check if the return value of this function requires sanitization.
708bool CodeGenFunction::requiresReturnValueCheck() const {
709 return requiresReturnValueNullabilityCheck() ||
710 (SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) && CurCodeDecl &&
711 CurCodeDecl->getAttr<ReturnsNonNullAttr>());
712}
713
714static bool matchesStlAllocatorFn(const Decl *D, const ASTContext &Ctx) {
715 auto *MD = dyn_cast_or_null<CXXMethodDecl>(D);
716 if (!MD || !MD->getDeclName().getAsIdentifierInfo() ||
717 !MD->getDeclName().getAsIdentifierInfo()->isStr("allocate") ||
718 (MD->getNumParams() != 1 && MD->getNumParams() != 2))
719 return false;
720
721 if (MD->parameters()[0]->getType().getCanonicalType() != Ctx.getSizeType())
722 return false;
723
724 if (MD->getNumParams() == 2) {
725 auto *PT = MD->parameters()[1]->getType()->getAs<PointerType>();
726 if (!PT || !PT->isVoidPointerType() ||
727 !PT->getPointeeType().isConstQualified())
728 return false;
729 }
730
731 return true;
732}
733
734bool CodeGenFunction::isInAllocaArgument(CGCXXABI &ABI, QualType Ty) {
735 const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
736 return RD && ABI.getRecordArgABI(RD) == CGCXXABI::RAA_DirectInMemory;
737}
738
739bool CodeGenFunction::hasInAllocaArg(const CXXMethodDecl *MD) {
740 return getTarget().getTriple().getArch() == llvm::Triple::x86 &&
742 llvm::any_of(MD->parameters(), [&](ParmVarDecl *P) {
743 return isInAllocaArgument(CGM.getCXXABI(), P->getType());
744 });
745}
746
747/// Return the UBSan prologue signature for \p FD if one is available.
748static llvm::Constant *getPrologueSignature(CodeGenModule &CGM,
749 const FunctionDecl *FD) {
750 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD))
751 if (!MD->isStatic())
752 return nullptr;
754}
755
757 llvm::Function *Fn,
758 const CGFunctionInfo &FnInfo,
759 const FunctionArgList &Args,
761 SourceLocation StartLoc) {
762 assert(!CurFn &&
763 "Do not use a CodeGenFunction object for more than one function");
764
765 const Decl *D = GD.getDecl();
766
767 DidCallStackSave = false;
768 CurCodeDecl = D;
769 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
770 if (FD && FD->usesSEHTry())
771 CurSEHParent = GD;
772 CurFuncDecl = (D ? D->getNonClosureContext() : nullptr);
773 FnRetTy = RetTy;
774 CurFn = Fn;
775 CurFnInfo = &FnInfo;
776 assert(CurFn->isDeclaration() && "Function already has body?");
777
778 // If this function is ignored for any of the enabled sanitizers,
779 // disable the sanitizer for the function.
780 do {
781#define SANITIZER(NAME, ID) \
782 if (SanOpts.empty()) \
783 break; \
784 if (SanOpts.has(SanitizerKind::ID)) \
785 if (CGM.isInNoSanitizeList(SanitizerKind::ID, Fn, Loc)) \
786 SanOpts.set(SanitizerKind::ID, false);
787
788#include "clang/Basic/Sanitizers.def"
789#undef SANITIZER
790 } while (false);
791
792 if (D) {
793 const bool SanitizeBounds = SanOpts.hasOneOf(SanitizerKind::Bounds);
794 SanitizerMask no_sanitize_mask;
795 bool NoSanitizeCoverage = false;
796
797 for (auto *Attr : D->specific_attrs<NoSanitizeAttr>()) {
798 no_sanitize_mask |= Attr->getMask();
799 // SanitizeCoverage is not handled by SanOpts.
800 if (Attr->hasCoverage())
801 NoSanitizeCoverage = true;
802 }
803
804 // Apply the no_sanitize* attributes to SanOpts.
805 SanOpts.Mask &= ~no_sanitize_mask;
806 if (no_sanitize_mask & SanitizerKind::Address)
807 SanOpts.set(SanitizerKind::KernelAddress, false);
808 if (no_sanitize_mask & SanitizerKind::KernelAddress)
809 SanOpts.set(SanitizerKind::Address, false);
810 if (no_sanitize_mask & SanitizerKind::HWAddress)
811 SanOpts.set(SanitizerKind::KernelHWAddress, false);
812 if (no_sanitize_mask & SanitizerKind::KernelHWAddress)
813 SanOpts.set(SanitizerKind::HWAddress, false);
814
815 if (SanitizeBounds && !SanOpts.hasOneOf(SanitizerKind::Bounds))
816 Fn->addFnAttr(llvm::Attribute::NoSanitizeBounds);
817
818 if (NoSanitizeCoverage && CGM.getCodeGenOpts().hasSanitizeCoverage())
819 Fn->addFnAttr(llvm::Attribute::NoSanitizeCoverage);
820
821 // Some passes need the non-negated no_sanitize attribute. Pass them on.
823 if (no_sanitize_mask & SanitizerKind::Thread)
824 Fn->addFnAttr("no_sanitize_thread");
825 }
826 }
827
829 CurFn->addFnAttr(llvm::Attribute::DisableSanitizerInstrumentation);
830 } else {
831 // Apply sanitizer attributes to the function.
832 if (SanOpts.hasOneOf(SanitizerKind::Address | SanitizerKind::KernelAddress))
833 Fn->addFnAttr(llvm::Attribute::SanitizeAddress);
834 if (SanOpts.hasOneOf(SanitizerKind::HWAddress |
835 SanitizerKind::KernelHWAddress))
836 Fn->addFnAttr(llvm::Attribute::SanitizeHWAddress);
837 if (SanOpts.has(SanitizerKind::MemtagStack))
838 Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
839 if (SanOpts.has(SanitizerKind::Thread))
840 Fn->addFnAttr(llvm::Attribute::SanitizeThread);
841 if (SanOpts.has(SanitizerKind::Type))
842 Fn->addFnAttr(llvm::Attribute::SanitizeType);
843 if (SanOpts.has(SanitizerKind::NumericalStability))
844 Fn->addFnAttr(llvm::Attribute::SanitizeNumericalStability);
845 if (SanOpts.hasOneOf(SanitizerKind::Memory | SanitizerKind::KernelMemory))
846 Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
847 }
848 if (SanOpts.has(SanitizerKind::SafeStack))
849 Fn->addFnAttr(llvm::Attribute::SafeStack);
850 if (SanOpts.has(SanitizerKind::ShadowCallStack))
851 Fn->addFnAttr(llvm::Attribute::ShadowCallStack);
852
853 if (SanOpts.has(SanitizerKind::Realtime))
854 if (FD && FD->getASTContext().hasAnyFunctionEffects())
855 for (const FunctionEffectWithCondition &Fe : FD->getFunctionEffects()) {
856 if (Fe.Effect.kind() == FunctionEffect::Kind::NonBlocking)
857 Fn->addFnAttr(llvm::Attribute::SanitizeRealtime);
858 else if (Fe.Effect.kind() == FunctionEffect::Kind::Blocking)
859 Fn->addFnAttr(llvm::Attribute::SanitizeRealtimeBlocking);
860 }
861
862 // Apply fuzzing attribute to the function.
863 if (SanOpts.hasOneOf(SanitizerKind::Fuzzer | SanitizerKind::FuzzerNoLink))
864 Fn->addFnAttr(llvm::Attribute::OptForFuzzing);
865
866 // Ignore TSan memory acesses from within ObjC/ObjC++ dealloc, initialize,
867 // .cxx_destruct, __destroy_helper_block_ and all of their calees at run time.
868 if (SanOpts.has(SanitizerKind::Thread)) {
869 if (const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
870 const IdentifierInfo *II = OMD->getSelector().getIdentifierInfoForSlot(0);
871 if (OMD->getMethodFamily() == OMF_dealloc ||
872 OMD->getMethodFamily() == OMF_initialize ||
873 (OMD->getSelector().isUnarySelector() && II->isStr(".cxx_destruct"))) {
875 }
876 }
877 }
878
879 // Ignore unrelated casts in STL allocate() since the allocator must cast
880 // from void* to T* before object initialization completes. Don't match on the
881 // namespace because not all allocators are in std::
882 if (D && SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
884 SanOpts.Mask &= ~SanitizerKind::CFIUnrelatedCast;
885 }
886
887 // Ignore null checks in coroutine functions since the coroutines passes
888 // are not aware of how to move the extra UBSan instructions across the split
889 // coroutine boundaries.
890 if (D && SanOpts.has(SanitizerKind::Null))
891 if (FD && FD->getBody() &&
892 FD->getBody()->getStmtClass() == Stmt::CoroutineBodyStmtClass)
893 SanOpts.Mask &= ~SanitizerKind::Null;
894
895 // Add pointer authentication attributes.
896 const CodeGenOptions &CodeGenOpts = CGM.getCodeGenOpts();
897 if (CodeGenOpts.PointerAuth.ReturnAddresses)
898 Fn->addFnAttr("ptrauth-returns");
899 if (CodeGenOpts.PointerAuth.FunctionPointers)
900 Fn->addFnAttr("ptrauth-calls");
901 if (CodeGenOpts.PointerAuth.AuthTraps)
902 Fn->addFnAttr("ptrauth-auth-traps");
903 if (CodeGenOpts.PointerAuth.IndirectGotos)
904 Fn->addFnAttr("ptrauth-indirect-gotos");
906 Fn->addFnAttr("aarch64-jump-table-hardening");
907
908 // Apply xray attributes to the function (as a string, for now)
909 bool AlwaysXRayAttr = false;
910 if (const auto *XRayAttr = D ? D->getAttr<XRayInstrumentAttr>() : nullptr) {
915 if (XRayAttr->alwaysXRayInstrument() && ShouldXRayInstrumentFunction()) {
916 Fn->addFnAttr("function-instrument", "xray-always");
917 AlwaysXRayAttr = true;
918 }
919 if (XRayAttr->neverXRayInstrument())
920 Fn->addFnAttr("function-instrument", "xray-never");
921 if (const auto *LogArgs = D->getAttr<XRayLogArgsAttr>())
923 Fn->addFnAttr("xray-log-args",
924 llvm::utostr(LogArgs->getArgumentCount()));
925 }
926 } else {
928 Fn->addFnAttr(
929 "xray-instruction-threshold",
930 llvm::itostr(CGM.getCodeGenOpts().XRayInstructionThreshold));
931 }
932
934 if (CGM.getCodeGenOpts().XRayIgnoreLoops)
935 Fn->addFnAttr("xray-ignore-loops");
936
939 Fn->addFnAttr("xray-skip-exit");
940
943 Fn->addFnAttr("xray-skip-entry");
944
945 auto FuncGroups = CGM.getCodeGenOpts().XRayTotalFunctionGroups;
946 if (FuncGroups > 1) {
947 auto FuncName = llvm::ArrayRef<uint8_t>(CurFn->getName().bytes_begin(),
948 CurFn->getName().bytes_end());
949 auto Group = crc32(FuncName) % FuncGroups;
950 if (Group != CGM.getCodeGenOpts().XRaySelectedFunctionGroup &&
951 !AlwaysXRayAttr)
952 Fn->addFnAttr("function-instrument", "xray-never");
953 }
954 }
955
956 if (CGM.getCodeGenOpts().getProfileInstr() != CodeGenOptions::ProfileNone) {
959 Fn->addFnAttr(llvm::Attribute::SkipProfile);
960 break;
962 Fn->addFnAttr(llvm::Attribute::NoProfile);
963 break;
965 break;
966 }
967 }
968
969 unsigned Count, Offset;
970 if (const auto *Attr =
971 D ? D->getAttr<PatchableFunctionEntryAttr>() : nullptr) {
972 Count = Attr->getCount();
973 Offset = Attr->getOffset();
974 } else {
975 Count = CGM.getCodeGenOpts().PatchableFunctionEntryCount;
976 Offset = CGM.getCodeGenOpts().PatchableFunctionEntryOffset;
977 }
978 if (Count && Offset <= Count) {
979 Fn->addFnAttr("patchable-function-entry", std::to_string(Count - Offset));
980 if (Offset)
981 Fn->addFnAttr("patchable-function-prefix", std::to_string(Offset));
982 }
983 // Instruct that functions for COFF/CodeView targets should start with a
984 // patchable instruction, but only on x86/x64. Don't forward this to ARM/ARM64
985 // backends as they don't need it -- instructions on these architectures are
986 // always atomically patchable at runtime.
987 if (CGM.getCodeGenOpts().HotPatch &&
988 getContext().getTargetInfo().getTriple().isX86() &&
989 getContext().getTargetInfo().getTriple().getEnvironment() !=
990 llvm::Triple::CODE16)
991 Fn->addFnAttr("patchable-function", "prologue-short-redirect");
992
993 // Add no-jump-tables value.
994 if (CGM.getCodeGenOpts().NoUseJumpTables)
995 Fn->addFnAttr("no-jump-tables", "true");
996
997 // Add no-inline-line-tables value.
998 if (CGM.getCodeGenOpts().NoInlineLineTables)
999 Fn->addFnAttr("no-inline-line-tables");
1000
1001 // Add profile-sample-accurate value.
1002 if (CGM.getCodeGenOpts().ProfileSampleAccurate)
1003 Fn->addFnAttr("profile-sample-accurate");
1004
1005 if (!CGM.getCodeGenOpts().SampleProfileFile.empty())
1006 Fn->addFnAttr("use-sample-profile");
1007
1008 if (D && D->hasAttr<CFICanonicalJumpTableAttr>())
1009 Fn->addFnAttr("cfi-canonical-jump-table");
1010
1011 if (D && D->hasAttr<NoProfileFunctionAttr>())
1012 Fn->addFnAttr(llvm::Attribute::NoProfile);
1013
1014 if (D && D->hasAttr<HybridPatchableAttr>())
1015 Fn->addFnAttr(llvm::Attribute::HybridPatchable);
1016
1017 if (D) {
1018 // Function attributes take precedence over command line flags.
1019 if (auto *A = D->getAttr<FunctionReturnThunksAttr>()) {
1020 switch (A->getThunkType()) {
1021 case FunctionReturnThunksAttr::Kind::Keep:
1022 break;
1023 case FunctionReturnThunksAttr::Kind::Extern:
1024 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1025 break;
1026 }
1027 } else if (CGM.getCodeGenOpts().FunctionReturnThunks)
1028 Fn->addFnAttr(llvm::Attribute::FnRetThunkExtern);
1029 }
1030
1031 if (FD && (getLangOpts().OpenCL ||
1032 (getLangOpts().CUDA &&
1033 getContext().getTargetInfo().getTriple().isSPIRV()) ||
1034 ((getLangOpts().HIP || getLangOpts().OffloadViaLLVM) &&
1035 getLangOpts().CUDAIsDevice))) {
1036 // Add metadata for a kernel function.
1037 EmitKernelMetadata(FD, Fn);
1038 }
1039
1040 if (FD && FD->hasAttr<ClspvLibclcBuiltinAttr>()) {
1041 Fn->setMetadata("clspv_libclc_builtin",
1042 llvm::MDNode::get(getLLVMContext(), {}));
1043 }
1044
1045 // If we are checking function types, emit a function type signature as
1046 // prologue data.
1047 if (FD && SanOpts.has(SanitizerKind::Function)) {
1048 if (llvm::Constant *PrologueSig = getPrologueSignature(CGM, FD)) {
1049 llvm::LLVMContext &Ctx = Fn->getContext();
1050 llvm::MDBuilder MDB(Ctx);
1051 Fn->setMetadata(
1052 llvm::LLVMContext::MD_func_sanitize,
1053 MDB.createRTTIPointerPrologue(
1054 PrologueSig, getUBSanFunctionTypeHash(FD->getType())));
1055 }
1056 }
1057
1058 // If we're checking nullability, we need to know whether we can check the
1059 // return value. Initialize the flag to 'true' and refine it in EmitParmDecl.
1060 if (SanOpts.has(SanitizerKind::NullabilityReturn)) {
1062 if (Nullability && *Nullability == NullabilityKind::NonNull &&
1063 !FnRetTy->isRecordType()) {
1064 if (!(SanOpts.has(SanitizerKind::ReturnsNonnullAttribute) &&
1065 CurCodeDecl && CurCodeDecl->getAttr<ReturnsNonNullAttr>()))
1066 RetValNullabilityPrecondition =
1067 llvm::ConstantInt::getTrue(getLLVMContext());
1068 }
1069 }
1070
1071 // If we're in C++ mode and the function name is "main", it is guaranteed
1072 // to be norecurse by the standard (3.6.1.3 "The function main shall not be
1073 // used within a program").
1074 //
1075 // OpenCL C 2.0 v2.2-11 s6.9.i:
1076 // Recursion is not supported.
1077 //
1078 // HLSL
1079 // Recursion is not supported.
1080 //
1081 // SYCL v1.2.1 s3.10:
1082 // kernels cannot include RTTI information, exception classes,
1083 // recursive code, virtual functions or make use of C++ libraries that
1084 // are not compiled for the device.
1085 if (FD &&
1086 ((getLangOpts().CPlusPlus && FD->isMain()) || getLangOpts().OpenCL ||
1087 getLangOpts().HLSL || getLangOpts().SYCLIsDevice ||
1088 (getLangOpts().CUDA && FD->hasAttr<CUDAGlobalAttr>())))
1089 Fn->addFnAttr(llvm::Attribute::NoRecurse);
1090
1091 llvm::RoundingMode RM = getLangOpts().getDefaultRoundingMode();
1092 llvm::fp::ExceptionBehavior FPExceptionBehavior =
1093 ToConstrainedExceptMD(getLangOpts().getDefaultExceptionMode());
1094 Builder.setDefaultConstrainedRounding(RM);
1095 Builder.setDefaultConstrainedExcept(FPExceptionBehavior);
1096 if ((FD && (FD->UsesFPIntrin() || FD->hasAttr<StrictFPAttr>())) ||
1097 (!FD && (FPExceptionBehavior != llvm::fp::ebIgnore ||
1098 RM != llvm::RoundingMode::NearestTiesToEven))) {
1099 Builder.setIsFPConstrained(true);
1100 Fn->addFnAttr(llvm::Attribute::StrictFP);
1101 }
1102
1103 // If a custom alignment is used, force realigning to this alignment on
1104 // any main function which certainly will need it.
1105 if (FD && ((FD->isMain() || FD->isMSVCRTEntryPoint()) &&
1106 CGM.getCodeGenOpts().StackAlignment))
1107 Fn->addFnAttr("stackrealign");
1108
1109 // "main" doesn't need to zero out call-used registers.
1110 if (FD && FD->isMain())
1111 Fn->removeFnAttr("zero-call-used-regs");
1112
1113 llvm::BasicBlock *EntryBB = createBasicBlock("entry", CurFn);
1114
1115 // Create a marker to make it easy to insert allocas into the entryblock
1116 // later. Don't create this with the builder, because we don't want it
1117 // folded.
1118 llvm::Value *Poison = llvm::PoisonValue::get(Int32Ty);
1119 AllocaInsertPt = new llvm::BitCastInst(Poison, Int32Ty, "allocapt", EntryBB);
1120
1122
1123 Builder.SetInsertPoint(EntryBB);
1124
1125 // If we're checking the return value, allocate space for a pointer to a
1126 // precise source location of the checked return statement.
1127 if (requiresReturnValueCheck()) {
1128 ReturnLocation = CreateDefaultAlignTempAlloca(Int8PtrTy, "return.sloc.ptr");
1129 Builder.CreateStore(llvm::ConstantPointerNull::get(Int8PtrTy),
1130 ReturnLocation);
1131 }
1132
1133 // Emit subprogram debug descriptor.
1134 if (CGDebugInfo *DI = getDebugInfo()) {
1135 // Reconstruct the type from the argument list so that implicit parameters,
1136 // such as 'this' and 'vtt', show up in the debug info. Preserve the calling
1137 // convention.
1138 DI->emitFunctionStart(GD, Loc, StartLoc,
1139 DI->getFunctionType(FD, RetTy, Args), CurFn,
1141 }
1142
1144 if (CGM.getCodeGenOpts().InstrumentFunctions)
1145 CurFn->addFnAttr("instrument-function-entry", "__cyg_profile_func_enter");
1146 if (CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
1147 CurFn->addFnAttr("instrument-function-entry-inlined",
1148 "__cyg_profile_func_enter");
1149 if (CGM.getCodeGenOpts().InstrumentFunctionEntryBare)
1150 CurFn->addFnAttr("instrument-function-entry-inlined",
1151 "__cyg_profile_func_enter_bare");
1152 }
1153
1154 // Since emitting the mcount call here impacts optimizations such as function
1155 // inlining, we just add an attribute to insert a mcount call in backend.
1156 // The attribute "counting-function" is set to mcount function name which is
1157 // architecture dependent.
1158 if (CGM.getCodeGenOpts().InstrumentForProfiling) {
1159 // Calls to fentry/mcount should not be generated if function has
1160 // the no_instrument_function attribute.
1161 if (!CurFuncDecl || !CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>()) {
1162 if (CGM.getCodeGenOpts().CallFEntry)
1163 Fn->addFnAttr("fentry-call", "true");
1164 else {
1165 Fn->addFnAttr("instrument-function-entry-inlined",
1166 getTarget().getMCountName());
1167 }
1168 if (CGM.getCodeGenOpts().MNopMCount) {
1169 if (!CGM.getCodeGenOpts().CallFEntry)
1170 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1171 << "-mnop-mcount" << "-mfentry";
1172 Fn->addFnAttr("mnop-mcount");
1173 }
1174
1175 if (CGM.getCodeGenOpts().RecordMCount) {
1176 if (!CGM.getCodeGenOpts().CallFEntry)
1177 CGM.getDiags().Report(diag::err_opt_not_valid_without_opt)
1178 << "-mrecord-mcount" << "-mfentry";
1179 Fn->addFnAttr("mrecord-mcount");
1180 }
1181 }
1182 }
1183
1184 if (CGM.getCodeGenOpts().PackedStack) {
1185 if (getContext().getTargetInfo().getTriple().getArch() !=
1186 llvm::Triple::systemz)
1187 CGM.getDiags().Report(diag::err_opt_not_valid_on_target)
1188 << "-mpacked-stack";
1189 Fn->addFnAttr("packed-stack");
1190 }
1191
1192 if (CGM.getCodeGenOpts().WarnStackSize != UINT_MAX &&
1193 !CGM.getDiags().isIgnored(diag::warn_fe_backend_frame_larger_than, Loc))
1194 Fn->addFnAttr("warn-stack-size",
1195 std::to_string(CGM.getCodeGenOpts().WarnStackSize));
1196
1197 if (RetTy->isVoidType()) {
1198 // Void type; nothing to return.
1200
1201 // Count the implicit return.
1202 if (!endsWithReturn(D))
1203 ++NumReturnExprs;
1205 // Indirect return; emit returned value directly into sret slot.
1206 // This reduces code size, and affects correctness in C++.
1207 auto AI = CurFn->arg_begin();
1209 ++AI;
1211 &*AI, RetTy, CurFnInfo->getReturnInfo().getIndirectAlign(), false,
1212 nullptr, nullptr, KnownNonNull);
1218 }
1221 // Load the sret pointer from the argument struct and return into that.
1222 unsigned Idx = CurFnInfo->getReturnInfo().getInAllocaFieldIndex();
1223 llvm::Function::arg_iterator EI = CurFn->arg_end();
1224 --EI;
1225 llvm::Value *Addr = Builder.CreateStructGEP(
1226 CurFnInfo->getArgStruct(), &*EI, Idx);
1227 llvm::Type *Ty =
1228 cast<llvm::GetElementPtrInst>(Addr)->getResultElementType();
1230 Addr = Builder.CreateAlignedLoad(Ty, Addr, getPointerAlign(), "agg.result");
1231 ReturnValue = Address(Addr, ConvertType(RetTy),
1233 } else {
1234 ReturnValue = CreateIRTemp(RetTy, "retval");
1235
1236 // Tell the epilog emitter to autorelease the result. We do this
1237 // now so that various specialized functions can suppress it
1238 // during their IR-generation.
1239 if (getLangOpts().ObjCAutoRefCount &&
1241 RetTy->isObjCRetainableType())
1242 AutoreleaseResult = true;
1243 }
1244
1246
1248
1249 // Emit OpenMP specific initialization of the device functions.
1250 if (getLangOpts().OpenMP && CurCodeDecl)
1252
1253 if (FD && getLangOpts().HLSL) {
1254 // Handle emitting HLSL entry functions.
1255 if (FD->hasAttr<HLSLShaderAttr>()) {
1257 }
1259 }
1260
1262
1263 if (const CXXMethodDecl *MD = dyn_cast_if_present<CXXMethodDecl>(D);
1264 MD && !MD->isStatic()) {
1265 bool IsInLambda =
1266 MD->getParent()->isLambda() && MD->getOverloadedOperator() == OO_Call;
1269 if (IsInLambda) {
1270 // We're in a lambda; figure out the captures.
1274 // If the lambda captures the object referred to by '*this' - either by
1275 // value or by reference, make sure CXXThisValue points to the correct
1276 // object.
1277
1278 // Get the lvalue for the field (which is a copy of the enclosing object
1279 // or contains the address of the enclosing object).
1282 // If the enclosing object was captured by value, just use its
1283 // address. Sign this pointer.
1284 CXXThisValue = ThisFieldLValue.getPointer(*this);
1285 } else {
1286 // Load the lvalue pointed to by the field, since '*this' was captured
1287 // by reference.
1288 CXXThisValue =
1289 EmitLoadOfLValue(ThisFieldLValue, SourceLocation()).getScalarVal();
1290 }
1291 }
1292 for (auto *FD : MD->getParent()->fields()) {
1293 if (FD->hasCapturedVLAType()) {
1294 auto *ExprArg = EmitLoadOfLValue(EmitLValueForLambdaField(FD),
1296 auto VAT = FD->getCapturedVLAType();
1297 VLASizeMap[VAT->getSizeExpr()] = ExprArg;
1298 }
1299 }
1300 } else if (MD->isImplicitObjectMemberFunction()) {
1301 // Not in a lambda; just use 'this' from the method.
1302 // FIXME: Should we generate a new load for each use of 'this'? The
1303 // fast register allocator would be happier...
1304 CXXThisValue = CXXABIThisValue;
1305 }
1306
1307 // Check the 'this' pointer once per function, if it's available.
1308 if (CXXABIThisValue) {
1309 SanitizerSet SkippedChecks;
1310 SkippedChecks.set(SanitizerKind::ObjectSize, true);
1311 QualType ThisTy = MD->getThisType();
1312
1313 // If this is the call operator of a lambda with no captures, it
1314 // may have a static invoker function, which may call this operator with
1315 // a null 'this' pointer.
1317 SkippedChecks.set(SanitizerKind::Null, true);
1318
1320 isa<CXXConstructorDecl>(MD) ? TCK_ConstructorCall : TCK_MemberCall,
1321 Loc, CXXABIThisValue, ThisTy, CXXABIThisAlignment, SkippedChecks);
1322 }
1323 }
1324
1325 // If any of the arguments have a variably modified type, make sure to
1326 // emit the type size, but only if the function is not naked. Naked functions
1327 // have no prolog to run this evaluation.
1328 if (!FD || !FD->hasAttr<NakedAttr>()) {
1329 for (const VarDecl *VD : Args) {
1330 // Dig out the type as written from ParmVarDecls; it's unclear whether
1331 // the standard (C99 6.9.1p10) requires this, but we're following the
1332 // precedent set by gcc.
1333 QualType Ty;
1334 if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD))
1335 Ty = PVD->getOriginalType();
1336 else
1337 Ty = VD->getType();
1338
1339 if (Ty->isVariablyModifiedType())
1341 }
1342 }
1343 // Emit a location at the end of the prologue.
1344 if (CGDebugInfo *DI = getDebugInfo())
1345 DI->EmitLocation(Builder, StartLoc);
1346 // TODO: Do we need to handle this in two places like we do with
1347 // target-features/target-cpu?
1348 if (CurFuncDecl)
1349 if (const auto *VecWidth = CurFuncDecl->getAttr<MinVectorWidthAttr>())
1350 LargestVectorWidth = VecWidth->getVectorWidth();
1351
1353 ConvergenceTokenStack.push_back(getOrEmitConvergenceEntryToken(CurFn));
1354}
1355
1356void CodeGenFunction::EmitFunctionBody(const Stmt *Body) {
1359 if (const CompoundStmt *S = dyn_cast<CompoundStmt>(Body))
1361 else
1362 EmitStmt(Body);
1363}
1364
1365/// When instrumenting to collect profile data, the counts for some blocks
1366/// such as switch cases need to not include the fall-through counts, so
1367/// emit a branch around the instrumentation code. When not instrumenting,
1368/// this just calls EmitBlock().
1369void CodeGenFunction::EmitBlockWithFallThrough(llvm::BasicBlock *BB,
1370 const Stmt *S) {
1371 llvm::BasicBlock *SkipCountBB = nullptr;
1372 // Do not skip over the instrumentation when single byte coverage mode is
1373 // enabled.
1376 // When instrumenting for profiling, the fallthrough to certain
1377 // statements needs to skip over the instrumentation code so that we
1378 // get an accurate count.
1379 SkipCountBB = createBasicBlock("skipcount");
1380 EmitBranch(SkipCountBB);
1381 }
1382 EmitBlock(BB);
1383 uint64_t CurrentCount = getCurrentProfileCount();
1386 if (SkipCountBB)
1387 EmitBlock(SkipCountBB);
1388}
1389
1390/// Tries to mark the given function nounwind based on the
1391/// non-existence of any throwing calls within it. We believe this is
1392/// lightweight enough to do at -O0.
1393static void TryMarkNoThrow(llvm::Function *F) {
1394 // LLVM treats 'nounwind' on a function as part of the type, so we
1395 // can't do this on functions that can be overwritten.
1396 if (F->isInterposable()) return;
1397
1398 for (llvm::BasicBlock &BB : *F)
1399 for (llvm::Instruction &I : BB)
1400 if (I.mayThrow())
1401 return;
1402
1403 F->setDoesNotThrow();
1404}
1405
1407 FunctionArgList &Args) {
1408 const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
1409 QualType ResTy = FD->getReturnType();
1410
1411 const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
1412 if (MD && MD->isImplicitObjectMemberFunction()) {
1413 if (CGM.getCXXABI().HasThisReturn(GD))
1414 ResTy = MD->getThisType();
1415 else if (CGM.getCXXABI().hasMostDerivedReturn(GD))
1416 ResTy = CGM.getContext().VoidPtrTy;
1417 CGM.getCXXABI().buildThisParam(*this, Args);
1418 }
1419
1420 // The base version of an inheriting constructor whose constructed base is a
1421 // virtual base is not passed any arguments (because it doesn't actually call
1422 // the inherited constructor).
1423 bool PassedParams = true;
1424 if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD))
1425 if (auto Inherited = CD->getInheritedConstructor())
1426 PassedParams =
1427 getTypes().inheritingCtorHasParams(Inherited, GD.getCtorType());
1428
1429 if (PassedParams) {
1430 for (auto *Param : FD->parameters()) {
1431 Args.push_back(Param);
1432 if (!Param->hasAttr<PassObjectSizeAttr>())
1433 continue;
1434
1436 getContext(), Param->getDeclContext(), Param->getLocation(),
1437 /*Id=*/nullptr, getContext().getSizeType(), ImplicitParamKind::Other);
1438 SizeArguments[Param] = Implicit;
1439 Args.push_back(Implicit);
1440 }
1441 }
1442
1443 if (MD && (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)))
1444 CGM.getCXXABI().addImplicitStructorParams(*this, ResTy, Args);
1445
1446 return ResTy;
1447}
1448
1449void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
1450 const CGFunctionInfo &FnInfo) {
1451 assert(Fn && "generating code for null Function");
1452 const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
1453 CurGD = GD;
1454
1455 FunctionArgList Args;
1456 QualType ResTy = BuildFunctionArgList(GD, Args);
1457
1459
1460 if (FD->isInlineBuiltinDeclaration()) {
1461 // When generating code for a builtin with an inline declaration, use a
1462 // mangled name to hold the actual body, while keeping an external
1463 // definition in case the function pointer is referenced somewhere.
1464 std::string FDInlineName = (Fn->getName() + ".inline").str();
1465 llvm::Module *M = Fn->getParent();
1466 llvm::Function *Clone = M->getFunction(FDInlineName);
1467 if (!Clone) {
1468 Clone = llvm::Function::Create(Fn->getFunctionType(),
1469 llvm::GlobalValue::InternalLinkage,
1470 Fn->getAddressSpace(), FDInlineName, M);
1471 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
1472 }
1473 Fn->setLinkage(llvm::GlobalValue::ExternalLinkage);
1474 Fn = Clone;
1475 } else {
1476 // Detect the unusual situation where an inline version is shadowed by a
1477 // non-inline version. In that case we should pick the external one
1478 // everywhere. That's GCC behavior too. Unfortunately, I cannot find a way
1479 // to detect that situation before we reach codegen, so do some late
1480 // replacement.
1481 for (const FunctionDecl *PD = FD->getPreviousDecl(); PD;
1482 PD = PD->getPreviousDecl()) {
1483 if (LLVM_UNLIKELY(PD->isInlineBuiltinDeclaration())) {
1484 std::string FDInlineName = (Fn->getName() + ".inline").str();
1485 llvm::Module *M = Fn->getParent();
1486 if (llvm::Function *Clone = M->getFunction(FDInlineName)) {
1487 Clone->replaceAllUsesWith(Fn);
1488 Clone->eraseFromParent();
1489 }
1490 break;
1491 }
1492 }
1493 }
1494
1495 // Check if we should generate debug info for this function.
1496 if (FD->hasAttr<NoDebugAttr>()) {
1497 // Clear non-distinct debug info that was possibly attached to the function
1498 // due to an earlier declaration without the nodebug attribute
1499 Fn->setSubprogram(nullptr);
1500 // Disable debug info indefinitely for this function
1501 DebugInfo = nullptr;
1502 }
1503
1504 // The function might not have a body if we're generating thunks for a
1505 // function declaration.
1506 SourceRange BodyRange;
1507 if (Stmt *Body = FD->getBody())
1508 BodyRange = Body->getSourceRange();
1509 else
1510 BodyRange = FD->getLocation();
1511 CurEHLocation = BodyRange.getEnd();
1512
1513 // Use the location of the start of the function to determine where
1514 // the function definition is located. By default use the location
1515 // of the declaration as the location for the subprogram. A function
1516 // may lack a declaration in the source code if it is created by code
1517 // gen. (examples: _GLOBAL__I_a, __cxx_global_array_dtor, thunk).
1519
1520 // If this is a function specialization then use the pattern body
1521 // as the location for the function.
1522 if (const FunctionDecl *SpecDecl = FD->getTemplateInstantiationPattern())
1523 if (SpecDecl->hasBody(SpecDecl))
1524 Loc = SpecDecl->getLocation();
1525
1526 Stmt *Body = FD->getBody();
1527
1528 if (Body) {
1529 // Coroutines always emit lifetime markers.
1530 if (isa<CoroutineBodyStmt>(Body))
1531 ShouldEmitLifetimeMarkers = true;
1532
1533 // Initialize helper which will detect jumps which can cause invalid
1534 // lifetime markers.
1535 if (ShouldEmitLifetimeMarkers)
1536 Bypasses.Init(Body);
1537 }
1538
1539 // Emit the standard function prologue.
1540 StartFunction(GD, ResTy, Fn, FnInfo, Args, Loc, BodyRange.getBegin());
1541
1542 // Save parameters for coroutine function.
1543 if (Body && isa_and_nonnull<CoroutineBodyStmt>(Body))
1544 llvm::append_range(FnArgs, FD->parameters());
1545
1546 // Ensure that the function adheres to the forward progress guarantee, which
1547 // is required by certain optimizations.
1548 // In C++11 and up, the attribute will be removed if the body contains a
1549 // trivial empty loop.
1551 CurFn->addFnAttr(llvm::Attribute::MustProgress);
1552
1553 // Generate the body of the function.
1554 PGO.assignRegionCounters(GD, CurFn);
1555 if (isa<CXXDestructorDecl>(FD))
1556 EmitDestructorBody(Args);
1557 else if (isa<CXXConstructorDecl>(FD))
1558 EmitConstructorBody(Args);
1559 else if (getLangOpts().CUDA &&
1560 !getLangOpts().CUDAIsDevice &&
1561 FD->hasAttr<CUDAGlobalAttr>())
1562 CGM.getCUDARuntime().emitDeviceStub(*this, Args);
1563 else if (isa<CXXMethodDecl>(FD) &&
1564 cast<CXXMethodDecl>(FD)->isLambdaStaticInvoker()) {
1565 // The lambda static invoker function is special, because it forwards or
1566 // clones the body of the function call operator (but is actually static).
1567 EmitLambdaStaticInvokeBody(cast<CXXMethodDecl>(FD));
1568 } else if (isa<CXXMethodDecl>(FD) &&
1569 isLambdaCallOperator(cast<CXXMethodDecl>(FD)) &&
1570 !FnInfo.isDelegateCall() &&
1571 cast<CXXMethodDecl>(FD)->getParent()->getLambdaStaticInvoker() &&
1572 hasInAllocaArg(cast<CXXMethodDecl>(FD))) {
1573 // If emitting a lambda with static invoker on X86 Windows, change
1574 // the call operator body.
1575 // Make sure that this is a call operator with an inalloca arg and check
1576 // for delegate call to make sure this is the original call op and not the
1577 // new forwarding function for the static invoker.
1578 EmitLambdaInAllocaCallOpBody(cast<CXXMethodDecl>(FD));
1579 } else if (FD->isDefaulted() && isa<CXXMethodDecl>(FD) &&
1580 (cast<CXXMethodDecl>(FD)->isCopyAssignmentOperator() ||
1581 cast<CXXMethodDecl>(FD)->isMoveAssignmentOperator())) {
1582 // Implicit copy-assignment gets the same special treatment as implicit
1583 // copy-constructors.
1585 } else if (Body) {
1586 EmitFunctionBody(Body);
1587 } else
1588 llvm_unreachable("no definition for emitted function");
1589
1590 // C++11 [stmt.return]p2:
1591 // Flowing off the end of a function [...] results in undefined behavior in
1592 // a value-returning function.
1593 // C11 6.9.1p12:
1594 // If the '}' that terminates a function is reached, and the value of the
1595 // function call is used by the caller, the behavior is undefined.
1597 !FD->getReturnType()->isVoidType() && Builder.GetInsertBlock()) {
1598 bool ShouldEmitUnreachable =
1599 CGM.getCodeGenOpts().StrictReturn ||
1601 if (SanOpts.has(SanitizerKind::Return)) {
1602 SanitizerScope SanScope(this);
1603 llvm::Value *IsFalse = Builder.getFalse();
1604 EmitCheck(std::make_pair(IsFalse, SanitizerKind::Return),
1605 SanitizerHandler::MissingReturn,
1607 } else if (ShouldEmitUnreachable) {
1608 if (CGM.getCodeGenOpts().OptimizationLevel == 0)
1609 EmitTrapCall(llvm::Intrinsic::trap);
1610 }
1611 if (SanOpts.has(SanitizerKind::Return) || ShouldEmitUnreachable) {
1612 Builder.CreateUnreachable();
1613 Builder.ClearInsertionPoint();
1614 }
1615 }
1616
1617 // Emit the standard function epilogue.
1618 FinishFunction(BodyRange.getEnd());
1619
1620 // If we haven't marked the function nothrow through other means, do
1621 // a quick pass now to see if we can.
1622 if (!CurFn->doesNotThrow())
1624}
1625
1626/// ContainsLabel - Return true if the statement contains a label in it. If
1627/// this statement is not executed normally, it not containing a label means
1628/// that we can just remove the code.
1629bool CodeGenFunction::ContainsLabel(const Stmt *S, bool IgnoreCaseStmts) {
1630 // Null statement, not a label!
1631 if (!S) return false;
1632
1633 // If this is a label, we have to emit the code, consider something like:
1634 // if (0) { ... foo: bar(); } goto foo;
1635 //
1636 // TODO: If anyone cared, we could track __label__'s, since we know that you
1637 // can't jump to one from outside their declared region.
1638 if (isa<LabelStmt>(S))
1639 return true;
1640
1641 // If this is a case/default statement, and we haven't seen a switch, we have
1642 // to emit the code.
1643 if (isa<SwitchCase>(S) && !IgnoreCaseStmts)
1644 return true;
1645
1646 // If this is a switch statement, we want to ignore cases below it.
1647 if (isa<SwitchStmt>(S))
1648 IgnoreCaseStmts = true;
1649
1650 // Scan subexpressions for verboten labels.
1651 for (const Stmt *SubStmt : S->children())
1652 if (ContainsLabel(SubStmt, IgnoreCaseStmts))
1653 return true;
1654
1655 return false;
1656}
1657
1658/// containsBreak - Return true if the statement contains a break out of it.
1659/// If the statement (recursively) contains a switch or loop with a break
1660/// inside of it, this is fine.
1661bool CodeGenFunction::containsBreak(const Stmt *S) {
1662 // Null statement, not a label!
1663 if (!S) return false;
1664
1665 // If this is a switch or loop that defines its own break scope, then we can
1666 // include it and anything inside of it.
1667 if (isa<SwitchStmt>(S) || isa<WhileStmt>(S) || isa<DoStmt>(S) ||
1668 isa<ForStmt>(S))
1669 return false;
1670
1671 if (isa<BreakStmt>(S))
1672 return true;
1673
1674 // Scan subexpressions for verboten breaks.
1675 for (const Stmt *SubStmt : S->children())
1676 if (containsBreak(SubStmt))
1677 return true;
1678
1679 return false;
1680}
1681
1683 if (!S) return false;
1684
1685 // Some statement kinds add a scope and thus never add a decl to the current
1686 // scope. Note, this list is longer than the list of statements that might
1687 // have an unscoped decl nested within them, but this way is conservatively
1688 // correct even if more statement kinds are added.
1689 if (isa<IfStmt>(S) || isa<SwitchStmt>(S) || isa<WhileStmt>(S) ||
1690 isa<DoStmt>(S) || isa<ForStmt>(S) || isa<CompoundStmt>(S) ||
1691 isa<CXXForRangeStmt>(S) || isa<CXXTryStmt>(S) ||
1692 isa<ObjCForCollectionStmt>(S) || isa<ObjCAtTryStmt>(S))
1693 return false;
1694
1695 if (isa<DeclStmt>(S))
1696 return true;
1697
1698 for (const Stmt *SubStmt : S->children())
1699 if (mightAddDeclToScope(SubStmt))
1700 return true;
1701
1702 return false;
1703}
1704
1705/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
1706/// to a constant, or if it does but contains a label, return false. If it
1707/// constant folds return true and set the boolean result in Result.
1709 bool &ResultBool,
1710 bool AllowLabels) {
1711 // If MC/DC is enabled, disable folding so that we can instrument all
1712 // conditions to yield complete test vectors. We still keep track of
1713 // folded conditions during region mapping and visualization.
1714 if (!AllowLabels && CGM.getCodeGenOpts().hasProfileClangInstr() &&
1715 CGM.getCodeGenOpts().MCDCCoverage)
1716 return false;
1717
1718 llvm::APSInt ResultInt;
1719 if (!ConstantFoldsToSimpleInteger(Cond, ResultInt, AllowLabels))
1720 return false;
1721
1722 ResultBool = ResultInt.getBoolValue();
1723 return true;
1724}
1725
1726/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
1727/// to a constant, or if it does but contains a label, return false. If it
1728/// constant folds return true and set the folded value.
1730 llvm::APSInt &ResultInt,
1731 bool AllowLabels) {
1732 // FIXME: Rename and handle conversion of other evaluatable things
1733 // to bool.
1735 if (!Cond->EvaluateAsInt(Result, getContext()))
1736 return false; // Not foldable, not integer or not fully evaluatable.
1737
1738 llvm::APSInt Int = Result.Val.getInt();
1739 if (!AllowLabels && CodeGenFunction::ContainsLabel(Cond))
1740 return false; // Contains a label.
1741
1742 ResultInt = Int;
1743 return true;
1744}
1745
1746/// Strip parentheses and simplistic logical-NOT operators.
1747const Expr *CodeGenFunction::stripCond(const Expr *C) {
1748 while (const UnaryOperator *Op = dyn_cast<UnaryOperator>(C->IgnoreParens())) {
1749 if (Op->getOpcode() != UO_LNot)
1750 break;
1751 C = Op->getSubExpr();
1752 }
1753 return C->IgnoreParens();
1754}
1755
1756/// Determine whether the given condition is an instrumentable condition
1757/// (i.e. no "&&" or "||").
1759 const BinaryOperator *BOp = dyn_cast<BinaryOperator>(stripCond(C));
1760 return (!BOp || !BOp->isLogicalOp());
1761}
1762
1763/// EmitBranchToCounterBlock - Emit a conditional branch to a new block that
1764/// increments a profile counter based on the semantics of the given logical
1765/// operator opcode. This is used to instrument branch condition coverage for
1766/// logical operators.
1768 const Expr *Cond, BinaryOperator::Opcode LOp, llvm::BasicBlock *TrueBlock,
1769 llvm::BasicBlock *FalseBlock, uint64_t TrueCount /* = 0 */,
1770 Stmt::Likelihood LH /* =None */, const Expr *CntrIdx /* = nullptr */) {
1771 // If not instrumenting, just emit a branch.
1772 bool InstrumentRegions = CGM.getCodeGenOpts().hasProfileClangInstr();
1773 if (!InstrumentRegions || !isInstrumentedCondition(Cond))
1774 return EmitBranchOnBoolExpr(Cond, TrueBlock, FalseBlock, TrueCount, LH);
1775
1776 const Stmt *CntrStmt = (CntrIdx ? CntrIdx : Cond);
1777
1778 llvm::BasicBlock *ThenBlock = nullptr;
1779 llvm::BasicBlock *ElseBlock = nullptr;
1780 llvm::BasicBlock *NextBlock = nullptr;
1781
1782 // Create the block we'll use to increment the appropriate counter.
1783 llvm::BasicBlock *CounterIncrBlock = createBasicBlock("lop.rhscnt");
1784
1785 // Set block pointers according to Logical-AND (BO_LAnd) semantics. This
1786 // means we need to evaluate the condition and increment the counter on TRUE:
1787 //
1788 // if (Cond)
1789 // goto CounterIncrBlock;
1790 // else
1791 // goto FalseBlock;
1792 //
1793 // CounterIncrBlock:
1794 // Counter++;
1795 // goto TrueBlock;
1796
1797 if (LOp == BO_LAnd) {
1798 ThenBlock = CounterIncrBlock;
1799 ElseBlock = FalseBlock;
1800 NextBlock = TrueBlock;
1801 }
1802
1803 // Set block pointers according to Logical-OR (BO_LOr) semantics. This means
1804 // we need to evaluate the condition and increment the counter on FALSE:
1805 //
1806 // if (Cond)
1807 // goto TrueBlock;
1808 // else
1809 // goto CounterIncrBlock;
1810 //
1811 // CounterIncrBlock:
1812 // Counter++;
1813 // goto FalseBlock;
1814
1815 else if (LOp == BO_LOr) {
1816 ThenBlock = TrueBlock;
1817 ElseBlock = CounterIncrBlock;
1818 NextBlock = FalseBlock;
1819 } else {
1820 llvm_unreachable("Expected Opcode must be that of a Logical Operator");
1821 }
1822
1823 // Emit Branch based on condition.
1824 EmitBranchOnBoolExpr(Cond, ThenBlock, ElseBlock, TrueCount, LH);
1825
1826 // Emit the block containing the counter increment(s).
1827 EmitBlock(CounterIncrBlock);
1828
1829 // Increment corresponding counter; if index not provided, use Cond as index.
1830 incrementProfileCounter(CntrStmt);
1831
1832 // Go to the next block.
1833 EmitBranch(NextBlock);
1834}
1835
1836/// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an if
1837/// statement) to the specified blocks. Based on the condition, this might try
1838/// to simplify the codegen of the conditional based on the branch.
1839/// \param LH The value of the likelihood attribute on the True branch.
1840/// \param ConditionalOp Used by MC/DC code coverage to track the result of the
1841/// ConditionalOperator (ternary) through a recursive call for the operator's
1842/// LHS and RHS nodes.
1844 const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock,
1845 uint64_t TrueCount, Stmt::Likelihood LH, const Expr *ConditionalOp) {
1846 Cond = Cond->IgnoreParens();
1847
1848 if (const BinaryOperator *CondBOp = dyn_cast<BinaryOperator>(Cond)) {
1849 // Handle X && Y in a condition.
1850 if (CondBOp->getOpcode() == BO_LAnd) {
1851 MCDCLogOpStack.push_back(CondBOp);
1852
1853 // If we have "1 && X", simplify the code. "0 && X" would have constant
1854 // folded if the case was simple enough.
1855 bool ConstantBool = false;
1856 if (ConstantFoldsToSimpleInteger(CondBOp->getLHS(), ConstantBool) &&
1857 ConstantBool) {
1858 // br(1 && X) -> br(X).
1859 incrementProfileCounter(CondBOp);
1860 EmitBranchToCounterBlock(CondBOp->getRHS(), BO_LAnd, TrueBlock,
1861 FalseBlock, TrueCount, LH);
1862 MCDCLogOpStack.pop_back();
1863 return;
1864 }
1865
1866 // If we have "X && 1", simplify the code to use an uncond branch.
1867 // "X && 0" would have been constant folded to 0.
1868 if (ConstantFoldsToSimpleInteger(CondBOp->getRHS(), ConstantBool) &&
1869 ConstantBool) {
1870 // br(X && 1) -> br(X).
1871 EmitBranchToCounterBlock(CondBOp->getLHS(), BO_LAnd, TrueBlock,
1872 FalseBlock, TrueCount, LH, CondBOp);
1873 MCDCLogOpStack.pop_back();
1874 return;
1875 }
1876
1877 // Emit the LHS as a conditional. If the LHS conditional is false, we
1878 // want to jump to the FalseBlock.
1879 llvm::BasicBlock *LHSTrue = createBasicBlock("land.lhs.true");
1880 // The counter tells us how often we evaluate RHS, and all of TrueCount
1881 // can be propagated to that branch.
1882 uint64_t RHSCount = getProfileCount(CondBOp->getRHS());
1883
1884 ConditionalEvaluation eval(*this);
1885 {
1886 ApplyDebugLocation DL(*this, Cond);
1887 // Propagate the likelihood attribute like __builtin_expect
1888 // __builtin_expect(X && Y, 1) -> X and Y are likely
1889 // __builtin_expect(X && Y, 0) -> only Y is unlikely
1890 EmitBranchOnBoolExpr(CondBOp->getLHS(), LHSTrue, FalseBlock, RHSCount,
1891 LH == Stmt::LH_Unlikely ? Stmt::LH_None : LH);
1892 EmitBlock(LHSTrue);
1893 }
1894
1895 incrementProfileCounter(CondBOp);
1896 setCurrentProfileCount(getProfileCount(CondBOp->getRHS()));
1897
1898 // Any temporaries created here are conditional.
1899 eval.begin(*this);
1900 EmitBranchToCounterBlock(CondBOp->getRHS(), BO_LAnd, TrueBlock,
1901 FalseBlock, TrueCount, LH);
1902 eval.end(*this);
1903 MCDCLogOpStack.pop_back();
1904 return;
1905 }
1906
1907 if (CondBOp->getOpcode() == BO_LOr) {
1908 MCDCLogOpStack.push_back(CondBOp);
1909
1910 // If we have "0 || X", simplify the code. "1 || X" would have constant
1911 // folded if the case was simple enough.
1912 bool ConstantBool = false;
1913 if (ConstantFoldsToSimpleInteger(CondBOp->getLHS(), ConstantBool) &&
1914 !ConstantBool) {
1915 // br(0 || X) -> br(X).
1916 incrementProfileCounter(CondBOp);
1917 EmitBranchToCounterBlock(CondBOp->getRHS(), BO_LOr, TrueBlock,
1918 FalseBlock, TrueCount, LH);
1919 MCDCLogOpStack.pop_back();
1920 return;
1921 }
1922
1923 // If we have "X || 0", simplify the code to use an uncond branch.
1924 // "X || 1" would have been constant folded to 1.
1925 if (ConstantFoldsToSimpleInteger(CondBOp->getRHS(), ConstantBool) &&
1926 !ConstantBool) {
1927 // br(X || 0) -> br(X).
1928 EmitBranchToCounterBlock(CondBOp->getLHS(), BO_LOr, TrueBlock,
1929 FalseBlock, TrueCount, LH, CondBOp);
1930 MCDCLogOpStack.pop_back();
1931 return;
1932 }
1933 // Emit the LHS as a conditional. If the LHS conditional is true, we
1934 // want to jump to the TrueBlock.
1935 llvm::BasicBlock *LHSFalse = createBasicBlock("lor.lhs.false");
1936 // We have the count for entry to the RHS and for the whole expression
1937 // being true, so we can divy up True count between the short circuit and
1938 // the RHS.
1939 uint64_t LHSCount =
1940 getCurrentProfileCount() - getProfileCount(CondBOp->getRHS());
1941 uint64_t RHSCount = TrueCount - LHSCount;
1942
1943 ConditionalEvaluation eval(*this);
1944 {
1945 // Propagate the likelihood attribute like __builtin_expect
1946 // __builtin_expect(X || Y, 1) -> only Y is likely
1947 // __builtin_expect(X || Y, 0) -> both X and Y are unlikely
1948 ApplyDebugLocation DL(*this, Cond);
1949 EmitBranchOnBoolExpr(CondBOp->getLHS(), TrueBlock, LHSFalse, LHSCount,
1950 LH == Stmt::LH_Likely ? Stmt::LH_None : LH);
1951 EmitBlock(LHSFalse);
1952 }
1953
1954 incrementProfileCounter(CondBOp);
1955 setCurrentProfileCount(getProfileCount(CondBOp->getRHS()));
1956
1957 // Any temporaries created here are conditional.
1958 eval.begin(*this);
1959 EmitBranchToCounterBlock(CondBOp->getRHS(), BO_LOr, TrueBlock, FalseBlock,
1960 RHSCount, LH);
1961
1962 eval.end(*this);
1963 MCDCLogOpStack.pop_back();
1964 return;
1965 }
1966 }
1967
1968 if (const UnaryOperator *CondUOp = dyn_cast<UnaryOperator>(Cond)) {
1969 // br(!x, t, f) -> br(x, f, t)
1970 // Avoid doing this optimization when instrumenting a condition for MC/DC.
1971 // LNot is taken as part of the condition for simplicity, and changing its
1972 // sense negatively impacts test vector tracking.
1973 bool MCDCCondition = CGM.getCodeGenOpts().hasProfileClangInstr() &&
1974 CGM.getCodeGenOpts().MCDCCoverage &&
1976 if (CondUOp->getOpcode() == UO_LNot && !MCDCCondition) {
1977 // Negate the count.
1978 uint64_t FalseCount = getCurrentProfileCount() - TrueCount;
1979 // The values of the enum are chosen to make this negation possible.
1980 LH = static_cast<Stmt::Likelihood>(-LH);
1981 // Negate the condition and swap the destination blocks.
1982 return EmitBranchOnBoolExpr(CondUOp->getSubExpr(), FalseBlock, TrueBlock,
1983 FalseCount, LH);
1984 }
1985 }
1986
1987 if (const ConditionalOperator *CondOp = dyn_cast<ConditionalOperator>(Cond)) {
1988 // br(c ? x : y, t, f) -> br(c, br(x, t, f), br(y, t, f))
1989 llvm::BasicBlock *LHSBlock = createBasicBlock("cond.true");
1990 llvm::BasicBlock *RHSBlock = createBasicBlock("cond.false");
1991
1992 // The ConditionalOperator itself has no likelihood information for its
1993 // true and false branches. This matches the behavior of __builtin_expect.
1994 ConditionalEvaluation cond(*this);
1995 EmitBranchOnBoolExpr(CondOp->getCond(), LHSBlock, RHSBlock,
1997
1998 // When computing PGO branch weights, we only know the overall count for
1999 // the true block. This code is essentially doing tail duplication of the
2000 // naive code-gen, introducing new edges for which counts are not
2001 // available. Divide the counts proportionally between the LHS and RHS of
2002 // the conditional operator.
2003 uint64_t LHSScaledTrueCount = 0;
2004 if (TrueCount) {
2005 double LHSRatio =
2007 LHSScaledTrueCount = TrueCount * LHSRatio;
2008 }
2009
2010 cond.begin(*this);
2011 EmitBlock(LHSBlock);
2013 {
2014 ApplyDebugLocation DL(*this, Cond);
2015 EmitBranchOnBoolExpr(CondOp->getLHS(), TrueBlock, FalseBlock,
2016 LHSScaledTrueCount, LH, CondOp);
2017 }
2018 cond.end(*this);
2019
2020 cond.begin(*this);
2021 EmitBlock(RHSBlock);
2022 EmitBranchOnBoolExpr(CondOp->getRHS(), TrueBlock, FalseBlock,
2023 TrueCount - LHSScaledTrueCount, LH, CondOp);
2024 cond.end(*this);
2025
2026 return;
2027 }
2028
2029 if (const CXXThrowExpr *Throw = dyn_cast<CXXThrowExpr>(Cond)) {
2030 // Conditional operator handling can give us a throw expression as a
2031 // condition for a case like:
2032 // br(c ? throw x : y, t, f) -> br(c, br(throw x, t, f), br(y, t, f)
2033 // Fold this to:
2034 // br(c, throw x, br(y, t, f))
2035 EmitCXXThrowExpr(Throw, /*KeepInsertionPoint*/false);
2036 return;
2037 }
2038
2039 // Emit the code with the fully general case.
2040 llvm::Value *CondV;
2041 {
2042 ApplyDebugLocation DL(*this, Cond);
2043 CondV = EvaluateExprAsBool(Cond);
2044 }
2045
2046 // If not at the top of the logical operator nest, update MCDC temp with the
2047 // boolean result of the evaluated condition.
2048 if (!MCDCLogOpStack.empty()) {
2049 const Expr *MCDCBaseExpr = Cond;
2050 // When a nested ConditionalOperator (ternary) is encountered in a boolean
2051 // expression, MC/DC tracks the result of the ternary, and this is tied to
2052 // the ConditionalOperator expression and not the ternary's LHS or RHS. If
2053 // this is the case, the ConditionalOperator expression is passed through
2054 // the ConditionalOp parameter and then used as the MCDC base expression.
2055 if (ConditionalOp)
2056 MCDCBaseExpr = ConditionalOp;
2057
2058 maybeUpdateMCDCCondBitmap(MCDCBaseExpr, CondV);
2059 }
2060
2061 llvm::MDNode *Weights = nullptr;
2062 llvm::MDNode *Unpredictable = nullptr;
2063
2064 // If the branch has a condition wrapped by __builtin_unpredictable,
2065 // create metadata that specifies that the branch is unpredictable.
2066 // Don't bother if not optimizing because that metadata would not be used.
2067 auto *Call = dyn_cast<CallExpr>(Cond->IgnoreImpCasts());
2068 if (Call && CGM.getCodeGenOpts().OptimizationLevel != 0) {
2069 auto *FD = dyn_cast_or_null<FunctionDecl>(Call->getCalleeDecl());
2070 if (FD && FD->getBuiltinID() == Builtin::BI__builtin_unpredictable) {
2071 llvm::MDBuilder MDHelper(getLLVMContext());
2072 Unpredictable = MDHelper.createUnpredictable();
2073 }
2074 }
2075
2076 // If there is a Likelihood knowledge for the cond, lower it.
2077 // Note that if not optimizing this won't emit anything.
2078 llvm::Value *NewCondV = emitCondLikelihoodViaExpectIntrinsic(CondV, LH);
2079 if (CondV != NewCondV)
2080 CondV = NewCondV;
2081 else {
2082 // Otherwise, lower profile counts. Note that we do this even at -O0.
2083 uint64_t CurrentCount = std::max(getCurrentProfileCount(), TrueCount);
2084 Weights = createProfileWeights(TrueCount, CurrentCount - TrueCount);
2085 }
2086
2087 llvm::Instruction *BrInst = Builder.CreateCondBr(CondV, TrueBlock, FalseBlock,
2088 Weights, Unpredictable);
2089 switch (HLSLControlFlowAttr) {
2090 case HLSLControlFlowHintAttr::Microsoft_branch:
2091 case HLSLControlFlowHintAttr::Microsoft_flatten: {
2092 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
2093
2094 llvm::ConstantInt *BranchHintConstant =
2096 HLSLControlFlowHintAttr::Spelling::Microsoft_branch
2097 ? llvm::ConstantInt::get(CGM.Int32Ty, 1)
2098 : llvm::ConstantInt::get(CGM.Int32Ty, 2);
2099
2101 {MDHelper.createString("hlsl.controlflow.hint"),
2102 MDHelper.createConstant(BranchHintConstant)});
2103 BrInst->setMetadata("hlsl.controlflow.hint",
2104 llvm::MDNode::get(CGM.getLLVMContext(), Vals));
2105 break;
2106 }
2107 case HLSLControlFlowHintAttr::SpellingNotCalculated:
2108 break;
2109 }
2110}
2111
2112/// ErrorUnsupported - Print out an error that codegen doesn't support the
2113/// specified stmt yet.
2114void CodeGenFunction::ErrorUnsupported(const Stmt *S, const char *Type) {
2116}
2117
2118/// emitNonZeroVLAInit - Emit the "zero" initialization of a
2119/// variable-length array whose elements have a non-zero bit-pattern.
2120///
2121/// \param baseType the inner-most element type of the array
2122/// \param src - a char* pointing to the bit-pattern for a single
2123/// base element of the array
2124/// \param sizeInChars - the total size of the VLA, in chars
2126 Address dest, Address src,
2127 llvm::Value *sizeInChars) {
2129
2130 CharUnits baseSize = CGF.getContext().getTypeSizeInChars(baseType);
2131 llvm::Value *baseSizeInChars
2132 = llvm::ConstantInt::get(CGF.IntPtrTy, baseSize.getQuantity());
2133
2134 Address begin = dest.withElementType(CGF.Int8Ty);
2135 llvm::Value *end = Builder.CreateInBoundsGEP(begin.getElementType(),
2136 begin.emitRawPointer(CGF),
2137 sizeInChars, "vla.end");
2138
2139 llvm::BasicBlock *originBB = CGF.Builder.GetInsertBlock();
2140 llvm::BasicBlock *loopBB = CGF.createBasicBlock("vla-init.loop");
2141 llvm::BasicBlock *contBB = CGF.createBasicBlock("vla-init.cont");
2142
2143 // Make a loop over the VLA. C99 guarantees that the VLA element
2144 // count must be nonzero.
2145 CGF.EmitBlock(loopBB);
2146
2147 llvm::PHINode *cur = Builder.CreatePHI(begin.getType(), 2, "vla.cur");
2148 cur->addIncoming(begin.emitRawPointer(CGF), originBB);
2149
2150 CharUnits curAlign =
2151 dest.getAlignment().alignmentOfArrayElement(baseSize);
2152
2153 // memcpy the individual element bit-pattern.
2154 Builder.CreateMemCpy(Address(cur, CGF.Int8Ty, curAlign), src, baseSizeInChars,
2155 /*volatile*/ false);
2156
2157 // Go to the next element.
2158 llvm::Value *next =
2159 Builder.CreateInBoundsGEP(CGF.Int8Ty, cur, baseSizeInChars, "vla.next");
2160
2161 // Leave if that's the end of the VLA.
2162 llvm::Value *done = Builder.CreateICmpEQ(next, end, "vla-init.isdone");
2163 Builder.CreateCondBr(done, contBB, loopBB);
2164 cur->addIncoming(next, loopBB);
2165
2166 CGF.EmitBlock(contBB);
2167}
2168
2169void
2171 // Ignore empty classes in C++.
2172 if (getLangOpts().CPlusPlus) {
2173 if (const RecordType *RT = Ty->getAs<RecordType>()) {
2174 if (cast<CXXRecordDecl>(RT->getDecl())->isEmpty())
2175 return;
2176 }
2177 }
2178
2179 if (DestPtr.getElementType() != Int8Ty)
2180 DestPtr = DestPtr.withElementType(Int8Ty);
2181
2182 // Get size and alignment info for this aggregate.
2184
2185 llvm::Value *SizeVal;
2186 const VariableArrayType *vla;
2187
2188 // Don't bother emitting a zero-byte memset.
2189 if (size.isZero()) {
2190 // But note that getTypeInfo returns 0 for a VLA.
2191 if (const VariableArrayType *vlaType =
2192 dyn_cast_or_null<VariableArrayType>(
2193 getContext().getAsArrayType(Ty))) {
2194 auto VlaSize = getVLASize(vlaType);
2195 SizeVal = VlaSize.NumElts;
2196 CharUnits eltSize = getContext().getTypeSizeInChars(VlaSize.Type);
2197 if (!eltSize.isOne())
2198 SizeVal = Builder.CreateNUWMul(SizeVal, CGM.getSize(eltSize));
2199 vla = vlaType;
2200 } else {
2201 return;
2202 }
2203 } else {
2204 SizeVal = CGM.getSize(size);
2205 vla = nullptr;
2206 }
2207
2208 // If the type contains a pointer to data member we can't memset it to zero.
2209 // Instead, create a null constant and copy it to the destination.
2210 // TODO: there are other patterns besides zero that we can usefully memset,
2211 // like -1, which happens to be the pattern used by member-pointers.
2212 if (!CGM.getTypes().isZeroInitializable(Ty)) {
2213 // For a VLA, emit a single element, then splat that over the VLA.
2214 if (vla) Ty = getContext().getBaseElementType(vla);
2215
2216 llvm::Constant *NullConstant = CGM.EmitNullConstant(Ty);
2217
2218 llvm::GlobalVariable *NullVariable =
2219 new llvm::GlobalVariable(CGM.getModule(), NullConstant->getType(),
2220 /*isConstant=*/true,
2221 llvm::GlobalVariable::PrivateLinkage,
2222 NullConstant, Twine());
2223 CharUnits NullAlign = DestPtr.getAlignment();
2224 NullVariable->setAlignment(NullAlign.getAsAlign());
2225 Address SrcPtr(NullVariable, Builder.getInt8Ty(), NullAlign);
2226
2227 if (vla) return emitNonZeroVLAInit(*this, Ty, DestPtr, SrcPtr, SizeVal);
2228
2229 // Get and call the appropriate llvm.memcpy overload.
2230 Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal, false);
2231 return;
2232 }
2233
2234 // Otherwise, just memset the whole thing to zero. This is legal
2235 // because in LLVM, all default initializers (other than the ones we just
2236 // handled above) are guaranteed to have a bit pattern of all zeros.
2237 Builder.CreateMemSet(DestPtr, Builder.getInt8(0), SizeVal, false);
2238}
2239
2240llvm::BlockAddress *CodeGenFunction::GetAddrOfLabel(const LabelDecl *L) {
2241 // Make sure that there is a block for the indirect goto.
2242 if (!IndirectBranch)
2244
2245 llvm::BasicBlock *BB = getJumpDestForLabel(L).getBlock();
2246
2247 // Make sure the indirect branch includes all of the address-taken blocks.
2248 IndirectBranch->addDestination(BB);
2249 return llvm::BlockAddress::get(CurFn, BB);
2250}
2251
2252llvm::BasicBlock *CodeGenFunction::GetIndirectGotoBlock() {
2253 // If we already made the indirect branch for indirect goto, return its block.
2254 if (IndirectBranch) return IndirectBranch->getParent();
2255
2256 CGBuilderTy TmpBuilder(*this, createBasicBlock("indirectgoto"));
2257
2258 // Create the PHI node that indirect gotos will add entries to.
2259 llvm::Value *DestVal = TmpBuilder.CreatePHI(Int8PtrTy, 0,
2260 "indirect.goto.dest");
2261
2262 // Create the indirect branch instruction.
2263 IndirectBranch = TmpBuilder.CreateIndirectBr(DestVal);
2264 return IndirectBranch->getParent();
2265}
2266
2267/// Computes the length of an array in elements, as well as the base
2268/// element type and a properly-typed first element pointer.
2269llvm::Value *CodeGenFunction::emitArrayLength(const ArrayType *origArrayType,
2270 QualType &baseType,
2271 Address &addr) {
2272 const ArrayType *arrayType = origArrayType;
2273
2274 // If it's a VLA, we have to load the stored size. Note that
2275 // this is the size of the VLA in bytes, not its size in elements.
2276 llvm::Value *numVLAElements = nullptr;
2277 if (isa<VariableArrayType>(arrayType)) {
2278 numVLAElements = getVLASize(cast<VariableArrayType>(arrayType)).NumElts;
2279
2280 // Walk into all VLAs. This doesn't require changes to addr,
2281 // which has type T* where T is the first non-VLA element type.
2282 do {
2283 QualType elementType = arrayType->getElementType();
2284 arrayType = getContext().getAsArrayType(elementType);
2285
2286 // If we only have VLA components, 'addr' requires no adjustment.
2287 if (!arrayType) {
2288 baseType = elementType;
2289 return numVLAElements;
2290 }
2291 } while (isa<VariableArrayType>(arrayType));
2292
2293 // We get out here only if we find a constant array type
2294 // inside the VLA.
2295 }
2296
2297 // We have some number of constant-length arrays, so addr should
2298 // have LLVM type [M x [N x [...]]]*. Build a GEP that walks
2299 // down to the first element of addr.
2301
2302 // GEP down to the array type.
2303 llvm::ConstantInt *zero = Builder.getInt32(0);
2304 gepIndices.push_back(zero);
2305
2306 uint64_t countFromCLAs = 1;
2307 QualType eltType;
2308
2309 llvm::ArrayType *llvmArrayType =
2310 dyn_cast<llvm::ArrayType>(addr.getElementType());
2311 while (llvmArrayType) {
2312 assert(isa<ConstantArrayType>(arrayType));
2313 assert(cast<ConstantArrayType>(arrayType)->getZExtSize() ==
2314 llvmArrayType->getNumElements());
2315
2316 gepIndices.push_back(zero);
2317 countFromCLAs *= llvmArrayType->getNumElements();
2318 eltType = arrayType->getElementType();
2319
2320 llvmArrayType =
2321 dyn_cast<llvm::ArrayType>(llvmArrayType->getElementType());
2322 arrayType = getContext().getAsArrayType(arrayType->getElementType());
2323 assert((!llvmArrayType || arrayType) &&
2324 "LLVM and Clang types are out-of-synch");
2325 }
2326
2327 if (arrayType) {
2328 // From this point onwards, the Clang array type has been emitted
2329 // as some other type (probably a packed struct). Compute the array
2330 // size, and just emit the 'begin' expression as a bitcast.
2331 while (arrayType) {
2332 countFromCLAs *= cast<ConstantArrayType>(arrayType)->getZExtSize();
2333 eltType = arrayType->getElementType();
2334 arrayType = getContext().getAsArrayType(eltType);
2335 }
2336
2337 llvm::Type *baseType = ConvertType(eltType);
2338 addr = addr.withElementType(baseType);
2339 } else {
2340 // Create the actual GEP.
2342 addr.emitRawPointer(*this),
2343 gepIndices, "array.begin"),
2344 ConvertTypeForMem(eltType), addr.getAlignment());
2345 }
2346
2347 baseType = eltType;
2348
2349 llvm::Value *numElements
2350 = llvm::ConstantInt::get(SizeTy, countFromCLAs);
2351
2352 // If we had any VLA dimensions, factor them in.
2353 if (numVLAElements)
2354 numElements = Builder.CreateNUWMul(numVLAElements, numElements);
2355
2356 return numElements;
2357}
2358
2359CodeGenFunction::VlaSizePair CodeGenFunction::getVLASize(QualType type) {
2361 assert(vla && "type was not a variable array type!");
2362 return getVLASize(vla);
2363}
2364
2365CodeGenFunction::VlaSizePair
2367 // The number of elements so far; always size_t.
2368 llvm::Value *numElements = nullptr;
2369
2370 QualType elementType;
2371 do {
2372 elementType = type->getElementType();
2373 llvm::Value *vlaSize = VLASizeMap[type->getSizeExpr()];
2374 assert(vlaSize && "no size for VLA!");
2375 assert(vlaSize->getType() == SizeTy);
2376
2377 if (!numElements) {
2378 numElements = vlaSize;
2379 } else {
2380 // It's undefined behavior if this wraps around, so mark it that way.
2381 // FIXME: Teach -fsanitize=undefined to trap this.
2382 numElements = Builder.CreateNUWMul(numElements, vlaSize);
2383 }
2384 } while ((type = getContext().getAsVariableArrayType(elementType)));
2385
2386 return { numElements, elementType };
2387}
2388
2389CodeGenFunction::VlaSizePair
2392 assert(vla && "type was not a variable array type!");
2393 return getVLAElements1D(vla);
2394}
2395
2396CodeGenFunction::VlaSizePair
2398 llvm::Value *VlaSize = VLASizeMap[Vla->getSizeExpr()];
2399 assert(VlaSize && "no size for VLA!");
2400 assert(VlaSize->getType() == SizeTy);
2401 return { VlaSize, Vla->getElementType() };
2402}
2403
2405 assert(type->isVariablyModifiedType() &&
2406 "Must pass variably modified type to EmitVLASizes!");
2407
2409
2410 // We're going to walk down into the type and look for VLA
2411 // expressions.
2412 do {
2413 assert(type->isVariablyModifiedType());
2414
2415 const Type *ty = type.getTypePtr();
2416 switch (ty->getTypeClass()) {
2417
2418#define TYPE(Class, Base)
2419#define ABSTRACT_TYPE(Class, Base)
2420#define NON_CANONICAL_TYPE(Class, Base)
2421#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2422#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
2423#include "clang/AST/TypeNodes.inc"
2424 llvm_unreachable("unexpected dependent type!");
2425
2426 // These types are never variably-modified.
2427 case Type::Builtin:
2428 case Type::Complex:
2429 case Type::Vector:
2430 case Type::ExtVector:
2431 case Type::ConstantMatrix:
2432 case Type::Record:
2433 case Type::Enum:
2434 case Type::Using:
2435 case Type::TemplateSpecialization:
2436 case Type::ObjCTypeParam:
2437 case Type::ObjCObject:
2438 case Type::ObjCInterface:
2439 case Type::ObjCObjectPointer:
2440 case Type::BitInt:
2441 llvm_unreachable("type class is never variably-modified!");
2442
2443 case Type::Elaborated:
2444 type = cast<ElaboratedType>(ty)->getNamedType();
2445 break;
2446
2447 case Type::Adjusted:
2448 type = cast<AdjustedType>(ty)->getAdjustedType();
2449 break;
2450
2451 case Type::Decayed:
2452 type = cast<DecayedType>(ty)->getPointeeType();
2453 break;
2454
2455 case Type::Pointer:
2456 type = cast<PointerType>(ty)->getPointeeType();
2457 break;
2458
2459 case Type::BlockPointer:
2460 type = cast<BlockPointerType>(ty)->getPointeeType();
2461 break;
2462
2463 case Type::LValueReference:
2464 case Type::RValueReference:
2465 type = cast<ReferenceType>(ty)->getPointeeType();
2466 break;
2467
2468 case Type::MemberPointer:
2469 type = cast<MemberPointerType>(ty)->getPointeeType();
2470 break;
2471
2472 case Type::ArrayParameter:
2473 case Type::ConstantArray:
2474 case Type::IncompleteArray:
2475 // Losing element qualification here is fine.
2476 type = cast<ArrayType>(ty)->getElementType();
2477 break;
2478
2479 case Type::VariableArray: {
2480 // Losing element qualification here is fine.
2481 const VariableArrayType *vat = cast<VariableArrayType>(ty);
2482
2483 // Unknown size indication requires no size computation.
2484 // Otherwise, evaluate and record it.
2485 if (const Expr *sizeExpr = vat->getSizeExpr()) {
2486 // It's possible that we might have emitted this already,
2487 // e.g. with a typedef and a pointer to it.
2488 llvm::Value *&entry = VLASizeMap[sizeExpr];
2489 if (!entry) {
2490 llvm::Value *size = EmitScalarExpr(sizeExpr);
2491
2492 // C11 6.7.6.2p5:
2493 // If the size is an expression that is not an integer constant
2494 // expression [...] each time it is evaluated it shall have a value
2495 // greater than zero.
2496 if (SanOpts.has(SanitizerKind::VLABound)) {
2497 SanitizerScope SanScope(this);
2498 llvm::Value *Zero = llvm::Constant::getNullValue(size->getType());
2499 clang::QualType SEType = sizeExpr->getType();
2500 llvm::Value *CheckCondition =
2501 SEType->isSignedIntegerType()
2502 ? Builder.CreateICmpSGT(size, Zero)
2503 : Builder.CreateICmpUGT(size, Zero);
2504 llvm::Constant *StaticArgs[] = {
2505 EmitCheckSourceLocation(sizeExpr->getBeginLoc()),
2506 EmitCheckTypeDescriptor(SEType)};
2507 EmitCheck(std::make_pair(CheckCondition, SanitizerKind::VLABound),
2508 SanitizerHandler::VLABoundNotPositive, StaticArgs, size);
2509 }
2510
2511 // Always zexting here would be wrong if it weren't
2512 // undefined behavior to have a negative bound.
2513 // FIXME: What about when size's type is larger than size_t?
2514 entry = Builder.CreateIntCast(size, SizeTy, /*signed*/ false);
2515 }
2516 }
2517 type = vat->getElementType();
2518 break;
2519 }
2520
2521 case Type::FunctionProto:
2522 case Type::FunctionNoProto:
2523 type = cast<FunctionType>(ty)->getReturnType();
2524 break;
2525
2526 case Type::Paren:
2527 case Type::TypeOf:
2528 case Type::UnaryTransform:
2529 case Type::Attributed:
2530 case Type::BTFTagAttributed:
2531 case Type::HLSLAttributedResource:
2532 case Type::SubstTemplateTypeParm:
2533 case Type::MacroQualified:
2534 case Type::CountAttributed:
2535 // Keep walking after single level desugaring.
2536 type = type.getSingleStepDesugaredType(getContext());
2537 break;
2538
2539 case Type::Typedef:
2540 case Type::Decltype:
2541 case Type::Auto:
2542 case Type::DeducedTemplateSpecialization:
2543 case Type::PackIndexing:
2544 // Stop walking: nothing to do.
2545 return;
2546
2547 case Type::TypeOfExpr:
2548 // Stop walking: emit typeof expression.
2549 EmitIgnoredExpr(cast<TypeOfExprType>(ty)->getUnderlyingExpr());
2550 return;
2551
2552 case Type::Atomic:
2553 type = cast<AtomicType>(ty)->getValueType();
2554 break;
2555
2556 case Type::Pipe:
2557 type = cast<PipeType>(ty)->getElementType();
2558 break;
2559 }
2560 } while (type->isVariablyModifiedType());
2561}
2562
2564 if (getContext().getBuiltinVaListType()->isArrayType())
2566 return EmitLValue(E).getAddress();
2567}
2568
2570 return EmitLValue(E).getAddress();
2571}
2572
2574 const APValue &Init) {
2575 assert(Init.hasValue() && "Invalid DeclRefExpr initializer!");
2576 if (CGDebugInfo *Dbg = getDebugInfo())
2578 Dbg->EmitGlobalVariable(E->getDecl(), Init);
2579}
2580
2581CodeGenFunction::PeepholeProtection
2583 // At the moment, the only aggressive peephole we do in IR gen
2584 // is trunc(zext) folding, but if we add more, we can easily
2585 // extend this protection.
2586
2587 if (!rvalue.isScalar()) return PeepholeProtection();
2588 llvm::Value *value = rvalue.getScalarVal();
2589 if (!isa<llvm::ZExtInst>(value)) return PeepholeProtection();
2590
2591 // Just make an extra bitcast.
2592 assert(HaveInsertPoint());
2593 llvm::Instruction *inst = new llvm::BitCastInst(value, value->getType(), "",
2594 Builder.GetInsertBlock());
2595
2596 PeepholeProtection protection;
2597 protection.Inst = inst;
2598 return protection;
2599}
2600
2601void CodeGenFunction::unprotectFromPeepholes(PeepholeProtection protection) {
2602 if (!protection.Inst) return;
2603
2604 // In theory, we could try to duplicate the peepholes now, but whatever.
2605 protection.Inst->eraseFromParent();
2606}
2607
2608void CodeGenFunction::emitAlignmentAssumption(llvm::Value *PtrValue,
2610 SourceLocation AssumptionLoc,
2611 llvm::Value *Alignment,
2612 llvm::Value *OffsetValue) {
2613 if (Alignment->getType() != IntPtrTy)
2614 Alignment =
2615 Builder.CreateIntCast(Alignment, IntPtrTy, false, "casted.align");
2616 if (OffsetValue && OffsetValue->getType() != IntPtrTy)
2617 OffsetValue =
2618 Builder.CreateIntCast(OffsetValue, IntPtrTy, true, "casted.offset");
2619 llvm::Value *TheCheck = nullptr;
2620 if (SanOpts.has(SanitizerKind::Alignment)) {
2621 llvm::Value *PtrIntValue =
2622 Builder.CreatePtrToInt(PtrValue, IntPtrTy, "ptrint");
2623
2624 if (OffsetValue) {
2625 bool IsOffsetZero = false;
2626 if (const auto *CI = dyn_cast<llvm::ConstantInt>(OffsetValue))
2627 IsOffsetZero = CI->isZero();
2628
2629 if (!IsOffsetZero)
2630 PtrIntValue = Builder.CreateSub(PtrIntValue, OffsetValue, "offsetptr");
2631 }
2632
2633 llvm::Value *Zero = llvm::ConstantInt::get(IntPtrTy, 0);
2634 llvm::Value *Mask =
2635 Builder.CreateSub(Alignment, llvm::ConstantInt::get(IntPtrTy, 1));
2636 llvm::Value *MaskedPtr = Builder.CreateAnd(PtrIntValue, Mask, "maskedptr");
2637 TheCheck = Builder.CreateICmpEQ(MaskedPtr, Zero, "maskcond");
2638 }
2639 llvm::Instruction *Assumption = Builder.CreateAlignmentAssumption(
2640 CGM.getDataLayout(), PtrValue, Alignment, OffsetValue);
2641
2642 if (!SanOpts.has(SanitizerKind::Alignment))
2643 return;
2644 emitAlignmentAssumptionCheck(PtrValue, Ty, Loc, AssumptionLoc, Alignment,
2645 OffsetValue, TheCheck, Assumption);
2646}
2647
2648void CodeGenFunction::emitAlignmentAssumption(llvm::Value *PtrValue,
2649 const Expr *E,
2650 SourceLocation AssumptionLoc,
2651 llvm::Value *Alignment,
2652 llvm::Value *OffsetValue) {
2653 QualType Ty = E->getType();
2655
2656 emitAlignmentAssumption(PtrValue, Ty, Loc, AssumptionLoc, Alignment,
2657 OffsetValue);
2658}
2659
2660llvm::Value *CodeGenFunction::EmitAnnotationCall(llvm::Function *AnnotationFn,
2661 llvm::Value *AnnotatedVal,
2662 StringRef AnnotationStr,
2663 SourceLocation Location,
2664 const AnnotateAttr *Attr) {
2666 AnnotatedVal,
2667 CGM.EmitAnnotationString(AnnotationStr),
2668 CGM.EmitAnnotationUnit(Location),
2669 CGM.EmitAnnotationLineNo(Location),
2670 };
2671 if (Attr)
2672 Args.push_back(CGM.EmitAnnotationArgs(Attr));
2673 return Builder.CreateCall(AnnotationFn, Args);
2674}
2675
2676void CodeGenFunction::EmitVarAnnotations(const VarDecl *D, llvm::Value *V) {
2677 assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
2678 for (const auto *I : D->specific_attrs<AnnotateAttr>())
2679 EmitAnnotationCall(CGM.getIntrinsic(llvm::Intrinsic::var_annotation,
2680 {V->getType(), CGM.ConstGlobalsPtrTy}),
2681 V, I->getAnnotation(), D->getLocation(), I);
2682}
2683
2685 Address Addr) {
2686 assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
2687 llvm::Value *V = Addr.emitRawPointer(*this);
2688 llvm::Type *VTy = V->getType();
2689 auto *PTy = dyn_cast<llvm::PointerType>(VTy);
2690 unsigned AS = PTy ? PTy->getAddressSpace() : 0;
2691 llvm::PointerType *IntrinTy =
2692 llvm::PointerType::get(CGM.getLLVMContext(), AS);
2693 llvm::Function *F = CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation,
2694 {IntrinTy, CGM.ConstGlobalsPtrTy});
2695
2696 for (const auto *I : D->specific_attrs<AnnotateAttr>()) {
2697 // FIXME Always emit the cast inst so we can differentiate between
2698 // annotation on the first field of a struct and annotation on the struct
2699 // itself.
2700 if (VTy != IntrinTy)
2701 V = Builder.CreateBitCast(V, IntrinTy);
2702 V = EmitAnnotationCall(F, V, I->getAnnotation(), D->getLocation(), I);
2703 V = Builder.CreateBitCast(V, VTy);
2704 }
2705
2706 return Address(V, Addr.getElementType(), Addr.getAlignment());
2707}
2708
2710
2712 : CGF(CGF) {
2713 assert(!CGF->IsSanitizerScope);
2714 CGF->IsSanitizerScope = true;
2715}
2716
2718 CGF->IsSanitizerScope = false;
2719}
2720
2721void CodeGenFunction::InsertHelper(llvm::Instruction *I,
2722 const llvm::Twine &Name,
2723 llvm::BasicBlock::iterator InsertPt) const {
2725 if (IsSanitizerScope)
2726 I->setNoSanitizeMetadata();
2727}
2728
2730 llvm::Instruction *I, const llvm::Twine &Name,
2731 llvm::BasicBlock::iterator InsertPt) const {
2732 llvm::IRBuilderDefaultInserter::InsertHelper(I, Name, InsertPt);
2733 if (CGF)
2734 CGF->InsertHelper(I, Name, InsertPt);
2735}
2736
2737// Emits an error if we don't have a valid set of target features for the
2738// called function.
2740 const FunctionDecl *TargetDecl) {
2741 // SemaChecking cannot handle below x86 builtins because they have different
2742 // parameter ranges with different TargetAttribute of caller.
2743 if (CGM.getContext().getTargetInfo().getTriple().isX86()) {
2744 unsigned BuiltinID = TargetDecl->getBuiltinID();
2745 if (BuiltinID == X86::BI__builtin_ia32_cmpps ||
2746 BuiltinID == X86::BI__builtin_ia32_cmpss ||
2747 BuiltinID == X86::BI__builtin_ia32_cmppd ||
2748 BuiltinID == X86::BI__builtin_ia32_cmpsd) {
2749 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
2750 llvm::StringMap<bool> TargetFetureMap;
2751 CGM.getContext().getFunctionFeatureMap(TargetFetureMap, FD);
2752 llvm::APSInt Result =
2753 *(E->getArg(2)->getIntegerConstantExpr(CGM.getContext()));
2754 if (Result.getSExtValue() > 7 && !TargetFetureMap.lookup("avx"))
2755 CGM.getDiags().Report(E->getBeginLoc(), diag::err_builtin_needs_feature)
2756 << TargetDecl->getDeclName() << "avx";
2757 }
2758 }
2759 return checkTargetFeatures(E->getBeginLoc(), TargetDecl);
2760}
2761
2762// Emits an error if we don't have a valid set of target features for the
2763// called function.
2765 const FunctionDecl *TargetDecl) {
2766 // Early exit if this is an indirect call.
2767 if (!TargetDecl)
2768 return;
2769
2770 // Get the current enclosing function if it exists. If it doesn't
2771 // we can't check the target features anyhow.
2772 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
2773 if (!FD)
2774 return;
2775
2776 // Grab the required features for the call. For a builtin this is listed in
2777 // the td file with the default cpu, for an always_inline function this is any
2778 // listed cpu and any listed features.
2779 unsigned BuiltinID = TargetDecl->getBuiltinID();
2780 std::string MissingFeature;
2781 llvm::StringMap<bool> CallerFeatureMap;
2782 CGM.getContext().getFunctionFeatureMap(CallerFeatureMap, FD);
2783 // When compiling in HipStdPar mode we have to be conservative in rejecting
2784 // target specific features in the FE, and defer the possible error to the
2785 // AcceleratorCodeSelection pass, wherein iff an unsupported target builtin is
2786 // referenced by an accelerator executable function, we emit an error.
2787 bool IsHipStdPar = getLangOpts().HIPStdPar && getLangOpts().CUDAIsDevice;
2788 if (BuiltinID) {
2789 StringRef FeatureList(CGM.getContext().BuiltinInfo.getRequiredFeatures(BuiltinID));
2791 FeatureList, CallerFeatureMap) && !IsHipStdPar) {
2792 CGM.getDiags().Report(Loc, diag::err_builtin_needs_feature)
2793 << TargetDecl->getDeclName()
2794 << FeatureList;
2795 }
2796 } else if (!TargetDecl->isMultiVersion() &&
2797 TargetDecl->hasAttr<TargetAttr>()) {
2798 // Get the required features for the callee.
2799
2800 const TargetAttr *TD = TargetDecl->getAttr<TargetAttr>();
2803
2804 SmallVector<StringRef, 1> ReqFeatures;
2805 llvm::StringMap<bool> CalleeFeatureMap;
2806 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
2807
2808 for (const auto &F : ParsedAttr.Features) {
2809 if (F[0] == '+' && CalleeFeatureMap.lookup(F.substr(1)))
2810 ReqFeatures.push_back(StringRef(F).substr(1));
2811 }
2812
2813 for (const auto &F : CalleeFeatureMap) {
2814 // Only positive features are "required".
2815 if (F.getValue())
2816 ReqFeatures.push_back(F.getKey());
2817 }
2818 if (!llvm::all_of(ReqFeatures, [&](StringRef Feature) {
2819 if (!CallerFeatureMap.lookup(Feature)) {
2820 MissingFeature = Feature.str();
2821 return false;
2822 }
2823 return true;
2824 }) && !IsHipStdPar)
2825 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
2826 << FD->getDeclName() << TargetDecl->getDeclName() << MissingFeature;
2827 } else if (!FD->isMultiVersion() && FD->hasAttr<TargetAttr>()) {
2828 llvm::StringMap<bool> CalleeFeatureMap;
2829 CGM.getContext().getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
2830
2831 for (const auto &F : CalleeFeatureMap) {
2832 if (F.getValue() && (!CallerFeatureMap.lookup(F.getKey()) ||
2833 !CallerFeatureMap.find(F.getKey())->getValue()) &&
2834 !IsHipStdPar)
2835 CGM.getDiags().Report(Loc, diag::err_function_needs_feature)
2836 << FD->getDeclName() << TargetDecl->getDeclName() << F.getKey();
2837 }
2838 }
2839}
2840
2841void CodeGenFunction::EmitSanitizerStatReport(llvm::SanitizerStatKind SSK) {
2842 if (!CGM.getCodeGenOpts().SanitizeStats)
2843 return;
2844
2845 llvm::IRBuilder<> IRB(Builder.GetInsertBlock(), Builder.GetInsertPoint());
2846 IRB.SetCurrentDebugLocation(Builder.getCurrentDebugLocation());
2847 CGM.getSanStats().create(IRB, SSK);
2848}
2849
2851 const CGCallee &Callee, SmallVectorImpl<llvm::OperandBundleDef> &Bundles) {
2852 const FunctionProtoType *FP =
2853 Callee.getAbstractInfo().getCalleeFunctionProtoType();
2854 if (FP)
2855 Bundles.emplace_back("kcfi", CGM.CreateKCFITypeId(FP->desugar()));
2856}
2857
2858llvm::Value *
2859CodeGenFunction::FormAArch64ResolverCondition(const FMVResolverOption &RO) {
2860 return RO.Features.empty() ? nullptr : EmitAArch64CpuSupports(RO.Features);
2861}
2862
2863llvm::Value *
2864CodeGenFunction::FormX86ResolverCondition(const FMVResolverOption &RO) {
2865 llvm::Value *Condition = nullptr;
2866
2867 if (RO.Architecture) {
2868 StringRef Arch = *RO.Architecture;
2869 // If arch= specifies an x86-64 micro-architecture level, test the feature
2870 // with __builtin_cpu_supports, otherwise use __builtin_cpu_is.
2871 if (Arch.starts_with("x86-64"))
2872 Condition = EmitX86CpuSupports({Arch});
2873 else
2874 Condition = EmitX86CpuIs(Arch);
2875 }
2876
2877 if (!RO.Features.empty()) {
2878 llvm::Value *FeatureCond = EmitX86CpuSupports(RO.Features);
2879 Condition =
2880 Condition ? Builder.CreateAnd(Condition, FeatureCond) : FeatureCond;
2881 }
2882 return Condition;
2883}
2884
2886 llvm::Function *Resolver,
2888 llvm::Function *FuncToReturn,
2889 bool SupportsIFunc) {
2890 if (SupportsIFunc) {
2891 Builder.CreateRet(FuncToReturn);
2892 return;
2893 }
2894
2896 llvm::make_pointer_range(Resolver->args()));
2897
2898 llvm::CallInst *Result = Builder.CreateCall(FuncToReturn, Args);
2899 Result->setTailCallKind(llvm::CallInst::TCK_MustTail);
2900
2901 if (Resolver->getReturnType()->isVoidTy())
2902 Builder.CreateRetVoid();
2903 else
2904 Builder.CreateRet(Result);
2905}
2906
2908 llvm::Function *Resolver, ArrayRef<FMVResolverOption> Options) {
2909
2910 llvm::Triple::ArchType ArchType =
2911 getContext().getTargetInfo().getTriple().getArch();
2912
2913 switch (ArchType) {
2914 case llvm::Triple::x86:
2915 case llvm::Triple::x86_64:
2916 EmitX86MultiVersionResolver(Resolver, Options);
2917 return;
2918 case llvm::Triple::aarch64:
2919 EmitAArch64MultiVersionResolver(Resolver, Options);
2920 return;
2921 case llvm::Triple::riscv32:
2922 case llvm::Triple::riscv64:
2923 EmitRISCVMultiVersionResolver(Resolver, Options);
2924 return;
2925
2926 default:
2927 assert(false && "Only implemented for x86, AArch64 and RISC-V targets");
2928 }
2929}
2930
2932 llvm::Function *Resolver, ArrayRef<FMVResolverOption> Options) {
2933
2934 if (getContext().getTargetInfo().getTriple().getOS() !=
2935 llvm::Triple::OSType::Linux) {
2936 CGM.getDiags().Report(diag::err_os_unsupport_riscv_fmv);
2937 return;
2938 }
2939
2940 llvm::BasicBlock *CurBlock = createBasicBlock("resolver_entry", Resolver);
2941 Builder.SetInsertPoint(CurBlock);
2943
2944 bool SupportsIFunc = getContext().getTargetInfo().supportsIFunc();
2945 bool HasDefault = false;
2946 unsigned DefaultIndex = 0;
2947
2948 // Check the each candidate function.
2949 for (unsigned Index = 0; Index < Options.size(); Index++) {
2950
2951 if (Options[Index].Features.empty()) {
2952 HasDefault = true;
2953 DefaultIndex = Index;
2954 continue;
2955 }
2956
2957 Builder.SetInsertPoint(CurBlock);
2958
2959 // FeaturesCondition: The bitmask of the required extension has been
2960 // enabled by the runtime object.
2961 // (__riscv_feature_bits.features[i] & REQUIRED_BITMASK) ==
2962 // REQUIRED_BITMASK
2963 //
2964 // When condition is met, return this version of the function.
2965 // Otherwise, try the next version.
2966 //
2967 // if (FeaturesConditionVersion1)
2968 // return Version1;
2969 // else if (FeaturesConditionVersion2)
2970 // return Version2;
2971 // else if (FeaturesConditionVersion3)
2972 // return Version3;
2973 // ...
2974 // else
2975 // return DefaultVersion;
2976
2977 // TODO: Add a condition to check the length before accessing elements.
2978 // Without checking the length first, we may access an incorrect memory
2979 // address when using different versions.
2980 llvm::SmallVector<StringRef, 8> CurrTargetAttrFeats;
2981 llvm::SmallVector<std::string, 8> TargetAttrFeats;
2982
2983 for (StringRef Feat : Options[Index].Features) {
2984 std::vector<std::string> FeatStr =
2986
2987 assert(FeatStr.size() == 1 && "Feature string not delimited");
2988
2989 std::string &CurrFeat = FeatStr.front();
2990 if (CurrFeat[0] == '+')
2991 TargetAttrFeats.push_back(CurrFeat.substr(1));
2992 }
2993
2994 if (TargetAttrFeats.empty())
2995 continue;
2996
2997 for (std::string &Feat : TargetAttrFeats)
2998 CurrTargetAttrFeats.push_back(Feat);
2999
3000 Builder.SetInsertPoint(CurBlock);
3001 llvm::Value *FeatsCondition = EmitRISCVCpuSupports(CurrTargetAttrFeats);
3002
3003 llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver);
3004 CGBuilderTy RetBuilder(*this, RetBlock);
3005 CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder,
3006 Options[Index].Function, SupportsIFunc);
3007 llvm::BasicBlock *ElseBlock = createBasicBlock("resolver_else", Resolver);
3008
3009 Builder.SetInsertPoint(CurBlock);
3010 Builder.CreateCondBr(FeatsCondition, RetBlock, ElseBlock);
3011
3012 CurBlock = ElseBlock;
3013 }
3014
3015 // Finally, emit the default one.
3016 if (HasDefault) {
3017 Builder.SetInsertPoint(CurBlock);
3019 CGM, Resolver, Builder, Options[DefaultIndex].Function, SupportsIFunc);
3020 return;
3021 }
3022
3023 // If no generic/default, emit an unreachable.
3024 Builder.SetInsertPoint(CurBlock);
3025 llvm::CallInst *TrapCall = EmitTrapCall(llvm::Intrinsic::trap);
3026 TrapCall->setDoesNotReturn();
3027 TrapCall->setDoesNotThrow();
3028 Builder.CreateUnreachable();
3029 Builder.ClearInsertionPoint();
3030}
3031
3033 llvm::Function *Resolver, ArrayRef<FMVResolverOption> Options) {
3034 assert(!Options.empty() && "No multiversion resolver options found");
3035 assert(Options.back().Features.size() == 0 && "Default case must be last");
3036 bool SupportsIFunc = getContext().getTargetInfo().supportsIFunc();
3037 assert(SupportsIFunc &&
3038 "Multiversion resolver requires target IFUNC support");
3039 bool AArch64CpuInitialized = false;
3040 llvm::BasicBlock *CurBlock = createBasicBlock("resolver_entry", Resolver);
3041
3042 for (const FMVResolverOption &RO : Options) {
3043 Builder.SetInsertPoint(CurBlock);
3044 llvm::Value *Condition = FormAArch64ResolverCondition(RO);
3045
3046 // The 'default' or 'all features enabled' case.
3047 if (!Condition) {
3048 CreateMultiVersionResolverReturn(CGM, Resolver, Builder, RO.Function,
3049 SupportsIFunc);
3050 return;
3051 }
3052
3053 if (!AArch64CpuInitialized) {
3054 Builder.SetInsertPoint(CurBlock, CurBlock->begin());
3055 EmitAArch64CpuInit();
3056 AArch64CpuInitialized = true;
3057 Builder.SetInsertPoint(CurBlock);
3058 }
3059
3060 llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver);
3061 CGBuilderTy RetBuilder(*this, RetBlock);
3062 CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, RO.Function,
3063 SupportsIFunc);
3064 CurBlock = createBasicBlock("resolver_else", Resolver);
3065 Builder.CreateCondBr(Condition, RetBlock, CurBlock);
3066 }
3067
3068 // If no default, emit an unreachable.
3069 Builder.SetInsertPoint(CurBlock);
3070 llvm::CallInst *TrapCall = EmitTrapCall(llvm::Intrinsic::trap);
3071 TrapCall->setDoesNotReturn();
3072 TrapCall->setDoesNotThrow();
3073 Builder.CreateUnreachable();
3074 Builder.ClearInsertionPoint();
3075}
3076
3078 llvm::Function *Resolver, ArrayRef<FMVResolverOption> Options) {
3079
3080 bool SupportsIFunc = getContext().getTargetInfo().supportsIFunc();
3081
3082 // Main function's basic block.
3083 llvm::BasicBlock *CurBlock = createBasicBlock("resolver_entry", Resolver);
3084 Builder.SetInsertPoint(CurBlock);
3085 EmitX86CpuInit();
3086
3087 for (const FMVResolverOption &RO : Options) {
3088 Builder.SetInsertPoint(CurBlock);
3089 llvm::Value *Condition = FormX86ResolverCondition(RO);
3090
3091 // The 'default' or 'generic' case.
3092 if (!Condition) {
3093 assert(&RO == Options.end() - 1 &&
3094 "Default or Generic case must be last");
3095 CreateMultiVersionResolverReturn(CGM, Resolver, Builder, RO.Function,
3096 SupportsIFunc);
3097 return;
3098 }
3099
3100 llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver);
3101 CGBuilderTy RetBuilder(*this, RetBlock);
3102 CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, RO.Function,
3103 SupportsIFunc);
3104 CurBlock = createBasicBlock("resolver_else", Resolver);
3105 Builder.CreateCondBr(Condition, RetBlock, CurBlock);
3106 }
3107
3108 // If no generic/default, emit an unreachable.
3109 Builder.SetInsertPoint(CurBlock);
3110 llvm::CallInst *TrapCall = EmitTrapCall(llvm::Intrinsic::trap);
3111 TrapCall->setDoesNotReturn();
3112 TrapCall->setDoesNotThrow();
3113 Builder.CreateUnreachable();
3114 Builder.ClearInsertionPoint();
3115}
3116
3117// Loc - where the diagnostic will point, where in the source code this
3118// alignment has failed.
3119// SecondaryLoc - if present (will be present if sufficiently different from
3120// Loc), the diagnostic will additionally point a "Note:" to this location.
3121// It should be the location where the __attribute__((assume_aligned))
3122// was written e.g.
3124 llvm::Value *Ptr, QualType Ty, SourceLocation Loc,
3125 SourceLocation SecondaryLoc, llvm::Value *Alignment,
3126 llvm::Value *OffsetValue, llvm::Value *TheCheck,
3127 llvm::Instruction *Assumption) {
3128 assert(isa_and_nonnull<llvm::CallInst>(Assumption) &&
3129 cast<llvm::CallInst>(Assumption)->getCalledOperand() ==
3130 llvm::Intrinsic::getOrInsertDeclaration(
3131 Builder.GetInsertBlock()->getParent()->getParent(),
3132 llvm::Intrinsic::assume) &&
3133 "Assumption should be a call to llvm.assume().");
3134 assert(&(Builder.GetInsertBlock()->back()) == Assumption &&
3135 "Assumption should be the last instruction of the basic block, "
3136 "since the basic block is still being generated.");
3137
3138 if (!SanOpts.has(SanitizerKind::Alignment))
3139 return;
3140
3141 // Don't check pointers to volatile data. The behavior here is implementation-
3142 // defined.
3144 return;
3145
3146 // We need to temorairly remove the assumption so we can insert the
3147 // sanitizer check before it, else the check will be dropped by optimizations.
3148 Assumption->removeFromParent();
3149
3150 {
3151 SanitizerScope SanScope(this);
3152
3153 if (!OffsetValue)
3154 OffsetValue = Builder.getInt1(false); // no offset.
3155
3156 llvm::Constant *StaticData[] = {EmitCheckSourceLocation(Loc),
3157 EmitCheckSourceLocation(SecondaryLoc),
3159 llvm::Value *DynamicData[] = {EmitCheckValue(Ptr),
3160 EmitCheckValue(Alignment),
3161 EmitCheckValue(OffsetValue)};
3162 EmitCheck({std::make_pair(TheCheck, SanitizerKind::Alignment)},
3163 SanitizerHandler::AlignmentAssumption, StaticData, DynamicData);
3164 }
3165
3166 // We are now in the (new, empty) "cont" basic block.
3167 // Reintroduce the assumption.
3168 Builder.Insert(Assumption);
3169 // FIXME: Assumption still has it's original basic block as it's Parent.
3170}
3171
3173 if (CGDebugInfo *DI = getDebugInfo())
3174 return DI->SourceLocToDebugLoc(Location);
3175
3176 return llvm::DebugLoc();
3177}
3178
3179llvm::Value *
3180CodeGenFunction::emitCondLikelihoodViaExpectIntrinsic(llvm::Value *Cond,
3181 Stmt::Likelihood LH) {
3182 switch (LH) {
3183 case Stmt::LH_None:
3184 return Cond;
3185 case Stmt::LH_Likely:
3186 case Stmt::LH_Unlikely:
3187 // Don't generate llvm.expect on -O0 as the backend won't use it for
3188 // anything.
3189 if (CGM.getCodeGenOpts().OptimizationLevel == 0)
3190 return Cond;
3191 llvm::Type *CondTy = Cond->getType();
3192 assert(CondTy->isIntegerTy(1) && "expecting condition to be a boolean");
3193 llvm::Function *FnExpect =
3194 CGM.getIntrinsic(llvm::Intrinsic::expect, CondTy);
3195 llvm::Value *ExpectedValueOfCond =
3196 llvm::ConstantInt::getBool(CondTy, LH == Stmt::LH_Likely);
3197 return Builder.CreateCall(FnExpect, {Cond, ExpectedValueOfCond},
3198 Cond->getName() + ".expval");
3199 }
3200 llvm_unreachable("Unknown Likelihood");
3201}
3202
3203llvm::Value *CodeGenFunction::emitBoolVecConversion(llvm::Value *SrcVec,
3204 unsigned NumElementsDst,
3205 const llvm::Twine &Name) {
3206 auto *SrcTy = cast<llvm::FixedVectorType>(SrcVec->getType());
3207 unsigned NumElementsSrc = SrcTy->getNumElements();
3208 if (NumElementsSrc == NumElementsDst)
3209 return SrcVec;
3210
3211 std::vector<int> ShuffleMask(NumElementsDst, -1);
3212 for (unsigned MaskIdx = 0;
3213 MaskIdx < std::min<>(NumElementsDst, NumElementsSrc); ++MaskIdx)
3214 ShuffleMask[MaskIdx] = MaskIdx;
3215
3216 return Builder.CreateShuffleVector(SrcVec, ShuffleMask, Name);
3217}
3218
3220 const CGPointerAuthInfo &PointerAuth,
3222 if (!PointerAuth.isSigned())
3223 return;
3224
3225 auto *Key = Builder.getInt32(PointerAuth.getKey());
3226
3227 llvm::Value *Discriminator = PointerAuth.getDiscriminator();
3228 if (!Discriminator)
3229 Discriminator = Builder.getSize(0);
3230
3231 llvm::Value *Args[] = {Key, Discriminator};
3232 Bundles.emplace_back("ptrauth", Args);
3233}
3234
3236 const CGPointerAuthInfo &PointerAuth,
3237 llvm::Value *Pointer,
3238 unsigned IntrinsicID) {
3239 if (!PointerAuth)
3240 return Pointer;
3241
3242 auto Key = CGF.Builder.getInt32(PointerAuth.getKey());
3243
3244 llvm::Value *Discriminator = PointerAuth.getDiscriminator();
3245 if (!Discriminator) {
3246 Discriminator = CGF.Builder.getSize(0);
3247 }
3248
3249 // Convert the pointer to intptr_t before signing it.
3250 auto OrigType = Pointer->getType();
3251 Pointer = CGF.Builder.CreatePtrToInt(Pointer, CGF.IntPtrTy);
3252
3253 // call i64 @llvm.ptrauth.sign.i64(i64 %pointer, i32 %key, i64 %discriminator)
3254 auto Intrinsic = CGF.CGM.getIntrinsic(IntrinsicID);
3255 Pointer = CGF.EmitRuntimeCall(Intrinsic, {Pointer, Key, Discriminator});
3256
3257 // Convert back to the original type.
3258 Pointer = CGF.Builder.CreateIntToPtr(Pointer, OrigType);
3259 return Pointer;
3260}
3261
3262llvm::Value *
3264 llvm::Value *Pointer) {
3265 if (!PointerAuth.shouldSign())
3266 return Pointer;
3267 return EmitPointerAuthCommon(*this, PointerAuth, Pointer,
3268 llvm::Intrinsic::ptrauth_sign);
3269}
3270
3271static llvm::Value *EmitStrip(CodeGenFunction &CGF,
3272 const CGPointerAuthInfo &PointerAuth,
3273 llvm::Value *Pointer) {
3274 auto StripIntrinsic = CGF.CGM.getIntrinsic(llvm::Intrinsic::ptrauth_strip);
3275
3276 auto Key = CGF.Builder.getInt32(PointerAuth.getKey());
3277 // Convert the pointer to intptr_t before signing it.
3278 auto OrigType = Pointer->getType();
3280 StripIntrinsic, {CGF.Builder.CreatePtrToInt(Pointer, CGF.IntPtrTy), Key});
3281 return CGF.Builder.CreateIntToPtr(Pointer, OrigType);
3282}
3283
3284llvm::Value *
3286 llvm::Value *Pointer) {
3287 if (PointerAuth.shouldStrip()) {
3288 return EmitStrip(*this, PointerAuth, Pointer);
3289 }
3290 if (!PointerAuth.shouldAuth()) {
3291 return Pointer;
3292 }
3293
3294 return EmitPointerAuthCommon(*this, PointerAuth, Pointer,
3295 llvm::Intrinsic::ptrauth_auth);
3296}
Defines the clang::ASTContext interface.
#define V(N, I)
Definition: ASTContext.h:3443
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.
const Decl * D
Expr * E
static llvm::Value * EmitPointerAuthCommon(CodeGenFunction &CGF, const CGPointerAuthInfo &PointerAuth, llvm::Value *Pointer, unsigned IntrinsicID)
static void CreateMultiVersionResolverReturn(CodeGenModule &CGM, llvm::Function *Resolver, CGBuilderTy &Builder, llvm::Function *FuncToReturn, bool SupportsIFunc)
static llvm::Value * EmitStrip(CodeGenFunction &CGF, const CGPointerAuthInfo &PointerAuth, llvm::Value *Pointer)
static void emitNonZeroVLAInit(CodeGenFunction &CGF, QualType baseType, Address dest, Address src, llvm::Value *sizeInChars)
emitNonZeroVLAInit - Emit the "zero" initialization of a variable-length array whose elements have a ...
static void EmitIfUsed(CodeGenFunction &CGF, llvm::BasicBlock *BB)
static LValue makeNaturalAlignAddrLValue(llvm::Value *V, QualType T, bool ForPointeeType, bool MightBeSigned, CodeGenFunction &CGF, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
static void TryMarkNoThrow(llvm::Function *F)
Tries to mark the given function nounwind based on the non-existence of any throwing calls within it.
static llvm::Constant * getPrologueSignature(CodeGenModule &CGM, const FunctionDecl *FD)
Return the UBSan prologue signature for FD if one is available.
static bool endsWithReturn(const Decl *F)
Determine whether the function F ends with a return stmt.
static bool shouldEmitLifetimeMarkers(const CodeGenOptions &CGOpts, const LangOptions &LangOpts)
shouldEmitLifetimeMarkers - Decide whether we need emit the life-time markers.
static bool matchesStlAllocatorFn(const Decl *D, const ASTContext &Ctx)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
llvm::MachO::Target Target
Definition: MachO.h:51
SourceLocation Loc
Definition: SemaObjC.cpp:759
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:188
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:1187
Builtin::Context & BuiltinInfo
Definition: ASTContext.h:682
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
bool hasAnyFunctionEffects() const
Definition: ASTContext.h:3014
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:2918
const TargetInfo & getTargetInfo() const
Definition: ASTContext.h:799
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: Type.h:3577
QualType getElementType() const
Definition: Type.h:3589
Attr - This represents one attribute.
Definition: Attr.h:43
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3909
static bool isLogicalOp(Opcode Opc)
Definition: Expr.h:4042
const char * getRequiredFeatures(unsigned ID) const
Definition: Builtins.h:256
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2553
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2078
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:2556
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition: DeclCXX.h:2204
QualType getThisType() const
Return the type of the this pointer.
Definition: DeclCXX.cpp:2657
bool isStatic() const
Definition: DeclCXX.cpp:2280
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:1030
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:1735
bool isCapturelessLambda() const
Definition: DeclCXX.h:1076
A C++ throw-expression (C++ [except.throw]).
Definition: ExprCXX.h:1206
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2874
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
PointerAuthOptions PointerAuth
Configuration for pointer-signing.
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:128
static Address invalid()
Definition: Address.h:176
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:251
CharUnits getAlignment() const
Definition: Address.h:189
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Definition: Address.h:207
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
Definition: Address.h:274
bool isValid() const
Definition: Address.h:177
llvm::PointerType * getType() const
Return the type of the pointer value.
Definition: Address.h:199
A scoped helper to set the current debug location to the specified location or preferred location of ...
Definition: CGDebugInfo.h:858
static ApplyDebugLocation CreateDefaultArtificial(CodeGenFunction &CGF, SourceLocation TemporaryLocation)
Apply TemporaryLocation if it is valid.
Definition: CGDebugInfo.h:905
This is an IRBuilder insertion helper that forwards to CodeGenFunction::InsertHelper,...
Definition: CGBuilder.h:30
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock::iterator InsertPt) const override
This forwards to CodeGenFunction::InsertHelper.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Definition: CGBuilder.h:136
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
Definition: CGBuilder.h:398
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:365
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
Definition: CGBuilder.h:128
llvm::ConstantInt * getSize(CharUnits N)
Definition: CGBuilder.h:99
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
Definition: CGBuilder.h:346
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:63
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
Definition: CGDebugInfo.h:58
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 setHLSLFunctionAttributes(const FunctionDecl *FD, llvm::Function *Fn)
void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn)
virtual void functionFinished(CodeGenFunction &CGF)
Cleans up references to the objects in finished function.
llvm::OpenMPIRBuilder & getOMPBuilder()
virtual void emitFunctionProlog(CodeGenFunction &CGF, const Decl *D)
Emits OpenMP-specific function prolog.
llvm::Value * getDiscriminator() const
CGFPOptionsRAII(CodeGenFunction &CGF, FPOptions FPFeatures)
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
llvm::Value * EmitPointerAuthAuth(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
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...
void EmitPointerAuthOperandBundle(const CGPointerAuthInfo &Info, SmallVectorImpl< llvm::OperandBundleDef > &Bundles)
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 EmitAArch64MultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
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)
void EmitMultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
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.
llvm::Value * EmitRISCVCpuSupports(const CallExpr *E)
bool CurFuncIsThunk
In C++, whether we are code generating a thunk.
SmallVector< llvm::ConvergenceControlInst *, 4 > ConvergenceTokenStack
Stack to track the controlled convergence tokens.
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.
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 EmitFunctionBody(const Stmt *Body)
void EmitRISCVMultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
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.
llvm::Value * EmitPointerAuthSign(const CGPointerAuthInfo &Info, llvm::Value *Pointer)
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 EmitX86MultiVersionResolver(llvm::Function *Resolver, ArrayRef< FMVResolverOption > Options)
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.
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.
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.
void EmitStmt(const Stmt *S, ArrayRef< const Attr * > Attrs={})
EmitStmt - Emit the code for the statement.
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::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
llvm::Type * ConvertType(QualType T)
CodeGenTypes & getTypes() const
bool IsSanitizerScope
True if CodeGen currently emits code implementing sanitizer checks.
HLSLControlFlowHintAttr::Spelling HLSLControlFlowAttr
HLSL Branch attribute.
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
llvm::SmallVector< const ParmVarDecl *, 4 > FnArgs
Save Parameter Decl for coroutine.
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
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock::iterator InsertPt) const
CGBuilder insert helper.
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 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::Type * convertTypeForLoadStore(QualType ASTTy, llvm::Type *LLVMTy=nullptr)
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::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
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.
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:1819
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:325
llvm::Type * convertTypeForLoadStore(QualType T, llvm::Type *LLVMTy=nullptr)
Given that T is a scalar type, return the IR type that should be used for load and store operations.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
bool isZeroInitializable(QualType T)
IsZeroInitializable - Return whether a type can be zero-initialized (in the C++ sense) with an LLVM z...
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:382
LValue - This represents an lvalue references.
Definition: CGValue.h:182
llvm::Value * getPointer(CodeGenFunction &CGF) const
Address getAddress() const
Definition: CGValue.h:361
void InsertHelper(llvm::Instruction *I) const
Function called by the CodeGenFunction when an instruction is created.
Definition: CGLoopInfo.cpp:840
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
Definition: CGValue.h:42
bool isScalar() const
Definition: CGValue.h:64
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
Definition: CGValue.h:71
llvm::Value * getPointer() const
Definition: Address.h:66
bool isValid() const
Definition: Address.h:62
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:90
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:237
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:1628
ConditionalOperator - The ?: ternary operator.
Definition: Expr.h:4262
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1265
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
T * getAttr() const
Definition: DeclBase.h:576
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:520
Decl * getNonClosureContext()
Find the innermost non-closure ancestor of this declaration, walking up through blocks,...
Definition: DeclBase.cpp:1243
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
Definition: DeclBase.h:562
SourceLocation getLocation() const
Definition: DeclBase.h:442
bool hasAttr() const
Definition: DeclBase.h:580
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1493
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition: Diagnostic.h:939
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:3886
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition: Expr.cpp:3086
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
Definition: Expr.cpp:3070
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:4126
LangOptions::FPExceptionModeKind getExceptionMode() const
Definition: LangOptions.h:924
bool allowFPContractAcrossStatement() const
Definition: LangOptions.h:899
RoundingMode getRoundingMode() const
Definition: LangOptions.h:912
Represents a member of a struct/union/class.
Definition: Decl.h:3033
Represents a function declaration or definition.
Definition: Decl.h:1935
bool isMultiVersion() const
True if this function is considered a multiversioned function.
Definition: Decl.h:2565
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition: Decl.cpp:3243
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
Definition: Decl.cpp:3638
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
Definition: Decl.h:2784
bool usesSEHTry() const
Indicates the function uses __try.
Definition: Decl.h:2446
QualType getReturnType() const
Definition: Decl.h:2720
ArrayRef< ParmVarDecl * > parameters() const
Definition: Decl.h:2649
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:4123
FunctionEffectsRef getFunctionEffects() const
Definition: Decl.h:3009
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
Definition: Decl.cpp:3320
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
Definition: Decl.cpp:3455
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
Definition: Decl.h:2356
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
Definition: Decl.cpp:3313
bool isDefaulted() const
Whether this function is defaulted.
Definition: Decl.h:2313
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition: Decl.cpp:3989
Represents a prototype with parameter type info, e.g.
Definition: Type.h:5102
QualType desugar() const
Definition: Type.h:5646
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:5402
Represents the declaration of a label.
Definition: Decl.h:503
FPExceptionModeKind
Possible floating point exception behavior.
Definition: LangOptions.h:287
@ FPE_Strict
Strictly preserve the floating-point exception semantics.
Definition: LangOptions.h:293
@ FPE_MayTrap
Transformations do not cause new exceptions but may hide some.
Definition: LangOptions.h:291
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Definition: LangOptions.h:289
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:499
SanitizerSet Sanitize
Set of enabled sanitizers.
Definition: LangOptions.h:505
RoundingMode getDefaultRoundingMode() const
Definition: LangOptions.h:811
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:319
Represents a parameter to a function.
Definition: Decl.h:1725
ParsedAttr - Represents a syntactic attribute.
Definition: ParsedAttr.h:129
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition: Type.h:3198
@ 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:929
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition: Type.h:8015
field_range fields() const
Definition: Decl.h:4354
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:6072
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Definition: Redeclarable.h:203
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:1380
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition: Stmt.cpp:333
Likelihood
The likelihood of a branch being taken.
Definition: Stmt.h:1323
@ LH_Unlikely
Branch has the [[unlikely]] attribute.
Definition: Stmt.h:1324
@ LH_None
No attribute set or branches of the IfStmt have the same attribute.
Definition: Stmt.h:1325
@ LH_Likely
Branch has the [[likely]] attribute.
Definition: Stmt.h:1327
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Stmt.cpp:345
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:1262
bool supportsIFunc() const
Identify whether this target supports IFuncs.
Definition: TargetInfo.h:1510
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
Definition: TargetInfo.h:1333
virtual ParsedTargetAttr parseTargetAttr(StringRef Str) const
Definition: TargetInfo.cpp:565
virtual std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts) const
Returns target-specific min and max values VScale_Range.
Definition: TargetInfo.h:1026
The base class of the type hierarchy.
Definition: Type.h:1828
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.cpp:1916
bool isVoidType() const
Definition: Type.h:8510
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
Definition: Type.cpp:2180
bool isPointerType() const
Definition: Type.h:8186
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition: Type.cpp:738
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition: Type.h:2724
TypeClass getTypeClass() const
Definition: Type.h:2341
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8731
bool isRecordType() const
Definition: Type.h:8286
bool isObjCRetainableType() const
Definition: Type.cpp:5028
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Definition: Type.cpp:4763
bool isFunctionNoProtoType() const
Definition: Type.h:2534
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition: Expr.h:2232
QualType getType() const
Definition: Decl.h:682
Represents a variable declaration or definition.
Definition: Decl.h:882
Represents a C array with a specified size that is not an integer-constant-expression.
Definition: Type.h:3808
Expr * getSizeExpr() const
Definition: Type.h:3827
QualType getElementType() const
Definition: Type.h:4048
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.
@ NotKnownNonNull
Definition: Address.h:33
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:2355
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
unsigned int uint32_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
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Definition: Type.h:4840
Contains information gathered from parsing the contents of TargetAttr.
Definition: TargetInfo.h:58
std::vector< std::string > Features
Definition: TargetInfo.h:59
bool ReturnAddresses
Should return addresses be authenticated?
bool AArch64JumpTableHardening
Use hardened lowering for jump-table dispatch?
PointerAuthSchema FunctionPointers
The ABI for C function pointers.
bool AuthTraps
Do authentication failures cause a trap?
bool IndirectGotos
Do indirect goto label addresses need to be authenticated?
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