From: Evan Cheng Date: Tue, 6 Jun 2006 23:30:24 +0000 (+0000) Subject: Added X86FunctionInfo subclass of MachineFunction to record whether the X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e8bd0a332ab43c30a7745381075a9749070b6a50;p=oota-llvm.git Added X86FunctionInfo subclass of MachineFunction to record whether the function that is being lowered is forced to use FP. Currently this is only true for main() / Cygwin. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28703 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 8608d432738..6f20b9cf26c 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -15,6 +15,7 @@ #include "X86.h" #include "X86InstrBuilder.h" #include "X86ISelLowering.h" +#include "X86MachineFunctionInfo.h" #include "X86TargetMachine.h" #include "llvm/CallingConv.h" #include "llvm/Constants.h" @@ -3409,6 +3410,13 @@ SDOperand X86TargetLowering::LowerRET(SDOperand Op, SelectionDAG &DAG) { SDOperand X86TargetLowering::LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) { + MachineFunction &MF = DAG.getMachineFunction(); + const Function* Fn = MF.getFunction(); + if (Fn->hasExternalLinkage() && + Fn->getName() == "main" && + Subtarget->TargetType == X86Subtarget::isCygwin) + MF.getInfo()->setForceFramePointer(true); + unsigned CC = cast(Op.getOperand(1))->getValue(); if (CC == CallingConv::Fast && EnableFastCC) return LowerFastCCArguments(Op, DAG); diff --git a/lib/Target/X86/X86MachineFunctionInfo.h b/lib/Target/X86/X86MachineFunctionInfo.h new file mode 100644 index 00000000000..9da2bf901bb --- /dev/null +++ b/lib/Target/X86/X86MachineFunctionInfo.h @@ -0,0 +1,30 @@ +//====- X86MachineFuctionInfo.h - X86 machine function info -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the Evan Cheng and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file declares X86-specific per-machine-function information. +// +//===----------------------------------------------------------------------===// + +#ifndef X86MACHINEFUNCTIONINFO_H +#define X86MACHINEFUNCTIONINFO_H + +#include "llvm/CodeGen/MachineFunction.h" + +namespace llvm { + +class X86FunctionInfo : public MachineFunctionInfo { + bool ForceFramePointer; // Function requires use of frame pointer. +public: + X86FunctionInfo(MachineFunction& MF) : ForceFramePointer(false) {} + bool getForceFramePointer() const { return ForceFramePointer;} + void setForceFramePointer(bool forceFP) { ForceFramePointer = forceFP; } +}; +} // End llvm namespace + +#endif diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index ec4a24d503c..86e9151ea34 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -15,8 +15,9 @@ #include "X86.h" #include "X86RegisterInfo.h" #include "X86Subtarget.h" -#include "X86TargetMachine.h" #include "X86InstrBuilder.h" +#include "X86MachineFunctionInfo.h" +#include "X86TargetMachine.h" #include "llvm/Constants.h" #include "llvm/Type.h" #include "llvm/Function.h" @@ -638,14 +639,9 @@ X86RegisterInfo::getCalleeSaveRegClasses() const { // if frame pointer elimination is disabled. // static bool hasFP(MachineFunction &MF) { - const Function* Fn = MF.getFunction(); - const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget(); - return (NoFramePointerElim || MF.getFrameInfo()->hasVarSizedObjects() || - (Fn->hasExternalLinkage() && - Fn->getName() == "main" && - Subtarget->TargetType == X86Subtarget::isCygwin)); + MF.getInfo()->getForceFramePointer()); } void X86RegisterInfo::