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