diff options
Diffstat (limited to 'lib/CodeGen/CodeGenModule.h')
| -rw-r--r-- | lib/CodeGen/CodeGenModule.h | 63 | 
1 files changed, 50 insertions, 13 deletions
| diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index 36f6785fd1b9..d0b2dd717c8c 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -28,6 +28,7 @@  #include "clang/Basic/LangOptions.h"  #include "clang/Basic/Module.h"  #include "clang/Basic/SanitizerBlacklist.h" +#include "clang/Basic/XRayLists.h"  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/SetVector.h"  #include "llvm/ADT/SmallPtrSet.h" @@ -546,6 +547,10 @@ public:      return *ObjCData;    } +  // Version checking function, used to implement ObjC's @available: +  // i32 @__isOSVersionAtLeast(i32, i32, i32) +  llvm::Constant *IsOSVersionAtLeastFn = nullptr; +    InstrProfStats &getPGOStats() { return PGOStats; }    llvm::IndexedInstrProfReader *getPGOReader() const { return PGOReader.get(); } @@ -906,14 +911,13 @@ public:    /// Create a new runtime function with the specified type and name.    llvm::Constant *    CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, -                        llvm::AttributeSet ExtraAttrs = llvm::AttributeSet(), +                        llvm::AttributeList ExtraAttrs = llvm::AttributeList(),                          bool Local = false);    /// Create a new compiler builtin function with the specified type and name. -  llvm::Constant *CreateBuiltinFunction(llvm::FunctionType *Ty, -                                        StringRef Name, -                                        llvm::AttributeSet ExtraAttrs = -                                          llvm::AttributeSet()); +  llvm::Constant * +  CreateBuiltinFunction(llvm::FunctionType *Ty, StringRef Name, +                        llvm::AttributeList ExtraAttrs = llvm::AttributeList());    /// Create a new runtime global variable with the specified type and name.    llvm::Constant *CreateRuntimeVariable(llvm::Type *Ty,                                          StringRef Name); @@ -1022,6 +1026,25 @@ public:                                CGCalleeInfo CalleeInfo, AttributeListType &PAL,                                unsigned &CallingConv, bool AttrOnCallSite); +  /// Adds attributes to F according to our CodeGenOptions and LangOptions, as +  /// though we had emitted it ourselves.  We remove any attributes on F that +  /// conflict with the attributes we add here. +  /// +  /// This is useful for adding attrs to bitcode modules that you want to link +  /// with but don't control, such as CUDA's libdevice.  When linking with such +  /// a bitcode library, you might want to set e.g. its functions' +  /// "unsafe-fp-math" attribute to match the attr of the functions you're +  /// codegen'ing.  Otherwise, LLVM will interpret the bitcode module's lack of +  /// unsafe-fp-math attrs as tantamount to unsafe-fp-math=false, and then LLVM +  /// will propagate unsafe-fp-math=false up to every transitive caller of a +  /// function in the bitcode library! +  /// +  /// With the exception of fast-math attrs, this will only make the attributes +  /// on the function more conservative.  But it's unsafe to call this on a +  /// function which relies on particular fast-math attributes for correctness. +  /// It's up to you to ensure that this is safe. +  void AddDefaultFnAttrs(llvm::Function &F); +    // Fills in the supplied string map with the set of target features for the    // passed in function.    void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap, @@ -1103,6 +1126,12 @@ public:                                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, +  /// false otherwise. +  bool imbueXRayAttrs(llvm::Function *Fn, SourceLocation Loc, +                      StringRef Category = StringRef()) const; +    SanitizerMetadata *getSanitizerMetadata() {      return SanitizerMD.get();    } @@ -1176,7 +1205,7 @@ public:    void AddVTableTypeMetadata(llvm::GlobalVariable *VTable, CharUnits Offset,                               const CXXRecordDecl *RD); -  /// \breif Get the declaration of std::terminate for the platform. +  /// \brief Get the declaration of std::terminate for the platform.    llvm::Constant *getTerminateFn();    llvm::SanitizerStatReport &getSanStats(); @@ -1190,12 +1219,11 @@ public:    llvm::Constant *getNullPointer(llvm::PointerType *T, QualType QT);  private: -  llvm::Constant * -  GetOrCreateLLVMFunction(StringRef MangledName, llvm::Type *Ty, GlobalDecl D, -                          bool ForVTable, bool DontDefer = false, -                          bool IsThunk = false, -                          llvm::AttributeSet ExtraAttrs = llvm::AttributeSet(), -                          ForDefinition_t IsForDefinition = NotForDefinition); +  llvm::Constant *GetOrCreateLLVMFunction( +      StringRef MangledName, llvm::Type *Ty, GlobalDecl D, bool ForVTable, +      bool DontDefer = false, bool IsThunk = false, +      llvm::AttributeList ExtraAttrs = llvm::AttributeList(), +      ForDefinition_t IsForDefinition = NotForDefinition);    llvm::Constant *GetOrCreateLLVMGlobal(StringRef MangledName,                                          llvm::PointerType *PTy, @@ -1222,7 +1250,6 @@ private:    void EmitDeclContext(const DeclContext *DC);    void EmitLinkageSpec(const LinkageSpecDecl *D); -  void CompleteDIClassType(const CXXMethodDecl* D);    /// \brief Emit the function that initializes C++ thread_local variables.    void EmitCXXThreadLocalInitFunc(); @@ -1266,6 +1293,10 @@ private:    /// Emit any vtables which we deferred and still have a use for.    void EmitDeferredVTables(); +  /// Emit a dummy function that reference a CoreFoundation symbol when +  /// @available is used on Darwin. +  void emitAtAvailableLinkGuard(); +    /// Emit the llvm.used and llvm.compiler.used metadata.    void emitLLVMUsed(); @@ -1304,6 +1335,12 @@ private:    /// Check whether we can use a "simpler", more core exceptions personality    /// function.    void SimplifyPersonality(); + +  /// Helper function for ConstructAttributeList and AddDefaultFnAttrs. +  /// Constructs an AttrList for a function with the given properties. +  void ConstructDefaultFnAttrList(StringRef Name, bool HasOptnone, +                                  bool AttrOnCallSite, +                                  llvm::AttrBuilder &FuncAttrs);  };  }  // end namespace CodeGen  }  // end namespace clang | 
