TargetOptionsImpl.cpp revision f245ae5a4a78d5a02b3b9e2dae819077a56d81e7
1028700f544deeea423ce9b516e190e4e970e3c6cNick Lewycky//===-- TargetOptionsImpl.cpp - Options that apply to all targets ----------==//
2b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky//
3b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky//                     The LLVM Compiler Infrastructure
4b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky//
5b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky// This file is distributed under the University of Illinois Open Source
6b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky// License. See LICENSE.TXT for details.
7b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky//
8b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky//===----------------------------------------------------------------------===//
9b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky//
10b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky// This file implements the methods in the TargetOptions.
11b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky//
12b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky//===----------------------------------------------------------------------===//
13b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
14f245ae5a4a78d5a02b3b9e2dae819077a56d81e7Bill Wendling#include "llvm/IR/Function.h"
15b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky#include "llvm/CodeGen/MachineFunction.h"
16b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky#include "llvm/CodeGen/MachineFrameInfo.h"
17b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky#include "llvm/Target/TargetOptions.h"
18b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewyckyusing namespace llvm;
19b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
20b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// DisableFramePointerElim - This returns true if frame pointer elimination
21b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// optimization should be disabled for the given machine function.
22b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewyckybool TargetOptions::DisableFramePointerElim(const MachineFunction &MF) const {
23b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  // Check to see if we should eliminate non-leaf frame pointers and then
24b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  // check to see if we should eliminate all frame pointers.
25f245ae5a4a78d5a02b3b9e2dae819077a56d81e7Bill Wendling  bool NoFramePointerElimNonLeaf =
26f245ae5a4a78d5a02b3b9e2dae819077a56d81e7Bill Wendling    MF.getFunction()->getFnAttribute("no-frame-pointer-elim-non-leaf")
27f245ae5a4a78d5a02b3b9e2dae819077a56d81e7Bill Wendling      .getValueAsString() == "true";
28b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  if (NoFramePointerElimNonLeaf && !NoFramePointerElim) {
29b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky    const MachineFrameInfo *MFI = MF.getFrameInfo();
30b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky    return MFI->hasCalls();
31b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  }
32b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
33b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  return NoFramePointerElim;
34b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky}
35b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
36b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// LessPreciseFPMAD - This flag return true when -enable-fp-mad option
37b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// is specified on the command line.  When this flag is off(default), the
38b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// code generator is not allowed to generate mad (multiply add) if the
39b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// result is "less precise" than doing those operations individually.
40b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewyckybool TargetOptions::LessPreciseFPMAD() const {
41b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  return UnsafeFPMath || LessPreciseFPMADOption;
42b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky}
43b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
44b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// HonorSignDependentRoundingFPMath - Return true if the codegen must assume
45b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// that the rounding mode of the FPU can change from its default.
46b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewyckybool TargetOptions::HonorSignDependentRoundingFPMath() const {
47b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  return !UnsafeFPMath && HonorSignDependentRoundingFPMathOption;
48b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky}
49b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
50b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// getTrapFunctionName - If this returns a non-empty string, this means isel
51b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// should lower Intrinsic::trap to a call to the specified function name
52b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// instead of an ISD::TRAP node.
53b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick LewyckyStringRef TargetOptions::getTrapFunctionName() const {
54b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  return TrapFuncName;
55b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky}
56