Index: llvm/trunk/include/llvm/CodeGen/CommandFlags.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/CommandFlags.h +++ llvm/trunk/include/llvm/CodeGen/CommandFlags.h @@ -229,8 +229,6 @@ static inline TargetOptions InitTargetOptionsFromCodeGenFlags() { TargetOptions Options; Options.LessPreciseFPMADOption = EnableFPMAD; - Options.NoFramePointerElim = DisableFPElim; - Options.NoFramePointerElimOverride = DisableFPElim.getNumOccurrences() > 0; Options.AllowFPOpFusion = FuseFPOps; Options.UnsafeFPMath = EnableUnsafeFPMath; Options.NoInfsFPMath = EnableNoInfsFPMath; @@ -288,4 +286,31 @@ return Features.getString(); } +/// \brief Set function attributes of functions in Module M based on CPU, +/// Features, and command line flags. +static inline void setFunctionAttributes(StringRef CPU, StringRef Features, + Module &M) { + for (auto &F : M) { + auto &Ctx = F.getContext(); + AttributeSet Attrs = F.getAttributes(), NewAttrs; + + if (!CPU.empty()) + NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex, + "target-cpu", CPU); + + if (!Features.empty()) + NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex, + "target-features", Features); + + if (DisableFPElim.getNumOccurrences() > 0) + NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex, + "no-frame-pointer-elim", + DisableFPElim ? "true" : "false"); + + // Let NewAttrs override Attrs. + NewAttrs = Attrs.addAttributes(Ctx, AttributeSet::FunctionIndex, NewAttrs); + F.setAttributes(NewAttrs); + } +} + #endif Index: llvm/trunk/include/llvm/Target/TargetOptions.h =================================================================== --- llvm/trunk/include/llvm/Target/TargetOptions.h +++ llvm/trunk/include/llvm/Target/TargetOptions.h @@ -60,8 +60,7 @@ class TargetOptions { public: TargetOptions() - : PrintMachineCode(false), NoFramePointerElim(false), - NoFramePointerElimOverride(false), + : PrintMachineCode(false), LessPreciseFPMADOption(false), UnsafeFPMath(false), NoInfsFPMath(false), NoNaNsFPMath(false), HonorSignDependentRoundingFPMathOption(false), @@ -81,14 +80,6 @@ /// output from the code generator. unsigned PrintMachineCode : 1; - /// NoFramePointerElim - This flag is enabled when the -disable-fp-elim is - /// specified on the command line. If the target supports the frame pointer - /// elimination optimization, this option should disable it. - unsigned NoFramePointerElim : 1; - - /// This flag is true when "disable-fp-elim" appeared on the command line. - unsigned NoFramePointerElimOverride : 1; - /// DisableFramePointerElim - This returns true if frame pointer elimination /// optimization should be disabled for the given machine function. bool DisableFramePointerElim(const MachineFunction &MF) const; @@ -227,15 +218,6 @@ MCTargetOptions MCOptions; }; -/// \brief Set function attributes of functions in Module M based on CPU, -/// Features, and Options. -/// If AlwaysRecordAttrs is true, it will always record the function attributes -/// in Options regardless of whether those attributes were specified on the -/// tool's command line. -void setFunctionAttributes(StringRef CPU, StringRef Features, - const TargetOptions &Options, Module &M, - bool AlwaysRecordAttrs); - // Comparison operators: Index: llvm/trunk/lib/CodeGen/TargetOptionsImpl.cpp =================================================================== --- llvm/trunk/lib/CodeGen/TargetOptionsImpl.cpp +++ llvm/trunk/lib/CodeGen/TargetOptionsImpl.cpp @@ -54,30 +54,3 @@ StringRef TargetOptions::getTrapFunctionName() const { return TrapFuncName; } - - -void llvm::setFunctionAttributes(StringRef CPU, StringRef Features, - const TargetOptions &Options, Module &M, - bool AlwaysRecordAttrs) { - for (auto &F : M) { - auto &Ctx = F.getContext(); - AttributeSet Attrs = F.getAttributes(), NewAttrs; - - if (!CPU.empty()) - NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex, - "target-cpu", CPU); - - if (!Features.empty()) - NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex, - "target-features", Features); - - if (Options.NoFramePointerElimOverride || AlwaysRecordAttrs) - NewAttrs = NewAttrs.addAttribute( - Ctx, AttributeSet::FunctionIndex, "no-frame-pointer-elim", - Options.NoFramePointerElim ? "true" : "false"); - - // Let NewAttrs override Attrs. - NewAttrs = Attrs.addAttributes(Ctx, AttributeSet::FunctionIndex, NewAttrs); - F.setAttributes(NewAttrs); - } -} Index: llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp =================================================================== --- llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp @@ -177,15 +177,19 @@ memcpy(&options, PassedOptions, SizeOfPassedOptions); TargetOptions targetOptions; - targetOptions.NoFramePointerElim = options.NoFramePointerElim; targetOptions.EnableFastISel = options.EnableFastISel; std::unique_ptr Mod(unwrap(M)); if (Mod) // Set function attribute "no-frame-pointer-elim" based on // NoFramePointerElim. - setFunctionAttributes(/* CPU */ "", /* Features */ "", targetOptions, *Mod, - /* AlwaysRecordAttrs */ true); + for (auto &F : *Mod) { + auto Attrs = F.getAttributes(); + auto Value = options.NoFramePointerElim ? "true" : "false"; + Attrs = Attrs.addAttribute(F.getContext(), AttributeSet::FunctionIndex, + "no-frame-pointer-elim", Value); + F.setAttributes(Attrs); + } std::string Error; EngineBuilder builder(std::move(Mod)); Index: llvm/trunk/lib/ExecutionEngine/LLVMBuild.txt =================================================================== --- llvm/trunk/lib/ExecutionEngine/LLVMBuild.txt +++ llvm/trunk/lib/ExecutionEngine/LLVMBuild.txt @@ -22,4 +22,4 @@ type = Library name = ExecutionEngine parent = Libraries -required_libraries = CodeGen Core MC Object RuntimeDyld Support +required_libraries = Core MC Object RuntimeDyld Support Index: llvm/trunk/tools/llc/llc.cpp =================================================================== --- llvm/trunk/tools/llc/llc.cpp +++ llvm/trunk/tools/llc/llc.cpp @@ -304,11 +304,9 @@ if (const DataLayout *DL = Target->getDataLayout()) M->setDataLayout(*DL); - // Override function attributes based on CPUStr, FeaturesStr, and Options. - // Pass AlwaysRecordAttrs=false as we want to override an attribute only when - // the corresponding cl::opt has been provided on llc's command line. - setFunctionAttributes(CPUStr, FeaturesStr, Options, *M, - /* AlwaysRecordAttrs */ false); + // Override function attributes based on CPUStr, FeaturesStr, and command line + // flags. + setFunctionAttributes(CPUStr, FeaturesStr, *M); if (RelaxAll.getNumOccurrences() > 0 && FileType != TargetMachine::CGFT_ObjectFile) Index: llvm/trunk/tools/opt/opt.cpp =================================================================== --- llvm/trunk/tools/opt/opt.cpp +++ llvm/trunk/tools/opt/opt.cpp @@ -396,11 +396,9 @@ std::unique_ptr TM(Machine); - // Override function attributes based on CPUStr, FeaturesStr, and Options. - // Pass AlwaysRecordAttrs=false as we want to override an attribute only when - // the corresponding cl::opt has been provided on opt's command line. - setFunctionAttributes(CPUStr, FeaturesStr, Options, *M, - /* AlwaysRecordAttrs */ false); + // Override function attributes based on CPUStr, FeaturesStr, and command line + // flags. + setFunctionAttributes(CPUStr, FeaturesStr, *M); // If the output is set to be emitted to standard out, and standard out is a // console, print out a warning message and refuse to do it. We don't