diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h')
| -rw-r--r-- | contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h | 115 | 
1 files changed, 100 insertions, 15 deletions
| diff --git a/contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h b/contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h index a8a63c8da57f..da43b9616c88 100644 --- a/contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h +++ b/contrib/llvm-project/clang/lib/CodeGen/CodeGenModule.h @@ -85,6 +85,7 @@ class CGObjCRuntime;  class CGOpenCLRuntime;  class CGOpenMPRuntime;  class CGCUDARuntime; +class CGHLSLRuntime;  class CoverageMappingModuleGen;  class TargetCodeGenInfo; @@ -319,6 +320,7 @@ private:    std::unique_ptr<CGOpenCLRuntime> OpenCLRuntime;    std::unique_ptr<CGOpenMPRuntime> OpenMPRuntime;    std::unique_ptr<CGCUDARuntime> CUDARuntime; +  std::unique_ptr<CGHLSLRuntime> HLSLRuntime;    std::unique_ptr<CGDebugInfo> DebugInfo;    std::unique_ptr<ObjCEntrypoints> ObjCData;    llvm::MDNode *NoObjCARCExceptionsMetadata = nullptr; @@ -348,8 +350,9 @@ private:    /// is defined once we get to the end of the of the translation unit.    std::vector<GlobalDecl> Aliases; -  /// List of multiversion functions that have to be emitted.  Used to make sure -  /// we properly emit the iFunc. +  /// List of multiversion functions to be emitted. This list is processed in +  /// conjunction with other deferred symbols and is used to ensure that +  /// multiversion function resolvers and ifuncs are defined and emitted.    std::vector<GlobalDecl> MultiVersionFuncs;    typedef llvm::StringMap<llvm::TrackingVH<llvm::Constant> > ReplacementsTy; @@ -406,6 +409,8 @@ private:    llvm::StringMap<llvm::GlobalVariable *> CFConstantStringMap;    llvm::DenseMap<llvm::Constant *, llvm::GlobalVariable *> ConstantStringMap; +  llvm::DenseMap<const UnnamedGlobalConstantDecl *, llvm::GlobalVariable *> +      UnnamedGlobalConstantDeclMap;    llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap;    llvm::DenseMap<const Decl*, llvm::GlobalVariable*> StaticLocalDeclGuardMap;    llvm::DenseMap<const Expr*, llvm::Constant *> MaterializedGlobalTemporaryMap; @@ -509,6 +514,7 @@ private:    void createOpenCLRuntime();    void createOpenMPRuntime();    void createCUDARuntime(); +  void createHLSLRuntime();    bool isTriviallyRecursive(const FunctionDecl *F);    bool shouldEmitFunction(GlobalDecl GD); @@ -561,6 +567,8 @@ private:    MetadataTypeMap VirtualMetadataIdMap;    MetadataTypeMap GeneralizedMetadataIdMap; +  llvm::DenseMap<const llvm::Constant *, llvm::GlobalVariable *> RTTIProxyMap; +  public:    CodeGenModule(ASTContext &C, const HeaderSearchOptions &headersearchopts,                  const PreprocessorOptions &ppopts, @@ -607,6 +615,12 @@ public:      return *CUDARuntime;    } +  /// Return a reference to the configured HLSL runtime. +  CGHLSLRuntime &getHLSLRuntime() { +    assert(HLSLRuntime != nullptr); +    return *HLSLRuntime; +  } +    ObjCEntrypoints &getObjCEntrypoints() const {      assert(ObjCData != nullptr);      return *ObjCData; @@ -786,6 +800,14 @@ public:    void setDSOLocal(llvm::GlobalValue *GV) const; +  bool shouldMapVisibilityToDLLExport(const NamedDecl *D) const { +    return getLangOpts().hasDefaultVisibilityExportMapping() && D && +           (D->getLinkageAndVisibility().getVisibility() == +            DefaultVisibility) && +           (getLangOpts().isAllDefaultVisibilityExportMapping() || +            (getLangOpts().isExplicitDefaultVisibilityExportMapping() && +             D->getLinkageAndVisibility().isVisibilityExplicit())); +  }    void setDLLImportDLLExport(llvm::GlobalValue *GV, GlobalDecl D) const;    void setDLLImportDLLExport(llvm::GlobalValue *GV, const NamedDecl *D) const;    /// Set visibility, dllimport/dllexport and dso_local. @@ -826,7 +848,9 @@ public:    llvm::Function *CreateGlobalInitOrCleanUpFunction(        llvm::FunctionType *ty, const Twine &name, const CGFunctionInfo &FI, -      SourceLocation Loc = SourceLocation(), bool TLS = false); +      SourceLocation Loc = SourceLocation(), bool TLS = false, +      llvm::GlobalVariable::LinkageTypes Linkage = +          llvm::GlobalVariable::InternalLinkage);    /// Return the AST address space of the underlying global variable for D, as    /// determined by its declaration. Normally this is the same as the address @@ -873,6 +897,10 @@ public:    /// Get the address of a GUID.    ConstantAddress GetAddrOfMSGuidDecl(const MSGuidDecl *GD); +  /// Get the address of a UnnamedGlobalConstant +  ConstantAddress +  GetAddrOfUnnamedGlobalConstantDecl(const UnnamedGlobalConstantDecl *GCD); +    /// Get the address of a template parameter object.    ConstantAddress    GetAddrOfTemplateParamObject(const TemplateParamObjectDecl *TPO); @@ -1213,6 +1241,7 @@ public:    StringRef getMangledName(GlobalDecl GD);    StringRef getBlockMangledName(GlobalDecl GD, const BlockDecl *BD); +  const GlobalDecl getMangledNameDecl(StringRef);    void EmitTentativeDefinition(const VarDecl *D); @@ -1287,8 +1316,9 @@ public:    bool isInNoSanitizeList(SanitizerMask Kind, llvm::Function *Fn,                            SourceLocation Loc) const; -  bool isInNoSanitizeList(llvm::GlobalVariable *GV, SourceLocation Loc, -                          QualType Ty, StringRef Category = StringRef()) const; +  bool isInNoSanitizeList(SanitizerMask Kind, 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, @@ -1346,15 +1376,18 @@ public:    /// \param D The allocate declaration    void EmitOMPAllocateDecl(const OMPAllocateDecl *D); +  /// Return the alignment specified in an allocate directive, if present. +  llvm::Optional<CharUnits> getOMPAllocateAlignment(const VarDecl *VD); +    /// Returns whether the given record has hidden LTO visibility and therefore    /// may participate in (single-module) CFI and whole-program vtable    /// optimization.    bool HasHiddenLTOVisibility(const CXXRecordDecl *RD); -  /// Returns whether the given record has public std LTO visibility -  /// and therefore may not participate in (single-module) CFI and whole-program -  /// vtable optimization. -  bool HasLTOVisibilityPublicStd(const CXXRecordDecl *RD); +  /// Returns whether the given record has public LTO visibility (regardless of +  /// -lto-whole-program-visibility) and therefore may not participate in +  /// (single-module) CFI and whole-program vtable optimization. +  bool AlwaysHasLTOVisibilityPublic(const CXXRecordDecl *RD);    /// Returns the vcall visibility of the given type. This is the scope in which    /// a virtual function call could be made which ends up being dispatched to a @@ -1411,6 +1444,9 @@ public:    std::vector<const CXXRecordDecl *>    getMostBaseClasses(const CXXRecordDecl *RD); +  llvm::GlobalVariable * +  GetOrCreateRTTIProxyGlobalVariable(llvm::Constant *Addr); +    /// Get the declaration of std::terminate for the platform.    llvm::FunctionCallee getTerminateFn(); @@ -1429,7 +1465,7 @@ public:    /// \param FN is a pointer to IR function being generated.    /// \param FD is a pointer to function declaration if any.    /// \param CGF is a pointer to CodeGenFunction that generates this function. -  void GenOpenCLArgMetadata(llvm::Function *FN, +  void GenKernelArgMetadata(llvm::Function *FN,                              const FunctionDecl *FD = nullptr,                              CodeGenFunction *CGF = nullptr); @@ -1448,10 +1484,40 @@ public:    bool stopAutoInit();    /// Print the postfix for externalized static variable or kernels for single -  /// source offloading languages CUDA and HIP. +  /// source offloading languages CUDA and HIP. The unique postfix is created +  /// using either the CUID argument, or the file's UniqueID and active macros. +  /// The fallback method without a CUID requires that the offloading toolchain +  /// does not define separate macros via the -cc1 options.    void printPostfixForExternalizedDecl(llvm::raw_ostream &OS,                                         const Decl *D) const; +  /// Move some lazily-emitted states to the NewBuilder. This is especially +  /// essential for the incremental parsing environment like Clang Interpreter, +  /// because we'll lose all important information after each repl. +  void moveLazyEmissionStates(CodeGenModule *NewBuilder) { +    assert(DeferredDeclsToEmit.empty() && +           "Should have emitted all decls deferred to emit."); +    assert(NewBuilder->DeferredDecls.empty() && +           "Newly created module should not have deferred decls"); +    NewBuilder->DeferredDecls = std::move(DeferredDecls); + +    assert(NewBuilder->DeferredVTables.empty() && +           "Newly created module should not have deferred vtables"); +    NewBuilder->DeferredVTables = std::move(DeferredVTables); + +    assert(NewBuilder->MangledDeclNames.empty() && +           "Newly created module should not have mangled decl names"); +    assert(NewBuilder->Manglings.empty() && +           "Newly created module should not have manglings"); +    NewBuilder->Manglings = std::move(Manglings); + +    assert(WeakRefReferences.empty() && +           "Not all WeakRefRefs have been applied"); +    NewBuilder->WeakRefReferences = std::move(WeakRefReferences); + +    NewBuilder->TBAA = std::move(TBAA); +  } +  private:    llvm::Constant *GetOrCreateLLVMFunction(        StringRef MangledName, llvm::Type *Ty, GlobalDecl D, bool ForVTable, @@ -1459,9 +1525,18 @@ private:        llvm::AttributeList ExtraAttrs = llvm::AttributeList(),        ForDefinition_t IsForDefinition = NotForDefinition); -  llvm::Constant *GetOrCreateMultiVersionResolver(GlobalDecl GD, -                                                  llvm::Type *DeclTy, -                                                  const FunctionDecl *FD); +  // References to multiversion functions are resolved through an implicitly +  // defined resolver function. This function is responsible for creating +  // the resolver symbol for the provided declaration. The value returned +  // will be for an ifunc (llvm::GlobalIFunc) if the current target supports +  // that feature and for a regular function (llvm::GlobalValue) otherwise. +  llvm::Constant *GetOrCreateMultiVersionResolver(GlobalDecl GD); + +  // In scenarios where a function is not known to be a multiversion function +  // until a later declaration, it is sometimes necessary to change the +  // previously created mangled name to align with requirements of whatever +  // multiversion function kind the function is now known to be. This function +  // is responsible for performing such mangled name updates.    void UpdateMultiVersionNames(GlobalDecl GD, const FunctionDecl *FD,                                 StringRef &CurName); @@ -1488,7 +1563,6 @@ private:    void EmitAliasDefinition(GlobalDecl GD);    void emitIFuncDefinition(GlobalDecl GD);    void emitCPUDispatchDefinition(GlobalDecl GD); -  void EmitTargetClonesResolver(GlobalDecl GD);    void EmitObjCPropertyImplementations(const ObjCImplementationDecl *D);    void EmitObjCIvarInitializations(ObjCImplementationDecl *D); @@ -1554,6 +1628,7 @@ private:    // registered by the atexit subroutine using unatexit.    void unregisterGlobalDtorsWithUnAtExit(); +  /// Emit deferred multiversion function resolvers and associated variants.    void emitMultiVersionFunctions();    /// Emit any vtables which we deferred and still have a use for. @@ -1569,6 +1644,16 @@ private:    /// Emit the link options introduced by imported modules.    void EmitModuleLinkOptions(); +  /// Helper function for EmitStaticExternCAliases() to redirect ifuncs that +  /// have a resolver name that matches 'Elem' to instead resolve to the name of +  /// 'CppFunc'. This redirection is necessary in cases where 'Elem' has a name +  /// that will be emitted as an alias of the name bound to 'CppFunc'; ifuncs +  /// may not reference aliases. Redirection is only performed if 'Elem' is only +  /// used by ifuncs in which case, 'Elem' is destroyed. 'true' is returned if +  /// redirection is successful, and 'false' is returned otherwise. +  bool CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem, +                                    llvm::GlobalValue *CppFunc); +    /// Emit aliases for internal-linkage declarations inside "C" language    /// linkage specifications, giving them the "expected" name where possible.    void EmitStaticExternCAliases(); | 
