diff options
Diffstat (limited to 'contrib/llvm/lib/Target/TargetMachine.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/TargetMachine.cpp | 34 | 
1 files changed, 30 insertions, 4 deletions
| diff --git a/contrib/llvm/lib/Target/TargetMachine.cpp b/contrib/llvm/lib/Target/TargetMachine.cpp index 382571982b96..e7282519d597 100644 --- a/contrib/llvm/lib/Target/TargetMachine.cpp +++ b/contrib/llvm/lib/Target/TargetMachine.cpp @@ -11,12 +11,14 @@  //  //===----------------------------------------------------------------------===// -#include "llvm/GlobalAlias.h" -#include "llvm/GlobalValue.h" -#include "llvm/GlobalVariable.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/GlobalAlias.h" +#include "llvm/IR/GlobalValue.h" +#include "llvm/IR/GlobalVariable.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCCodeGenInfo.h" -#include "llvm/Target/TargetMachine.h"  #include "llvm/Support/CommandLine.h"  using namespace llvm; @@ -61,6 +63,30 @@ TargetMachine::~TargetMachine() {    delete AsmInfo;  } +/// \brief Reset the target options based on the function's attributes. +void TargetMachine::resetTargetOptions(const MachineFunction *MF) const { +  const Function *F = MF->getFunction(); +  TargetOptions &TO = MF->getTarget().Options; +   +#define RESET_OPTION(X, Y)                                              \ +  do {                                                                  \ +    if (F->hasFnAttribute(Y))                                           \ +      TO.X =                                                            \ +        (F->getAttributes().                                            \ +           getAttribute(AttributeSet::FunctionIndex,                    \ +                        Y).getValueAsString() == "true");               \ +  } while (0) + +  RESET_OPTION(NoFramePointerElim, "no-frame-pointer-elim"); +  RESET_OPTION(NoFramePointerElimNonLeaf, "no-frame-pointer-elim-non-leaf"); +  RESET_OPTION(LessPreciseFPMADOption, "less-precise-fpmad"); +  RESET_OPTION(UnsafeFPMath, "unsafe-fp-math"); +  RESET_OPTION(NoInfsFPMath, "no-infs-fp-math"); +  RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math"); +  RESET_OPTION(UseSoftFloat, "use-soft-float"); +  RESET_OPTION(DisableTailCalls, "disable-tail-calls"); +} +  /// getRelocationModel - Returns the code generation relocation model. The  /// choices are static, PIC, and dynamic-no-pic, and target default.  Reloc::Model TargetMachine::getRelocationModel() const { | 
