diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 01bbbd7371aad..af05eec0ce19f 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -2002,10 +2002,7 @@ static void getTrivialDefaultFunctionAttributes( } } -/// Adds attributes to \p F according to our \p CodeGenOpts and \p LangOpts, as -/// though we had emitted it ourselves. We remove any attributes on F that -/// conflict with the attributes we add here. -static void mergeDefaultFunctionDefinitionAttributes( +void CodeGen::mergeDefaultFunctionDefinitionAttributes( llvm::Function &F, const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, const TargetOptions &TargetOpts, bool WillInternalize) { @@ -2065,15 +2062,6 @@ static void mergeDefaultFunctionDefinitionAttributes( F.addFnAttrs(FuncAttrs); } -void clang::CodeGen::mergeDefaultFunctionDefinitionAttributes( - llvm::Function &F, const CodeGenOptions CodeGenOpts, - const LangOptions &LangOpts, const TargetOptions &TargetOpts, - bool WillInternalize) { - - ::mergeDefaultFunctionDefinitionAttributes(F, CodeGenOpts, LangOpts, - TargetOpts, WillInternalize); -} - void CodeGenModule::getTrivialDefaultFunctionAttributes( StringRef Name, bool HasOptnone, bool AttrOnCallSite, llvm::AttrBuilder &FuncAttrs) { @@ -2094,15 +2082,6 @@ void CodeGenModule::getDefaultFunctionAttributes(StringRef Name, addMergableDefaultFunctionAttributes(CodeGenOpts, FuncAttrs); } -/// Apply default attributes to \p F, accounting for merge semantics of -/// attributes that should not overwrite existing attributes. -void CodeGenModule::mergeDefaultFunctionDefinitionAttributes( - llvm::Function &F, bool WillInternalize) { - ::mergeDefaultFunctionDefinitionAttributes(F, getCodeGenOpts(), getLangOpts(), - getTarget().getTargetOpts(), - WillInternalize); -} - void CodeGenModule::addDefaultFunctionDefinitionAttributes( llvm::AttrBuilder &attrs) { getDefaultFunctionAttributes(/*function name*/ "", /*optnone*/ false, diff --git a/clang/lib/CodeGen/CGCall.h b/clang/lib/CodeGen/CGCall.h index 75c4dcc400caf..cc0b1daf338e6 100644 --- a/clang/lib/CodeGen/CGCall.h +++ b/clang/lib/CodeGen/CGCall.h @@ -395,10 +395,25 @@ class ReturnValueSlot { bool isExternallyDestructed() const { return IsExternallyDestructed; } }; -/// Helper to add attributes to \p F according to the CodeGenOptions and -/// LangOptions without requiring a CodeGenModule to be constructed. +/// Adds attributes to \p F according to our \p CodeGenOpts and \p LangOpts, 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 mergeDefaultFunctionDefinitionAttributes(llvm::Function &F, - const CodeGenOptions CodeGenOpts, + const CodeGenOptions &CodeGenOpts, const LangOptions &LangOpts, const TargetOptions &TargetOpts, bool WillInternalize); diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index c8fc068bde7bb..2dcaaac498962 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -1259,26 +1259,6 @@ class CodeGenModule : public CodeGenTypeCache { llvm::AttributeList &Attrs, unsigned &CallingConv, 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 - /// 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 mergeDefaultFunctionDefinitionAttributes(llvm::Function &F, - bool WillInternalize); - /// Like the overload taking a `Function &`, but intended specifically /// for frontends that want to build on Clang's target-configuration logic. void addDefaultFunctionDefinitionAttributes(llvm::AttrBuilder &attrs);