clang 21.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 "clang/AST/DeclCXX.h"
21#include "clang/AST/DeclObjC.h"
24#include "clang/AST/Mangle.h"
25#include "clang/Basic/ABI.h"
33#include "llvm/ADT/DenseMap.h"
34#include "llvm/ADT/MapVector.h"
35#include "llvm/ADT/SetVector.h"
36#include "llvm/ADT/SmallPtrSet.h"
37#include "llvm/ADT/StringMap.h"
38#include "llvm/IR/Module.h"
39#include "llvm/IR/ValueHandle.h"
40#include "llvm/Transforms/Utils/SanitizerStats.h"
41#include <optional>
42
43namespace llvm {
44class Module;
45class Constant;
46class ConstantInt;
47class Function;
48class GlobalValue;
49class DataLayout;
50class FunctionType;
51class LLVMContext;
52class IndexedInstrProfReader;
53
54namespace vfs {
55class FileSystem;
56}
57}
58
59namespace clang {
60class ASTContext;
61class AtomicType;
62class FunctionDecl;
63class IdentifierInfo;
64class ObjCImplementationDecl;
65class ObjCEncodeExpr;
66class BlockExpr;
67class CharUnits;
68class Decl;
69class Expr;
70class Stmt;
71class StringLiteral;
72class NamedDecl;
73class PointerAuthSchema;
74class ValueDecl;
75class VarDecl;
76class LangOptions;
77class CodeGenOptions;
78class HeaderSearchOptions;
79class DiagnosticsEngine;
80class AnnotateAttr;
81class CXXDestructorDecl;
82class Module;
83class CoverageSourceInfo;
84class InitSegAttr;
85
86namespace CodeGen {
87
88class CodeGenFunction;
89class CodeGenTBAA;
90class CGCXXABI;
91class CGDebugInfo;
92class CGObjCRuntime;
93class CGOpenCLRuntime;
94class CGOpenMPRuntime;
95class CGCUDARuntime;
96class CGHLSLRuntime;
97class CoverageMappingModuleGen;
98class TargetCodeGenInfo;
99
100enum ForDefinition_t : bool {
102 ForDefinition = true
104
105/// The Counter with an optional additional Counter for
106/// branches. `Skipped` counter can be calculated with `Executed` and
107/// a common Counter (like `Parent`) as `(Parent-Executed)`.
108///
109/// In SingleByte mode, Counters are binary. Subtraction is not
110/// applicable (but addition is capable). In this case, both
111/// `Executed` and `Skipped` counters are required. `Skipped` is
112/// `None` by default. It is allocated in the coverage mapping.
113///
114/// There might be cases that `Parent` could be induced with
115/// `(Executed+Skipped)`. This is not always applicable.
117public:
118 /// Optional value.
119 class ValueOpt {
120 private:
121 static constexpr uint32_t None = (1u << 31); /// None is allocated.
122 static constexpr uint32_t Mask = None - 1;
123
124 uint32_t Val;
125
126 public:
127 ValueOpt() : Val(None) {}
128
129 ValueOpt(unsigned InitVal) {
130 assert(!(InitVal & ~Mask));
131 Val = InitVal;
132 }
133
134 bool hasValue() const { return !(Val & None); }
135
136 operator uint32_t() const { return Val; }
137 };
138
140 ValueOpt Skipped; /// May be None.
141
142 /// Initialized with Skipped=None.
143 CounterPair(unsigned Val) : Executed(Val) {}
144
145 // FIXME: Should work with {None, None}
147};
148
150 unsigned int priority;
151 unsigned int lex_order;
152 OrderGlobalInitsOrStermFinalizers(unsigned int p, unsigned int l)
153 : priority(p), lex_order(l) {}
154
156 return priority == RHS.priority && lex_order == RHS.lex_order;
157 }
158
160 return std::tie(priority, lex_order) <
161 std::tie(RHS.priority, RHS.lex_order);
162 }
163};
164
166 ObjCEntrypoints() { memset(this, 0, sizeof(*this)); }
167
168 /// void objc_alloc(id);
169 llvm::FunctionCallee objc_alloc;
170
171 /// void objc_allocWithZone(id);
172 llvm::FunctionCallee objc_allocWithZone;
173
174 /// void objc_alloc_init(id);
175 llvm::FunctionCallee objc_alloc_init;
176
177 /// void objc_autoreleasePoolPop(void*);
178 llvm::FunctionCallee objc_autoreleasePoolPop;
179
180 /// void objc_autoreleasePoolPop(void*);
181 /// Note this method is used when we are using exception handling
182 llvm::FunctionCallee objc_autoreleasePoolPopInvoke;
183
184 /// void *objc_autoreleasePoolPush(void);
186
187 /// id objc_autorelease(id);
188 llvm::Function *objc_autorelease;
189
190 /// id objc_autorelease(id);
191 /// Note this is the runtime method not the intrinsic.
193
194 /// id objc_autoreleaseReturnValue(id);
196
197 /// void objc_copyWeak(id *dest, id *src);
198 llvm::Function *objc_copyWeak;
199
200 /// void objc_destroyWeak(id*);
201 llvm::Function *objc_destroyWeak;
202
203 /// id objc_initWeak(id*, id);
204 llvm::Function *objc_initWeak;
205
206 /// id objc_loadWeak(id*);
207 llvm::Function *objc_loadWeak;
208
209 /// id objc_loadWeakRetained(id*);
210 llvm::Function *objc_loadWeakRetained;
211
212 /// void objc_moveWeak(id *dest, id *src);
213 llvm::Function *objc_moveWeak;
214
215 /// id objc_retain(id);
216 llvm::Function *objc_retain;
217
218 /// id objc_retain(id);
219 /// Note this is the runtime method not the intrinsic.
220 llvm::FunctionCallee objc_retainRuntimeFunction;
221
222 /// id objc_retainAutorelease(id);
223 llvm::Function *objc_retainAutorelease;
224
225 /// id objc_retainAutoreleaseReturnValue(id);
227
228 /// id objc_retainAutoreleasedReturnValue(id);
230
231 /// id objc_retainBlock(id);
232 llvm::Function *objc_retainBlock;
233
234 /// void objc_release(id);
235 llvm::Function *objc_release;
236
237 /// void objc_release(id);
238 /// Note this is the runtime method not the intrinsic.
239 llvm::FunctionCallee objc_releaseRuntimeFunction;
240
241 /// void objc_storeStrong(id*, id);
242 llvm::Function *objc_storeStrong;
243
244 /// id objc_storeWeak(id*, id);
245 llvm::Function *objc_storeWeak;
246
247 /// id objc_unsafeClaimAutoreleasedReturnValue(id);
249
250 /// A void(void) inline asm to use to mark that the return value of
251 /// a call will be immediately retain.
253
254 /// void clang.arc.use(...);
255 llvm::Function *clang_arc_use;
256
257 /// void clang.arc.noop.use(...);
258 llvm::Function *clang_arc_noop_use;
259};
260
261/// This class records statistics on instrumentation based profiling.
263 uint32_t VisitedInMainFile = 0;
264 uint32_t MissingInMainFile = 0;
265 uint32_t Visited = 0;
266 uint32_t Missing = 0;
267 uint32_t Mismatched = 0;
268
269public:
270 InstrProfStats() = default;
271 /// Record that we've visited a function and whether or not that function was
272 /// in the main source file.
273 void addVisited(bool MainFile) {
274 if (MainFile)
275 ++VisitedInMainFile;
276 ++Visited;
277 }
278 /// Record that a function we've visited has no profile data.
279 void addMissing(bool MainFile) {
280 if (MainFile)
281 ++MissingInMainFile;
282 ++Missing;
283 }
284 /// Record that a function we've visited has mismatched profile data.
285 void addMismatched(bool MainFile) { ++Mismatched; }
286 /// Whether or not the stats we've gathered indicate any potential problems.
287 bool hasDiagnostics() { return Missing || Mismatched; }
288 /// Report potential problems we've found to \c Diags.
289 void reportDiagnostics(DiagnosticsEngine &Diags, StringRef MainFile);
290};
291
292/// A pair of helper functions for a __block variable.
293class BlockByrefHelpers : public llvm::FoldingSetNode {
294 // MSVC requires this type to be complete in order to process this
295 // header.
296public:
297 llvm::Constant *CopyHelper;
298 llvm::Constant *DisposeHelper;
299
300 /// The alignment of the field. This is important because
301 /// different offsets to the field within the byref struct need to
302 /// have different helper functions.
304
306 : CopyHelper(nullptr), DisposeHelper(nullptr), Alignment(alignment) {}
308 virtual ~BlockByrefHelpers();
309
310 void Profile(llvm::FoldingSetNodeID &id) const {
311 id.AddInteger(Alignment.getQuantity());
312 profileImpl(id);
313 }
314 virtual void profileImpl(llvm::FoldingSetNodeID &id) const = 0;
315
316 virtual bool needsCopy() const { return true; }
317 virtual void emitCopy(CodeGenFunction &CGF, Address dest, Address src) = 0;
318
319 virtual bool needsDispose() const { return true; }
320 virtual void emitDispose(CodeGenFunction &CGF, Address field) = 0;
321};
322
323/// This class organizes the cross-function state that is used while generating
324/// LLVM code.
326 CodeGenModule(const CodeGenModule &) = delete;
327 void operator=(const CodeGenModule &) = delete;
328
329public:
330 struct Structor {
332 : Priority(0), LexOrder(~0u), Initializer(nullptr),
333 AssociatedData(nullptr) {}
334 Structor(int Priority, unsigned LexOrder, llvm::Constant *Initializer,
335 llvm::Constant *AssociatedData)
339 unsigned LexOrder;
340 llvm::Constant *Initializer;
341 llvm::Constant *AssociatedData;
342 };
343
344 typedef std::vector<Structor> CtorList;
345
346private:
347 ASTContext &Context;
348 const LangOptions &LangOpts;
349 IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS; // Only used for debug info.
350 const HeaderSearchOptions &HeaderSearchOpts; // Only used for debug info.
351 const PreprocessorOptions &PreprocessorOpts; // Only used for debug info.
352 const CodeGenOptions &CodeGenOpts;
353 unsigned NumAutoVarInit = 0;
354 llvm::Module &TheModule;
355 DiagnosticsEngine &Diags;
356 const TargetInfo &Target;
357 std::unique_ptr<CGCXXABI> ABI;
358 llvm::LLVMContext &VMContext;
359 std::string ModuleNameHash;
360 bool CXX20ModuleInits = false;
361 std::unique_ptr<CodeGenTBAA> TBAA;
362
363 mutable std::unique_ptr<TargetCodeGenInfo> TheTargetCodeGenInfo;
364
365 // This should not be moved earlier, since its initialization depends on some
366 // of the previous reference members being already initialized and also checks
367 // if TheTargetCodeGenInfo is NULL
368 std::unique_ptr<CodeGenTypes> Types;
369
370 /// Holds information about C++ vtables.
371 CodeGenVTables VTables;
372
373 std::unique_ptr<CGObjCRuntime> ObjCRuntime;
374 std::unique_ptr<CGOpenCLRuntime> OpenCLRuntime;
375 std::unique_ptr<CGOpenMPRuntime> OpenMPRuntime;
376 std::unique_ptr<CGCUDARuntime> CUDARuntime;
377 std::unique_ptr<CGHLSLRuntime> HLSLRuntime;
378 std::unique_ptr<CGDebugInfo> DebugInfo;
379 std::unique_ptr<ObjCEntrypoints> ObjCData;
380 llvm::MDNode *NoObjCARCExceptionsMetadata = nullptr;
381 std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader;
382 InstrProfStats PGOStats;
383 std::unique_ptr<llvm::SanitizerStatReport> SanStats;
384 StackExhaustionHandler StackHandler;
385
386 // A set of references that have only been seen via a weakref so far. This is
387 // used to remove the weak of the reference if we ever see a direct reference
388 // or a definition.
390
391 /// This contains all the decls which have definitions but/ which are deferred
392 /// for emission and therefore should only be output if they are actually
393 /// used. If a decl is in this, then it is known to have not been referenced
394 /// yet.
395 llvm::DenseMap<StringRef, GlobalDecl> DeferredDecls;
396
397 llvm::StringSet<llvm::BumpPtrAllocator> DeferredResolversToEmit;
398
399 /// This is a list of deferred decls which we have seen that *are* actually
400 /// referenced. These get code generated when the module is done.
401 std::vector<GlobalDecl> DeferredDeclsToEmit;
402 void addDeferredDeclToEmit(GlobalDecl GD) {
403 DeferredDeclsToEmit.emplace_back(GD);
404 addEmittedDeferredDecl(GD);
405 }
406
407 /// Decls that were DeferredDecls and have now been emitted.
408 llvm::DenseMap<llvm::StringRef, GlobalDecl> EmittedDeferredDecls;
409
410 void addEmittedDeferredDecl(GlobalDecl GD) {
411 // Reemission is only needed in incremental mode.
412 if (!Context.getLangOpts().IncrementalExtensions)
413 return;
414
415 // Assume a linkage by default that does not need reemission.
416 auto L = llvm::GlobalValue::ExternalLinkage;
417 if (llvm::isa<FunctionDecl>(GD.getDecl()))
418 L = getFunctionLinkage(GD);
419 else if (auto *VD = llvm::dyn_cast<VarDecl>(GD.getDecl()))
421
422 if (llvm::GlobalValue::isInternalLinkage(L) ||
423 llvm::GlobalValue::isLinkOnceLinkage(L) ||
424 llvm::GlobalValue::isWeakLinkage(L)) {
425 EmittedDeferredDecls[getMangledName(GD)] = GD;
426 }
427 }
428
429 /// List of alias we have emitted. Used to make sure that what they point to
430 /// is defined once we get to the end of the of the translation unit.
431 std::vector<GlobalDecl> Aliases;
432
433 /// List of multiversion functions to be emitted. This list is processed in
434 /// conjunction with other deferred symbols and is used to ensure that
435 /// multiversion function resolvers and ifuncs are defined and emitted.
436 std::vector<GlobalDecl> MultiVersionFuncs;
437
438 llvm::MapVector<StringRef, llvm::TrackingVH<llvm::Constant>> Replacements;
439
440 /// List of global values to be replaced with something else. Used when we
441 /// want to replace a GlobalValue but can't identify it by its mangled name
442 /// anymore (because the name is already taken).
444 GlobalValReplacements;
445
446 /// Variables for which we've emitted globals containing their constant
447 /// values along with the corresponding globals, for opportunistic reuse.
448 llvm::DenseMap<const VarDecl*, llvm::GlobalVariable*> InitializerConstants;
449
450 /// Set of global decls for which we already diagnosed mangled name conflict.
451 /// Required to not issue a warning (on a mangling conflict) multiple times
452 /// for the same decl.
453 llvm::DenseSet<GlobalDecl> DiagnosedConflictingDefinitions;
454
455 /// A queue of (optional) vtables to consider emitting.
456 std::vector<const CXXRecordDecl*> DeferredVTables;
457
458 /// A queue of (optional) vtables that may be emitted opportunistically.
459 std::vector<const CXXRecordDecl *> OpportunisticVTables;
460
461 /// List of global values which are required to be present in the object file;
462 /// bitcast to i8*. This is used for forcing visibility of symbols which may
463 /// otherwise be optimized out.
464 std::vector<llvm::WeakTrackingVH> LLVMUsed;
465 std::vector<llvm::WeakTrackingVH> LLVMCompilerUsed;
466
467 /// Store the list of global constructors and their respective priorities to
468 /// be emitted when the translation unit is complete.
469 CtorList GlobalCtors;
470
471 /// Store the list of global destructors and their respective priorities to be
472 /// emitted when the translation unit is complete.
473 CtorList GlobalDtors;
474
475 /// An ordered map of canonical GlobalDecls to their mangled names.
476 llvm::MapVector<GlobalDecl, StringRef> MangledDeclNames;
477 llvm::StringMap<GlobalDecl, llvm::BumpPtrAllocator> Manglings;
478
479 /// Global annotations.
480 std::vector<llvm::Constant*> Annotations;
481
482 // Store deferred function annotations so they can be emitted at the end with
483 // most up to date ValueDecl that will have all the inherited annotations.
484 llvm::MapVector<StringRef, const ValueDecl *> DeferredAnnotations;
485
486 /// Map used to get unique annotation strings.
487 llvm::StringMap<llvm::Constant*> AnnotationStrings;
488
489 /// Used for uniquing of annotation arguments.
490 llvm::DenseMap<unsigned, llvm::Constant *> AnnotationArgs;
491
492 llvm::StringMap<llvm::GlobalVariable *> CFConstantStringMap;
493
494 llvm::DenseMap<llvm::Constant *, llvm::GlobalVariable *> ConstantStringMap;
495 llvm::DenseMap<const UnnamedGlobalConstantDecl *, llvm::GlobalVariable *>
496 UnnamedGlobalConstantDeclMap;
497 llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap;
498 llvm::DenseMap<const Decl*, llvm::GlobalVariable*> StaticLocalDeclGuardMap;
499 llvm::DenseMap<const Expr*, llvm::Constant *> MaterializedGlobalTemporaryMap;
500
501 llvm::DenseMap<QualType, llvm::Constant *> AtomicSetterHelperFnMap;
502 llvm::DenseMap<QualType, llvm::Constant *> AtomicGetterHelperFnMap;
503
504 /// Map used to get unique type descriptor constants for sanitizers.
505 llvm::DenseMap<QualType, llvm::Constant *> TypeDescriptorMap;
506
507 /// Map used to track internal linkage functions declared within
508 /// extern "C" regions.
509 typedef llvm::MapVector<IdentifierInfo *,
510 llvm::GlobalValue *> StaticExternCMap;
511 StaticExternCMap StaticExternCValues;
512
513 /// thread_local variables defined or used in this TU.
514 std::vector<const VarDecl *> CXXThreadLocals;
515
516 /// thread_local variables with initializers that need to run
517 /// before any thread_local variable in this TU is odr-used.
518 std::vector<llvm::Function *> CXXThreadLocalInits;
519 std::vector<const VarDecl *> CXXThreadLocalInitVars;
520
521 /// Global variables with initializers that need to run before main.
522 std::vector<llvm::Function *> CXXGlobalInits;
523
524 /// When a C++ decl with an initializer is deferred, null is
525 /// appended to CXXGlobalInits, and the index of that null is placed
526 /// here so that the initializer will be performed in the correct
527 /// order. Once the decl is emitted, the index is replaced with ~0U to ensure
528 /// that we don't re-emit the initializer.
529 llvm::DenseMap<const Decl*, unsigned> DelayedCXXInitPosition;
530
531 typedef std::pair<OrderGlobalInitsOrStermFinalizers, llvm::Function *>
532 GlobalInitData;
533
534 // When a tail call is performed on an "undefined" symbol, on PPC without pc
535 // relative feature, the tail call is not allowed. In "EmitCall" for such
536 // tail calls, the "undefined" symbols may be forward declarations, their
537 // definitions are provided in the module after the callsites. For such tail
538 // calls, diagnose message should not be emitted.
540 MustTailCallUndefinedGlobals;
541
542 struct GlobalInitPriorityCmp {
543 bool operator()(const GlobalInitData &LHS,
544 const GlobalInitData &RHS) const {
545 return LHS.first.priority < RHS.first.priority;
546 }
547 };
548
549 /// Global variables with initializers whose order of initialization is set by
550 /// init_priority attribute.
551 SmallVector<GlobalInitData, 8> PrioritizedCXXGlobalInits;
552
553 /// Global destructor functions and arguments that need to run on termination.
554 /// When UseSinitAndSterm is set, it instead contains sterm finalizer
555 /// functions, which also run on unloading a shared library.
556 typedef std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH,
557 llvm::Constant *>
558 CXXGlobalDtorsOrStermFinalizer_t;
559 SmallVector<CXXGlobalDtorsOrStermFinalizer_t, 8>
560 CXXGlobalDtorsOrStermFinalizers;
561
562 typedef std::pair<OrderGlobalInitsOrStermFinalizers, llvm::Function *>
563 StermFinalizerData;
564
565 struct StermFinalizerPriorityCmp {
566 bool operator()(const StermFinalizerData &LHS,
567 const StermFinalizerData &RHS) const {
568 return LHS.first.priority < RHS.first.priority;
569 }
570 };
571
572 /// Global variables with sterm finalizers whose order of initialization is
573 /// set by init_priority attribute.
574 SmallVector<StermFinalizerData, 8> PrioritizedCXXStermFinalizers;
575
576 /// The complete set of modules that has been imported.
577 llvm::SetVector<clang::Module *> ImportedModules;
578
579 /// The set of modules for which the module initializers
580 /// have been emitted.
581 llvm::SmallPtrSet<clang::Module *, 16> EmittedModuleInitializers;
582
583 /// A vector of metadata strings for linker options.
584 SmallVector<llvm::MDNode *, 16> LinkerOptionsMetadata;
585
586 /// A vector of metadata strings for dependent libraries for ELF.
587 SmallVector<llvm::MDNode *, 16> ELFDependentLibraries;
588
589 /// @name Cache for Objective-C runtime types
590 /// @{
591
592 /// Cached reference to the class for constant strings. This value has type
593 /// int * but is actually an Obj-C class pointer.
594 llvm::WeakTrackingVH CFConstantStringClassRef;
595
596 /// The type used to describe the state of a fast enumeration in
597 /// Objective-C's for..in loop.
598 QualType ObjCFastEnumerationStateType;
599
600 /// @}
601
602 /// Lazily create the Objective-C runtime
603 void createObjCRuntime();
604
605 void createOpenCLRuntime();
606 void createOpenMPRuntime();
607 void createCUDARuntime();
608 void createHLSLRuntime();
609
610 bool isTriviallyRecursive(const FunctionDecl *F);
611 bool shouldEmitFunction(GlobalDecl GD);
612 // Whether a global variable should be emitted by CUDA/HIP host/device
613 // related attributes.
614 bool shouldEmitCUDAGlobalVar(const VarDecl *VD) const;
615 bool shouldOpportunisticallyEmitVTables();
616 /// Map used to be sure we don't emit the same CompoundLiteral twice.
617 llvm::DenseMap<const CompoundLiteralExpr *, llvm::GlobalVariable *>
618 EmittedCompoundLiterals;
619
620 /// Map of the global blocks we've emitted, so that we don't have to re-emit
621 /// them if the constexpr evaluator gets aggressive.
622 llvm::DenseMap<const BlockExpr *, llvm::Constant *> EmittedGlobalBlocks;
623
624 /// @name Cache for Blocks Runtime Globals
625 /// @{
626
627 llvm::Constant *NSConcreteGlobalBlock = nullptr;
628 llvm::Constant *NSConcreteStackBlock = nullptr;
629
630 llvm::FunctionCallee BlockObjectAssign = nullptr;
631 llvm::FunctionCallee BlockObjectDispose = nullptr;
632
633 llvm::Type *BlockDescriptorType = nullptr;
634 llvm::Type *GenericBlockLiteralType = nullptr;
635
636 struct {
638 } Block;
639
640 GlobalDecl initializedGlobalDecl;
641
642 /// @}
643
644 /// void @llvm.lifetime.start(i64 %size, i8* nocapture <ptr>)
645 llvm::Function *LifetimeStartFn = nullptr;
646
647 /// void @llvm.lifetime.end(i64 %size, i8* nocapture <ptr>)
648 llvm::Function *LifetimeEndFn = nullptr;
649
650 /// void @llvm.fake.use(...)
651 llvm::Function *FakeUseFn = nullptr;
652
653 std::unique_ptr<SanitizerMetadata> SanitizerMD;
654
655 llvm::MapVector<const Decl *, bool> DeferredEmptyCoverageMappingDecls;
656
657 std::unique_ptr<CoverageMappingModuleGen> CoverageMapping;
658
659 /// Mapping from canonical types to their metadata identifiers. We need to
660 /// maintain this mapping because identifiers may be formed from distinct
661 /// MDNodes.
662 typedef llvm::DenseMap<QualType, llvm::Metadata *> MetadataTypeMap;
663 MetadataTypeMap MetadataIdMap;
664 MetadataTypeMap VirtualMetadataIdMap;
665 MetadataTypeMap GeneralizedMetadataIdMap;
666
667 // Helps squashing blocks of TopLevelStmtDecl into a single llvm::Function
668 // when used with -fincremental-extensions.
669 std::pair<std::unique_ptr<CodeGenFunction>, const TopLevelStmtDecl *>
670 GlobalTopLevelStmtBlockInFlight;
671
672 llvm::DenseMap<GlobalDecl, uint16_t> PtrAuthDiscriminatorHashes;
673
674 llvm::DenseMap<const CXXRecordDecl *, std::optional<PointerAuthQualifier>>
675 VTablePtrAuthInfos;
676 std::optional<PointerAuthQualifier>
677 computeVTPointerAuthentication(const CXXRecordDecl *ThisClass);
678
679public:
681 const HeaderSearchOptions &headersearchopts,
682 const PreprocessorOptions &ppopts,
683 const CodeGenOptions &CodeGenOpts, llvm::Module &M,
684 DiagnosticsEngine &Diags,
685 CoverageSourceInfo *CoverageInfo = nullptr);
686
688
689 void clear();
690
691 /// Finalize LLVM code generation.
692 void Release();
693
694 /// Return true if we should emit location information for expressions.
696
697 /// Return a reference to the configured Objective-C runtime.
699 if (!ObjCRuntime) createObjCRuntime();
700 return *ObjCRuntime;
701 }
702
703 /// Return true iff an Objective-C runtime has been configured.
704 bool hasObjCRuntime() { return !!ObjCRuntime; }
705
706 const std::string &getModuleNameHash() const { return ModuleNameHash; }
707
708 /// Return a reference to the configured OpenCL runtime.
710 assert(OpenCLRuntime != nullptr);
711 return *OpenCLRuntime;
712 }
713
714 /// Return a reference to the configured OpenMP runtime.
716 assert(OpenMPRuntime != nullptr);
717 return *OpenMPRuntime;
718 }
719
720 /// Return a reference to the configured CUDA runtime.
722 assert(CUDARuntime != nullptr);
723 return *CUDARuntime;
724 }
725
726 /// Return a reference to the configured HLSL runtime.
728 assert(HLSLRuntime != nullptr);
729 return *HLSLRuntime;
730 }
731
733 assert(ObjCData != nullptr);
734 return *ObjCData;
735 }
736
737 // Version checking functions, used to implement ObjC's @available:
738 // i32 @__isOSVersionAtLeast(i32, i32, i32)
739 llvm::FunctionCallee IsOSVersionAtLeastFn = nullptr;
740 // i32 @__isPlatformVersionAtLeast(i32, i32, i32, i32)
741 llvm::FunctionCallee IsPlatformVersionAtLeastFn = nullptr;
742
743 InstrProfStats &getPGOStats() { return PGOStats; }
744 llvm::IndexedInstrProfReader *getPGOReader() const { return PGOReader.get(); }
745
747 return CoverageMapping.get();
748 }
749
750 llvm::Constant *getStaticLocalDeclAddress(const VarDecl *D) {
751 return StaticLocalDeclMap[D];
752 }
754 llvm::Constant *C) {
755 StaticLocalDeclMap[D] = C;
756 }
757
758 llvm::Constant *
760 llvm::GlobalValue::LinkageTypes Linkage);
761
762 llvm::GlobalVariable *getStaticLocalDeclGuardAddress(const VarDecl *D) {
763 return StaticLocalDeclGuardMap[D];
764 }
766 llvm::GlobalVariable *C) {
767 StaticLocalDeclGuardMap[D] = C;
768 }
769
770 Address createUnnamedGlobalFrom(const VarDecl &D, llvm::Constant *Constant,
771 CharUnits Align);
772
773 bool lookupRepresentativeDecl(StringRef MangledName,
774 GlobalDecl &Result) const;
775
777 return AtomicSetterHelperFnMap[Ty];
778 }
780 llvm::Constant *Fn) {
781 AtomicSetterHelperFnMap[Ty] = Fn;
782 }
783
785 return AtomicGetterHelperFnMap[Ty];
786 }
788 llvm::Constant *Fn) {
789 AtomicGetterHelperFnMap[Ty] = Fn;
790 }
791
792 llvm::Constant *getTypeDescriptorFromMap(QualType Ty) {
793 return TypeDescriptorMap[Ty];
794 }
795 void setTypeDescriptorInMap(QualType Ty, llvm::Constant *C) {
796 TypeDescriptorMap[Ty] = C;
797 }
798
799 CGDebugInfo *getModuleDebugInfo() { return DebugInfo.get(); }
800
802 if (!NoObjCARCExceptionsMetadata)
803 NoObjCARCExceptionsMetadata = llvm::MDNode::get(getLLVMContext(), {});
804 return NoObjCARCExceptionsMetadata;
805 }
806
807 ASTContext &getContext() const { return Context; }
808 const LangOptions &getLangOpts() const { return LangOpts; }
810 return FS;
811 }
813 const { return HeaderSearchOpts; }
815 const { return PreprocessorOpts; }
816 const CodeGenOptions &getCodeGenOpts() const { return CodeGenOpts; }
817 llvm::Module &getModule() const { return TheModule; }
818 DiagnosticsEngine &getDiags() const { return Diags; }
819 const llvm::DataLayout &getDataLayout() const {
820 return TheModule.getDataLayout();
821 }
822 const TargetInfo &getTarget() const { return Target; }
823 const llvm::Triple &getTriple() const { return Target.getTriple(); }
824 bool supportsCOMDAT() const;
825 void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO);
826
827 const ABIInfo &getABIInfo();
828 CGCXXABI &getCXXABI() const { return *ABI; }
829 llvm::LLVMContext &getLLVMContext() { return VMContext; }
830
831 bool shouldUseTBAA() const { return TBAA != nullptr; }
832
834
835 CodeGenTypes &getTypes() { return *Types; }
836
837 CodeGenVTables &getVTables() { return VTables; }
838
840 return VTables.getItaniumVTableContext();
841 }
842
844 return VTables.getItaniumVTableContext();
845 }
846
848 return VTables.getMicrosoftVTableContext();
849 }
850
851 CtorList &getGlobalCtors() { return GlobalCtors; }
852 CtorList &getGlobalDtors() { return GlobalDtors; }
853
854 /// getTBAATypeInfo - Get metadata used to describe accesses to objects of
855 /// the given type.
856 llvm::MDNode *getTBAATypeInfo(QualType QTy);
857
858 /// getTBAAAccessInfo - Get TBAA information that describes an access to
859 /// an object of the given type.
861
862 /// getTBAAVTablePtrAccessInfo - Get the TBAA information that describes an
863 /// access to a virtual table pointer.
864 TBAAAccessInfo getTBAAVTablePtrAccessInfo(llvm::Type *VTablePtrType);
865
866 llvm::MDNode *getTBAAStructInfo(QualType QTy);
867
868 /// getTBAABaseTypeInfo - Get metadata that describes the given base access
869 /// type. Return null if the type is not suitable for use in TBAA access tags.
870 llvm::MDNode *getTBAABaseTypeInfo(QualType QTy);
871
872 /// getTBAAAccessTagInfo - Get TBAA tag for a given memory access.
873 llvm::MDNode *getTBAAAccessTagInfo(TBAAAccessInfo Info);
874
875 /// mergeTBAAInfoForCast - Get merged TBAA information for the purposes of
876 /// type casts.
879
880 /// mergeTBAAInfoForConditionalOperator - Get merged TBAA information for the
881 /// purposes of conditional operator.
883 TBAAAccessInfo InfoB);
884
885 /// mergeTBAAInfoForMemoryTransfer - Get merged TBAA information for the
886 /// purposes of memory transfer calls.
888 TBAAAccessInfo SrcInfo);
889
890 /// getTBAAInfoForSubobject - Get TBAA information for an access with a given
891 /// base lvalue.
893 if (Base.getTBAAInfo().isMayAlias())
895 return getTBAAAccessInfo(AccessType);
896 }
897
900
901 /// DecorateInstructionWithTBAA - Decorate the instruction with a TBAA tag.
902 void DecorateInstructionWithTBAA(llvm::Instruction *Inst,
903 TBAAAccessInfo TBAAInfo);
904
905 /// Adds !invariant.barrier !tag to instruction
906 void DecorateInstructionWithInvariantGroup(llvm::Instruction *I,
907 const CXXRecordDecl *RD);
908
909 /// Emit the given number of characters as a value of type size_t.
910 llvm::ConstantInt *getSize(CharUnits numChars);
911
912 /// Set the visibility for the given LLVM GlobalValue.
913 void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const;
914
915 void setDSOLocal(llvm::GlobalValue *GV) const;
916
919 (D->getLinkageAndVisibility().getVisibility() ==
923 D->getLinkageAndVisibility().isVisibilityExplicit()));
924 }
925 void setDLLImportDLLExport(llvm::GlobalValue *GV, GlobalDecl D) const;
926 void setDLLImportDLLExport(llvm::GlobalValue *GV, const NamedDecl *D) const;
927 /// Set visibility, dllimport/dllexport and dso_local.
928 /// This must be called after dllimport/dllexport is set.
929 void setGVProperties(llvm::GlobalValue *GV, GlobalDecl GD) const;
930 void setGVProperties(llvm::GlobalValue *GV, const NamedDecl *D) const;
931
932 void setGVPropertiesAux(llvm::GlobalValue *GV, const NamedDecl *D) const;
933
934 /// Set the TLS mode for the given LLVM GlobalValue for the thread-local
935 /// variable declaration D.
936 void setTLSMode(llvm::GlobalValue *GV, const VarDecl &D) const;
937
938 /// Get LLVM TLS mode from CodeGenOptions.
939 llvm::GlobalVariable::ThreadLocalMode GetDefaultLLVMTLSModel() const;
940
941 static llvm::GlobalValue::VisibilityTypes GetLLVMVisibility(Visibility V) {
942 switch (V) {
943 case DefaultVisibility: return llvm::GlobalValue::DefaultVisibility;
944 case HiddenVisibility: return llvm::GlobalValue::HiddenVisibility;
945 case ProtectedVisibility: return llvm::GlobalValue::ProtectedVisibility;
946 }
947 llvm_unreachable("unknown visibility!");
948 }
949
950 llvm::Constant *GetAddrOfGlobal(GlobalDecl GD,
951 ForDefinition_t IsForDefinition
953
954 /// Will return a global variable of the given type. If a variable with a
955 /// different type already exists then a new variable with the right type
956 /// will be created and all uses of the old variable will be replaced with a
957 /// bitcast to the new variable.
958 llvm::GlobalVariable *
959 CreateOrReplaceCXXRuntimeVariable(StringRef Name, llvm::Type *Ty,
960 llvm::GlobalValue::LinkageTypes Linkage,
961 llvm::Align Alignment);
962
963 llvm::Function *CreateGlobalInitOrCleanUpFunction(
964 llvm::FunctionType *ty, const Twine &name, const CGFunctionInfo &FI,
965 SourceLocation Loc = SourceLocation(), bool TLS = false,
966 llvm::GlobalVariable::LinkageTypes Linkage =
967 llvm::GlobalVariable::InternalLinkage);
968
969 /// Return the AST address space of the underlying global variable for D, as
970 /// determined by its declaration. Normally this is the same as the address
971 /// space of D's type, but in CUDA, address spaces are associated with
972 /// declarations, not types. If D is nullptr, return the default address
973 /// space for global variable.
974 ///
975 /// For languages without explicit address spaces, if D has default address
976 /// space, target-specific global or constant address space may be returned.
978
979 /// Return the AST address space of constant literal, which is used to emit
980 /// the constant literal as global variable in LLVM IR.
981 /// Note: This is not necessarily the address space of the constant literal
982 /// in AST. For address space agnostic language, e.g. C++, constant literal
983 /// in AST is always in default address space.
985
986 /// Return the llvm::Constant for the address of the given global variable.
987 /// If Ty is non-null and if the global doesn't exist, then it will be created
988 /// with the specified type instead of whatever the normal requested type
989 /// would be. If IsForDefinition is true, it is guaranteed that an actual
990 /// global with type Ty will be returned, not conversion of a variable with
991 /// the same mangled name but some other type.
992 llvm::Constant *GetAddrOfGlobalVar(const VarDecl *D,
993 llvm::Type *Ty = nullptr,
994 ForDefinition_t IsForDefinition
996
997 /// Return the address of the given function. If Ty is non-null, then this
998 /// function will use the specified type if it has to create it.
999 llvm::Constant *GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty = nullptr,
1000 bool ForVTable = false,
1001 bool DontDefer = false,
1002 ForDefinition_t IsForDefinition
1004
1005 // Return the function body address of the given function.
1006 llvm::Constant *GetFunctionStart(const ValueDecl *Decl);
1007
1008 /// Return a function pointer for a reference to the given function.
1009 /// This correctly handles weak references, but does not apply a
1010 /// pointer signature.
1011 llvm::Constant *getRawFunctionPointer(GlobalDecl GD,
1012 llvm::Type *Ty = nullptr);
1013
1014 /// Return the ABI-correct function pointer value for a reference
1015 /// to the given function. This will apply a pointer signature if
1016 /// necessary, caching the result for the given function.
1017 llvm::Constant *getFunctionPointer(GlobalDecl GD, llvm::Type *Ty = nullptr);
1018
1019 /// Return the ABI-correct function pointer value for a reference
1020 /// to the given function. This will apply a pointer signature if
1021 /// necessary.
1022 llvm::Constant *getFunctionPointer(llvm::Constant *Pointer,
1024
1025 llvm::Constant *getMemberFunctionPointer(const FunctionDecl *FD,
1026 llvm::Type *Ty = nullptr);
1027
1028 llvm::Constant *getMemberFunctionPointer(llvm::Constant *Pointer,
1029 QualType FT);
1030
1032
1034
1036
1038
1039 bool shouldSignPointer(const PointerAuthSchema &Schema);
1040 llvm::Constant *getConstantSignedPointer(llvm::Constant *Pointer,
1041 const PointerAuthSchema &Schema,
1042 llvm::Constant *StorageAddress,
1043 GlobalDecl SchemaDecl,
1044 QualType SchemaType);
1045
1046 llvm::Constant *
1047 getConstantSignedPointer(llvm::Constant *Pointer, unsigned Key,
1048 llvm::Constant *StorageAddress,
1049 llvm::ConstantInt *OtherDiscriminator);
1050
1051 llvm::ConstantInt *
1053 GlobalDecl SchemaDecl, QualType SchemaType);
1054
1056 std::optional<CGPointerAuthInfo>
1058 const CXXRecordDecl *Record,
1059 llvm::Value *StorageAddress);
1060
1061 std::optional<PointerAuthQualifier>
1063
1065
1066 // Return whether RTTI information should be emitted for this target.
1067 bool shouldEmitRTTI(bool ForEH = false) {
1068 return (ForEH || getLangOpts().RTTI) && !getLangOpts().CUDAIsDevice &&
1069 !(getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice &&
1070 (getTriple().isNVPTX() || getTriple().isAMDGPU()));
1071 }
1072
1073 /// Get the address of the RTTI descriptor for the given type.
1074 llvm::Constant *GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH = false);
1075
1076 /// Get the address of a GUID.
1078
1079 /// Get the address of a UnnamedGlobalConstant
1082
1083 /// Get the address of a template parameter object.
1086
1087 /// Get the address of the thunk for the given global decl.
1088 llvm::Constant *GetAddrOfThunk(StringRef Name, llvm::Type *FnTy,
1089 GlobalDecl GD);
1090
1091 /// Get a reference to the target of VD.
1093
1094 /// Returns the assumed alignment of an opaque pointer to the given class.
1096
1097 /// Returns the minimum object size for an object of the given class type
1098 /// (or a class derived from it).
1100
1101 /// Returns the minimum object size for an object of the given type.
1103 if (CXXRecordDecl *RD = Ty->getAsCXXRecordDecl())
1104 return getMinimumClassObjectSize(RD);
1105 return getContext().getTypeSizeInChars(Ty);
1106 }
1107
1108 /// Returns the assumed alignment of a virtual base of a class.
1110 const CXXRecordDecl *Derived,
1111 const CXXRecordDecl *VBase);
1112
1113 /// Given a class pointer with an actual known alignment, and the
1114 /// expected alignment of an object at a dynamic offset w.r.t that
1115 /// pointer, return the alignment to assume at the offset.
1117 const CXXRecordDecl *Class,
1118 CharUnits ExpectedTargetAlign);
1119
1120 CharUnits
1124
1125 /// Returns the offset from a derived class to a class. Returns null if the
1126 /// offset is 0.
1127 llvm::Constant *
1131
1132 llvm::FoldingSet<BlockByrefHelpers> ByrefHelpersCache;
1133
1134 /// Fetches the global unique block count.
1135 int getUniqueBlockCount() { return ++Block.GlobalUniqueCount; }
1136
1137 /// Fetches the type of a generic block descriptor.
1138 llvm::Type *getBlockDescriptorType();
1139
1140 /// The type of a generic block literal.
1141 llvm::Type *getGenericBlockLiteralType();
1142
1143 /// Gets the address of a block which requires no captures.
1144 llvm::Constant *GetAddrOfGlobalBlock(const BlockExpr *BE, StringRef Name);
1145
1146 /// Returns the address of a block which requires no caputres, or null if
1147 /// we've yet to emit the block for BE.
1148 llvm::Constant *getAddrOfGlobalBlockIfEmitted(const BlockExpr *BE) {
1149 return EmittedGlobalBlocks.lookup(BE);
1150 }
1151
1152 /// Notes that BE's global block is available via Addr. Asserts that BE
1153 /// isn't already emitted.
1154 void setAddrOfGlobalBlock(const BlockExpr *BE, llvm::Constant *Addr);
1155
1156 /// Return a pointer to a constant CFString object for the given string.
1158
1159 /// Return a constant array for the given string.
1160 llvm::Constant *GetConstantArrayFromStringLiteral(const StringLiteral *E);
1161
1162 /// Return a pointer to a constant array for the given string literal.
1165 StringRef Name = ".str");
1166
1167 /// Return a pointer to a constant array for the given ObjCEncodeExpr node.
1170
1171 /// Returns a pointer to a character array containing the literal and a
1172 /// terminating '\0' character. The result has pointer to array type.
1173 ///
1174 /// \param GlobalName If provided, the name to use for the global (if one is
1175 /// created).
1177 GetAddrOfConstantCString(const std::string &Str,
1178 const char *GlobalName = nullptr);
1179
1180 /// Returns a pointer to a constant global variable for the given file-scope
1181 /// compound literal expression.
1183
1184 /// If it's been emitted already, returns the GlobalVariable corresponding to
1185 /// a compound literal. Otherwise, returns null.
1186 llvm::GlobalVariable *
1188
1189 /// Notes that CLE's GlobalVariable is GV. Asserts that CLE isn't already
1190 /// emitted.
1192 llvm::GlobalVariable *GV);
1193
1194 /// Returns a pointer to a global variable representing a temporary
1195 /// with static or thread storage duration.
1197 const Expr *Inner);
1198
1199 /// Retrieve the record type that describes the state of an
1200 /// Objective-C fast enumeration loop (for..in).
1202
1203 // Produce code for this constructor/destructor. This method doesn't try
1204 // to apply any ABI rules about which other constructors/destructors
1205 // are needed or if they are alias to each other.
1206 llvm::Function *codegenCXXStructor(GlobalDecl GD);
1207
1208 /// Return the address of the constructor/destructor of the given type.
1209 llvm::Constant *
1211 llvm::FunctionType *FnType = nullptr,
1212 bool DontDefer = false,
1213 ForDefinition_t IsForDefinition = NotForDefinition) {
1214 return cast<llvm::Constant>(getAddrAndTypeOfCXXStructor(GD, FnInfo, FnType,
1215 DontDefer,
1216 IsForDefinition)
1217 .getCallee());
1218 }
1219
1220 llvm::FunctionCallee getAddrAndTypeOfCXXStructor(
1221 GlobalDecl GD, const CGFunctionInfo *FnInfo = nullptr,
1222 llvm::FunctionType *FnType = nullptr, bool DontDefer = false,
1223 ForDefinition_t IsForDefinition = NotForDefinition);
1224
1225 /// Given a builtin id for a function like "__builtin_fabsf", return a
1226 /// Function* for "fabsf".
1227 llvm::Constant *getBuiltinLibFunction(const FunctionDecl *FD,
1228 unsigned BuiltinID);
1229
1230 llvm::Function *getIntrinsic(unsigned IID, ArrayRef<llvm::Type *> Tys = {});
1231
1232 void AddCXXGlobalInit(llvm::Function *F) { CXXGlobalInits.push_back(F); }
1233
1234 /// Emit code for a single top level declaration.
1235 void EmitTopLevelDecl(Decl *D);
1236
1237 /// Stored a deferred empty coverage mapping for an unused
1238 /// and thus uninstrumented top level declaration.
1240
1241 /// Remove the deferred empty coverage mapping as this
1242 /// declaration is actually instrumented.
1243 void ClearUnusedCoverageMapping(const Decl *D);
1244
1245 /// Emit all the deferred coverage mappings
1246 /// for the uninstrumented functions.
1248
1249 /// Emit an alias for "main" if it has no arguments (needed for wasm).
1250 void EmitMainVoidAlias();
1251
1252 /// Tell the consumer that this variable has been instantiated.
1254
1255 /// If the declaration has internal linkage but is inside an
1256 /// extern "C" linkage specification, prepare to emit an alias for it
1257 /// to the expected name.
1258 template<typename SomeDecl>
1259 void MaybeHandleStaticInExternC(const SomeDecl *D, llvm::GlobalValue *GV);
1260
1261 /// Add a global to a list to be added to the llvm.used metadata.
1262 void addUsedGlobal(llvm::GlobalValue *GV);
1263
1264 /// Add a global to a list to be added to the llvm.compiler.used metadata.
1265 void addCompilerUsedGlobal(llvm::GlobalValue *GV);
1266
1267 /// Add a global to a list to be added to the llvm.compiler.used metadata.
1268 void addUsedOrCompilerUsedGlobal(llvm::GlobalValue *GV);
1269
1270 /// Add a destructor and object to add to the C++ global destructor function.
1271 void AddCXXDtorEntry(llvm::FunctionCallee DtorFn, llvm::Constant *Object) {
1272 CXXGlobalDtorsOrStermFinalizers.emplace_back(DtorFn.getFunctionType(),
1273 DtorFn.getCallee(), Object);
1274 }
1275
1276 /// Add an sterm finalizer to the C++ global cleanup function.
1277 void AddCXXStermFinalizerEntry(llvm::FunctionCallee DtorFn) {
1278 CXXGlobalDtorsOrStermFinalizers.emplace_back(DtorFn.getFunctionType(),
1279 DtorFn.getCallee(), nullptr);
1280 }
1281
1282 /// Add an sterm finalizer to its own llvm.global_dtors entry.
1283 void AddCXXStermFinalizerToGlobalDtor(llvm::Function *StermFinalizer,
1284 int Priority) {
1285 AddGlobalDtor(StermFinalizer, Priority);
1286 }
1287
1288 void AddCXXPrioritizedStermFinalizerEntry(llvm::Function *StermFinalizer,
1289 int Priority) {
1291 PrioritizedCXXStermFinalizers.size());
1292 PrioritizedCXXStermFinalizers.push_back(
1293 std::make_pair(Key, StermFinalizer));
1294 }
1295
1296 /// Create or return a runtime function declaration with the specified type
1297 /// and name. If \p AssumeConvergent is true, the call will have the
1298 /// convergent attribute added.
1299 ///
1300 /// For new code, please use the overload that takes a QualType; it sets
1301 /// function attributes more accurately.
1302 llvm::FunctionCallee
1303 CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name,
1304 llvm::AttributeList ExtraAttrs = llvm::AttributeList(),
1305 bool Local = false, bool AssumeConvergent = false);
1306
1307 /// Create or return a runtime function declaration with the specified type
1308 /// and name. If \p AssumeConvergent is true, the call will have the
1309 /// convergent attribute added.
1310 llvm::FunctionCallee
1312 StringRef Name,
1313 llvm::AttributeList ExtraAttrs = llvm::AttributeList(),
1314 bool Local = false, bool AssumeConvergent = false);
1315
1316 /// Create a new runtime global variable with the specified type and name.
1317 llvm::Constant *CreateRuntimeVariable(llvm::Type *Ty,
1318 StringRef Name);
1319
1320 ///@name Custom Blocks Runtime Interfaces
1321 ///@{
1322
1323 llvm::Constant *getNSConcreteGlobalBlock();
1324 llvm::Constant *getNSConcreteStackBlock();
1325 llvm::FunctionCallee getBlockObjectAssign();
1326 llvm::FunctionCallee getBlockObjectDispose();
1327
1328 ///@}
1329
1330 llvm::Function *getLLVMLifetimeStartFn();
1331 llvm::Function *getLLVMLifetimeEndFn();
1332 llvm::Function *getLLVMFakeUseFn();
1333
1334 // Make sure that this type is translated.
1335 void UpdateCompletedType(const TagDecl *TD);
1336
1337 llvm::Constant *getMemberPointerConstant(const UnaryOperator *e);
1338
1339 /// Emit type info if type of an expression is a variably modified
1340 /// type. Also emit proper debug info for cast types.
1342 CodeGenFunction *CGF = nullptr);
1343
1344 /// Return the result of value-initializing the given type, i.e. a null
1345 /// expression of the given type. This is usually, but not always, an LLVM
1346 /// null constant.
1347 llvm::Constant *EmitNullConstant(QualType T);
1348
1349 /// Return a null constant appropriate for zero-initializing a base class with
1350 /// the given type. This is usually, but not always, an LLVM null constant.
1351 llvm::Constant *EmitNullConstantForBase(const CXXRecordDecl *Record);
1352
1353 /// Emit a general error that something can't be done.
1354 void Error(SourceLocation loc, StringRef error);
1355
1356 /// Print out an error that codegen doesn't support the specified stmt yet.
1357 void ErrorUnsupported(const Stmt *S, const char *Type);
1358
1359 /// Print out an error that codegen doesn't support the specified decl yet.
1360 void ErrorUnsupported(const Decl *D, const char *Type);
1361
1362 /// Run some code with "sufficient" stack space. (Currently, at least 256K is
1363 /// guaranteed). Produces a warning if we're low on stack space and allocates
1364 /// more in that case. Use this in code that may recurse deeply to avoid stack
1365 /// overflow.
1367 llvm::function_ref<void()> Fn);
1368
1369 /// Set the attributes on the LLVM function for the given decl and function
1370 /// info. This applies attributes necessary for handling the ABI as well as
1371 /// user specified attributes like section.
1372 void SetInternalFunctionAttributes(GlobalDecl GD, llvm::Function *F,
1373 const CGFunctionInfo &FI);
1374
1375 /// Set the LLVM function attributes (sext, zext, etc).
1377 llvm::Function *F, bool IsThunk);
1378
1379 /// Set the LLVM function attributes which only apply to a function
1380 /// definition.
1381 void SetLLVMFunctionAttributesForDefinition(const Decl *D, llvm::Function *F);
1382
1383 /// Set the LLVM function attributes that represent floating point
1384 /// environment.
1385 void setLLVMFunctionFEnvAttributes(const FunctionDecl *D, llvm::Function *F);
1386
1387 /// Return true iff the given type uses 'sret' when used as a return type.
1388 bool ReturnTypeUsesSRet(const CGFunctionInfo &FI);
1389
1390 /// Return true iff the given type has `inreg` set.
1391 bool ReturnTypeHasInReg(const CGFunctionInfo &FI);
1392
1393 /// Return true iff the given type uses an argument slot when 'sret' is used
1394 /// as a return type.
1396
1397 /// Return true iff the given type uses 'fpret' when used as a return type.
1398 bool ReturnTypeUsesFPRet(QualType ResultType);
1399
1400 /// Return true iff the given type uses 'fp2ret' when used as a return type.
1401 bool ReturnTypeUsesFP2Ret(QualType ResultType);
1402
1403 /// Get the LLVM attributes and calling convention to use for a particular
1404 /// function type.
1405 ///
1406 /// \param Name - The function name.
1407 /// \param Info - The function type information.
1408 /// \param CalleeInfo - The callee information these attributes are being
1409 /// constructed for. If valid, the attributes applied to this decl may
1410 /// contribute to the function attributes and calling convention.
1411 /// \param Attrs [out] - On return, the attribute list to use.
1412 /// \param CallingConv [out] - On return, the LLVM calling convention to use.
1413 void ConstructAttributeList(StringRef Name, const CGFunctionInfo &Info,
1414 CGCalleeInfo CalleeInfo,
1415 llvm::AttributeList &Attrs, unsigned &CallingConv,
1416 bool AttrOnCallSite, bool IsThunk);
1417
1418 /// Adjust Memory attribute to ensure that the BE gets the right attribute
1419 // in order to generate the library call or the intrinsic for the function
1420 // name 'Name'.
1421 void AdjustMemoryAttribute(StringRef Name, CGCalleeInfo CalleeInfo,
1422 llvm::AttributeList &Attrs);
1423
1424 /// Like the overload taking a `Function &`, but intended specifically
1425 /// for frontends that want to build on Clang's target-configuration logic.
1426 void addDefaultFunctionDefinitionAttributes(llvm::AttrBuilder &attrs);
1427
1428 StringRef getMangledName(GlobalDecl GD);
1429 StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD);
1430 const GlobalDecl getMangledNameDecl(StringRef);
1431
1432 void EmitTentativeDefinition(const VarDecl *D);
1433
1435
1437
1439
1440 /// Appends Opts to the "llvm.linker.options" metadata value.
1441 void AppendLinkerOptions(StringRef Opts);
1442
1443 /// Appends a detect mismatch command to the linker options.
1444 void AddDetectMismatch(StringRef Name, StringRef Value);
1445
1446 /// Appends a dependent lib to the appropriate metadata value.
1447 void AddDependentLib(StringRef Lib);
1448
1449
1450 llvm::GlobalVariable::LinkageTypes getFunctionLinkage(GlobalDecl GD);
1451
1452 void setFunctionLinkage(GlobalDecl GD, llvm::Function *F) {
1453 F->setLinkage(getFunctionLinkage(GD));
1454 }
1455
1456 /// Return the appropriate linkage for the vtable, VTT, and type information
1457 /// of the given class.
1458 llvm::GlobalVariable::LinkageTypes getVTableLinkage(const CXXRecordDecl *RD);
1459
1460 /// Return the store size, in character units, of the given LLVM type.
1461 CharUnits GetTargetTypeStoreSize(llvm::Type *Ty) const;
1462
1463 /// Returns LLVM linkage for a declarator.
1464 llvm::GlobalValue::LinkageTypes
1466
1467 /// Returns LLVM linkage for a declarator.
1468 llvm::GlobalValue::LinkageTypes
1470
1471 /// Emit all the global annotations.
1472 void EmitGlobalAnnotations();
1473
1474 /// Emit an annotation string.
1475 llvm::Constant *EmitAnnotationString(StringRef Str);
1476
1477 /// Emit the annotation's translation unit.
1478 llvm::Constant *EmitAnnotationUnit(SourceLocation Loc);
1479
1480 /// Emit the annotation line number.
1481 llvm::Constant *EmitAnnotationLineNo(SourceLocation L);
1482
1483 /// Emit additional args of the annotation.
1484 llvm::Constant *EmitAnnotationArgs(const AnnotateAttr *Attr);
1485
1486 /// Generate the llvm::ConstantStruct which contains the annotation
1487 /// information for a given GlobalValue. The annotation struct is
1488 /// {i8 *, i8 *, i8 *, i32}. The first field is a constant expression, the
1489 /// GlobalValue being annotated. The second field is the constant string
1490 /// created from the AnnotateAttr's annotation. The third field is a constant
1491 /// string containing the name of the translation unit. The fourth field is
1492 /// the line number in the file of the annotated value declaration.
1493 llvm::Constant *EmitAnnotateAttr(llvm::GlobalValue *GV,
1494 const AnnotateAttr *AA,
1495 SourceLocation L);
1496
1497 /// Add global annotations that are set on D, for the global GV. Those
1498 /// annotations are emitted during finalization of the LLVM code.
1499 void AddGlobalAnnotations(const ValueDecl *D, llvm::GlobalValue *GV);
1500
1501 bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn,
1502 SourceLocation Loc) const;
1503
1504 bool isInNoSanitizeList(SanitizerMask Kind, llvm::GlobalVariable *GV,
1506 StringRef Category = StringRef()) const;
1507
1508 /// Imbue XRay attributes to a function, applying the always/never attribute
1509 /// lists in the process. Returns true if we did imbue attributes this way,
1510 /// false otherwise.
1511 bool imbueXRayAttrs(llvm::Function *Fn, SourceLocation Loc,
1512 StringRef Category = StringRef()) const;
1513
1514 /// \returns true if \p Fn at \p Loc should be excluded from profile
1515 /// instrumentation by the SCL passed by \p -fprofile-list.
1517 isFunctionBlockedByProfileList(llvm::Function *Fn, SourceLocation Loc) const;
1518
1519 /// \returns true if \p Fn at \p Loc should be excluded from profile
1520 /// instrumentation.
1522 isFunctionBlockedFromProfileInstr(llvm::Function *Fn,
1523 SourceLocation Loc) const;
1524
1526 return SanitizerMD.get();
1527 }
1528
1530 DeferredVTables.push_back(RD);
1531 }
1532
1533 /// Emit code for a single global function or var decl. Forward declarations
1534 /// are emitted lazily.
1535 void EmitGlobal(GlobalDecl D);
1536
1538
1539 llvm::GlobalValue *GetGlobalValue(StringRef Ref);
1540
1541 /// Set attributes which are common to any form of a global definition (alias,
1542 /// Objective-C method, function, global variable).
1543 ///
1544 /// NOTE: This should only be called for definitions.
1545 void SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV);
1546
1547 void addReplacement(StringRef Name, llvm::Constant *C);
1548
1549 void addGlobalValReplacement(llvm::GlobalValue *GV, llvm::Constant *C);
1550
1551 /// Emit a code for threadprivate directive.
1552 /// \param D Threadprivate declaration.
1554
1555 /// Emit a code for declare reduction construct.
1557 CodeGenFunction *CGF = nullptr);
1558
1559 /// Emit a code for declare mapper construct.
1561 CodeGenFunction *CGF = nullptr);
1562
1563 /// Emit a code for requires directive.
1564 /// \param D Requires declaration
1566
1567 /// Emit a code for the allocate directive.
1568 /// \param D The allocate declaration
1570
1571 /// Return the alignment specified in an allocate directive, if present.
1572 std::optional<CharUnits> getOMPAllocateAlignment(const VarDecl *VD);
1573
1574 /// Returns whether the given record has hidden LTO visibility and therefore
1575 /// may participate in (single-module) CFI and whole-program vtable
1576 /// optimization.
1577 bool HasHiddenLTOVisibility(const CXXRecordDecl *RD);
1578
1579 /// Returns whether the given record has public LTO visibility (regardless of
1580 /// -lto-whole-program-visibility) and therefore may not participate in
1581 /// (single-module) CFI and whole-program vtable optimization.
1583
1584 /// Returns the vcall visibility of the given type. This is the scope in which
1585 /// a virtual function call could be made which ends up being dispatched to a
1586 /// member function of this class. This scope can be wider than the visibility
1587 /// of the class itself when the class has a more-visible dynamic base class.
1588 /// The client should pass in an empty Visited set, which is used to prevent
1589 /// redundant recursive processing.
1590 llvm::GlobalObject::VCallVisibility
1592 llvm::DenseSet<const CXXRecordDecl *> &Visited);
1593
1594 /// Emit type metadata for the given vtable using the given layout.
1596 llvm::GlobalVariable *VTable,
1597 const VTableLayout &VTLayout);
1598
1599 llvm::Type *getVTableComponentType() const;
1600
1601 /// Generate a cross-DSO type identifier for MD.
1602 llvm::ConstantInt *CreateCrossDsoCfiTypeId(llvm::Metadata *MD);
1603
1604 /// Generate a KCFI type identifier for T.
1605 llvm::ConstantInt *CreateKCFITypeId(QualType T);
1606
1607 /// Create a metadata identifier for the given type. This may either be an
1608 /// MDString (for external identifiers) or a distinct unnamed MDNode (for
1609 /// internal identifiers).
1611
1612 /// Create a metadata identifier that is intended to be used to check virtual
1613 /// calls via a member function pointer.
1615
1616 /// Create a metadata identifier for the generalization of the given type.
1617 /// This may either be an MDString (for external identifiers) or a distinct
1618 /// unnamed MDNode (for internal identifiers).
1620
1621 /// Create and attach type metadata to the given function.
1623 llvm::Function *F);
1624
1625 /// Set type metadata to the given function.
1626 void setKCFIType(const FunctionDecl *FD, llvm::Function *F);
1627
1628 /// Emit KCFI type identifier constants and remove unused identifiers.
1629 void finalizeKCFITypes();
1630
1631 /// Whether this function's return type has no side effects, and thus may
1632 /// be trivially discarded if it is unused.
1633 bool MayDropFunctionReturn(const ASTContext &Context,
1634 QualType ReturnType) const;
1635
1636 /// Returns whether this module needs the "all-vtables" type identifier.
1637 bool NeedAllVtablesTypeId() const;
1638
1639 /// Create and attach type metadata for the given vtable.
1640 void AddVTableTypeMetadata(llvm::GlobalVariable *VTable, CharUnits Offset,
1641 const CXXRecordDecl *RD);
1642
1643 /// Return a vector of most-base classes for RD. This is used to implement
1644 /// control flow integrity checks for member function pointers.
1645 ///
1646 /// A most-base class of a class C is defined as a recursive base class of C,
1647 /// including C itself, that does not have any bases.
1650
1651 /// Get the declaration of std::terminate for the platform.
1652 llvm::FunctionCallee getTerminateFn();
1653
1654 llvm::SanitizerStatReport &getSanStats();
1655
1656 llvm::Value *
1658
1659 /// OpenCL v1.2 s5.6.4.6 allows the compiler to store kernel argument
1660 /// information in the program executable. The argument information stored
1661 /// includes the argument name, its type, the address and access qualifiers
1662 /// used. This helper can be used to generate metadata for source code kernel
1663 /// function as well as generated implicitly kernels. If a kernel is generated
1664 /// implicitly null value has to be passed to the last two parameters,
1665 /// otherwise all parameters must have valid non-null values.
1666 /// \param FN is a pointer to IR function being generated.
1667 /// \param FD is a pointer to function declaration if any.
1668 /// \param CGF is a pointer to CodeGenFunction that generates this function.
1669 void GenKernelArgMetadata(llvm::Function *FN,
1670 const FunctionDecl *FD = nullptr,
1671 CodeGenFunction *CGF = nullptr);
1672
1673 /// Get target specific null pointer.
1674 /// \param T is the LLVM type of the null pointer.
1675 /// \param QT is the clang QualType of the null pointer.
1676 llvm::Constant *getNullPointer(llvm::PointerType *T, QualType QT);
1677
1679 LValueBaseInfo *BaseInfo = nullptr,
1680 TBAAAccessInfo *TBAAInfo = nullptr,
1681 bool forPointeeType = false);
1683 LValueBaseInfo *BaseInfo = nullptr,
1684 TBAAAccessInfo *TBAAInfo = nullptr);
1685 bool stopAutoInit();
1686
1687 /// Print the postfix for externalized static variable or kernels for single
1688 /// source offloading languages CUDA and HIP. The unique postfix is created
1689 /// using either the CUID argument, or the file's UniqueID and active macros.
1690 /// The fallback method without a CUID requires that the offloading toolchain
1691 /// does not define separate macros via the -cc1 options.
1692 void printPostfixForExternalizedDecl(llvm::raw_ostream &OS,
1693 const Decl *D) const;
1694
1695 /// Move some lazily-emitted states to the NewBuilder. This is especially
1696 /// essential for the incremental parsing environment like Clang Interpreter,
1697 /// because we'll lose all important information after each repl.
1698 void moveLazyEmissionStates(CodeGenModule *NewBuilder);
1699
1700 /// Emit the IR encoding to attach the CUDA launch bounds attribute to \p F.
1701 /// If \p MaxThreadsVal is not nullptr, the max threads value is stored in it,
1702 /// if a valid one was found.
1703 void handleCUDALaunchBoundsAttr(llvm::Function *F,
1704 const CUDALaunchBoundsAttr *A,
1705 int32_t *MaxThreadsVal = nullptr,
1706 int32_t *MinBlocksVal = nullptr,
1707 int32_t *MaxClusterRankVal = nullptr);
1708
1709 /// Emit the IR encoding to attach the AMD GPU flat-work-group-size attribute
1710 /// to \p F. Alternatively, the work group size can be taken from a \p
1711 /// ReqdWGS. If \p MinThreadsVal is not nullptr, the min threads value is
1712 /// stored in it, if a valid one was found. If \p MaxThreadsVal is not
1713 /// nullptr, the max threads value is stored in it, if a valid one was found.
1715 llvm::Function *F, const AMDGPUFlatWorkGroupSizeAttr *A,
1716 const ReqdWorkGroupSizeAttr *ReqdWGS = nullptr,
1717 int32_t *MinThreadsVal = nullptr, int32_t *MaxThreadsVal = nullptr);
1718
1719 /// Emit the IR encoding to attach the AMD GPU waves-per-eu attribute to \p F.
1720 void handleAMDGPUWavesPerEUAttr(llvm::Function *F,
1721 const AMDGPUWavesPerEUAttr *A);
1722
1723 llvm::Constant *
1724 GetOrCreateLLVMGlobal(StringRef MangledName, llvm::Type *Ty, LangAS AddrSpace,
1725 const VarDecl *D,
1726 ForDefinition_t IsForDefinition = NotForDefinition);
1727
1728 // FIXME: Hardcoding priority here is gross.
1729 void AddGlobalCtor(llvm::Function *Ctor, int Priority = 65535,
1730 unsigned LexOrder = ~0U,
1731 llvm::Constant *AssociatedData = nullptr);
1732 void AddGlobalDtor(llvm::Function *Dtor, int Priority = 65535,
1733 bool IsDtorAttrFunc = false);
1734
1735 // Return whether structured convergence intrinsics should be generated for
1736 // this target.
1738 // TODO: this should probably become unconditional once the controlled
1739 // convergence becomes the norm.
1740 return getTriple().isSPIRVLogical();
1741 }
1742
1744 std::pair<const FunctionDecl *, SourceLocation> Global) {
1745 MustTailCallUndefinedGlobals.insert(Global);
1746 }
1747
1749 // In C23 (N3096) $6.7.10:
1750 // """
1751 // If any object is initialized with an empty iniitializer, then it is
1752 // subject to default initialization:
1753 // - if it is an aggregate, every member is initialized (recursively)
1754 // according to these rules, and any padding is initialized to zero bits;
1755 // - if it is a union, the first named member is initialized (recursively)
1756 // according to these rules, and any padding is initialized to zero bits.
1757 //
1758 // If the aggregate or union contains elements or members that are
1759 // aggregates or unions, these rules apply recursively to the subaggregates
1760 // or contained unions.
1761 //
1762 // If there are fewer initializers in a brace-enclosed list than there are
1763 // elements or members of an aggregate, or fewer characters in a string
1764 // literal used to initialize an array of known size than there are elements
1765 // in the array, the remainder of the aggregate is subject to default
1766 // initialization.
1767 // """
1768 //
1769 // From my understanding, the standard is ambiguous in the following two
1770 // areas:
1771 // 1. For a union type with empty initializer, if the first named member is
1772 // not the largest member, then the bytes comes after the first named member
1773 // but before padding are left unspecified. An example is:
1774 // union U { int a; long long b;};
1775 // union U u = {}; // The first 4 bytes are 0, but 4-8 bytes are left
1776 // unspecified.
1777 //
1778 // 2. It only mentions padding for empty initializer, but doesn't mention
1779 // padding for a non empty initialization list. And if the aggregation or
1780 // union contains elements or members that are aggregates or unions, and
1781 // some are non empty initializers, while others are empty initiailizers,
1782 // the padding initialization is unclear. An example is:
1783 // struct S1 { int a; long long b; };
1784 // struct S2 { char c; struct S1 s1; };
1785 // // The values for paddings between s2.c and s2.s1.a, between s2.s1.a
1786 // and s2.s1.b are unclear.
1787 // struct S2 s2 = { 'c' };
1788 //
1789 // Here we choose to zero initiailize left bytes of a union type. Because
1790 // projects like the Linux kernel are relying on this behavior. If we don't
1791 // explicitly zero initialize them, the undef values can be optimized to
1792 // return gabage data. We also choose to zero initialize paddings for
1793 // aggregates and unions, no matter they are initialized by empty
1794 // initializers or non empty initializers. This can provide a consistent
1795 // behavior. So projects like the Linux kernel can rely on it.
1796 return !getLangOpts().CPlusPlus;
1797 }
1798
1799private:
1800 bool shouldDropDLLAttribute(const Decl *D, const llvm::GlobalValue *GV) const;
1801
1802 llvm::Constant *GetOrCreateLLVMFunction(
1803 StringRef MangledName, llvm::Type *Ty, GlobalDecl D, bool ForVTable,
1804 bool DontDefer = false, bool IsThunk = false,
1805 llvm::AttributeList ExtraAttrs = llvm::AttributeList(),
1806 ForDefinition_t IsForDefinition = NotForDefinition);
1807
1808 // Adds a declaration to the list of multi version functions if not present.
1809 void AddDeferredMultiVersionResolverToEmit(GlobalDecl GD);
1810
1811 // References to multiversion functions are resolved through an implicitly
1812 // defined resolver function. This function is responsible for creating
1813 // the resolver symbol for the provided declaration. The value returned
1814 // will be for an ifunc (llvm::GlobalIFunc) if the current target supports
1815 // that feature and for a regular function (llvm::GlobalValue) otherwise.
1816 llvm::Constant *GetOrCreateMultiVersionResolver(GlobalDecl GD);
1817
1818 // In scenarios where a function is not known to be a multiversion function
1819 // until a later declaration, it is sometimes necessary to change the
1820 // previously created mangled name to align with requirements of whatever
1821 // multiversion function kind the function is now known to be. This function
1822 // is responsible for performing such mangled name updates.
1823 void UpdateMultiVersionNames(GlobalDecl GD, const FunctionDecl *FD,
1824 StringRef &CurName);
1825
1826 bool GetCPUAndFeaturesAttributes(GlobalDecl GD,
1827 llvm::AttrBuilder &AttrBuilder,
1828 bool SetTargetFeatures = true);
1829 void setNonAliasAttributes(GlobalDecl GD, llvm::GlobalObject *GO);
1830
1831 /// Set function attributes for a function declaration.
1832 void SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
1833 bool IsIncompleteFunction, bool IsThunk);
1834
1835 void EmitGlobalDefinition(GlobalDecl D, llvm::GlobalValue *GV = nullptr);
1836
1837 void EmitGlobalFunctionDefinition(GlobalDecl GD, llvm::GlobalValue *GV);
1838 void EmitMultiVersionFunctionDefinition(GlobalDecl GD, llvm::GlobalValue *GV);
1839
1840 void EmitGlobalVarDefinition(const VarDecl *D, bool IsTentative = false);
1841 void EmitExternalVarDeclaration(const VarDecl *D);
1842 void EmitExternalFunctionDeclaration(const FunctionDecl *D);
1843 void EmitAliasDefinition(GlobalDecl GD);
1844 void emitIFuncDefinition(GlobalDecl GD);
1845 void emitCPUDispatchDefinition(GlobalDecl GD);
1846 void EmitObjCPropertyImplementations(const ObjCImplementationDecl *D);
1847 void EmitObjCIvarInitializations(ObjCImplementationDecl *D);
1848
1849 // C++ related functions.
1850
1851 void EmitDeclContext(const DeclContext *DC);
1852 void EmitLinkageSpec(const LinkageSpecDecl *D);
1853 void EmitTopLevelStmt(const TopLevelStmtDecl *D);
1854
1855 /// Emit the function that initializes C++ thread_local variables.
1856 void EmitCXXThreadLocalInitFunc();
1857
1858 /// Emit the function that initializes global variables for a C++ Module.
1859 void EmitCXXModuleInitFunc(clang::Module *Primary);
1860
1861 /// Emit the function that initializes C++ globals.
1862 void EmitCXXGlobalInitFunc();
1863
1864 /// Emit the function that performs cleanup associated with C++ globals.
1865 void EmitCXXGlobalCleanUpFunc();
1866
1867 /// Emit the function that initializes the specified global (if PerformInit is
1868 /// true) and registers its destructor.
1869 void EmitCXXGlobalVarDeclInitFunc(const VarDecl *D,
1870 llvm::GlobalVariable *Addr,
1871 bool PerformInit);
1872
1873 void EmitPointerToInitFunc(const VarDecl *VD, llvm::GlobalVariable *Addr,
1874 llvm::Function *InitFunc, InitSegAttr *ISA);
1875
1876 /// EmitCtorList - Generates a global array of functions and priorities using
1877 /// the given list and name. This array will have appending linkage and is
1878 /// suitable for use as a LLVM constructor or destructor array. Clears Fns.
1879 void EmitCtorList(CtorList &Fns, const char *GlobalName);
1880
1881 /// Emit any needed decls for which code generation was deferred.
1882 void EmitDeferred();
1883
1884 /// Try to emit external vtables as available_externally if they have emitted
1885 /// all inlined virtual functions. It runs after EmitDeferred() and therefore
1886 /// is not allowed to create new references to things that need to be emitted
1887 /// lazily.
1888 void EmitVTablesOpportunistically();
1889
1890 /// Call replaceAllUsesWith on all pairs in Replacements.
1891 void applyReplacements();
1892
1893 /// Call replaceAllUsesWith on all pairs in GlobalValReplacements.
1894 void applyGlobalValReplacements();
1895
1896 void checkAliases();
1897
1898 std::map<int, llvm::TinyPtrVector<llvm::Function *>> DtorsUsingAtExit;
1899
1900 /// Register functions annotated with __attribute__((destructor)) using
1901 /// __cxa_atexit, if it is available, or atexit otherwise.
1902 void registerGlobalDtorsWithAtExit();
1903
1904 // When using sinit and sterm functions, unregister
1905 // __attribute__((destructor)) annotated functions which were previously
1906 // registered by the atexit subroutine using unatexit.
1907 void unregisterGlobalDtorsWithUnAtExit();
1908
1909 /// Emit deferred multiversion function resolvers and associated variants.
1910 void emitMultiVersionFunctions();
1911
1912 /// Emit any vtables which we deferred and still have a use for.
1913 void EmitDeferredVTables();
1914
1915 /// Emit a dummy function that reference a CoreFoundation symbol when
1916 /// @available is used on Darwin.
1917 void emitAtAvailableLinkGuard();
1918
1919 /// Emit the llvm.used and llvm.compiler.used metadata.
1920 void emitLLVMUsed();
1921
1922 /// For C++20 Itanium ABI, emit the initializers for the module.
1923 void EmitModuleInitializers(clang::Module *Primary);
1924
1925 /// Emit the link options introduced by imported modules.
1926 void EmitModuleLinkOptions();
1927
1928 /// Helper function for EmitStaticExternCAliases() to redirect ifuncs that
1929 /// have a resolver name that matches 'Elem' to instead resolve to the name of
1930 /// 'CppFunc'. This redirection is necessary in cases where 'Elem' has a name
1931 /// that will be emitted as an alias of the name bound to 'CppFunc'; ifuncs
1932 /// may not reference aliases. Redirection is only performed if 'Elem' is only
1933 /// used by ifuncs in which case, 'Elem' is destroyed. 'true' is returned if
1934 /// redirection is successful, and 'false' is returned otherwise.
1935 bool CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
1936 llvm::GlobalValue *CppFunc);
1937
1938 /// Emit aliases for internal-linkage declarations inside "C" language
1939 /// linkage specifications, giving them the "expected" name where possible.
1940 void EmitStaticExternCAliases();
1941
1942 void EmitDeclMetadata();
1943
1944 /// Emit the Clang version as llvm.ident metadata.
1945 void EmitVersionIdentMetadata();
1946
1947 /// Emit the Clang commandline as llvm.commandline metadata.
1948 void EmitCommandLineMetadata();
1949
1950 /// Emit the module flag metadata used to pass options controlling the
1951 /// the backend to LLVM.
1952 void EmitBackendOptionsMetadata(const CodeGenOptions &CodeGenOpts);
1953
1954 /// Emits OpenCL specific Metadata e.g. OpenCL version.
1955 void EmitOpenCLMetadata();
1956
1957 /// Emit the llvm.gcov metadata used to tell LLVM where to emit the .gcno and
1958 /// .gcda files in a way that persists in .bc files.
1959 void EmitCoverageFile();
1960
1961 /// Determine whether the definition must be emitted; if this returns \c
1962 /// false, the definition can be emitted lazily if it's used.
1963 bool MustBeEmitted(const ValueDecl *D);
1964
1965 /// Determine whether the definition can be emitted eagerly, or should be
1966 /// delayed until the end of the translation unit. This is relevant for
1967 /// definitions whose linkage can change, e.g. implicit function instantions
1968 /// which may later be explicitly instantiated.
1969 bool MayBeEmittedEagerly(const ValueDecl *D);
1970
1971 /// Check whether we can use a "simpler", more core exceptions personality
1972 /// function.
1973 void SimplifyPersonality();
1974
1975 /// Helper function for getDefaultFunctionAttributes. Builds a set of function
1976 /// attributes which can be simply added to a function.
1977 void getTrivialDefaultFunctionAttributes(StringRef Name, bool HasOptnone,
1978 bool AttrOnCallSite,
1979 llvm::AttrBuilder &FuncAttrs);
1980
1981 /// Helper function for ConstructAttributeList and
1982 /// addDefaultFunctionDefinitionAttributes. Builds a set of function
1983 /// attributes to add to a function with the given properties.
1984 void getDefaultFunctionAttributes(StringRef Name, bool HasOptnone,
1985 bool AttrOnCallSite,
1986 llvm::AttrBuilder &FuncAttrs);
1987
1988 llvm::Metadata *CreateMetadataIdentifierImpl(QualType T, MetadataTypeMap &Map,
1989 StringRef Suffix);
1990};
1991
1992} // end namespace CodeGen
1993} // end namespace clang
1994
1995#endif // LLVM_CLANG_LIB_CODEGEN_CODEGENMODULE_H
Enums/classes describing ABI related information about constructors, destructors and thunks.
#define V(N, I)
Definition: ASTContext.h:3460
const Decl * D
enum clang::sema::@1727::IndirectLocalPathEntry::EntryKind Kind
Expr * E
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
int Priority
Definition: Format.cpp:3060
int Category
Definition: Format.cpp:3059
llvm::DenseSet< const void * > Visited
Definition: HTMLLogger.cpp:145
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
Definition: MachO.h:51
llvm::MachO::Record Record
Definition: MachO.h:31
SourceLocation Loc
Definition: SemaObjC.cpp:759
Defines a utilitiy for warning once when close to out of stack space.
__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:188
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
Attr - This represents one attribute.
Definition: Attr.h:43
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4503
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition: Expr.h:6414
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2856
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
const CXXBaseSpecifier *const * path_const_iterator
Definition: Expr.h:3614
CharUnits - This is an opaque type for sizes expressed in character units.
Definition: CharUnits.h:38
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Definition: CharUnits.h:185
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
ABIInfo - Target specific hooks for defining how a type should be passed or returned from functions.
Definition: ABIInfo.h:48
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition: Address.h:128
A pair of helper functions for a __block variable.
void Profile(llvm::FoldingSetNodeID &id) const
virtual void emitCopy(CodeGenFunction &CGF, Address dest, Address src)=0
BlockByrefHelpers(CharUnits alignment)
virtual bool needsCopy() const
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:41
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
Definition: CGDebugInfo.h:58
CGFunctionInfo - Class to encapsulate the information about a function definition.
Implements runtime-specific code generation functions.
Definition: CGObjCRuntime.h:65
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()
Definition: CGBlocks.cpp:2847
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:351
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:1269
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.
Definition: CGVTables.cpp:1316
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
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.
CGDebugInfo * getModuleDebugInfo()
ConstantAddress GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr *E)
Returns a pointer to a constant global variable for the given file-scope compound literal expression.
void setLLVMFunctionFEnvAttributes(const FunctionDecl *D, llvm::Function *F)
Set the LLVM function attributes that represent floating point environment.
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:2572
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:724
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.
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:59
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:2920
llvm::FunctionCallee getAddrAndTypeOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Definition: CGCXX.cpp:218
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:1109
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.
Definition: CGBlocks.cpp:1258
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:1596
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.
llvm::Constant * getBuiltinLibFunction(const FunctionDecl *FD, unsigned BuiltinID)
Given a builtin id for a function like "__builtin_fabsf", return a Function* for "fabsf".
Definition: CGBuiltin.cpp:263
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 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.
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.
Definition: CGBlocks.cpp:1096
llvm::Constant * GetAddrOfGlobalBlock(const BlockExpr *BE, StringRef Name)
Gets the address of a block which requires no captures.
Definition: CGBlocks.cpp:1266
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:2590
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:697
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 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.
CGPointerAuthInfo EmitPointerAuthInfo(const RecordDecl *RD)
void EmitVTableTypeMetadata(const CXXRecordDecl *RD, llvm::GlobalVariable *VTable, const VTableLayout &VTLayout)
Emit type metadata for the given vtable using the given layout.
Definition: CGVTables.cpp:1350
bool lookupRepresentativeDecl(StringRef MangledName, GlobalDecl &Result) const
void EmitOMPAllocateDecl(const OMPAllocateDecl *D)
Emit a code for the allocate directive.
Definition: CGDecl.cpp:2850
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:200
bool TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D)
Try to emit a base destructor as an alias to its primary base-class destructor.
Definition: CGCXX.cpp:32
llvm::GlobalValue::LinkageTypes getLLVMLinkageVarDefinition(const VarDecl *VD)
Returns LLVM linkage for a declarator.
llvm::Constant * getMemberPointerConstant(const UnaryOperator *e)
bool HasHiddenLTOVisibility(const CXXRecordDecl *RD)
Returns whether the given record has hidden LTO visibility and therefore may participate in (single-m...
Definition: CGVTables.cpp:1304
const llvm::DataLayout & getDataLayout() const
llvm::Constant * getNSConcreteGlobalBlock()
Definition: CGBlocks.cpp:2859
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:172
ObjCEntrypoints & getObjCEntrypoints() const
TBAAAccessInfo getTBAAVTablePtrAccessInfo(llvm::Type *VTablePtrType)
getTBAAVTablePtrAccessInfo - Get the TBAA information that describes an access to a virtual table poi...
bool shouldEmitConvergenceTokens() const
CGCXXABI & getCXXABI() const
ConstantAddress GetWeakRefReference(const ValueDecl *VD)
Get a reference to the target of VD.
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:76
llvm::Constant * GetFunctionStart(const ValueDecl *Decl)
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:1613
void EmitDeferredUnusedCoverageMappings()
Emit all the deferred coverage mappings for the uninstrumented functions.
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()
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...
std::optional< PointerAuthQualifier > getVTablePointerAuthentication(const CXXRecordDecl *thisClass)
llvm::Function * codegenCXXStructor(GlobalDecl GD)
Definition: CGCXX.cpp:204
CharUnits getClassPointerAlignment(const CXXRecordDecl *CD)
Returns the assumed alignment of an opaque pointer to the given class.
Definition: CGClass.cpp:40
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:247
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...
Definition: CGVTables.cpp:1280
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:1591
bool ReturnTypeHasInReg(const CGFunctionInfo &FI)
Return true iff the given type has inreg set.
Definition: CGCall.cpp:1586
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...
Definition: CGVTables.cpp:1185
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:2308
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:2336
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:91
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...
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)
llvm::Constant * GetAddrOfGlobal(GlobalDecl GD, ForDefinition_t IsForDefinition=NotForDefinition)
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()
Definition: CGBlocks.cpp:2869
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
llvm::SanitizerStatReport & getSanStats()
llvm::Constant * EmitAnnotationString(StringRef Str)
Emit an annotation string.
llvm::Type * getVTableComponentType() const
Definition: CGVTables.cpp:715
void EmitOMPDeclareMapper(const OMPDeclareMapperDecl *D, CodeGenFunction *CGF=nullptr)
Emit a code for declare mapper construct.
Definition: CGDecl.cpp:2838
llvm::Function * getLLVMLifetimeEndFn()
Lazily declare the @llvm.lifetime.end intrinsic.
Definition: CGDecl.cpp:2581
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:2846
void HandleCXXStaticMemberVarInstantiation(VarDecl *VD)
Tell the consumer that this variable has been instantiated.
bool ReturnTypeUsesSRet(const CGFunctionInfo &FI)
Return true iff the given type uses 'sret' when used as a return type.
Definition: CGCall.cpp:1581
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:2161
std::optional< CharUnits > getOMPAllocateAlignment(const VarDecl *VD)
Return the alignment specified in an allocate directive, if present.
Definition: CGDecl.cpp:2905
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.
Definition: CGException.cpp:62
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
llvm::FunctionCallee getBlockObjectDispose()
Definition: CGBlocks.cpp:2835
TBAAAccessInfo mergeTBAAInfoForConditionalOperator(TBAAAccessInfo InfoA, TBAAAccessInfo InfoB)
mergeTBAAInfoForConditionalOperator - Get merged TBAA information for the purposes of conditional ope...
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 CreateFunctionTypeMetadataForIcall(const FunctionDecl *FD, llvm::Function *F)
Create and attach type metadata to the given function.
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:2831
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.
Definition: CGVTables.cpp:1080
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.
Definition: CGBlocks.cpp:1128
CharUnits getMinimumObjectSize(QualType Ty)
Returns the minimum object size for an object of the given type.
void addReplacement(StringRef Name, llvm::Constant *C)
llvm::ConstantInt * CreateKCFITypeId(QualType T)
Generate a KCFI type identifier for T.
std::optional< CGPointerAuthInfo > getVTablePointerAuthInfo(CodeGenFunction *Context, const CXXRecordDecl *Record, llvm::Value *StorageAddress)
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.
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...
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:1821
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)
Definition: CGDeclCXX.cpp:443
llvm::Constant * EmitAnnotationUnit(SourceLocation Loc)
Emit the annotation's translation unit.
CGPointerAuthInfo getPointerAuthInfoForType(QualType type)
ConstantAddress GetAddrOfConstantCString(const std::string &Str, const char *GlobalName=nullptr)
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:34
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.
Definition: CodeGenTypes.h:54
ItaniumVTableContext & getItaniumVTableContext()
Definition: CGVTables.h:91
MicrosoftVTableContext & getMicrosoftVTableContext()
Definition: CGVTables.h:99
A specialization of Address that requires the address to be an LLVM Constant.
Definition: Address.h:294
The Counter with an optional additional Counter for branches.
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:182
TargetCodeGenInfo - This class organizes various target-specific codegeneration issues,...
Definition: TargetInfo.h:47
CompoundLiteralExpr - [C99 6.5.2.5].
Definition: Expr.h:3477
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:1439
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Represents a ValueDecl that came out of a declarator.
Definition: Decl.h:739
Concrete class used by the front-end to report problems and issues.
Definition: Diagnostic.h:231
ExplicitCastExpr - An explicit cast written in the source code.
Definition: Expr.h:3799
This represents one expression.
Definition: Expr.h:110
Represents a function declaration or definition.
Definition: Decl.h:1935
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4322
GlobalDecl - represents a global declaration.
Definition: GlobalDecl.h:56
const Decl * getDecl() const
Definition: GlobalDecl.h:103
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...
Definition: LangOptions.h:500
bool hasDefaultVisibilityExportMapping() const
Definition: LangOptions.h:774
bool isExplicitDefaultVisibilityExportMapping() const
Definition: LangOptions.h:779
bool isAllDefaultVisibilityExportMapping() const
Definition: LangOptions.h:784
Represents a linkage specification.
Definition: DeclCXX.h:2996
A global _GUID constant.
Definition: DeclCXX.h:4389
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition: ExprCXX.h:4732
Describes a module or submodule.
Definition: Module.h:115
This represents a decl that may have a name.
Definition: Decl.h:253
This represents '#pragma omp allocate ...' directive.
Definition: DeclOpenMP.h:474
This represents '#pragma omp declare mapper ...' directive.
Definition: DeclOpenMP.h:287
This represents '#pragma omp declare reduction ...' directive.
Definition: DeclOpenMP.h:177
This represents '#pragma omp requires...' directive.
Definition: DeclOpenMP.h:417
This represents '#pragma omp threadprivate ...' directive.
Definition: DeclOpenMP.h:110
ObjCEncodeExpr, used for @encode in Objective-C.
Definition: ExprObjC.h:410
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition: DeclObjC.h:2596
The basic abstraction for the target Objective-C runtime.
Definition: ObjCRuntime.h:28
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: Type.h:929
Represents a struct/union/class.
Definition: Decl.h:4169
Encodes a location in the source.
Stmt - This represents one statement.
Definition: Stmt.h:84
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1778
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3585
Exposes information about the current target.
Definition: TargetInfo.h:220
A template parameter object.
A declaration that models statements at global scope.
Definition: Decl.h:4466
The base class of the type hierarchy.
Definition: Type.h:1828
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.cpp:1916
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition: Expr.h:2232
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition: DeclCXX.h:4446
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:671
Represents a variable declaration or definition.
Definition: Decl.h:886
Defines the clang::TargetInfo interface.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
The JSON file list parser is used to communicate input to InstallAPI.
GVALinkage
A more specific kind of linkage than enum Linkage.
Definition: Linkage.h:72
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...
@ Result
The result type of a method or function.
LangAS
Defines the address space values used by the address space qualifier of QualType.
Definition: AddressSpaces.h:25
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition: Specifiers.h:278
@ Class
The "class" keyword introduces the elaborated-type-specifier.
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
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