diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.h')
| -rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 100 |
1 files changed, 72 insertions, 28 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 618e2f857b07..47dc6f415b60 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -25,9 +25,10 @@ #include "clang/Basic/ABI.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/Module.h" -#include "clang/Basic/SanitizerBlacklist.h" +#include "clang/Basic/NoSanitizeList.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/XRayLists.h" +#include "clang/Lex/PreprocessorOptions.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" @@ -72,7 +73,6 @@ class VarDecl; class LangOptions; class CodeGenOptions; class HeaderSearchOptions; -class PreprocessorOptions; class DiagnosticsEngine; class AnnotateAttr; class CXXDestructorDecl; @@ -103,17 +103,17 @@ enum ForDefinition_t : bool { ForDefinition = true }; -struct OrderGlobalInits { +struct OrderGlobalInitsOrStermFinalizers { unsigned int priority; unsigned int lex_order; - OrderGlobalInits(unsigned int p, unsigned int l) + OrderGlobalInitsOrStermFinalizers(unsigned int p, unsigned int l) : priority(p), lex_order(l) {} - bool operator==(const OrderGlobalInits &RHS) const { + bool operator==(const OrderGlobalInitsOrStermFinalizers &RHS) const { return priority == RHS.priority && lex_order == RHS.lex_order; } - bool operator<(const OrderGlobalInits &RHS) const { + bool operator<(const OrderGlobalInitsOrStermFinalizers &RHS) const { return std::tie(priority, lex_order) < std::tie(RHS.priority, RHS.lex_order); } @@ -210,6 +210,9 @@ struct ObjCEntrypoints { /// void clang.arc.use(...); llvm::Function *clang_arc_use; + + /// void clang.arc.noop.use(...); + llvm::Function *clang_arc_noop_use; }; /// This class records statistics on instrumentation based profiling. @@ -308,6 +311,7 @@ private: const TargetInfo &Target; std::unique_ptr<CGCXXABI> ABI; llvm::LLVMContext &VMContext; + std::string ModuleNameHash = ""; std::unique_ptr<CodeGenTBAA> TBAA; @@ -453,7 +457,8 @@ private: /// that we don't re-emit the initializer. llvm::DenseMap<const Decl*, unsigned> DelayedCXXInitPosition; - typedef std::pair<OrderGlobalInits, llvm::Function*> GlobalInitData; + typedef std::pair<OrderGlobalInitsOrStermFinalizers, llvm::Function *> + GlobalInitData; struct GlobalInitPriorityCmp { bool operator()(const GlobalInitData &LHS, @@ -469,10 +474,26 @@ private: /// Global destructor functions and arguments that need to run on termination. /// When UseSinitAndSterm is set, it instead contains sterm finalizer /// functions, which also run on unloading a shared library. - std::vector< - std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH, llvm::Constant *>> + typedef std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH, + llvm::Constant *> + CXXGlobalDtorsOrStermFinalizer_t; + SmallVector<CXXGlobalDtorsOrStermFinalizer_t, 8> CXXGlobalDtorsOrStermFinalizers; + typedef std::pair<OrderGlobalInitsOrStermFinalizers, llvm::Function *> + StermFinalizerData; + + struct StermFinalizerPriorityCmp { + bool operator()(const StermFinalizerData &LHS, + const StermFinalizerData &RHS) const { + return LHS.first.priority < RHS.first.priority; + } + }; + + /// Global variables with sterm finalizers whose order of initialization is + /// set by init_priority attribute. + SmallVector<StermFinalizerData, 8> PrioritizedCXXStermFinalizers; + /// The complete set of modules that has been imported. llvm::SetVector<clang::Module *> ImportedModules; @@ -583,6 +604,8 @@ public: /// Return true iff an Objective-C runtime has been configured. bool hasObjCRuntime() { return !!ObjCRuntime; } + const std::string &getModuleNameHash() const { return ModuleNameHash; } + /// Return a reference to the configured OpenCL runtime. CGOpenCLRuntime &getOpenCLRuntime() { assert(OpenCLRuntime != nullptr); @@ -832,6 +855,13 @@ public: /// space, target-specific global or constant address space may be returned. LangAS GetGlobalVarAddressSpace(const VarDecl *D); + /// Return the AST address space of constant literal, which is used to emit + /// the constant literal as global variable in LLVM IR. + /// Note: This is not necessarily the address space of the constant literal + /// in AST. For address space agnostic language, e.g. C++, constant literal + /// in AST is always in default address space. + LangAS GetGlobalConstantAddressSpace() const; + /// Return the llvm::Constant for the address of the given global variable. /// If Ty is non-null and if the global doesn't exist, then it will be created /// with the specified type instead of whatever the normal requested type @@ -843,13 +873,6 @@ public: ForDefinition_t IsForDefinition = NotForDefinition); - /// Return the AST address space of string literal, which is used to emit - /// the string literal as global variable in LLVM IR. - /// Note: This is not necessarily the address space of the string literal - /// in AST. For address space agnostic language, e.g. C++, string literal - /// in AST is always in default address space. - LangAS getStringLiteralAddressSpace() const; - /// Return the address of the given function. If Ty is non-null, then this /// function will use the specified type if it has to create it. llvm::Constant *GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty = nullptr, @@ -1051,6 +1074,9 @@ public: /// Add a global to a list to be added to the llvm.compiler.used metadata. void addCompilerUsedGlobal(llvm::GlobalValue *GV); + /// Add a global to a list to be added to the llvm.compiler.used metadata. + void addUsedOrCompilerUsedGlobal(llvm::GlobalValue *GV); + /// Add a destructor and object to add to the C++ global destructor function. void AddCXXDtorEntry(llvm::FunctionCallee DtorFn, llvm::Constant *Object) { CXXGlobalDtorsOrStermFinalizers.emplace_back(DtorFn.getFunctionType(), @@ -1069,6 +1095,14 @@ public: AddGlobalDtor(StermFinalizer, Priority); } + void AddCXXPrioritizedStermFinalizerEntry(llvm::Function *StermFinalizer, + int Priority) { + OrderGlobalInitsOrStermFinalizers Key(Priority, + PrioritizedCXXStermFinalizers.size()); + PrioritizedCXXStermFinalizers.push_back( + std::make_pair(Key, StermFinalizer)); + } + /// Create or return a runtime function declaration with the specified type /// and name. If \p AssumeConvergent is true, the call will have the /// convergent attribute added. @@ -1130,7 +1164,7 @@ public: /// Set the LLVM function attributes (sext, zext, etc). void SetLLVMFunctionAttributes(GlobalDecl GD, const CGFunctionInfo &Info, - llvm::Function *F); + llvm::Function *F, bool IsThunk); /// Set the LLVM function attributes which only apply to a function /// definition. @@ -1166,7 +1200,7 @@ public: void ConstructAttributeList(StringRef Name, const CGFunctionInfo &Info, CGCalleeInfo CalleeInfo, llvm::AttributeList &Attrs, unsigned &CallingConv, - bool AttrOnCallSite); + bool AttrOnCallSite, bool IsThunk); /// Adds attributes to F according to our CodeGenOptions and LangOptions, as /// though we had emitted it ourselves. We remove any attributes on F that @@ -1264,12 +1298,11 @@ public: /// annotations are emitted during finalization of the LLVM code. void AddGlobalAnnotations(const ValueDecl *D, llvm::GlobalValue *GV); - bool isInSanitizerBlacklist(SanitizerMask Kind, llvm::Function *Fn, - SourceLocation Loc) const; + bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn, + SourceLocation Loc) const; - bool isInSanitizerBlacklist(llvm::GlobalVariable *GV, SourceLocation Loc, - QualType Ty, - StringRef Category = StringRef()) const; + bool isInNoSanitizeList(llvm::GlobalVariable *GV, SourceLocation Loc, + QualType Ty, StringRef Category = StringRef()) const; /// Imbue XRay attributes to a function, applying the always/never attribute /// lists in the process. Returns true if we did imbue attributes this way, @@ -1323,6 +1356,10 @@ public: /// \param D Requires declaration void EmitOMPRequiresDecl(const OMPRequiresDecl *D); + /// Emit a code for the allocate directive. + /// \param D The allocate declaration + void EmitOMPAllocateDecl(const OMPAllocateDecl *D); + /// Returns whether the given record has hidden LTO visibility and therefore /// may participate in (single-module) CFI and whole-program vtable /// optimization. @@ -1369,6 +1406,10 @@ public: void CreateFunctionTypeMetadataForIcall(const FunctionDecl *FD, llvm::Function *F); + /// Whether this function's return type has no side effects, and thus may + /// be trivially discarded if it is unused. + bool MayDropFunctionReturn(const ASTContext &Context, QualType ReturnType); + /// Returns whether this module needs the "all-vtables" type identifier. bool NeedAllVtablesTypeId() const; @@ -1420,6 +1461,10 @@ public: TBAAAccessInfo *TBAAInfo = nullptr); bool stopAutoInit(); + /// Print the postfix for externalized static variable for single source + /// offloading languages CUDA and HIP. + void printPostfixForExternalizedStaticVar(llvm::raw_ostream &OS) const; + private: llvm::Constant *GetOrCreateLLVMFunction( StringRef MangledName, llvm::Type *Ty, GlobalDecl D, bool ForVTable, @@ -1432,11 +1477,10 @@ private: const FunctionDecl *FD); void UpdateMultiVersionNames(GlobalDecl GD, const FunctionDecl *FD); - llvm::Constant *GetOrCreateLLVMGlobal(StringRef MangledName, - llvm::PointerType *PTy, - const VarDecl *D, - ForDefinition_t IsForDefinition - = NotForDefinition); + llvm::Constant * + GetOrCreateLLVMGlobal(StringRef MangledName, llvm::Type *Ty, + unsigned AddrSpace, const VarDecl *D, + ForDefinition_t IsForDefinition = NotForDefinition); bool GetCPUAndFeaturesAttributes(GlobalDecl GD, llvm::AttrBuilder &AttrBuilder); |
