clang 24.0.0git
CodeGenModule.h
Go to the documentation of this file.
1//===--- CodeGenModule.h - Per-Module state for LLVM CodeGen ----*- C++ -*-===//
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 is the internal per-translation-unit state used for llvm translation.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENMODULE_H
14#define LLVM_CLANG_LIB_CODEGEN_CODEGENMODULE_H
15
16#include "CGVTables.h"
17#include "CodeGenTypeCache.h"
18#include "CodeGenTypes.h"
19#include "SanitizerMetadata.h"
20#include "TrapReasonBuilder.h"
21#include "clang/AST/DeclCXX.h"
22#include "clang/AST/DeclObjC.h"
25#include "clang/AST/Mangle.h"
26#include "clang/Basic/ABI.h"
34#include "llvm/ADT/DenseMap.h"
35#include "llvm/ADT/MapVector.h"
36#include "llvm/ADT/SetVector.h"
37#include "llvm/ADT/SmallPtrSet.h"
38#include "llvm/ADT/StringMap.h"
39#include "llvm/IR/Module.h"
40#include "llvm/IR/ValueHandle.h"
41#include "llvm/Support/Allocator.h"
42#include "llvm/Support/VirtualFileSystemFwd.h"
43#include "llvm/Transforms/Utils/SanitizerStats.h"
44#include <optional>
45
46namespace llvm {
47class Module;
48class Constant;
49class ConstantInt;
50class Function;
51class GlobalValue;
52class DataLayout;
53class FunctionType;
54class LLVMContext;
55class IndexedInstrProfReader;
56
57namespace abi {
58class ArgInfo;
59class IRTypeMapper;
60class TargetInfo;
61class TypeBuilder;
62} // namespace abi
63}
64
65namespace clang {
66class ASTContext;
67class AtomicType;
68class FunctionDecl;
69class IdentifierInfo;
70class ObjCImplementationDecl;
71class ObjCEncodeExpr;
72class BlockExpr;
73class CharUnits;
74class Decl;
75class Expr;
76class Stmt;
77class StringLiteral;
78class NamedDecl;
79class PointerAuthSchema;
80class ValueDecl;
81class VarDecl;
82class LangOptions;
83class CodeGenOptions;
84class HeaderSearchOptions;
85class DiagnosticsEngine;
86class AnnotateAttr;
87class CXXDestructorDecl;
88class Module;
89class CoverageSourceInfo;
90class InitSegAttr;
91
92namespace CodeGen {
93
94class CodeGenFunction;
95class CodeGenTBAA;
96class CGCXXABI;
97class CGDebugInfo;
98class CGObjCRuntime;
99class CGOpenCLRuntime;
100class CGOpenMPRuntime;
101class CGCUDARuntime;
102class CGHLSLRuntime;
103class CGFunctionInfo;
104class CoverageMappingModuleGen;
105class QualTypeMapper;
106class TargetCodeGenInfo;
107
108enum ForDefinition_t : bool {
111};
112
113/// The Counter with an optional additional Counter for
114/// branches. `Skipped` counter can be calculated with `Executed` and
115/// a common Counter (like `Parent`) as `(Parent-Executed)`.
116///
117/// In SingleByte mode, Counters are binary. Subtraction is not
118/// applicable (but addition is capable). In this case, both
119/// `Executed` and `Skipped` counters are required. `Skipped` is
120/// `None` by default. It is allocated in the coverage mapping.
121///
122/// There might be cases that `Parent` could be induced with
123/// `(Executed+Skipped)`. This is not always applicable.
125public:
126 /// Optional value.
127 class ValueOpt {
128 private:
129 static constexpr uint32_t None = (1u << 31); /// None is allocated.
130 static constexpr uint32_t Mask = None - 1;
131
132 uint32_t Val;
133
134 public:
135 ValueOpt() : Val(None) {}
136
137 ValueOpt(unsigned InitVal) {
138 assert(!(InitVal & ~Mask));
139 Val = InitVal;
140 }
141
142 bool hasValue() const { return !(Val & None); }
143
144 operator uint32_t() const { return Val; }
145 };
146
148 ValueOpt Skipped; /// May be None.
149
150 /// Initialized with Skipped=None.
151 CounterPair(unsigned Val) : Executed(Val) {}
152
153 // FIXME: Should work with {None, None}
155};
156
158 unsigned int priority;
159 unsigned int lex_order;
160 OrderGlobalInitsOrStermFinalizers(unsigned int p, unsigned int l)
161 : priority(p), lex_order(l) {}
162
164 return priority == RHS.priority && lex_order == RHS.lex_order;
165 }
166
168 return std::tie(priority, lex_order) <
169 std::tie(RHS.priority, RHS.lex_order);
170 }
171};
172
174 ObjCEntrypoints() { memset(this, 0, sizeof(*this)); }
175
176 /// void objc_alloc(id);
177 llvm::FunctionCallee objc_alloc;
178
179 /// void objc_allocWithZone(id);
180 llvm::FunctionCallee objc_allocWithZone;
181
182 /// void objc_alloc_init(id);
183 llvm::FunctionCallee objc_alloc_init;
184
185 /// void objc_autoreleasePoolPop(void*);
186 llvm::FunctionCallee objc_autoreleasePoolPop;
187
188 /// void objc_autoreleasePoolPop(void*);
189 /// Note this method is used when we are using exception handling
190 llvm::FunctionCallee objc_autoreleasePoolPopInvoke;
191
192 /// void *objc_autoreleasePoolPush(void);
194
195 /// id objc_autorelease(id);
196 llvm::Function *objc_autorelease;
197
198 /// id objc_autorelease(id);
199 /// Note this is the runtime method not the intrinsic.
201
202 /// id objc_autoreleaseReturnValue(id);
204
205 /// void objc_copyWeak(id *dest, id *src);
206 llvm::Function *objc_copyWeak;
207
208 /// void objc_destroyWeak(id*);
209 llvm::Function *objc_destroyWeak;
210
211 /// id objc_initWeak(id*, id);
212 llvm::Function *objc_initWeak;
213
214 /// id objc_loadWeak(id*);
215 llvm::Function *objc_loadWeak;
216
217 /// id objc_loadWeakRetained(id*);
218 llvm::Function *objc_loadWeakRetained;
219
220 /// void objc_moveWeak(id *dest, id *src);
221 llvm::Function *objc_moveWeak;
222
223 /// id objc_retain(id);
224 llvm::Function *objc_retain;
225
226 /// id objc_retain(id);
227 /// Note this is the runtime method not the intrinsic.
228 llvm::FunctionCallee objc_retainRuntimeFunction;
229
230 /// id objc_retainAutorelease(id);
231 llvm::Function *objc_retainAutorelease;
232
233 /// id objc_retainAutoreleaseReturnValue(id);
235
236 /// id objc_retainAutoreleasedReturnValue(id);
238
239 /// id objc_retainBlock(id);
240 llvm::Function *objc_retainBlock;
241
242 /// void objc_release(id);
243 llvm::Function *objc_release;
244
245 /// void objc_release(id);
246 /// Note this is the runtime method not the intrinsic.
247 llvm::FunctionCallee objc_releaseRuntimeFunction;
248
249 /// void objc_storeStrong(id*, id);
250 llvm::Function *objc_storeStrong;
251
252 /// id objc_storeWeak(id*, id);
253 llvm::Function *objc_storeWeak;
254
255 /// id objc_unsafeClaimAutoreleasedReturnValue(id);
257
258 /// A void(void) inline asm to use to mark that the return value of
259 /// a call will be immediately retain.
261
262 /// void clang.arc.use(...);
263 llvm::Function *clang_arc_use;
264
265 /// void clang.arc.noop.use(...);
266 llvm::Function *clang_arc_noop_use;
267};
268
269/// This class records statistics on instrumentation based profiling.
271 uint32_t VisitedInMainFile = 0;
272 uint32_t MissingInMainFile = 0;
273 uint32_t Visited = 0;
274 uint32_t Missing = 0;
275 uint32_t Mismatched = 0;
276
277public:
278 InstrProfStats() = default;
279 /// Record that we've visited a function and whether or not that function was
280 /// in the main source file.
281 void addVisited(bool MainFile) {
282 if (MainFile)
283 ++VisitedInMainFile;
284 ++Visited;
285 }
286 /// Record that a function we've visited has no profile data.
287 void addMissing(bool MainFile) {
288 if (MainFile)
289 ++MissingInMainFile;
290 ++Missing;
291 }
292 /// Record that a function we've visited has mismatched profile data.
293 void addMismatched(bool MainFile) { ++Mismatched; }
294 /// Whether or not the stats we've gathered indicate any potential problems.
295 bool hasDiagnostics() { return Missing || Mismatched; }
296 /// Report potential problems we've found to \c Diags.
297 void reportDiagnostics(DiagnosticsEngine &Diags, StringRef MainFile);
298};
299
300/// A pair of helper functions for a __block variable.
301class BlockByrefHelpers : public llvm::FoldingSetNode {
302 // MSVC requires this type to be complete in order to process this
303 // header.
304public:
305 llvm::Constant *CopyHelper;
306 llvm::Constant *DisposeHelper;
307
308 /// The alignment of the field. This is important because
309 /// different offsets to the field within the byref struct need to
310 /// have different helper functions.
312
316 virtual ~BlockByrefHelpers();
317
318 void Profile(llvm::FoldingSetNodeID &id) const {
319 id.AddInteger(Alignment.getQuantity());
320 profileImpl(id);
321 }
322 virtual void profileImpl(llvm::FoldingSetNodeID &id) const = 0;
323
324 virtual bool needsCopy() const { return true; }
325 virtual void emitCopy(CodeGenFunction &CGF, Address dest, Address src) = 0;
326
327 virtual bool needsDispose() const { return true; }
328 virtual void emitDispose(CodeGenFunction &CGF, Address field) = 0;
329};
330
331/// This class organizes the cross-function state that is used while generating
332/// LLVM code.
333class CodeGenModule : public CodeGenTypeCache {
334 CodeGenModule(const CodeGenModule &) = delete;
335 void operator=(const CodeGenModule &) = delete;
336
337public:
338 struct Structor {
347 unsigned LexOrder;
348 llvm::Constant *Initializer;
349 llvm::Constant *AssociatedData;
350 };
351
352 typedef std::vector<Structor> CtorList;
353
354private:
355 ASTContext &Context;
356 const LangOptions &LangOpts;
357 IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS; // Only used for debug info.
358 const HeaderSearchOptions &HeaderSearchOpts; // Only used for debug info.
359 const PreprocessorOptions &PreprocessorOpts; // Only used for debug info.
360 const CodeGenOptions &CodeGenOpts;
361 unsigned NumAutoVarInit = 0;
362 llvm::Module &TheModule;
363 DiagnosticsEngine &Diags;
364 const TargetInfo &Target;
365 std::unique_ptr<CGCXXABI> ABI;
366 llvm::LLVMContext &VMContext;
367 std::string ModuleNameHash;
368 bool CXX20ModuleInits = false;
369 std::unique_ptr<CodeGenTBAA> TBAA;
370
371 mutable std::unique_ptr<TargetCodeGenInfo> TheTargetCodeGenInfo;
372
373 /// Cached LLVMABI target lowering info, lazily constructed when the
374 /// experimental ABI lowering path is taken.
375 mutable std::unique_ptr<llvm::abi::TargetInfo> TheLLVMABITargetInfo;
376
377 /// Allocator and mappers used by the experimental LLVMABI-based lowering
378 /// path (gated on -fexperimental-abi-lowering). Constructed unconditionally
379 /// so the path can be entered without re-checking initialization, but the
380 /// caches stay empty when the flag is off.
381 llvm::BumpPtrAllocator AbiAlloc;
382 std::unique_ptr<QualTypeMapper> AbiMapper;
383 std::unique_ptr<llvm::abi::IRTypeMapper> AbiReverseMapper;
384
385 // This should not be moved earlier, since its initialization depends on some
386 // of the previous reference members being already initialized and also checks
387 // if TheTargetCodeGenInfo is NULL
388 std::unique_ptr<CodeGenTypes> Types;
389
390 /// Holds information about C++ vtables.
391 CodeGenVTables VTables;
392
393 std::unique_ptr<CGObjCRuntime> ObjCRuntime;
394 std::unique_ptr<CGOpenCLRuntime> OpenCLRuntime;
395 std::unique_ptr<CGOpenMPRuntime> OpenMPRuntime;
396 std::unique_ptr<CGCUDARuntime> CUDARuntime;
397 std::unique_ptr<CGHLSLRuntime> HLSLRuntime;
398 std::unique_ptr<CGDebugInfo> DebugInfo;
399 std::unique_ptr<ObjCEntrypoints> ObjCData;
400 llvm::MDNode *NoObjCARCExceptionsMetadata = nullptr;
401 std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader;
402 InstrProfStats PGOStats;
403 std::unique_ptr<llvm::SanitizerStatReport> SanStats;
404 StackExhaustionHandler StackHandler;
405
406 // A set of references that have only been seen via a weakref so far. This is
407 // used to remove the weak of the reference if we ever see a direct reference
408 // or a definition.
410
411 /// This contains all the decls which have definitions but/ which are deferred
412 /// for emission and therefore should only be output if they are actually
413 /// used. If a decl is in this, then it is known to have not been referenced
414 /// yet.
415 llvm::DenseMap<StringRef, GlobalDecl> DeferredDecls;
416
417 llvm::StringSet<llvm::BumpPtrAllocator> DeferredResolversToEmit;
418
419 /// This is a list of deferred decls which we have seen that *are* actually
420 /// referenced. These get code generated when the module is done.
421 std::vector<GlobalDecl> DeferredDeclsToEmit;
422 void addDeferredDeclToEmit(GlobalDecl GD) {
423 DeferredDeclsToEmit.emplace_back(GD);
424 addEmittedDeferredDecl(GD);
425 }
426
427 /// Decls that were DeferredDecls and have now been emitted.
428 llvm::DenseMap<llvm::StringRef, GlobalDecl> EmittedDeferredDecls;
429
430 void addEmittedDeferredDecl(GlobalDecl GD) {
431 // Reemission is only needed in incremental mode.
432 if (!Context.getLangOpts().IncrementalExtensions)
433 return;
434
435 // Assume a linkage by default that does not need reemission.
436 auto L = llvm::GlobalValue::ExternalLinkage;
437 if (llvm::isa<FunctionDecl>(GD.getDecl()))
438 L = getFunctionLinkage(GD);
439 else if (auto *VD = llvm::dyn_cast<VarDecl>(GD.getDecl()))
441
442 if (llvm::GlobalValue::isInternalLinkage(L) ||
443 llvm::GlobalValue::isLinkOnceLinkage(L) ||
444 llvm::GlobalValue::isWeakLinkage(L)) {
445 EmittedDeferredDecls[getMangledName(GD)] = GD;
446 }
447 }
448
449 /// List of alias we have emitted. Used to make sure that what they point to
450 /// is defined once we get to the end of the of the translation unit.
451 std::vector<GlobalDecl> Aliases;
452
453 /// List of multiversion functions to be emitted. This list is processed in
454 /// conjunction with other deferred symbols and is used to ensure that
455 /// multiversion function resolvers and ifuncs are defined and emitted.
456 std::vector<GlobalDecl> MultiVersionFuncs;
457
458 llvm::MapVector<StringRef, llvm::TrackingVH<llvm::Constant>> Replacements;
459
460 /// List of global values to be replaced with something else. Used when we
461 /// want to replace a GlobalValue but can't identify it by its mangled name
462 /// anymore (because the name is already taken).
464 GlobalValReplacements;
465
466 /// Variables for which we've emitted globals containing their constant
467 /// values along with the corresponding globals, for opportunistic reuse.
468 llvm::DenseMap<const VarDecl*, llvm::GlobalVariable*> InitializerConstants;
469
470 /// Set of global decls for which we already diagnosed mangled name conflict.
471 /// Required to not issue a warning (on a mangling conflict) multiple times
472 /// for the same decl.
473 llvm::DenseSet<GlobalDecl> DiagnosedConflictingDefinitions;
474
475 /// A queue of (optional) vtables to consider emitting.
476 std::vector<const CXXRecordDecl*> DeferredVTables;
477
478 /// In incremental compilation, the set of vtable classes whose vtable
479 /// definitions were emitted into a previous PTU's module. Carried forward
480 /// by moveLazyEmissionStates() so later PTUs skip re-defining them.
482
483 /// A queue of (optional) vtables that may be emitted opportunistically.
484 std::vector<const CXXRecordDecl *> OpportunisticVTables;
485
486 /// List of global values which are required to be present in the object file;
487 /// bitcast to i8*. This is used for forcing visibility of symbols which may
488 /// otherwise be optimized out.
489 std::vector<llvm::WeakTrackingVH> LLVMUsed;
490 std::vector<llvm::WeakTrackingVH> LLVMCompilerUsed;
491
492 /// Store the list of global constructors and their respective priorities to
493 /// be emitted when the translation unit is complete.
494 CtorList GlobalCtors;
495
496 /// Store the list of global destructors and their respective priorities to be
497 /// emitted when the translation unit is complete.
498 CtorList GlobalDtors;
499
500 /// An ordered map of canonical GlobalDecls to their mangled names.
501 llvm::MapVector<GlobalDecl, StringRef> MangledDeclNames;
502 llvm::StringMap<GlobalDecl, llvm::BumpPtrAllocator> Manglings;
503
504 /// Global annotations.
505 std::vector<llvm::Constant*> Annotations;
506
507 // Store deferred function annotations so they can be emitted at the end with
508 // most up to date ValueDecl that will have all the inherited annotations.
509 // The key owns its storage: not every mangled name handed to
510 // GetOrCreateLLVMFunction outlives the call.
511 llvm::MapVector<std::string, const ValueDecl *, llvm::StringMap<unsigned>>
512 DeferredAnnotations;
513
514 /// Map used to get unique annotation strings.
515 llvm::StringMap<llvm::Constant*> AnnotationStrings;
516
517 /// Used for uniquing of annotation arguments.
518 llvm::DenseMap<unsigned, llvm::Constant *> AnnotationArgs;
519
520 llvm::StringMap<llvm::GlobalVariable *> CFConstantStringMap;
521
522 llvm::DenseMap<llvm::Constant *, llvm::GlobalVariable *> ConstantStringMap;
523 llvm::DenseMap<const UnnamedGlobalConstantDecl *, llvm::GlobalVariable *>
524 UnnamedGlobalConstantDeclMap;
525 llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap;
526 llvm::DenseMap<const Decl*, llvm::GlobalVariable*> StaticLocalDeclGuardMap;
527 llvm::DenseMap<const Expr*, llvm::Constant *> MaterializedGlobalTemporaryMap;
528
529 llvm::DenseMap<QualType, llvm::Constant *> AtomicSetterHelperFnMap;
530 llvm::DenseMap<QualType, llvm::Constant *> AtomicGetterHelperFnMap;
531
532 /// Map used to get unique type descriptor constants for sanitizers.
533 llvm::DenseMap<QualType, llvm::Constant *> TypeDescriptorMap;
534
535 /// Map used to track internal linkage functions declared within
536 /// extern "C" regions.
537 typedef llvm::MapVector<IdentifierInfo *,
538 llvm::GlobalValue *> StaticExternCMap;
539 StaticExternCMap StaticExternCValues;
540
541 /// thread_local variables defined or used in this TU.
542 std::vector<const VarDecl *> CXXThreadLocals;
543
544 /// thread_local variables with initializers that need to run
545 /// before any thread_local variable in this TU is odr-used.
546 std::vector<llvm::Function *> CXXThreadLocalInits;
547 std::vector<const VarDecl *> CXXThreadLocalInitVars;
548
549 /// Global variables with initializers that need to run before main.
550 std::vector<llvm::Function *> CXXGlobalInits;
551
552 /// When a C++ decl with an initializer is deferred, null is
553 /// appended to CXXGlobalInits, and the index of that null is placed
554 /// here so that the initializer will be performed in the correct
555 /// order. Once the decl is emitted, the index is replaced with ~0U to ensure
556 /// that we don't re-emit the initializer.
557 llvm::DenseMap<const Decl*, unsigned> DelayedCXXInitPosition;
558
559 /// To remember which types did require a vector deleting destructor body.
560 /// This set basically contains classes that have virtual destructor and new[]
561 /// was emitted for the class.
562 llvm::SmallPtrSet<const CXXRecordDecl *, 16> RequireVectorDeletingDtor;
563
564 /// Pending MSVC __global_delete variants that may need forwarding bodies.
565 /// Maps each __global_delete wrapper alias to the corresponding global
566 /// ::operator delete FunctionDecl, in insertion order.
567 llvm::MapVector<llvm::GlobalAlias *, const FunctionDecl *>
568 PendingMSVCGlobalDeletes;
569
570 /// Whether this TU contains a direct use of global ::operator delete
571 /// (indicating that __global_delete forwarding bodies should be emitted).
572 bool HasDirectGlobalDelete = false;
573
574 typedef std::pair<OrderGlobalInitsOrStermFinalizers, llvm::Function *>
575 GlobalInitData;
576
577 // When a tail call is performed on an "undefined" symbol, on PPC without pc
578 // relative feature, the tail call is not allowed. In "EmitCall" for such
579 // tail calls, the "undefined" symbols may be forward declarations, their
580 // definitions are provided in the module after the callsites. For such tail
581 // calls, diagnose message should not be emitted.
583 MustTailCallUndefinedGlobals;
584
585 struct GlobalInitPriorityCmp {
586 bool operator()(const GlobalInitData &LHS,
587 const GlobalInitData &RHS) const {
588 return LHS.first.priority < RHS.first.priority;
589 }
590 };
591
592 /// Global variables with initializers whose order of initialization is set by
593 /// init_priority attribute.
594 SmallVector<GlobalInitData, 8> PrioritizedCXXGlobalInits;
595
596 /// Global destructor functions and arguments that need to run on termination.
597 /// When UseSinitAndSterm is set, it instead contains sterm finalizer
598 /// functions, which also run on unloading a shared library.
599 typedef std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH,
600 llvm::Constant *>
601 CXXGlobalDtorsOrStermFinalizer_t;
602 SmallVector<CXXGlobalDtorsOrStermFinalizer_t, 8>
603 CXXGlobalDtorsOrStermFinalizers;
604
605 typedef std::pair<OrderGlobalInitsOrStermFinalizers, llvm::Function *>
606 StermFinalizerData;
607
608 struct StermFinalizerPriorityCmp {
609 bool operator()(const StermFinalizerData &LHS,
610 const StermFinalizerData &RHS) const {
611 return LHS.first.priority < RHS.first.priority;
612 }
613 };
614
615 /// Global variables with sterm finalizers whose order of initialization is
616 /// set by init_priority attribute.
617 SmallVector<StermFinalizerData, 8> PrioritizedCXXStermFinalizers;
618
619 /// The complete set of modules that has been imported.
620 llvm::SetVector<clang::Module *> ImportedModules;
621
622 /// The set of modules for which the module initializers
623 /// have been emitted.
624 llvm::SmallPtrSet<clang::Module *, 16> EmittedModuleInitializers;
625
626 /// A vector of metadata strings for linker options.
627 SmallVector<llvm::MDNode *, 16> LinkerOptionsMetadata;
628
629 /// A vector of metadata strings for dependent libraries for ELF.
630 SmallVector<llvm::MDNode *, 16> ELFDependentLibraries;
631
632 /// Global variable for copyright pragma comment (if present).
633 llvm::GlobalVariable *LoadTimeCommentGlobal = nullptr;
634
635 /// @name Cache for Objective-C runtime types
636 /// @{
637
638 /// Cached reference to the class for constant strings. This value has type
639 /// int * but is actually an Obj-C class pointer.
640 llvm::WeakTrackingVH CFConstantStringClassRef;
641
642 /// The type used to describe the state of a fast enumeration in
643 /// Objective-C's for..in loop.
644 QualType ObjCFastEnumerationStateType;
645
646 /// @}
647
648 /// Lazily create the Objective-C runtime
649 void createObjCRuntime();
650
651 void createOpenCLRuntime();
652 void createOpenMPRuntime();
653 void createCUDARuntime();
654 void createHLSLRuntime();
655
656 bool shouldEmitFunction(GlobalDecl GD);
657 bool shouldOpportunisticallyEmitVTables();
658 /// Map used to be sure we don't emit the same CompoundLiteral twice.
659 llvm::DenseMap<const CompoundLiteralExpr *, llvm::GlobalVariable *>
660 EmittedCompoundLiterals;
661
662 /// Map of the global blocks we've emitted, so that we don't have to re-emit
663 /// them if the constexpr evaluator gets aggressive.
664 llvm::DenseMap<const BlockExpr *, llvm::Constant *> EmittedGlobalBlocks;
665
666 /// @name Cache for Blocks Runtime Globals
667 /// @{
668
669 llvm::Constant *NSConcreteGlobalBlock = nullptr;
670 llvm::Constant *NSConcreteStackBlock = nullptr;
671
672 llvm::FunctionCallee BlockObjectAssign = nullptr;
673 llvm::FunctionCallee BlockObjectDispose = nullptr;
674
675 llvm::Type *BlockDescriptorType = nullptr;
676 llvm::Type *GenericBlockLiteralType = nullptr;
677
678 struct {
680 } Block;
681
682 GlobalDecl initializedGlobalDecl;
683
684 /// @}
685
686 /// void @llvm.lifetime.start(i64 %size, i8* nocapture <ptr>)
687 llvm::Function *LifetimeStartFn = nullptr;
688
689 /// void @llvm.lifetime.end(i64 %size, i8* nocapture <ptr>)
690 llvm::Function *LifetimeEndFn = nullptr;
691
692 /// void @llvm.fake.use(...)
693 llvm::Function *FakeUseFn = nullptr;
694
695 std::unique_ptr<SanitizerMetadata> SanitizerMD;
696
697 llvm::MapVector<const Decl *, bool> DeferredEmptyCoverageMappingDecls;
698
699 std::unique_ptr<CoverageMappingModuleGen> CoverageMapping;
700
701 /// Mapping from canonical types to their metadata identifiers. We need to
702 /// maintain this mapping because identifiers may be formed from distinct
703 /// MDNodes.
704 typedef llvm::DenseMap<QualType, llvm::Metadata *> MetadataTypeMap;
705 MetadataTypeMap MetadataIdMap;
706 MetadataTypeMap VirtualMetadataIdMap;
707 MetadataTypeMap GeneralizedMetadataIdMap;
708 MetadataTypeMap CallGraphMetadataIdMap;
709
710 // Helps squashing blocks of TopLevelStmtDecl into a single llvm::Function
711 // when used with -fincremental-extensions.
712 std::pair<std::unique_ptr<CodeGenFunction>, const TopLevelStmtDecl *>
713 GlobalTopLevelStmtBlockInFlight;
714
715 llvm::DenseMap<GlobalDecl, uint16_t> PtrAuthDiscriminatorHashes;
716
717 llvm::DenseMap<const CXXRecordDecl *, std::optional<PointerAuthQualifier>>
718 VTablePtrAuthInfos;
719 std::optional<PointerAuthQualifier>
720 computeVTPointerAuthentication(const CXXRecordDecl *ThisClass,
721 bool IsVTTEntry);
722
723 AtomicOptions AtomicOpts;
724
725 // A set of functions which should be hot-patched; see
726 // -fms-hotpatch-functions-file (and -list). This will nearly always be empty.
727 // The list is sorted for binary-searching.
728 std::vector<std::string> MSHotPatchFunctions;
729
730public:
732 const HeaderSearchOptions &headersearchopts,
733 const PreprocessorOptions &ppopts,
734 const CodeGenOptions &CodeGenOpts, llvm::Module &M,
735 DiagnosticsEngine &Diags,
736 CoverageSourceInfo *CoverageInfo = nullptr);
737
739
740 void clear();
741
742 /// Finalize LLVM code generation.
743 void Release();
744
745 /// Get the current Atomic options.
746 AtomicOptions getAtomicOpts() { return AtomicOpts; }
747
748 /// Set the current Atomic options.
749 void setAtomicOpts(AtomicOptions AO) { AtomicOpts = AO; }
750
751 /// Return true if we should emit location information for expressions.
753
754 /// Return a reference to the configured Objective-C runtime.
756 if (!ObjCRuntime) createObjCRuntime();
757 return *ObjCRuntime;
758 }
759
760 /// Return true iff an Objective-C runtime has been configured.
761 bool hasObjCRuntime() { return !!ObjCRuntime; }
762
763 /// Check if the precondition thunk optimization is enabled.
764 /// This checks runtime support and codegen options, but does NOT check
765 /// whether a specific method is eligible for thunks or inline preconditions.
766 ///
767 /// TODO: Add support for GNUStep as well, currently only supports NeXT
768 /// family.
772 getCodeGenOpts().ObjCDirectPreconditionThunk;
773 }
774
775 /// Check if a direct method should use precondition thunks at call sites.
776 /// Returns false if OMD is null, not a direct method, or variadic.
777 ///
778 /// Variadic methods use inline preconditions instead of thunks to avoid
779 /// musttail complexity across different architectures.
781 return OMD && OMD->isDirectMethod() && !OMD->isVariadic() &&
783 }
784
785 /// Check if a direct method should have inline precondition checks at call
786 /// sites.
787 /// Returns false if OMD is null, not a direct method, or not variadic.
788 ///
789 /// Variadic direct methods use inline preconditions rather than thunks
790 /// to avoid musttail complexity across different architectures.
792 return OMD && OMD->isDirectMethod() && OMD->isVariadic() &&
794 }
795
796 const std::string &getModuleNameHash() const { return ModuleNameHash; }
797
798 /// Return a reference to the configured OpenCL runtime.
800 assert(OpenCLRuntime != nullptr);
801 return *OpenCLRuntime;
802 }
803
804 /// Return a reference to the configured OpenMP runtime.
806 assert(OpenMPRuntime != nullptr);
807 return *OpenMPRuntime;
808 }
809
810 /// Return a reference to the configured CUDA runtime.
812 assert(CUDARuntime != nullptr);
813 return *CUDARuntime;
814 }
815
816 /// Return a reference to the configured HLSL runtime.
818 assert(HLSLRuntime != nullptr);
819 return *HLSLRuntime;
820 }
821
823 assert(ObjCData != nullptr);
824 return *ObjCData;
825 }
826
827 // Version checking functions, used to implement ObjC's @available:
828 // i32 @__isOSVersionAtLeast(i32, i32, i32)
829 llvm::FunctionCallee IsOSVersionAtLeastFn = nullptr;
830 // i32 @__isPlatformVersionAtLeast(i32, i32, i32, i32)
831 llvm::FunctionCallee IsPlatformVersionAtLeastFn = nullptr;
832
833 InstrProfStats &getPGOStats() { return PGOStats; }
834 llvm::IndexedInstrProfReader *getPGOReader() const { return PGOReader.get(); }
835
837 return CoverageMapping.get();
838 }
839
840 llvm::Constant *getStaticLocalDeclAddress(const VarDecl *D) {
841 return StaticLocalDeclMap[D];
842 }
844 llvm::Constant *C) {
845 StaticLocalDeclMap[D] = C;
846 }
847
848 llvm::Constant *
850 llvm::GlobalValue::LinkageTypes Linkage);
851
852 llvm::GlobalVariable *getStaticLocalDeclGuardAddress(const VarDecl *D) {
853 return StaticLocalDeclGuardMap[D];
854 }
856 llvm::GlobalVariable *C) {
857 StaticLocalDeclGuardMap[D] = C;
858 }
859
860 Address createUnnamedGlobalFrom(const VarDecl &D, llvm::Constant *Constant,
861 CharUnits Align);
862
863 bool lookupRepresentativeDecl(StringRef MangledName,
864 GlobalDecl &Result) const;
865
867 return AtomicSetterHelperFnMap[Ty];
868 }
870 llvm::Constant *Fn) {
871 AtomicSetterHelperFnMap[Ty] = Fn;
872 }
873
875 return AtomicGetterHelperFnMap[Ty];
876 }
878 llvm::Constant *Fn) {
879 AtomicGetterHelperFnMap[Ty] = Fn;
880 }
881
882 llvm::Constant *getTypeDescriptorFromMap(QualType Ty) {
883 return TypeDescriptorMap[Ty];
884 }
885 void setTypeDescriptorInMap(QualType Ty, llvm::Constant *C) {
886 TypeDescriptorMap[Ty] = C;
887 }
888
889 CGDebugInfo *getModuleDebugInfo() { return DebugInfo.get(); }
890
892 if (!NoObjCARCExceptionsMetadata)
893 NoObjCARCExceptionsMetadata = llvm::MDNode::get(getLLVMContext(), {});
894 return NoObjCARCExceptionsMetadata;
895 }
896
897 ASTContext &getContext() const { return Context; }
898 const LangOptions &getLangOpts() const { return LangOpts; }
900 return FS;
901 }
903 const { return HeaderSearchOpts; }
905 const { return PreprocessorOpts; }
906 const CodeGenOptions &getCodeGenOpts() const { return CodeGenOpts; }
907 llvm::Module &getModule() const { return TheModule; }
908 DiagnosticsEngine &getDiags() const { return Diags; }
909 const llvm::DataLayout &getDataLayout() const {
910 return TheModule.getDataLayout();
911 }
912 const TargetInfo &getTarget() const { return Target; }
913 const llvm::Triple &getTriple() const { return Target.getTriple(); }
914 bool supportsCOMDAT() const;
915 void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO);
916
917 const ABIInfo &getABIInfo();
918
919 /// Lazily build and return the LLVMABI library's TargetInfo for the current
920 /// target. Used by the experimental ABI lowering path
921 /// (-fexperimental-abi-lowering).
922 const llvm::abi::TargetInfo &getLLVMABITargetInfo(llvm::abi::TypeBuilder &TB);
923
924 /// True when -fexperimental-abi-lowering is in effect AND the active target
925 /// has an LLVMABI implementation that supports the given LLVM calling
926 /// convention. Unsupported CCs fall back to the legacy ABIInfo path.
927 bool shouldUseLLVMABILowering(unsigned CallingConv) const;
928
929 /// Drive the experimental LLVMABI-based lowering path: map argument and
930 /// return types into the LLVMABI library, ask its target lowering to fill
931 /// in classification, and write the results back into FI.
933
934 CGCXXABI &getCXXABI() const { return *ABI; }
935 llvm::LLVMContext &getLLVMContext() { return VMContext; }
936
937 bool shouldUseTBAA() const { return TBAA != nullptr; }
938
940
941 CodeGenTypes &getTypes() { return *Types; }
942
943 CodeGenVTables &getVTables() { return VTables; }
944
946 return VTables.getItaniumVTableContext();
947 }
948
950 return VTables.getItaniumVTableContext();
951 }
952
954 return VTables.getMicrosoftVTableContext();
955 }
956
957 CtorList &getGlobalCtors() { return GlobalCtors; }
958 CtorList &getGlobalDtors() { return GlobalDtors; }
959
960 /// getTBAATypeInfo - Get metadata used to describe accesses to objects of
961 /// the given type.
962 llvm::MDNode *getTBAATypeInfo(QualType QTy);
963
964 /// getTBAAAccessInfo - Get TBAA information that describes an access to
965 /// an object of the given type.
967
968 /// getTBAAVTablePtrAccessInfo - Get the TBAA information that describes an
969 /// access to a virtual table pointer.
970 TBAAAccessInfo getTBAAVTablePtrAccessInfo(llvm::Type *VTablePtrType);
971
972 llvm::MDNode *getTBAAStructInfo(QualType QTy);
973
974 /// getTBAABaseTypeInfo - Get metadata that describes the given base access
975 /// type. Return null if the type is not suitable for use in TBAA access tags.
976 llvm::MDNode *getTBAABaseTypeInfo(QualType QTy);
977
978 /// getTBAAAccessTagInfo - Get TBAA tag for a given memory access.
979 llvm::MDNode *getTBAAAccessTagInfo(TBAAAccessInfo Info);
980
981 /// mergeTBAAInfoForCast - Get merged TBAA information for the purposes of
982 /// type casts.
985
986 /// mergeTBAAInfoForConditionalOperator - Get merged TBAA information for the
987 /// purposes of conditional operator.
989 TBAAAccessInfo InfoB);
990
991 /// mergeTBAAInfoForMemoryTransfer - Get merged TBAA information for the
992 /// purposes of memory transfer calls.
994 TBAAAccessInfo SrcInfo);
995
996 /// getTBAAInfoForSubobject - Get TBAA information for an access with a given
997 /// base lvalue.
999 if (Base.getTBAAInfo().isMayAlias())
1001 return getTBAAAccessInfo(AccessType);
1002 }
1003
1005 bool isPaddedAtomicType(const AtomicType *type);
1006
1007 /// DecorateInstructionWithTBAA - Decorate the instruction with a TBAA tag.
1008 void DecorateInstructionWithTBAA(llvm::Instruction *Inst,
1009 TBAAAccessInfo TBAAInfo);
1010
1011 /// Adds !invariant.barrier !tag to instruction
1012 void DecorateInstructionWithInvariantGroup(llvm::Instruction *I,
1013 const CXXRecordDecl *RD);
1014
1015 /// Emit the given number of characters as a value of type size_t.
1016 llvm::ConstantInt *getSize(CharUnits numChars);
1017
1018 /// Set the visibility for the given LLVM GlobalValue.
1019 void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const;
1020
1021 void setDSOLocal(llvm::GlobalValue *GV) const;
1022
1031 void setDLLImportDLLExport(llvm::GlobalValue *GV, GlobalDecl D) const;
1032 void setDLLImportDLLExport(llvm::GlobalValue *GV, const NamedDecl *D) const;
1033 /// Set visibility, dllimport/dllexport and dso_local.
1034 /// This must be called after dllimport/dllexport is set.
1035 void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const;
1036 void setGVProperties(llvm::GlobalValue *GV, const NamedDecl *D) const;
1037
1038 void setGVPropertiesAux(llvm::GlobalValue *GV, const NamedDecl *D) const;
1039
1040 /// Set the TLS mode for the given LLVM GlobalValue for the thread-local
1041 /// variable declaration D.
1042 void setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const;
1043
1044 /// Get LLVM TLS mode from CodeGenOptions.
1045 llvm::GlobalVariable::ThreadLocalMode GetDefaultLLVMTLSModel() const;
1046
1047 static llvm::GlobalValue::VisibilityTypes GetLLVMVisibility(Visibility V) {
1048 switch (V) {
1049 case DefaultVisibility: return llvm::GlobalValue::DefaultVisibility;
1050 case HiddenVisibility: return llvm::GlobalValue::HiddenVisibility;
1051 case ProtectedVisibility: return llvm::GlobalValue::ProtectedVisibility;
1052 }
1053 llvm_unreachable("unknown visibility!");
1054 }
1055
1056 llvm::Constant *GetAddrOfGlobal(GlobalDecl GD,
1057 ForDefinition_t IsForDefinition
1059
1060 /// Will return a global variable of the given type. If a variable with a
1061 /// different type already exists then a new variable with the right type
1062 /// will be created and all uses of the old variable will be replaced with a
1063 /// bitcast to the new variable.
1064 llvm::GlobalVariable *
1065 CreateOrReplaceCXXRuntimeVariable(StringRef Name, llvm::Type *Ty,
1066 llvm::GlobalValue::LinkageTypes Linkage,
1067 llvm::Align Alignment);
1068
1069 llvm::Function *CreateGlobalInitOrCleanUpFunction(
1070 llvm::FunctionType *ty, const Twine &name, const CGFunctionInfo &FI,
1071 SourceLocation Loc = SourceLocation(), bool TLS = false,
1072 llvm::GlobalVariable::LinkageTypes Linkage =
1073 llvm::GlobalVariable::InternalLinkage);
1074
1075 /// Return the AST address space of the underlying global variable for D, as
1076 /// determined by its declaration. Normally this is the same as the address
1077 /// space of D's type, but in CUDA, address spaces are associated with
1078 /// declarations, not types. If D is nullptr, return the default address
1079 /// space for global variable.
1080 ///
1081 /// For languages without explicit address spaces, if D has default address
1082 /// space, target-specific global or constant address space may be returned.
1084
1085 /// Return the AST address space of constant literal, which is used to emit
1086 /// the constant literal as global variable in LLVM IR.
1087 /// Note: This is not necessarily the address space of the constant literal
1088 /// in AST. For address space agnostic language, e.g. C++, constant literal
1089 /// in AST is always in default address space.
1091
1092 /// Return the llvm::Constant for the address of the given global variable.
1093 /// If Ty is non-null and if the global doesn't exist, then it will be created
1094 /// with the specified type instead of whatever the normal requested type
1095 /// would be. If IsForDefinition is true, it is guaranteed that an actual
1096 /// global with type Ty will be returned, not conversion of a variable with
1097 /// the same mangled name but some other type.
1098 llvm::Constant *GetAddrOfGlobalVar(const VarDecl *D,
1099 llvm::Type *Ty = nullptr,
1100 ForDefinition_t IsForDefinition
1102
1103 /// Return the address of the given function. If Ty is non-null, then this
1104 /// function will use the specified type if it has to create it.
1105 llvm::Constant *GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty = nullptr,
1106 bool ForVTable = false,
1107 bool DontDefer = false,
1108 ForDefinition_t IsForDefinition
1110
1111 // Return the function body address of the given function.
1112 llvm::Constant *GetFunctionStart(const ValueDecl *Decl);
1113
1114 /// Return a function pointer for a reference to the given function.
1115 /// This correctly handles weak references, but does not apply a
1116 /// pointer signature.
1117 llvm::Constant *getRawFunctionPointer(GlobalDecl GD,
1118 llvm::Type *Ty = nullptr);
1119
1120 /// Return the ABI-correct function pointer value for a reference
1121 /// to the given function. This will apply a pointer signature if
1122 /// necessary, caching the result for the given function.
1123 llvm::Constant *getFunctionPointer(GlobalDecl GD, llvm::Type *Ty = nullptr);
1124
1125 /// Return the ABI-correct function pointer value for a reference
1126 /// to the given function. This will apply a pointer signature if
1127 /// necessary.
1128 llvm::Constant *getFunctionPointer(llvm::Constant *Pointer,
1130
1131 llvm::Constant *getMemberFunctionPointer(const FunctionDecl *FD,
1132 llvm::Type *Ty = nullptr);
1133
1134 llvm::Constant *getMemberFunctionPointer(llvm::Constant *Pointer,
1135 QualType FT);
1136
1138
1140
1142
1144
1145 bool shouldSignPointer(const PointerAuthSchema &Schema);
1146 llvm::Constant *getConstantSignedPointer(llvm::Constant *Pointer,
1147 const PointerAuthSchema &Schema,
1148 llvm::Constant *StorageAddress,
1149 GlobalDecl SchemaDecl,
1150 QualType SchemaType);
1151
1152 llvm::Constant *
1153 getConstantSignedPointer(llvm::Constant *Pointer, unsigned Key,
1154 llvm::Constant *StorageAddress,
1155 llvm::ConstantInt *OtherDiscriminator);
1156
1157 llvm::ConstantInt *
1159 GlobalDecl SchemaDecl, QualType SchemaType);
1160
1162
1163 std::optional<CGPointerAuthInfo> getVTablePointerAuthInfo(
1164 CodeGenFunction *Context, const CXXRecordDecl *Record,
1165 llvm::Value *StorageAddress, bool IsVTTEntry = false);
1166
1167 std::optional<PointerAuthQualifier>
1169 bool IsVTTEntry = false);
1170
1171 // Return whether RTTI information should be emitted for this target.
1172 bool shouldEmitRTTI(bool ForEH = false) {
1173 return (ForEH || getLangOpts().RTTI) &&
1174 (!getLangOpts().isTargetDevice() || !getTriple().isGPU());
1175 }
1176
1177 /// Get the address of the RTTI descriptor for the given type.
1178 llvm::Constant *GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH = false);
1179
1180 /// Get the address of a GUID.
1182
1183 /// Get the address of a UnnamedGlobalConstant
1186
1187 /// Get the address of a template parameter object.
1190
1191 /// Get the address of the thunk for the given global decl.
1192 llvm::Constant *GetAddrOfThunk(StringRef Name, llvm::Type *FnTy,
1193 GlobalDecl GD);
1194
1195 /// Get a reference to the target of VD.
1197
1198 /// Returns the assumed alignment of an opaque pointer to the given class.
1200
1201 /// Returns the minimum object size for an object of the given class type
1202 /// (or a class derived from it).
1204
1205 /// Returns the minimum object size for an object of the given type.
1211
1212 /// Returns the assumed alignment of a virtual base of a class.
1214 const CXXRecordDecl *Derived,
1215 const CXXRecordDecl *VBase);
1216
1217 /// Given a class pointer with an actual known alignment, and the
1218 /// expected alignment of an object at a dynamic offset w.r.t that
1219 /// pointer, return the alignment to assume at the offset.
1221 const CXXRecordDecl *Class,
1222 CharUnits ExpectedTargetAlign);
1223
1224 CharUnits
1228
1229 /// Returns the offset from a derived class to a class. Returns null if the
1230 /// offset is 0.
1231 llvm::Constant *
1235
1236 llvm::FoldingSet<BlockByrefHelpers> ByrefHelpersCache;
1237
1238 /// Fetches the global unique block count.
1239 int getUniqueBlockCount() { return ++Block.GlobalUniqueCount; }
1240
1241 /// Fetches the type of a generic block descriptor.
1242 llvm::Type *getBlockDescriptorType();
1243
1244 /// The type of a generic block literal.
1245 llvm::Type *getGenericBlockLiteralType();
1246
1247 /// Gets the address of a block which requires no captures.
1248 llvm::Constant *GetAddrOfGlobalBlock(const BlockExpr *BE, StringRef Name);
1249
1250 /// Returns the address of a block which requires no caputres, or null if
1251 /// we've yet to emit the block for BE.
1252 llvm::Constant *getAddrOfGlobalBlockIfEmitted(const BlockExpr *BE) {
1253 return EmittedGlobalBlocks.lookup(BE);
1254 }
1255
1256 /// Notes that BE's global block is available via Addr. Asserts that BE
1257 /// isn't already emitted.
1258 void setAddrOfGlobalBlock(const BlockExpr *BE, llvm::Constant *Addr);
1259
1260 /// Return a pointer to a constant CFString object for the given string.
1262
1263 /// Return a constant array for the given string.
1264 llvm::Constant *GetConstantArrayFromStringLiteral(const StringLiteral *E);
1265
1266 /// Return a pointer to a constant array for the given string literal.
1269 StringRef Name = ".str");
1270
1271 /// Return a pointer to a constant array for the given ObjCEncodeExpr node.
1274
1275 /// Returns a pointer to a character array containing the literal and a
1276 /// terminating '\0' character. The result has pointer to array type.
1277 ///
1278 /// \param GlobalName If provided, the name to use for the global (if one is
1279 /// created).
1280 ConstantAddress GetAddrOfConstantCString(const std::string &Str,
1281 StringRef GlobalName = ".str");
1282
1283 /// Returns a pointer to a constant global variable for the given file-scope
1284 /// compound literal expression.
1286
1287 /// If it's been emitted already, returns the GlobalVariable corresponding to
1288 /// a compound literal. Otherwise, returns null.
1289 llvm::GlobalVariable *
1291
1292 /// Notes that CLE's GlobalVariable is GV. Asserts that CLE isn't already
1293 /// emitted.
1295 llvm::GlobalVariable *GV);
1296
1297 /// Returns a pointer to a global variable representing a temporary
1298 /// with static or thread storage duration.
1300 const Expr *Inner);
1301
1302 /// Retrieve the record type that describes the state of an
1303 /// Objective-C fast enumeration loop (for..in).
1305
1306 // Produce code for this constructor/destructor. This method doesn't try
1307 // to apply any ABI rules about which other constructors/destructors
1308 // are needed or if they are alias to each other.
1309 llvm::Function *codegenCXXStructor(GlobalDecl GD);
1310
1311 /// Emit a trap stub body for functions in ASTContext::CUDADeviceInvalidFuncs.
1312 bool tryEmitCUDADeviceInvalidFunctionBody(GlobalDecl GD, llvm::Function *Fn);
1313
1314 /// Return the address of the constructor/destructor of the given type.
1315 llvm::Constant *
1317 llvm::FunctionType *FnType = nullptr,
1318 bool DontDefer = false,
1319 ForDefinition_t IsForDefinition = NotForDefinition) {
1320 return cast<llvm::Constant>(getAddrAndTypeOfCXXStructor(GD, FnInfo, FnType,
1321 DontDefer,
1322 IsForDefinition)
1323 .getCallee());
1324 }
1325
1326 llvm::FunctionCallee getAddrAndTypeOfCXXStructor(
1327 GlobalDecl GD, const CGFunctionInfo *FnInfo = nullptr,
1328 llvm::FunctionType *FnType = nullptr, bool DontDefer = false,
1329 ForDefinition_t IsForDefinition = NotForDefinition);
1330
1331 /// Given a builtin id for a function like "__builtin_fabsf", return a
1332 /// Function* for "fabsf".
1333 llvm::Constant *getBuiltinLibFunction(const FunctionDecl *FD,
1334 unsigned BuiltinID);
1335
1336 llvm::Function *getIntrinsic(unsigned IID, ArrayRef<llvm::Type *> Tys = {});
1337
1338 void AddCXXGlobalInit(llvm::Function *F) { CXXGlobalInits.push_back(F); }
1339
1340 /// Emit code for a single top level declaration.
1341 void EmitTopLevelDecl(Decl *D);
1342
1343 /// Stored a deferred empty coverage mapping for an unused
1344 /// and thus uninstrumented top level declaration.
1346
1347 /// Remove the deferred empty coverage mapping as this
1348 /// declaration is actually instrumented.
1349 void ClearUnusedCoverageMapping(const Decl *D);
1350
1351 /// Emit all the deferred coverage mappings
1352 /// for the uninstrumented functions.
1354
1355 /// Emit an alias for "main" if it has no arguments (needed for wasm).
1356 void EmitMainVoidAlias();
1357
1358 /// Tell the consumer that this variable has been instantiated.
1360
1361 /// If the declaration has internal linkage but is inside an
1362 /// extern "C" linkage specification, prepare to emit an alias for it
1363 /// to the expected name.
1364 template<typename SomeDecl>
1365 void MaybeHandleStaticInExternC(const SomeDecl *D, llvm::GlobalValue *GV);
1366
1367 /// Add a global to a list to be added to the llvm.used metadata.
1368 void addUsedGlobal(llvm::GlobalValue *GV);
1369
1370 /// Add a global to a list to be added to the llvm.compiler.used metadata.
1371 void addCompilerUsedGlobal(llvm::GlobalValue *GV);
1372
1373 /// Add a global to a list to be added to the llvm.compiler.used metadata.
1374 void addUsedOrCompilerUsedGlobal(llvm::GlobalValue *GV);
1375
1376 /// Add a destructor and object to add to the C++ global destructor function.
1377 void AddCXXDtorEntry(llvm::FunctionCallee DtorFn, llvm::Constant *Object) {
1378 CXXGlobalDtorsOrStermFinalizers.emplace_back(DtorFn.getFunctionType(),
1379 DtorFn.getCallee(), Object);
1380 }
1381
1382 /// Add an sterm finalizer to the C++ global cleanup function.
1383 void AddCXXStermFinalizerEntry(llvm::FunctionCallee DtorFn) {
1384 CXXGlobalDtorsOrStermFinalizers.emplace_back(DtorFn.getFunctionType(),
1385 DtorFn.getCallee(), nullptr);
1386 }
1387
1388 /// Add an sterm finalizer to its own llvm.global_dtors entry.
1389 void AddCXXStermFinalizerToGlobalDtor(llvm::Function *StermFinalizer,
1390 int Priority) {
1391 AddGlobalDtor(StermFinalizer, Priority);
1392 }
1393
1394 void AddCXXPrioritizedStermFinalizerEntry(llvm::Function *StermFinalizer,
1395 int Priority) {
1397 PrioritizedCXXStermFinalizers.size());
1398 PrioritizedCXXStermFinalizers.push_back(
1399 std::make_pair(Key, StermFinalizer));
1400 }
1401
1402 /// Create or return a runtime function declaration with the specified type
1403 /// and name. If \p AssumeConvergent is true, the call will have the
1404 /// convergent attribute added.
1405 ///
1406 /// For new code, please use the overload that takes a QualType; it sets
1407 /// function attributes more accurately.
1408 llvm::FunctionCallee
1409 CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name,
1410 llvm::AttributeList ExtraAttrs = llvm::AttributeList(),
1411 bool Local = false, bool AssumeConvergent = false);
1412
1413 /// Create or return a runtime function declaration with the specified type
1414 /// and name. If \p AssumeConvergent is true, the call will have the
1415 /// convergent attribute added.
1416 llvm::FunctionCallee
1418 StringRef Name,
1419 llvm::AttributeList ExtraAttrs = llvm::AttributeList(),
1420 bool Local = false, bool AssumeConvergent = false);
1421
1422 /// Create a new runtime global variable with the specified type and name.
1423 llvm::Constant *CreateRuntimeVariable(llvm::Type *Ty,
1424 StringRef Name);
1425
1426 ///@name Custom Blocks Runtime Interfaces
1427 ///@{
1428
1429 llvm::Constant *getNSConcreteGlobalBlock();
1430 llvm::Constant *getNSConcreteStackBlock();
1431 llvm::FunctionCallee getBlockObjectAssign();
1432 llvm::FunctionCallee getBlockObjectDispose();
1433
1434 ///@}
1435
1436 llvm::Function *getLLVMLifetimeStartFn();
1437 llvm::Function *getLLVMLifetimeEndFn();
1438 llvm::Function *getLLVMFakeUseFn();
1439
1440 // Make sure that this type is translated.
1441 void UpdateCompletedType(const TagDecl *TD);
1442
1443 llvm::Constant *getMemberPointerConstant(const UnaryOperator *e);
1444
1445 /// Emit type info if type of an expression is a variably modified
1446 /// type. Also emit proper debug info for cast types.
1448 CodeGenFunction *CGF = nullptr);
1449
1450 /// Return the result of value-initializing the given type, i.e. a null
1451 /// expression of the given type. This is usually, but not always, an LLVM
1452 /// null constant.
1453 llvm::Constant *EmitNullConstant(QualType T);
1454
1455 /// Return a null constant appropriate for zero-initializing a base class with
1456 /// the given type. This is usually, but not always, an LLVM null constant.
1457 llvm::Constant *EmitNullConstantForBase(const CXXRecordDecl *Record);
1458
1459 /// Emit a general error that something can't be done.
1460 void Error(SourceLocation loc, StringRef error);
1461
1462 /// Print out an error that codegen doesn't support the specified stmt yet.
1463 void ErrorUnsupported(const Stmt *S, const char *Type);
1464
1465 /// Print out an error that codegen doesn't support the specified stmt yet.
1466 void ErrorUnsupported(const Stmt *S, llvm::StringRef Type);
1467
1468 /// Print out an error that codegen doesn't support the specified decl yet.
1469 void ErrorUnsupported(const Decl *D, const char *Type);
1470
1471 /// Run some code with "sufficient" stack space. (Currently, at least 256K is
1472 /// guaranteed). Produces a warning if we're low on stack space and allocates
1473 /// more in that case. Use this in code that may recurse deeply to avoid stack
1474 /// overflow.
1476 llvm::function_ref<void()> Fn);
1477
1478 /// Set the attributes on the LLVM function for the given decl and function
1479 /// info. This applies attributes necessary for handling the ABI as well as
1480 /// user specified attributes like section.
1481 void SetInternalFunctionAttributes(GlobalDecl GD, llvm::Function *F,
1482 const CGFunctionInfo &FI);
1483
1484 /// Set the LLVM function attributes (sext, zext, etc).
1486 llvm::Function *F, bool IsThunk);
1487
1488 /// Set the LLVM function attributes which only apply to a function
1489 /// definition.
1490 void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F);
1491
1492 /// Return true iff the given type uses 'sret' when used as a return type.
1493 bool ReturnTypeUsesSRet(const CGFunctionInfo &FI);
1494
1495 /// Return true iff the given type has `inreg` set.
1496 bool ReturnTypeHasInReg(const CGFunctionInfo &FI);
1497
1498 /// Return true iff the given type uses an argument slot when 'sret' is used
1499 /// as a return type.
1501
1502 /// Return true iff the given type uses 'fpret' when used as a return type.
1503 bool ReturnTypeUsesFPRet(QualType ResultType);
1504
1505 /// Return true iff the given type uses 'fp2ret' when used as a return type.
1506 bool ReturnTypeUsesFP2Ret(QualType ResultType);
1507
1508 /// Get the LLVM attributes and calling convention to use for a particular
1509 /// function type.
1510 ///
1511 /// \param Name - The function name.
1512 /// \param Info - The function type information.
1513 /// \param CalleeInfo - The callee information these attributes are being
1514 /// constructed for. If valid, the attributes applied to this decl may
1515 /// contribute to the function attributes and calling convention.
1516 /// \param Attrs [out] - On return, the attribute list to use.
1517 /// \param CallingConv [out] - On return, the LLVM calling convention to use.
1518 /// \param AttrOnCallSite - Whether or not the attributes are on a call site
1519 void ConstructAttributeList(StringRef Name, const CGFunctionInfo &Info,
1520 CGCalleeInfo CalleeInfo,
1521 llvm::AttributeList &Attrs, unsigned &CallingConv,
1522 bool AttrOnCallSite, bool IsThunk);
1523
1524 /// Adjust Memory attribute to ensure that the BE gets the right attribute
1525 // in order to generate the library call or the intrinsic for the function
1526 // name 'Name'.
1527 void AdjustMemoryAttribute(StringRef Name, CGCalleeInfo CalleeInfo,
1528 llvm::AttributeList &Attrs);
1529
1530 /// Like the overload taking a `Function &`, but intended specifically
1531 /// for frontends that want to build on Clang's target-configuration logic.
1532 void addDefaultFunctionDefinitionAttributes(llvm::AttrBuilder &attrs);
1533
1534 StringRef getMangledName(GlobalDecl GD);
1536 const NamedDecl *ND);
1537 StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD);
1538 const GlobalDecl getMangledNameDecl(StringRef);
1539
1540 void EmitTentativeDefinition(const VarDecl *D);
1541
1543
1545
1547
1548 /// Appends Opts to the "llvm.linker.options" metadata value.
1549 void AppendLinkerOptions(StringRef Opts);
1550
1551 /// Appends a detect mismatch command to the linker options.
1552 void AddDetectMismatch(StringRef Name, StringRef Value);
1553
1554 /// Appends a dependent lib to the appropriate metadata value.
1555 void AddDependentLib(StringRef Lib);
1556
1557 llvm::GlobalVariable::LinkageTypes getFunctionLinkage(GlobalDecl GD);
1558
1559 void setFunctionLinkage(GlobalDecl GD, llvm::Function *F) {
1560 F->setLinkage(getFunctionLinkage(GD));
1561 }
1562
1563 /// Return the appropriate linkage for the vtable, VTT, and type information
1564 /// of the given class.
1565 llvm::GlobalVariable::LinkageTypes getVTableLinkage(const CXXRecordDecl *RD);
1566
1567 /// Returns true if a vtable with the given linkage may be emitted with more
1568 /// than one address in the program, because the vtable is weak and the
1569 /// target's ABI allows weak vtables to be duplicated across images.
1570 bool mayVTableBeDuplicated(llvm::GlobalValue::LinkageTypes Linkage) const;
1571
1572 /// Return the store size, in character units, of the given LLVM type.
1573 CharUnits GetTargetTypeStoreSize(llvm::Type *Ty) const;
1574
1575 /// Returns LLVM linkage for a declarator.
1576 llvm::GlobalValue::LinkageTypes
1578
1579 /// Returns LLVM linkage for a declarator.
1580 llvm::GlobalValue::LinkageTypes
1582
1583 /// Emit all the global annotations.
1584 void EmitGlobalAnnotations();
1585
1586 /// Emit an annotation string.
1587 llvm::Constant *EmitAnnotationString(StringRef Str);
1588
1589 /// Emit the annotation's translation unit.
1590 llvm::Constant *EmitAnnotationUnit(SourceLocation Loc);
1591
1592 /// Emit the annotation line number.
1593 llvm::Constant *EmitAnnotationLineNo(SourceLocation L);
1594
1595 /// Emit additional args of the annotation.
1596 llvm::Constant *EmitAnnotationArgs(const AnnotateAttr *Attr);
1597
1598 /// Generate the llvm::ConstantStruct which contains the annotation
1599 /// information for a given GlobalValue. The annotation struct is
1600 /// {i8 *, i8 *, i8 *, i32}. The first field is a constant expression, the
1601 /// GlobalValue being annotated. The second field is the constant string
1602 /// created from the AnnotateAttr's annotation. The third field is a constant
1603 /// string containing the name of the translation unit. The fourth field is
1604 /// the line number in the file of the annotated value declaration.
1605 llvm::Constant *EmitAnnotateAttr(llvm::GlobalValue *GV,
1606 const AnnotateAttr *AA,
1607 SourceLocation L);
1608
1609 /// Add global annotations that are set on D, for the global GV. Those
1610 /// annotations are emitted during finalization of the LLVM code.
1611 void AddGlobalAnnotations(const ValueDecl *D, llvm::GlobalValue *GV);
1612
1613 bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn,
1614 SourceLocation Loc) const;
1615
1616 bool isInNoSanitizeList(SanitizerMask Kind, llvm::GlobalVariable *GV,
1617 SourceLocation Loc, QualType Ty,
1618 StringRef Category = StringRef()) const;
1619
1620 /// Imbue XRay attributes to a function, applying the always/never attribute
1621 /// lists in the process. Returns true if we did imbue attributes this way,
1622 /// false otherwise.
1623 bool imbueXRayAttrs(llvm::Function *Fn, SourceLocation Loc,
1624 StringRef Category = StringRef()) const;
1625
1626 /// \returns true if \p Fn at \p Loc should be excluded from profile
1627 /// instrumentation by the SCL passed by \p -fprofile-list.
1629 isFunctionBlockedByProfileList(llvm::Function *Fn, SourceLocation Loc) const;
1630
1631 /// \returns true if \p Fn at \p Loc should be excluded from profile
1632 /// instrumentation.
1634 isFunctionBlockedFromProfileInstr(llvm::Function *Fn,
1635 SourceLocation Loc) const;
1636
1638 return SanitizerMD.get();
1639 }
1640
1642 DeferredVTables.push_back(RD);
1643 }
1644
1645 /// Emit code for a single global function or var decl. Forward declarations
1646 /// are emitted lazily.
1647 void EmitGlobal(GlobalDecl D);
1648
1649 /// Record that new[] was called for the class, transform vector deleting
1650 /// destructor definition in a form of alias to the actual definition.
1652
1653 /// Record a pending __global_delete variant that may need a forwarding body.
1654 void addPendingGlobalDelete(llvm::GlobalAlias *GlobalDeleteAlias,
1655 const FunctionDecl *OperatorDeleteFD);
1656
1657 /// Get or create the MSVC-compatible __global_delete wrapper for the given
1658 /// global ::operator delete, registering it as a pending variant so a
1659 /// forwarding body can be emitted if this TU directly uses global
1660 /// ::operator delete.
1661 llvm::Constant *
1663
1664 /// Note that global ::operator delete is directly used in this TU.
1666
1667 /// Emit __global_delete forwarding bodies for any pending variants,
1668 /// if this TU directly uses global ::operator delete.
1670
1671 /// Check that class need vector deleting destructor body.
1673
1676
1677 llvm::GlobalValue *GetGlobalValue(StringRef Ref);
1678
1679 /// Set attributes which are common to any form of a global definition (alias,
1680 /// Objective-C method, function, global variable).
1681 ///
1682 /// NOTE: This should only be called for definitions.
1683 void SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV);
1684
1685 void addReplacement(StringRef Name, llvm::Constant *C);
1686
1687 void addGlobalValReplacement(llvm::GlobalValue *GV, llvm::Constant *C);
1688
1689 /// Emit a code for threadprivate directive.
1690 /// \param D Threadprivate declaration.
1692
1693 /// Emit a code for declare reduction construct.
1695 CodeGenFunction *CGF = nullptr);
1696
1697 /// Emit a code for declare mapper construct.
1699 CodeGenFunction *CGF = nullptr);
1700
1701 // Emit code for the OpenACC Declare declaration.
1703 CodeGenFunction *CGF = nullptr);
1704 // Emit code for the OpenACC Routine declaration.
1706 CodeGenFunction *CGF = nullptr);
1707
1708 /// Emit a code for requires directive.
1709 /// \param D Requires declaration
1710 void EmitOMPRequiresDecl(const OMPRequiresDecl *D);
1711
1712 /// Emit a code for the allocate directive.
1713 /// \param D The allocate declaration
1714 void EmitOMPAllocateDecl(const OMPAllocateDecl *D);
1715
1716 /// Return the alignment specified in an allocate directive, if present.
1717 std::optional<CharUnits> getOMPAllocateAlignment(const VarDecl *VD);
1718
1719 /// Returns whether the given record has hidden LTO visibility and therefore
1720 /// may participate in (single-module) CFI and whole-program vtable
1721 /// optimization.
1722 bool HasHiddenLTOVisibility(const CXXRecordDecl *RD);
1723
1724 /// Returns whether the given record has public LTO visibility (regardless of
1725 /// -lto-whole-program-visibility) and therefore may not participate in
1726 /// (single-module) CFI and whole-program vtable optimization.
1728
1729 /// Returns the vcall visibility of the given type. This is the scope in which
1730 /// a virtual function call could be made which ends up being dispatched to a
1731 /// member function of this class. This scope can be wider than the visibility
1732 /// of the class itself when the class has a more-visible dynamic base class.
1733 /// The client should pass in an empty Visited set, which is used to prevent
1734 /// redundant recursive processing.
1735 llvm::GlobalObject::VCallVisibility
1737 llvm::DenseSet<const CXXRecordDecl *> &Visited);
1738
1739 /// Emit type metadata for the given vtable using the given layout.
1741 llvm::GlobalVariable *VTable,
1742 const VTableLayout &VTLayout);
1743
1744 llvm::Type *getVTableComponentType() const;
1745
1746 /// Generate a cross-DSO type identifier for MD.
1747 llvm::ConstantInt *CreateCrossDsoCfiTypeId(llvm::Metadata *MD);
1748
1749 /// Generate a KCFI type identifier for T.
1750 llvm::ConstantInt *CreateKCFITypeId(QualType T, StringRef Salt);
1751
1752 /// Create a metadata identifier for the given function type.
1754
1755 /// Create a metadata identifier for the given type. This may either be an
1756 /// MDString (for external identifiers) or a distinct unnamed MDNode (for
1757 /// internal identifiers).
1759
1760 /// Create a metadata identifier for the Call Graph Section.
1761 /// This is a generalized type identifier that is guaranteed to be an
1762 /// MDString.
1764
1765 /// Applies C default argument promotions to a parameter type for Call Graph
1766 /// Section type reconstruction.
1768
1769 /// Reconstructs a FunctionProtoType for an unprototyped function type
1770 /// (FunctionNoProtoType) using the given parameter/argument types, applying
1771 /// default argument promotions to ensure call-site and definition-site type
1772 /// signatures match.
1774 ArrayRef<QualType> ParamTypes) const;
1775
1776 /// Create a metadata identifier that is intended to be used to check virtual
1777 /// calls via a member function pointer.
1779
1780 /// Create a metadata identifier for the generalization of the given type.
1781 /// This may either be an MDString (for external identifiers) or a distinct
1782 /// unnamed MDNode (for internal identifiers).
1784
1785 /// Create and attach type metadata to the given function.
1787 llvm::Function *F);
1788
1789 /// Create and attach callgraph metadata if the function is a potential
1790 /// indirect call target to support call graph section.
1791 void createIndirectFunctionTypeMD(const FunctionDecl *FD, llvm::Function *F);
1792
1793 /// Create and attach callee_type metadata to the given call.
1794 void createCalleeTypeMetadataForIcall(const QualType &QT, llvm::CallBase *CB);
1795
1796 /// Set type metadata to the given function.
1797 void setKCFIType(const FunctionDecl *FD, llvm::Function *F);
1798
1799 /// Emit KCFI type identifier constants and remove unused identifiers.
1800 void finalizeKCFITypes();
1801
1802 /// Whether this function's return type has no side effects, and thus may
1803 /// be trivially discarded if it is unused.
1804 bool MayDropFunctionReturn(const ASTContext &Context,
1805 QualType ReturnType) const;
1806
1807 /// Returns whether this module needs the "all-vtables" type identifier.
1808 bool NeedAllVtablesTypeId() const;
1809
1810 /// Create and attach type metadata for the given vtable.
1811 void AddVTableTypeMetadata(llvm::GlobalVariable *VTable, CharUnits Offset,
1812 const CXXRecordDecl *RD);
1813
1814 /// Return a vector of most-base classes for RD. This is used to implement
1815 /// control flow integrity checks for member function pointers.
1816 ///
1817 /// A most-base class of a class C is defined as a recursive base class of C,
1818 /// including C itself, that does not have any bases.
1821
1822 /// Get the declaration of std::terminate for the platform.
1823 llvm::FunctionCallee getTerminateFn();
1824
1825 llvm::SanitizerStatReport &getSanStats();
1826
1827 llvm::Value *
1829
1830 /// OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument
1831 /// information in the program executable. The argument information stored
1832 /// includes the argument name, its type, the address and access qualifiers
1833 /// used. This helper can be used to generate metadata for source code kernel
1834 /// function as well as generated implicitly kernels. If a kernel is generated
1835 /// implicitly null value has to be passed to the last two parameters,
1836 /// otherwise all parameters must have valid non-null values.
1837 /// \param FN is a pointer to IR function being generated.
1838 /// \param FD is a pointer to function declaration if any.
1839 /// \param CGF is a pointer to CodeGenFunction that generates this function.
1840 void GenKernelArgMetadata(llvm::Function *FN,
1841 const FunctionDecl *FD = nullptr,
1842 CodeGenFunction *CGF = nullptr);
1843
1844 /// Get target specific null pointer.
1845 /// \param T is the LLVM type of the null pointer.
1846 /// \param QT is the clang QualType of the null pointer.
1847 llvm::Constant *getNullPointer(llvm::PointerType *T, QualType QT);
1848
1850 LValueBaseInfo *BaseInfo = nullptr,
1851 TBAAAccessInfo *TBAAInfo = nullptr,
1852 bool forPointeeType = false);
1854 LValueBaseInfo *BaseInfo = nullptr,
1855 TBAAAccessInfo *TBAAInfo = nullptr);
1856 bool stopAutoInit();
1857
1858 /// Print the postfix for externalized static variable or kernels for single
1859 /// source offloading languages CUDA and HIP. The unique postfix is created
1860 /// using either the CUID argument, or the file's UniqueID and active macros.
1861 /// The fallback method without a CUID requires that the offloading toolchain
1862 /// does not define separate macros via the -cc1 options.
1863 void printPostfixForExternalizedDecl(llvm::raw_ostream &OS,
1864 const Decl *D) const;
1865
1866 /// Move some lazily-emitted states to the NewBuilder. This is especially
1867 /// essential for the incremental parsing environment like Clang Interpreter,
1868 /// because we'll lose all important information after each repl.
1869 void moveLazyEmissionStates(CodeGenModule *NewBuilder);
1870
1871 /// Emit the IR encoding to attach the CUDA launch bounds attribute to \p F.
1872 /// If \p MaxThreadsVal is not nullptr, the max threads value is stored in it,
1873 /// if a valid one was found.
1874 void handleCUDALaunchBoundsAttr(llvm::Function *F,
1875 const CUDALaunchBoundsAttr *A,
1876 int32_t *MaxThreadsVal = nullptr,
1877 int32_t *MinBlocksVal = nullptr,
1878 int32_t *MaxClusterRankVal = nullptr);
1879
1880 /// Emit the IR encoding to attach the AMD GPU flat-work-group-size attribute
1881 /// to \p F. Alternatively, the work group size can be taken from a \p
1882 /// ReqdWGS. If \p MinThreadsVal is not nullptr, the min threads value is
1883 /// stored in it, if a valid one was found. If \p MaxThreadsVal is not
1884 /// nullptr, the max threads value is stored in it, if a valid one was found.
1886 llvm::Function *F, const AMDGPUFlatWorkGroupSizeAttr *A,
1887 const ReqdWorkGroupSizeAttr *ReqdWGS = nullptr,
1888 int32_t *MinThreadsVal = nullptr, int32_t *MaxThreadsVal = nullptr);
1889
1890 /// Emit the IR encoding to attach the AMD GPU waves-per-eu attribute to \p F.
1891 void handleAMDGPUWavesPerEUAttr(llvm::Function *F,
1892 const AMDGPUWavesPerEUAttr *A);
1893
1894 llvm::Constant *
1895 GetOrCreateLLVMGlobal(StringRef MangledName, llvm::Type *Ty, LangAS AddrSpace,
1896 const VarDecl *D,
1897 ForDefinition_t IsForDefinition = NotForDefinition);
1898
1899 // FIXME: Hardcoding priority here is gross.
1900 void AddGlobalCtor(llvm::Function *Ctor, int Priority = 65535,
1901 unsigned LexOrder = ~0U,
1902 llvm::Constant *AssociatedData = nullptr);
1903 void AddGlobalDtor(llvm::Function *Dtor, int Priority = 65535,
1904 bool IsDtorAttrFunc = false);
1905
1906 // Return whether structured convergence intrinsics should be generated for
1907 // this target.
1909 // TODO: this should probably become unconditional once the controlled
1910 // convergence becomes the norm.
1911 return getTriple().isSPIRVLogical() || getTriple().isDXIL();
1912 }
1913
1915 std::pair<const FunctionDecl *, SourceLocation> Global) {
1916 MustTailCallUndefinedGlobals.insert(Global);
1917 }
1918
1920 // In C23 (N3096) $6.7.10:
1921 // """
1922 // If any object is initialized with an empty iniitializer, then it is
1923 // subject to default initialization:
1924 // - if it is an aggregate, every member is initialized (recursively)
1925 // according to these rules, and any padding is initialized to zero bits;
1926 // - if it is a union, the first named member is initialized (recursively)
1927 // according to these rules, and any padding is initialized to zero bits.
1928 //
1929 // If the aggregate or union contains elements or members that are
1930 // aggregates or unions, these rules apply recursively to the subaggregates
1931 // or contained unions.
1932 //
1933 // If there are fewer initializers in a brace-enclosed list than there are
1934 // elements or members of an aggregate, or fewer characters in a string
1935 // literal used to initialize an array of known size than there are elements
1936 // in the array, the remainder of the aggregate is subject to default
1937 // initialization.
1938 // """
1939 //
1940 // From my understanding, the standard is ambiguous in the following two
1941 // areas:
1942 // 1. For a union type with empty initializer, if the first named member is
1943 // not the largest member, then the bytes comes after the first named member
1944 // but before padding are left unspecified. An example is:
1945 // union U { int a; long long b;};
1946 // union U u = {}; // The first 4 bytes are 0, but 4-8 bytes are left
1947 // unspecified.
1948 //
1949 // 2. It only mentions padding for empty initializer, but doesn't mention
1950 // padding for a non empty initialization list. And if the aggregation or
1951 // union contains elements or members that are aggregates or unions, and
1952 // some are non empty initializers, while others are empty initiailizers,
1953 // the padding initialization is unclear. An example is:
1954 // struct S1 { int a; long long b; };
1955 // struct S2 { char c; struct S1 s1; };
1956 // // The values for paddings between s2.c and s2.s1.a, between s2.s1.a
1957 // and s2.s1.b are unclear.
1958 // struct S2 s2 = { 'c' };
1959 //
1960 // Here we choose to zero initiailize left bytes of a union type. Because
1961 // projects like the Linux kernel are relying on this behavior. If we don't
1962 // explicitly zero initialize them, the undef values can be optimized to
1963 // return gabage data. We also choose to zero initialize paddings for
1964 // aggregates and unions, no matter they are initialized by empty
1965 // initializers or non empty initializers. This can provide a consistent
1966 // behavior. So projects like the Linux kernel can rely on it.
1967 return !getLangOpts().CPlusPlus;
1968 }
1969
1970 // Helper to get the alignment for a variable.
1971 unsigned getVtableGlobalVarAlignment(const VarDecl *D = nullptr) {
1973 unsigned PAlign = Context.getLangOpts().RelativeCXXABIVTables
1974 ? 32
1975 : getTarget().getPointerAlign(AS);
1976 return PAlign;
1977 }
1978
1979 /// Helper function to construct a TrapReasonBuilder
1981 return TrapReasonBuilder(&getDiags(), DiagID, TR);
1982 }
1983
1984 llvm::Constant *performAddrSpaceCast(llvm::Constant *Src,
1985 llvm::Type *DestTy) {
1986 // Since target may map different address spaces in AST to the same address
1987 // space, an address space conversion may end up as a bitcast.
1988 return llvm::ConstantExpr::getPointerCast(Src, DestTy);
1989 }
1990
1991 std::optional<llvm::Attribute::AttrKind>
1992 StackProtectorAttribute(const Decl *D) const;
1993
1994 std::string getPFPFieldName(const FieldDecl *FD);
1995 llvm::GlobalValue *getPFPDeactivationSymbol(const FieldDecl *FD);
1996
1997private:
1998 /// Translate an llvm::abi::ArgInfo (computed by the LLVMABI library) into
1999 /// the clang ABIArgInfo consumed by the rest of CodeGen. Used by the
2000 /// experimental ABI lowering path.
2001 ABIArgInfo convertABIArgInfo(const llvm::abi::ArgInfo &AbiInfo,
2002 QualType Type);
2003
2004 /// Process #pragma comment(copyright, ...).
2005 void ProcessPragmaCommentCopyright(StringRef Comment, bool isFromASTFile);
2006
2007 bool shouldDropDLLAttribute(const Decl *D, const llvm::GlobalValue *GV) const;
2008
2009 llvm::Constant *GetOrCreateLLVMFunction(
2010 StringRef MangledName, llvm::Type *Ty, GlobalDecl D, bool ForVTable,
2011 bool DontDefer = false, bool IsThunk = false,
2012 llvm::AttributeList ExtraAttrs = llvm::AttributeList(),
2013 ForDefinition_t IsForDefinition = NotForDefinition);
2014
2015 // Adds a declaration to the list of multi version functions if not present.
2016 void AddDeferredMultiVersionResolverToEmit(GlobalDecl GD);
2017
2018 // References to multiversion functions are resolved through an implicitly
2019 // defined resolver function. This function is responsible for creating
2020 // the resolver symbol for the provided declaration. The value returned
2021 // will be for an ifunc (llvm::GlobalIFunc) if the current target supports
2022 // that feature and for a regular function (llvm::GlobalValue) otherwise.
2023 llvm::Constant *GetOrCreateMultiVersionResolver(GlobalDecl GD);
2024
2025 // Set attributes to a resolver function generated by Clang.
2026 // GD is either the cpu_dispatch declaration or an arbitrarily chosen
2027 // function declaration that triggered the implicit generation of this
2028 // resolver function.
2029 //
2030 /// NOTE: This should only be called for definitions.
2031 void setMultiVersionResolverAttributes(llvm::Function *Resolver,
2032 GlobalDecl GD);
2033
2034 // In scenarios where a function is not known to be a multiversion function
2035 // until a later declaration, it is sometimes necessary to change the
2036 // previously created mangled name to align with requirements of whatever
2037 // multiversion function kind the function is now known to be. This function
2038 // is responsible for performing such mangled name updates.
2039 void UpdateMultiVersionNames(GlobalDecl GD, const FunctionDecl *FD,
2040 StringRef &CurName);
2041
2042 bool GetCPUAndFeaturesAttributes(GlobalDecl GD,
2043 llvm::AttrBuilder &AttrBuilder,
2044 bool SetTargetFeatures = true);
2045 void setNonAliasAttributes(GlobalDecl GD, llvm::GlobalObject *GO);
2046
2047 /// Set function attributes for a function declaration.
2048 void SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
2049 bool IsIncompleteFunction, bool IsThunk);
2050
2051 void EmitGlobalDefinition(GlobalDecl D, llvm::GlobalValue *GV = nullptr);
2052
2053 void EmitGlobalFunctionDefinition(GlobalDecl GD, llvm::GlobalValue *GV);
2054 void EmitMultiVersionFunctionDefinition(GlobalDecl GD, llvm::GlobalValue *GV);
2055
2056 void EmitGlobalVarDefinition(const VarDecl *D, bool IsTentative = false);
2057 void EmitAliasDefinition(GlobalDecl GD);
2058 void emitIFuncDefinition(GlobalDecl GD);
2059 void emitCPUDispatchDefinition(GlobalDecl GD);
2060 void EmitObjCPropertyImplementations(const ObjCImplementationDecl *D);
2061 void EmitObjCIvarInitializations(ObjCImplementationDecl *D);
2062
2063 // C++ related functions.
2064
2065 void EmitDeclContext(const DeclContext *DC);
2066 void EmitLinkageSpec(const LinkageSpecDecl *D);
2067 void EmitTopLevelStmt(const TopLevelStmtDecl *D);
2068
2069 /// Emit the function that initializes C++ thread_local variables.
2070 void EmitCXXThreadLocalInitFunc();
2071
2072 /// Emit the function that initializes global variables for a C++ Module.
2073 void EmitCXXModuleInitFunc(clang::Module *Primary);
2074
2075 /// Emit the function that initializes C++ globals.
2076 void EmitCXXGlobalInitFunc();
2077
2078 /// Emit the function that performs cleanup associated with C++ globals.
2079 void EmitCXXGlobalCleanUpFunc();
2080
2081 /// Emit the function that initializes the specified global (if PerformInit is
2082 /// true) and registers its destructor.
2083 void EmitCXXGlobalVarDeclInitFunc(const VarDecl *D,
2084 llvm::GlobalVariable *Addr,
2085 bool PerformInit);
2086
2087 void EmitPointerToInitFunc(const VarDecl *VD, llvm::GlobalVariable *Addr,
2088 llvm::Function *InitFunc, InitSegAttr *ISA);
2089
2090 /// EmitCtorList - Generates a global array of functions and priorities using
2091 /// the given list and name. This array will have appending linkage and is
2092 /// suitable for use as a LLVM constructor or destructor array. Clears Fns.
2093 void EmitCtorList(CtorList &Fns, const char *GlobalName);
2094
2095 /// Emit any needed decls for which code generation was deferred.
2096 void EmitDeferred();
2097
2098 /// Try to emit external vtables as available_externally if they have emitted
2099 /// all inlined virtual functions. It runs after EmitDeferred() and therefore
2100 /// is not allowed to create new references to things that need to be emitted
2101 /// lazily.
2102 void EmitVTablesOpportunistically();
2103
2104 /// Call replaceAllUsesWith on all pairs in Replacements.
2105 void applyReplacements();
2106
2107 /// Call replaceAllUsesWith on all pairs in GlobalValReplacements.
2108 void applyGlobalValReplacements();
2109
2110 void checkAliases();
2111
2112 std::map<int, llvm::TinyPtrVector<llvm::Function *>> DtorsUsingAtExit;
2113
2114 /// Register functions annotated with __attribute__((destructor)) using
2115 /// __cxa_atexit, if it is available, or atexit otherwise.
2116 void registerGlobalDtorsWithAtExit();
2117
2118 // When using sinit and sterm functions, unregister
2119 // __attribute__((destructor)) annotated functions which were previously
2120 // registered by the atexit subroutine using unatexit.
2121 void unregisterGlobalDtorsWithUnAtExit();
2122
2123 /// Emit deferred multiversion function resolvers and associated variants.
2124 void emitMultiVersionFunctions();
2125
2126 /// Emit any vtables which we deferred and still have a use for.
2127 void EmitDeferredVTables();
2128
2129 /// Emit a dummy function that reference a CoreFoundation symbol when
2130 /// @available is used on Darwin.
2131 void emitAtAvailableLinkGuard();
2132
2133 /// Emit the llvm.used and llvm.compiler.used metadata.
2134 void emitLLVMUsed();
2135
2136 /// For C++20 Itanium ABI, emit the initializers for the module.
2137 void EmitModuleInitializers(clang::Module *Primary);
2138
2139 /// Emit the link options introduced by imported modules.
2140 void EmitModuleLinkOptions();
2141
2142 /// Helper function for EmitStaticExternCAliases() to redirect ifuncs that
2143 /// have a resolver name that matches 'Elem' to instead resolve to the name of
2144 /// 'CppFunc'. This redirection is necessary in cases where 'Elem' has a name
2145 /// that will be emitted as an alias of the name bound to 'CppFunc'; ifuncs
2146 /// may not reference aliases. Redirection is only performed if 'Elem' is only
2147 /// used by ifuncs in which case, 'Elem' is destroyed. 'true' is returned if
2148 /// redirection is successful, and 'false' is returned otherwise.
2149 bool CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
2150 llvm::GlobalValue *CppFunc);
2151
2152 /// Emit aliases for internal-linkage declarations inside "C" language
2153 /// linkage specifications, giving them the "expected" name where possible.
2154 void EmitStaticExternCAliases();
2155
2156 void EmitDeclMetadata();
2157
2158 /// Emit the Clang version as llvm.ident metadata.
2159 void EmitVersionIdentMetadata();
2160
2161 /// Emit the Clang commandline as llvm.commandline metadata.
2162 void EmitCommandLineMetadata();
2163
2164 /// Emit the module flag metadata used to pass options controlling the
2165 /// the backend to LLVM.
2166 void EmitBackendOptionsMetadata(const CodeGenOptions &CodeGenOpts);
2167
2168 /// Emits OpenCL specific Metadata e.g. OpenCL version.
2169 void EmitOpenCLMetadata();
2170
2171 /// Emit the llvm.gcov metadata used to tell LLVM where to emit the .gcno and
2172 /// .gcda files in a way that persists in .bc files.
2173 void EmitCoverageFile();
2174
2175 /// Given a sycl_kernel_entry_point attributed function, emit the
2176 /// corresponding SYCL kernel caller offload entry point function.
2177 void EmitSYCLKernelCaller(const FunctionDecl *KernelEntryPointFn,
2178 ASTContext &Ctx);
2179
2180 /// Attach the "sycl-module-id" function attribute to \p Fn, to record the
2181 /// module ID for the translation unit. This attribute is applied to SYCL
2182 /// kernel entry point functions and functions declared with the
2183 /// sycl_external attribute to enable them to be identified as entry points
2184 /// by clang-sycl-linker during device-code splitting.
2185 void addSYCLModuleIdAttr(llvm::Function *Fn);
2186
2187 /// Embed the finalized SYCL device binary named by -foffload-include-binary
2188 /// into the host module.
2189 /// \return the function that registers the binary with the runtime, or null
2190 /// if the binary could not be read.
2191 llvm::Function *embedSYCLDeviceBinary();
2192
2193 /// Determine whether the definition must be emitted; if this returns \c
2194 /// false, the definition can be emitted lazily if it's used.
2195 bool MustBeEmitted(const ValueDecl *D);
2196
2197 /// Determine whether the definition can be emitted eagerly, or should be
2198 /// delayed until the end of the translation unit. This is relevant for
2199 /// definitions whose linkage can change, e.g. implicit function instantions
2200 /// which may later be explicitly instantiated.
2201 bool MayBeEmittedEagerly(const ValueDecl *D);
2202
2203 /// Check whether we can use a "simpler", more core exceptions personality
2204 /// function.
2205 void SimplifyPersonality();
2206
2207 /// Helper function for getDefaultFunctionAttributes. Builds a set of function
2208 /// attributes which can be simply added to a function.
2209 void getTrivialDefaultFunctionAttributes(StringRef Name, bool HasOptnone,
2210 bool AttrOnCallSite,
2211 llvm::AttrBuilder &FuncAttrs);
2212
2213 /// Helper function for ConstructAttributeList and
2214 /// addDefaultFunctionDefinitionAttributes. Builds a set of function
2215 /// attributes to add to a function with the given properties.
2216 void getDefaultFunctionAttributes(StringRef Name, bool HasOptnone,
2217 bool AttrOnCallSite,
2218 llvm::AttrBuilder &FuncAttrs);
2219
2220 llvm::Metadata *CreateMetadataIdentifierImpl(QualType T, MetadataTypeMap &Map,
2221 StringRef Suffix,
2222 bool ForceString = false);
2223
2224 /// Emit deactivation symbols for any PFP fields whose offset is taken with
2225 /// offsetof.
2226 void emitPFPFieldsWithEvaluatedOffset();
2227};
2228
2229} // end namespace CodeGen
2230} // end namespace clang
2231
2232#endif // LLVM_CLANG_LIB_CODEGEN_CODEGENMODULE_H
Enums/classes describing ABI related information about constructors, destructors and thunks.
#define V(N, I)
static void getTrivialDefaultFunctionAttributes(StringRef Name, bool HasOptnone, const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, bool AttrOnCallSite, llvm::AttrBuilder &FuncAttrs)
Definition CGCall.cpp:2349
static std::optional< ArgClassification > convertABIArgInfo(const llvm::abi::ArgInfo &info, MLIRContext *ctx, mlir::Type origTy)
Convert an llvm::abi::ArgInfo into the ArgClassification consumed by CIRABIRewriteContext.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Definition MachO.h:31
llvm::json::Object Object
Defines a utilitiy for warning once when close to out of stack space.
This file contains the declaration of TrapReasonBuilder and related classes.
__DEVICE__ void * memset(void *__a, int __b, size_t __c)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:245
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:245
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
Attr - This represents one attribute.
Definition Attr.h:47
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4856
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6758
Represents a C++ destructor within a class.
Definition DeclCXX.h:2915
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
const CXXBaseSpecifier *const * path_const_iterator
Definition Expr.h:3812
This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
ABIArgInfo - Helper class to encapsulate information about how a specific C type should be passed to ...
ABIInfo - Target specific hooks for defining how a type should be passed or returned from functions.
Definition ABIInfo.h:49
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition Address.h:128
void Profile(llvm::FoldingSetNodeID &id) const
virtual void emitCopy(CodeGenFunction &CGF, Address dest, Address src)=0
BlockByrefHelpers(CharUnits alignment)
CharUnits Alignment
The alignment of the field.
virtual void emitDispose(CodeGenFunction &CGF, Address field)=0
BlockByrefHelpers(const BlockByrefHelpers &)=default
virtual bool needsDispose() const
virtual void profileImpl(llvm::FoldingSetNodeID &id) const =0
Implements C++ ABI-specific code generation functions.
Definition CGCXXABI.h:43
Abstract information about a function or function prototype.
Definition CGCall.h:43
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
Definition CGDebugInfo.h:59
CGFunctionInfo - Class to encapsulate the information about a function definition.
Implements runtime-specific code generation functions.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
This class organizes the cross-function state that is used while generating LLVM code.
StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD)
llvm::FunctionCallee getBlockObjectAssign()
const PreprocessorOptions & getPreprocessorOpts() const
ConstantAddress GetAddrOfMSGuidDecl(const MSGuidDecl *GD)
Get the address of a GUID.
void AddCXXPrioritizedStermFinalizerEntry(llvm::Function *StermFinalizer, int Priority)
void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const
Set visibility, dllimport/dllexport and dso_local.
void AddCXXDtorEntry(llvm::FunctionCallee DtorFn, llvm::Constant *Object)
Add a destructor and object to add to the C++ global destructor function.
llvm::FoldingSet< BlockByrefHelpers > ByrefHelpersCache
void AddVTableTypeMetadata(llvm::GlobalVariable *VTable, CharUnits Offset, const CXXRecordDecl *RD)
Create and attach type metadata for the given vtable.
void UpdateCompletedType(const TagDecl *TD)
void handleCUDALaunchBoundsAttr(llvm::Function *F, const CUDALaunchBoundsAttr *A, int32_t *MaxThreadsVal=nullptr, int32_t *MinBlocksVal=nullptr, int32_t *MaxClusterRankVal=nullptr)
Emit the IR encoding to attach the CUDA launch bounds attribute to F.
Definition NVPTX.cpp:344
llvm::MDNode * getTBAAAccessTagInfo(TBAAAccessInfo Info)
getTBAAAccessTagInfo - Get TBAA tag for a given memory access.
llvm::MDNode * getNoObjCARCExceptionsMetadata()
void AddCXXStermFinalizerToGlobalDtor(llvm::Function *StermFinalizer, int Priority)
Add an sterm finalizer to its own llvm.global_dtors entry.
llvm::GlobalVariable::ThreadLocalMode GetDefaultLLVMTLSModel() const
Get LLVM TLS mode from CodeGenOptions.
void EmitExplicitCastExprType(const ExplicitCastExpr *E, CodeGenFunction *CGF=nullptr)
Emit type info if type of an expression is a variably modified type.
Definition CGExpr.cpp:1457
void SetInternalFunctionAttributes(GlobalDecl GD, llvm::Function *F, const CGFunctionInfo &FI)
Set the attributes on the LLVM function for the given decl and function info.
void setDSOLocal(llvm::GlobalValue *GV) const
llvm::GlobalObject::VCallVisibility GetVCallVisibilityLevel(const CXXRecordDecl *RD, llvm::DenseSet< const CXXRecordDecl * > &Visited)
Returns the vcall visibility of the given type.
llvm::MDNode * getTBAAStructInfo(QualType QTy)
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
std::optional< llvm::Attribute::AttrKind > StackProtectorAttribute(const Decl *D) const
llvm::GlobalValue * getPFPDeactivationSymbol(const FieldDecl *FD)
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
llvm::ConstantInt * CreateKCFITypeId(QualType T, StringRef Salt)
Generate a KCFI type identifier for T.
llvm::Constant * performAddrSpaceCast(llvm::Constant *Src, llvm::Type *DestTy)
ConstantAddress GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr *E)
Returns a pointer to a constant global variable for the given file-scope compound literal expression.
bool NeedAllVtablesTypeId() const
Returns whether this module needs the "all-vtables" type identifier.
void addCompilerUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.compiler.used metadata.
CodeGenVTables & getVTables()
llvm::ConstantInt * CreateCrossDsoCfiTypeId(llvm::Metadata *MD)
Generate a cross-DSO type identifier for MD.
void setStaticLocalDeclAddress(const VarDecl *D, llvm::Constant *C)
llvm::Constant * EmitNullConstantForBase(const CXXRecordDecl *Record)
Return a null constant appropriate for zero-initializing a base class with the given type.
llvm::Function * getLLVMLifetimeStartFn()
Lazily declare the @llvm.lifetime.start intrinsic.
Definition CGDecl.cpp:2694
CharUnits GetTargetTypeStoreSize(llvm::Type *Ty) const
Return the store size, in character units, of the given LLVM type.
void handleAMDGPUWavesPerEUAttr(llvm::Function *F, const AMDGPUWavesPerEUAttr *A)
Emit the IR encoding to attach the AMD GPU waves-per-eu attribute to F.
Definition AMDGPU.cpp:754
void createFunctionTypeMetadataForIcall(const FunctionDecl *FD, llvm::Function *F)
Create and attach type metadata to the given function.
std::optional< PointerAuthQualifier > getVTablePointerAuthentication(const CXXRecordDecl *thisClass, bool IsVTTEntry=false)
void AddCXXStermFinalizerEntry(llvm::FunctionCallee DtorFn)
Add an sterm finalizer to the C++ global cleanup function.
void setTypeDescriptorInMap(QualType Ty, llvm::Constant *C)
bool getExpressionLocationsEnabled() const
Return true if we should emit location information for expressions.
llvm::Metadata * CreateMetadataIdentifierForCallGraphType(QualType T)
Create a metadata identifier for the Call Graph Section.
CharUnits getMinimumClassObjectSize(const CXXRecordDecl *CD)
Returns the minimum object size for an object of the given class type (or a class derived from it).
Definition CGClass.cpp:61
void addGlobalValReplacement(llvm::GlobalValue *GV, llvm::Constant *C)
llvm::Constant * getRawFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return a function pointer for a reference to the given function.
Definition CGExpr.cpp:3519
bool classNeedsVectorDestructor(const CXXRecordDecl *RD)
Check that class need vector deleting destructor body.
llvm::FunctionCallee getAddrAndTypeOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Definition CGCXX.cpp:283
llvm::Constant * GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH=false)
Get the address of the RTTI descriptor for the given type.
llvm::Constant * GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty=nullptr, bool ForVTable=false, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the given function.
Address createUnnamedGlobalFrom(const VarDecl &D, llvm::Constant *Constant, CharUnits Align)
Definition CGDecl.cpp:1143
void setGVPropertiesAux(llvm::GlobalValue *GV, const NamedDecl *D) const
llvm::Constant * getFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return the ABI-correct function pointer value for a reference to the given function.
const IntrusiveRefCntPtr< llvm::vfs::FileSystem > & getFileSystem() const
void setAddrOfGlobalBlock(const BlockExpr *BE, llvm::Constant *Addr)
Notes that BE's global block is available via Addr.
void setStaticLocalDeclGuardAddress(const VarDecl *D, llvm::GlobalVariable *C)
bool ReturnTypeUsesFPRet(QualType ResultType)
Return true iff the given type uses 'fpret' when used as a return type.
Definition CGCall.cpp:2059
void EmitMainVoidAlias()
Emit an alias for "main" if it has no arguments (needed for wasm).
void DecorateInstructionWithInvariantGroup(llvm::Instruction *I, const CXXRecordDecl *RD)
Adds !invariant.barrier !tag to instruction.
TrapReasonBuilder BuildTrapReason(unsigned DiagID, TrapReason &TR)
Helper function to construct a TrapReasonBuilder.
llvm::Constant * getBuiltinLibFunction(const FunctionDecl *FD, unsigned BuiltinID)
Given a builtin id for a function like "__builtin_fabsf", return a Function* for "fabsf".
llvm::Constant * getOrCreateMSVCGlobalDeleteWrapper(const FunctionDecl *GlobOD)
Get or create the MSVC-compatible __global_delete wrapper for the given global operator delete,...
DiagnosticsEngine & getDiags() const
bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn, SourceLocation Loc) const
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
llvm::Constant * getAddrOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the constructor/destructor of the given type.
bool isObjCDirectPreconditionThunkEnabled() const
Check if the precondition thunk optimization is enabled.
void setAtomicOpts(AtomicOptions AO)
Set the current Atomic options.
bool isPaddedAtomicType(QualType type)
llvm::Constant * getNullPointer(llvm::PointerType *T, QualType QT)
Get target specific null pointer.
void AddCXXGlobalInit(llvm::Function *F)
void ErrorUnsupported(const Stmt *S, const char *Type)
Print out an error that codegen doesn't support the specified stmt yet.
llvm::Constant * EmitAnnotateAttr(llvm::GlobalValue *GV, const AnnotateAttr *AA, SourceLocation L)
Generate the llvm::ConstantStruct which contains the annotation information for a given GlobalValue.
void EmitOpenACCDeclare(const OpenACCDeclareDecl *D, CodeGenFunction *CGF=nullptr)
Definition CGDecl.cpp:2969
bool shouldHavePreconditionThunk(const ObjCMethodDecl *OMD) const
Check if a direct method should use precondition thunks at call sites.
llvm::GlobalValue::LinkageTypes getLLVMLinkageForDeclarator(const DeclaratorDecl *D, GVALinkage Linkage)
Returns LLVM linkage for a declarator.
TBAAAccessInfo mergeTBAAInfoForMemoryTransfer(TBAAAccessInfo DestInfo, TBAAAccessInfo SrcInfo)
mergeTBAAInfoForMemoryTransfer - Get merged TBAA information for the purposes of memory transfer call...
llvm::Type * getBlockDescriptorType()
Fetches the type of a generic block descriptor.
llvm::Constant * GetAddrOfGlobalBlock(const BlockExpr *BE, StringRef Name)
Gets the address of a block which requires no captures.
llvm::Constant * getAtomicGetterHelperFnMap(QualType Ty)
CGPointerAuthInfo getMemberFunctionPointerAuthInfo(QualType FT)
const LangOptions & getLangOpts() const
CGCUDARuntime & getCUDARuntime()
Return a reference to the configured CUDA runtime.
int getUniqueBlockCount()
Fetches the global unique block count.
llvm::Constant * EmitAnnotationLineNo(SourceLocation L)
Emit the annotation line number.
QualType getObjCFastEnumerationStateType()
Retrieve the record type that describes the state of an Objective-C fast enumeration loop (for....
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
bool shouldMapVisibilityToDLLExport(const NamedDecl *D) const
CGOpenCLRuntime & getOpenCLRuntime()
Return a reference to the configured OpenCL runtime.
const std::string & getModuleNameHash() const
const TargetInfo & getTarget() const
bool shouldEmitRTTI(bool ForEH=false)
void EmitGlobal(GlobalDecl D)
Emit code for a single global function or var decl.
llvm::Function * getLLVMFakeUseFn()
Lazily declare the @llvm.fake.use intrinsic.
Definition CGDecl.cpp:2712
llvm::GlobalVariable * getStaticLocalDeclGuardAddress(const VarDecl *D)
llvm::ConstantInt * getPointerAuthOtherDiscriminator(const PointerAuthSchema &Schema, GlobalDecl SchemaDecl, QualType SchemaType)
Given a pointer-authentication schema, return a concrete "other" discriminator for it.
llvm::Metadata * CreateMetadataIdentifierForType(QualType T)
Create a metadata identifier for the given type.
llvm::Constant * getTypeDescriptorFromMap(QualType Ty)
llvm::IndexedInstrProfReader * getPGOReader() const
void addUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.used metadata.
void handleAMDGPUFlatWorkGroupSizeAttr(llvm::Function *F, const AMDGPUFlatWorkGroupSizeAttr *A, const ReqdWorkGroupSizeAttr *ReqdWGS=nullptr, int32_t *MinThreadsVal=nullptr, int32_t *MaxThreadsVal=nullptr)
Emit the IR encoding to attach the AMD GPU flat-work-group-size attribute to F.
Definition AMDGPU.cpp:723
void createIndirectFunctionTypeMD(const FunctionDecl *FD, llvm::Function *F)
Create and attach callgraph metadata if the function is a potential indirect call target to support c...
void AppendLinkerOptions(StringRef Opts)
Appends Opts to the "llvm.linker.options" metadata value.
bool hasObjCRuntime()
Return true iff an Objective-C runtime has been configured.
void createCalleeTypeMetadataForIcall(const QualType &QT, llvm::CallBase *CB)
Create and attach callee_type metadata to the given call.
bool tryEmitCUDADeviceInvalidFunctionBody(GlobalDecl GD, llvm::Function *Fn)
Emit a trap stub body for functions in ASTContext::CUDADeviceInvalidFuncs.
Definition CGCXX.cpp:249
void EmitExternalDeclaration(const DeclaratorDecl *D)
void AddDependentLib(StringRef Lib)
Appends a dependent lib to the appropriate metadata value.
void Release()
Finalize LLVM code generation.
llvm::FunctionCallee IsOSVersionAtLeastFn
ProfileList::ExclusionType isFunctionBlockedByProfileList(llvm::Function *Fn, SourceLocation Loc) const
CGPointerAuthInfo getPointerAuthInfoForPointeeType(QualType type)
llvm::MDNode * getTBAABaseTypeInfo(QualType QTy)
getTBAABaseTypeInfo - Get metadata that describes the given base access type.
void EmitVTableTypeMetadata(const CXXRecordDecl *RD, llvm::GlobalVariable *VTable, const VTableLayout &VTLayout)
Emit type metadata for the given vtable using the given layout.
void computeABIInfoUsingLib(CGFunctionInfo &FI)
Drive the experimental LLVMABI-based lowering path: map argument and return types into the LLVMABI li...
Definition CGCall.cpp:898
bool lookupRepresentativeDecl(StringRef MangledName, GlobalDecl &Result) const
void EmitOMPAllocateDecl(const OMPAllocateDecl *D)
Emit a code for the allocate directive.
Definition CGDecl.cpp:2983
void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const
Set the visibility for the given LLVM GlobalValue.
CoverageMappingModuleGen * getCoverageMapping() const
llvm::Constant * GetNonVirtualBaseClassOffset(const CXXRecordDecl *ClassDecl, CastExpr::path_const_iterator PathBegin, CastExpr::path_const_iterator PathEnd)
Returns the offset from a derived class to a class.
Definition CGClass.cpp:195
bool TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D)
Try to emit a base destructor as an alias to its primary base-class destructor.
Definition CGCXX.cpp:34
llvm::GlobalValue::LinkageTypes getLLVMLinkageVarDefinition(const VarDecl *VD)
Returns LLVM linkage for a declarator.
llvm::Constant * getMemberPointerConstant(const UnaryOperator *e)
unsigned getVtableGlobalVarAlignment(const VarDecl *D=nullptr)
bool HasHiddenLTOVisibility(const CXXRecordDecl *RD)
Returns whether the given record has hidden LTO visibility and therefore may participate in (single-m...
const llvm::DataLayout & getDataLayout() const
llvm::Constant * getNSConcreteGlobalBlock()
QualType GetCallGraphPromotedType(QualType Ty) const
Applies C default argument promotions to a parameter type for Call Graph Section type reconstruction.
void addUndefinedGlobalForTailCall(std::pair< const FunctionDecl *, SourceLocation > Global)
CharUnits computeNonVirtualBaseClassOffset(const CXXRecordDecl *DerivedClass, CastExpr::path_const_iterator Start, CastExpr::path_const_iterator End)
Definition CGClass.cpp:170
ObjCEntrypoints & getObjCEntrypoints() const
void requireVectorDestructorDefinition(const CXXRecordDecl *RD)
Record that new[] was called for the class, transform vector deleting destructor definition in a form...
TBAAAccessInfo getTBAAVTablePtrAccessInfo(llvm::Type *VTablePtrType)
getTBAAVTablePtrAccessInfo - Get the TBAA information that describes an access to a virtual table poi...
ConstantAddress GetWeakRefReference(const ValueDecl *VD)
Get a reference to the target of VD.
std::string getPFPFieldName(const FieldDecl *FD)
CGPointerAuthInfo getFunctionPointerAuthInfo(QualType T)
Return the abstract pointer authentication schema for a pointer to the given function type.
CharUnits getVBaseAlignment(CharUnits DerivedAlign, const CXXRecordDecl *Derived, const CXXRecordDecl *VBase)
Returns the assumed alignment of a virtual base of a class.
Definition CGClass.cpp:78
llvm::Constant * GetFunctionStart(const ValueDecl *Decl)
void addPendingGlobalDelete(llvm::GlobalAlias *GlobalDeleteAlias, const FunctionDecl *OperatorDeleteFD)
Record a pending __global_delete variant that may need a forwarding body.
llvm::GlobalVariable * getAddrOfConstantCompoundLiteralIfEmitted(const CompoundLiteralExpr *E)
If it's been emitted already, returns the GlobalVariable corresponding to a compound literal.
static llvm::GlobalValue::VisibilityTypes GetLLVMVisibility(Visibility V)
void EmitTentativeDefinition(const VarDecl *D)
bool ReturnTypeUsesFP2Ret(QualType ResultType)
Return true iff the given type uses 'fp2ret' when used as a return type.
Definition CGCall.cpp:2076
void EmitDeferredUnusedCoverageMappings()
Emit all the deferred coverage mappings for the uninstrumented functions.
bool mayVTableBeDuplicated(llvm::GlobalValue::LinkageTypes Linkage) const
Returns true if a vtable with the given linkage may be emitted with more than one address in the prog...
void addUsedOrCompilerUsedGlobal(llvm::GlobalValue *GV)
Add a global to a list to be added to the llvm.compiler.used metadata.
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.
llvm::Constant * getMemberFunctionPointer(const FunctionDecl *FD, llvm::Type *Ty=nullptr)
SanitizerMetadata * getSanitizerMetadata()
void EmitDefinitionAsAlias(GlobalDecl Alias, GlobalDecl Target)
Emit a definition as a global alias for another definition, unconditionally.
Definition CGCXX.cpp:207
llvm::Metadata * CreateMetadataIdentifierGeneralized(QualType T)
Create a metadata identifier for the generalization of the given type.
void EmitGlobalAnnotations()
Emit all the global annotations.
llvm::Constant * getAddrOfGlobalBlockIfEmitted(const BlockExpr *BE)
Returns the address of a block which requires no caputres, or null if we've yet to emit the block for...
llvm::Function * codegenCXXStructor(GlobalDecl GD)
Definition CGCXX.cpp:268
CharUnits getClassPointerAlignment(const CXXRecordDecl *CD)
Returns the assumed alignment of an opaque pointer to the given class.
Definition CGClass.cpp:42
const llvm::Triple & getTriple() const
void setAtomicSetterHelperFnMap(QualType Ty, llvm::Constant *Fn)
llvm::Constant * getOrCreateStaticVarDecl(const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage)
Definition CGDecl.cpp:264
SmallVector< const CXXRecordDecl *, 0 > getMostBaseClasses(const CXXRecordDecl *RD)
Return a vector of most-base classes for RD.
void AddDeferredUnusedCoverageMapping(Decl *D)
Stored a deferred empty coverage mapping for an unused and thus uninstrumented top level declaration.
bool AlwaysHasLTOVisibilityPublic(const CXXRecordDecl *RD)
Returns whether the given record has public LTO visibility (regardless of -lto-whole-program-visibili...
void MaybeHandleStaticInExternC(const SomeDecl *D, llvm::GlobalValue *GV)
If the declaration has internal linkage but is inside an extern "C" linkage specification,...
void DecorateInstructionWithTBAA(llvm::Instruction *Inst, TBAAAccessInfo TBAAInfo)
DecorateInstructionWithTBAA - Decorate the instruction with a TBAA tag.
uint16_t getPointerAuthDeclDiscriminator(GlobalDecl GD)
Return the "other" decl-specific discriminator for the given decl.
llvm::Constant * getAtomicSetterHelperFnMap(QualType Ty)
TBAAAccessInfo getTBAAInfoForSubobject(LValue Base, QualType AccessType)
getTBAAInfoForSubobject - Get TBAA information for an access with a given base lvalue.
llvm::GlobalVariable::LinkageTypes getFunctionLinkage(GlobalDecl GD)
void AddGlobalDtor(llvm::Function *Dtor, int Priority=65535, bool IsDtorAttrFunc=false)
AddGlobalDtor - Add a function to the list that will be called when the module is unloaded.
bool ReturnSlotInterferesWithArgs(const CGFunctionInfo &FI)
Return true iff the given type uses an argument slot when 'sret' is used as a return type.
Definition CGCall.cpp:2054
bool ReturnTypeHasInReg(const CGFunctionInfo &FI)
Return true iff the given type has inreg set.
Definition CGCall.cpp:2049
void EmitVTable(CXXRecordDecl *Class)
This is a callback from Sema to tell us that a particular vtable is required to be emitted in this tr...
llvm::Constant * CreateRuntimeVariable(llvm::Type *Ty, StringRef Name)
Create a new runtime global variable with the specified type and name.
void AdjustMemoryAttribute(StringRef Name, CGCalleeInfo CalleeInfo, llvm::AttributeList &Attrs)
Adjust Memory attribute to ensure that the BE gets the right attribute.
Definition CGCall.cpp:2736
void ConstructAttributeList(StringRef Name, const CGFunctionInfo &Info, CGCalleeInfo CalleeInfo, llvm::AttributeList &Attrs, unsigned &CallingConv, bool AttrOnCallSite, bool IsThunk)
Get the LLVM attributes and calling convention to use for a particular function type.
Definition CGCall.cpp:2764
CharUnits getDynamicOffsetAlignment(CharUnits ActualAlign, const CXXRecordDecl *Class, CharUnits ExpectedTargetAlign)
Given a class pointer with an actual known alignment, and the expected alignment of an object at a dy...
Definition CGClass.cpp:93
llvm::Constant * GetOrCreateLLVMGlobal(StringRef MangledName, llvm::Type *Ty, LangAS AddrSpace, const VarDecl *D, ForDefinition_t IsForDefinition=NotForDefinition)
GetOrCreateLLVMGlobal - If the specified mangled name is not in the module, create and return an llvm...
const llvm::abi::TargetInfo & getLLVMABITargetInfo(llvm::abi::TypeBuilder &TB)
Lazily build and return the LLVMABI library's TargetInfo for the current target.
TBAAAccessInfo getTBAAAccessInfo(QualType AccessType)
getTBAAAccessInfo - Get TBAA information that describes an access to an object of the given type.
void setFunctionLinkage(GlobalDecl GD, llvm::Function *F)
void noteDirectGlobalDelete()
Note that global operator delete is directly used in this TU.
llvm::Constant * GetAddrOfGlobal(GlobalDecl GD, ForDefinition_t IsForDefinition=NotForDefinition)
AtomicOptions getAtomicOpts()
Get the current Atomic options.
ConstantAddress GetAddrOfConstantCFString(const StringLiteral *Literal)
Return a pointer to a constant CFString object for the given string.
InstrProfStats & getPGOStats()
ProfileList::ExclusionType isFunctionBlockedFromProfileInstr(llvm::Function *Fn, SourceLocation Loc) const
void AddGlobalAnnotations(const ValueDecl *D, llvm::GlobalValue *GV)
Add global annotations that are set on D, for the global GV.
void setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const
Set the TLS mode for the given LLVM GlobalValue for the thread-local variable declaration D.
ItaniumVTableContext & getItaniumVTableContext()
ConstantAddress GetAddrOfConstantStringFromLiteral(const StringLiteral *S, StringRef Name=".str")
Return a pointer to a constant array for the given string literal.
ASTContext & getContext() const
ConstantAddress GetAddrOfTemplateParamObject(const TemplateParamObjectDecl *TPO)
Get the address of a template parameter object.
void EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D)
Emit a code for threadprivate directive.
llvm::Constant * getNSConcreteStackBlock()
ConstantAddress GetAddrOfUnnamedGlobalConstantDecl(const UnnamedGlobalConstantDecl *GCD)
Get the address of a UnnamedGlobalConstant.
TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, TBAAAccessInfo TargetInfo)
mergeTBAAInfoForCast - Get merged TBAA information for the purposes of type casts.
llvm::Constant * GetAddrOfGlobalVar(const VarDecl *D, llvm::Type *Ty=nullptr, ForDefinition_t IsForDefinition=NotForDefinition)
Return the llvm::Constant for the address of the given global variable.
MicrosoftVTableContext & getMicrosoftVTableContext()
const HeaderSearchOptions & getHeaderSearchOpts() const
QualType ReconstructCallGraphPrototype(const FunctionNoProtoType *FNPT, ArrayRef< QualType > ParamTypes) const
Reconstructs a FunctionProtoType for an unprototyped function type (FunctionNoProtoType) using the gi...
llvm::SanitizerStatReport & getSanStats()
llvm::Constant * EmitAnnotationString(StringRef Str)
Emit an annotation string.
llvm::Type * getVTableComponentType() const
void EmitOMPDeclareMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare mapper construct.
Definition CGDecl.cpp:2961
llvm::Function * getLLVMLifetimeEndFn()
Lazily declare the @llvm.lifetime.end intrinsic.
Definition CGDecl.cpp:2703
void RefreshTypeCacheForClass(const CXXRecordDecl *Class)
llvm::MDNode * getTBAATypeInfo(QualType QTy)
getTBAATypeInfo - Get metadata used to describe accesses to objects of the given type.
void setAddrOfConstantCompoundLiteral(const CompoundLiteralExpr *CLE, llvm::GlobalVariable *GV)
Notes that CLE's GlobalVariable is GV.
void EmitOMPRequiresDecl(const OMPRequiresDecl *D)
Emit a code for requires directive.
Definition CGDecl.cpp:2979
void HandleCXXStaticMemberVarInstantiation(VarDecl *VD)
Tell the consumer that this variable has been instantiated.
bool shouldHavePreconditionInline(const ObjCMethodDecl *OMD) const
Check if a direct method should have inline precondition checks at call sites.
bool ReturnTypeUsesSRet(const CGFunctionInfo &FI)
Return true iff the given type uses 'sret' when used as a return type.
Definition CGCall.cpp:2044
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
llvm::Constant * GetConstantArrayFromStringLiteral(const StringLiteral *E)
Return a constant array for the given string.
void SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV)
Set attributes which are common to any form of a global definition (alias, Objective-C method,...
void addDefaultFunctionDefinitionAttributes(llvm::AttrBuilder &attrs)
Like the overload taking a Function &, but intended specifically for frontends that want to build on ...
Definition CGCall.cpp:2600
std::optional< CharUnits > getOMPAllocateAlignment(const VarDecl *VD)
Return the alignment specified in an allocate directive, if present.
Definition CGDecl.cpp:3034
llvm::GlobalVariable * CreateOrReplaceCXXRuntimeVariable(StringRef Name, llvm::Type *Ty, llvm::GlobalValue::LinkageTypes Linkage, llvm::Align Alignment)
Will return a global variable of the given type.
llvm::FunctionCallee getTerminateFn()
Get the declaration of std::terminate for the platform.
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
llvm::FunctionCallee getBlockObjectDispose()
TBAAAccessInfo mergeTBAAInfoForConditionalOperator(TBAAAccessInfo InfoA, TBAAAccessInfo InfoB)
mergeTBAAInfoForConditionalOperator - Get merged TBAA information for the purposes of conditional ope...
std::string getMangledNameIgnoringAsmLabel(GlobalDecl GD, const NamedDecl *ND)
llvm::LLVMContext & getLLVMContext()
llvm::GlobalValue * GetGlobalValue(StringRef Ref)
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...
void setKCFIType(const FunctionDecl *FD, llvm::Function *F)
Set type metadata to the given function.
void setAtomicGetterHelperFnMap(QualType Ty, llvm::Constant *Fn)
void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO)
void EmitOMPDeclareReduction(const OMPDeclareReductionDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare reduction construct.
Definition CGDecl.cpp:2954
const ItaniumVTableContext & getItaniumVTableContext() const
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
void AddDetectMismatch(StringRef Name, StringRef Value)
Appends a detect mismatch command to the linker options.
void setDLLImportDLLExport(llvm::GlobalValue *GV, GlobalDecl D) const
CGObjCRuntime & getObjCRuntime()
Return a reference to the configured Objective-C runtime.
llvm::Value * createOpenCLIntToSamplerConversion(const Expr *E, CodeGenFunction &CGF)
ConstantAddress GetAddrOfGlobalTemporary(const MaterializeTemporaryExpr *E, const Expr *Inner)
Returns a pointer to a global variable representing a temporary with static or thread storage duratio...
llvm::Constant * EmitNullConstant(QualType T)
Return the result of value-initializing the given type, i.e.
LangAS GetGlobalConstantAddressSpace() const
Return the AST address space of constant literal, which is used to emit the constant literal as globa...
LangAS GetGlobalVarAddressSpace(const VarDecl *D)
Return the AST address space of the underlying global variable for D, as determined by its declaratio...
llvm::GlobalVariable::LinkageTypes getVTableLinkage(const CXXRecordDecl *RD)
Return the appropriate linkage for the vtable, VTT, and type information of the given class.
void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, llvm::Function *F, bool IsThunk)
Set the LLVM function attributes (sext, zext, etc).
void addDeferredVTable(const CXXRecordDecl *RD)
llvm::Type * getGenericBlockLiteralType()
The type of a generic block literal.
void EmitOpenACCRoutine(const OpenACCRoutineDecl *D, CodeGenFunction *CGF=nullptr)
Definition CGDecl.cpp:2974
void emitGlobalDeleteForwardingBodies()
Emit __global_delete forwarding bodies for any pending variants, if this TU directly uses global oper...
CharUnits getMinimumObjectSize(QualType Ty)
Returns the minimum object size for an object of the given type.
void addReplacement(StringRef Name, llvm::Constant *C)
std::optional< CGPointerAuthInfo > getVTablePointerAuthInfo(CodeGenFunction *Context, const CXXRecordDecl *Record, llvm::Value *StorageAddress, bool IsVTTEntry=false)
llvm::Constant * getConstantSignedPointer(llvm::Constant *Pointer, const PointerAuthSchema &Schema, llvm::Constant *StorageAddress, GlobalDecl SchemaDecl, QualType SchemaType)
Sign a constant pointer using the given scheme, producing a constant with the same IR type.
llvm::FunctionCallee IsPlatformVersionAtLeastFn
void AddGlobalCtor(llvm::Function *Ctor, int Priority=65535, unsigned LexOrder=~0U, llvm::Constant *AssociatedData=nullptr)
AddGlobalCtor - Add a function to the list that will be called before main() runs.
llvm::Metadata * CreateMetadataIdentifierForFnType(QualType T)
Create a metadata identifier for the given function type.
bool shouldSignPointer(const PointerAuthSchema &Schema)
Does a given PointerAuthScheme require us to sign a value.
void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F)
Set the LLVM function attributes which only apply to a function definition.
llvm::Metadata * CreateMetadataIdentifierForVirtualMemPtrType(QualType T)
Create a metadata identifier that is intended to be used to check virtual calls via a member function...
bool shouldUseLLVMABILowering(unsigned CallingConv) const
True when -fexperimental-abi-lowering is in effect AND the active target has an LLVMABI implementatio...
llvm::Constant * getStaticLocalDeclAddress(const VarDecl *D)
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:2284
ConstantAddress GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *)
Return a pointer to a constant array for the given ObjCEncodeExpr node.
const GlobalDecl getMangledNameDecl(StringRef)
void ClearUnusedCoverageMapping(const Decl *D)
Remove the deferred empty coverage mapping as this declaration is actually instrumented.
void EmitTopLevelDecl(Decl *D)
Emit code for a single top level declaration.
llvm::Function * CreateGlobalInitOrCleanUpFunction(llvm::FunctionType *ty, const Twine &name, const CGFunctionInfo &FI, SourceLocation Loc=SourceLocation(), bool TLS=false, llvm::GlobalVariable::LinkageTypes Linkage=llvm::GlobalVariable::InternalLinkage)
llvm::Constant * EmitAnnotationUnit(SourceLocation Loc)
Emit the annotation's translation unit.
CGPointerAuthInfo getPointerAuthInfoForType(QualType type)
ConstantAddress GetAddrOfConstantCString(const std::string &Str, StringRef GlobalName=".str")
Returns a pointer to a character array containing the literal and a terminating '\0' character.
std::vector< Structor > CtorList
void printPostfixForExternalizedDecl(llvm::raw_ostream &OS, const Decl *D) const
Print the postfix for externalized static variable or kernels for single source offloading languages ...
llvm::Constant * GetAddrOfThunk(StringRef Name, llvm::Type *FnTy, GlobalDecl GD)
Get the address of the thunk for the given global decl.
Definition CGVTables.cpp:35
void moveLazyEmissionStates(CodeGenModule *NewBuilder)
Move some lazily-emitted states to the NewBuilder.
llvm::ConstantInt * getSize(CharUnits numChars)
Emit the given number of characters as a value of type size_t.
void finalizeKCFITypes()
Emit KCFI type identifier constants and remove unused identifiers.
This class organizes the cross-module state that is used while lowering AST types to LLVM types.
A specialization of Address that requires the address to be an LLVM Constant.
Definition Address.h:296
CounterPair(unsigned Val)
May be None.
Organizes the cross-function state that is used while generating code coverage mapping data.
This class records statistics on instrumentation based profiling.
bool hasDiagnostics()
Whether or not the stats we've gathered indicate any potential problems.
void addMissing(bool MainFile)
Record that a function we've visited has no profile data.
void addMismatched(bool MainFile)
Record that a function we've visited has mismatched profile data.
void addVisited(bool MainFile)
Record that we've visited a function and whether or not that function was in the main source file.
void reportDiagnostics(DiagnosticsEngine &Diags, StringRef MainFile)
Report potential problems we've found to Diags.
LValue - This represents an lvalue references.
Definition CGValue.h:183
TargetCodeGenInfo - This class organizes various target-specific codegeneration issues,...
Definition TargetInfo.h:80
Helper class for stores the "trap reason" built by.
CompoundLiteralExpr - [C99 6.5.2.5].
Definition Expr.h:3674
Stores additional source code information like skipped ranges which is required by the coverage mappi...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1467
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:782
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:241
ExplicitCastExpr - An explicit cast written in the source code.
Definition Expr.h:3997
This represents one expression.
Definition Expr.h:114
Represents a member of a struct/union/class.
Definition Decl.h:3341
Represents a function declaration or definition.
Definition Decl.h:2082
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Definition TypeBase.h:5126
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4744
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:60
const Decl * getDecl() const
Definition GlobalDecl.h:115
HeaderSearchOptions - Helper class for storing options related to the initialization of the HeaderSea...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
bool hasDefaultVisibilityExportMapping() const
bool isExplicitDefaultVisibilityExportMapping() const
bool isAllDefaultVisibilityExportMapping() const
bool isTargetDevice() const
True when compiling for an offloading target device.
bool isVisibilityExplicit() const
Definition Visibility.h:90
Represents a linkage specification.
Definition DeclCXX.h:3053
A global _GUID constant.
Definition DeclCXX.h:4459
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4974
Describes a module or submodule.
Definition Module.h:340
This represents a decl that may have a name.
Definition Decl.h:276
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
Definition Decl.cpp:1229
This represents 'pragma omp allocate ...' directive.
Definition DeclOpenMP.h:536
This represents 'pragma omp declare mapper ...' directive.
Definition DeclOpenMP.h:349
This represents 'pragma omp declare reduction ...' directive.
Definition DeclOpenMP.h:239
This represents 'pragma omp requires...' directive.
Definition DeclOpenMP.h:479
This represents 'pragma omp threadprivate ...' directive.
Definition DeclOpenMP.h:110
ObjCEncodeExpr, used for @encode in Objective-C.
Definition ExprObjC.h:440
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition DeclObjC.h:2603
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
bool isVariadic() const
Definition DeclObjC.h:434
bool isDirectMethod() const
True if the method is tagged as objc_direct.
Definition DeclObjC.cpp:889
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
bool allowsDirectDispatch() const
Does this runtime supports direct dispatch.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
ExclusionType
Represents if an how something should be excluded from profiling.
Definition ProfileList.h:31
A (possibly-)qualified type.
Definition TypeBase.h:938
Encodes a location in the source.
Stmt - This represents one statement.
Definition Stmt.h:85
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1844
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3898
Exposes information about the current target.
Definition TargetInfo.h:228
uint64_t getPointerAlign(LangAS AddrSpace) const
Definition TargetInfo.h:501
A template parameter object.
A declaration that models statements at global scope.
Definition Decl.h:4816
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2313
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition DeclCXX.h:4516
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:714
Represents a variable declaration or definition.
Definition Decl.h:934
Defines the clang::TargetInfo interface.
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
Definition CGValue.h:155
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
Definition CGValue.h:146
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
static const FunctionDecl * getCallee(const CXXConstructExpr &D)
Top level wrappers for InstallAPI frontend operations.
GVALinkage
A more specific kind of linkage than enum Linkage.
Definition Linkage.h:72
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition Linkage.h:24
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
@ Result
The result type of a method or function.
Definition TypeBase.h:906
const FunctionProtoType * T
LangAS
Defines the address space values used by the address space qualifier of QualType.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:282
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6157
Visibility
Describes the different kinds of visibility that a declaration may have.
Definition Visibility.h:34
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
Definition Visibility.h:37
@ ProtectedVisibility
Objects with "protected" visibility are seen by the dynamic linker but always dynamically resolve to ...
Definition Visibility.h:42
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
Definition Visibility.h:46
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __builtin_riscv_mqwacc_i64 __packed_splat4 uint16_t
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t
Structor(int Priority, unsigned LexOrder, llvm::Constant *Initializer, llvm::Constant *AssociatedData)
This structure provides a set of types that are commonly used during IR emission.
llvm::Function * objc_retainAutoreleasedReturnValue
id objc_retainAutoreleasedReturnValue(id);
llvm::Function * objc_retainAutoreleaseReturnValue
id objc_retainAutoreleaseReturnValue(id);
llvm::FunctionCallee objc_alloc
void objc_alloc(id);
llvm::Function * objc_retain
id objc_retain(id);
llvm::FunctionCallee objc_alloc_init
void objc_alloc_init(id);
llvm::Function * objc_autorelease
id objc_autorelease(id);
llvm::Function * objc_moveWeak
void objc_moveWeak(id *dest, id *src);
llvm::FunctionCallee objc_autoreleasePoolPopInvoke
void objc_autoreleasePoolPop(void*); Note this method is used when we are using exception handling
llvm::InlineAsm * retainAutoreleasedReturnValueMarker
A void(void) inline asm to use to mark that the return value of a call will be immediately retain.
llvm::Function * clang_arc_use
void clang.arc.use(...);
llvm::Function * objc_initWeak
id objc_initWeak(id*, id);
llvm::FunctionCallee objc_retainRuntimeFunction
id objc_retain(id); Note this is the runtime method not the intrinsic.
llvm::Function * objc_copyWeak
void objc_copyWeak(id *dest, id *src);
llvm::Function * objc_destroyWeak
void objc_destroyWeak(id*);
llvm::Function * objc_retainAutorelease
id objc_retainAutorelease(id);
llvm::Function * objc_autoreleasePoolPush
void *objc_autoreleasePoolPush(void);
llvm::Function * objc_retainBlock
id objc_retainBlock(id);
llvm::Function * objc_storeStrong
void objc_storeStrong(id*, id);
llvm::Function * objc_loadWeak
id objc_loadWeak(id*);
llvm::Function * clang_arc_noop_use
void clang.arc.noop.use(...);
llvm::Function * objc_loadWeakRetained
id objc_loadWeakRetained(id*);
llvm::Function * objc_release
void objc_release(id);
llvm::FunctionCallee objc_autoreleaseRuntimeFunction
id objc_autorelease(id); Note this is the runtime method not the intrinsic.
llvm::Function * objc_autoreleaseReturnValue
id objc_autoreleaseReturnValue(id);
llvm::FunctionCallee objc_releaseRuntimeFunction
void objc_release(id); Note this is the runtime method not the intrinsic.
llvm::FunctionCallee objc_allocWithZone
void objc_allocWithZone(id);
llvm::FunctionCallee objc_autoreleasePoolPop
void objc_autoreleasePoolPop(void*);
llvm::Function * objc_storeWeak
id objc_storeWeak(id*, id);
llvm::Function * objc_unsafeClaimAutoreleasedReturnValue
id objc_unsafeClaimAutoreleasedReturnValue(id);
bool operator<(const OrderGlobalInitsOrStermFinalizers &RHS) const
bool operator==(const OrderGlobalInitsOrStermFinalizers &RHS) const
OrderGlobalInitsOrStermFinalizers(unsigned int p, unsigned int l)
static TBAAAccessInfo getMayAliasInfo()
Definition CodeGenTBAA.h:63