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/MachineFrameInfo.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunction.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.
25062cd9437ff0de45e321f8ddb04f876a4fd90e33Bill Wendling  if (MF.getFunction()->hasFnAttribute("no-frame-pointer-elim-non-leaf") &&
26062cd9437ff0de45e321f8ddb04f876a4fd90e33Bill Wendling      !NoFramePointerElim) {
27b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky    const MachineFrameInfo *MFI = MF.getFrameInfo();
28b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky    return MFI->hasCalls();
29b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  }
30b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
31b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  return NoFramePointerElim;
32b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky}
33b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
34b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// LessPreciseFPMAD - This flag return true when -enable-fp-mad option
35b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// is specified on the command line.  When this flag is off(default), the
36b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// code generator is not allowed to generate mad (multiply add) if the
37b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// result is "less precise" than doing those operations individually.
38b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewyckybool TargetOptions::LessPreciseFPMAD() const {
39b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  return UnsafeFPMath || LessPreciseFPMADOption;
40b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky}
41b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
42b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// HonorSignDependentRoundingFPMath - Return true if the codegen must assume
43b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// that the rounding mode of the FPU can change from its default.
44b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewyckybool TargetOptions::HonorSignDependentRoundingFPMath() const {
45b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  return !UnsafeFPMath && HonorSignDependentRoundingFPMathOption;
46b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky}
47b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky
48b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// getTrapFunctionName - If this returns a non-empty string, this means isel
49b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// should lower Intrinsic::trap to a call to the specified function name
50b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky/// instead of an ISD::TRAP node.
51b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick LewyckyStringRef TargetOptions::getTrapFunctionName() const {
52b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky  return TrapFuncName;
53b3ffe102fe35b4e4ee595c30b54b335e653310a9Nick Lewycky}
54