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