//=======- X86FrameLowering.cpp - X86 Frame Information --------*- C++ -*-====////// The LLVM Compiler Infrastructure//// This file is distributed under the University of Illinois Open Source// License. See LICENSE.TXT for details.////===----------------------------------------------------------------------===////// This file contains the X86 implementation of TargetFrameLowering class.////===----------------------------------------------------------------------===//#include"X86FrameLowering.h"#include"X86InstrBuilder.h"#include"X86InstrInfo.h"#include"X86MachineFunctionInfo.h"#include"X86TargetMachine.h"#include"llvm/Function.h"#include"llvm/CodeGen/MachineFrameInfo.h"#include"llvm/CodeGen/MachineFunction.h"#include"llvm/CodeGen/MachineInstrBuilder.h"#include"llvm/CodeGen/MachineModuleInfo.h"#include"llvm/CodeGen/MachineRegisterInfo.h"#include"llvm/MC/MCAsmInfo.h"#include"llvm/MC/MCSymbol.h"#include"llvm/Target/TargetData.h"#include"llvm/Target/TargetOptions.h"#include"llvm/Support/CommandLine.h"#include"llvm/ADT/SmallSet.h"usingnamespacellvm;// FIXME: completely move here.externcl::opt<bool>ForceStackAlign;boolX86FrameLowering::hasReservedCallFrame(constMachineFunction&MF)const{return!MF.getFrameInfo()->hasVarSizedObjects();}/// hasFP - Return true if the specified function should have a dedicated frame/// pointer register. This is true if the function has variable sized allocas/// or if frame pointer elimination is disabled.boolX86FrameLowering::hasFP(constMachineFunction&MF)const{constMachineFrameInfo*MFI=MF.getFrameInfo();constMachineModuleInfo&MMI=MF.getMMI();constTargetRegisterInfo*RI=TM.getRegisterInfo();return(DisableFramePointerElim(MF)||RI->needsStackRealignment(MF)||MFI->hasVarSizedObjects()||MFI->isFrameAddressTaken()||MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer()||MMI.callsUnwindInit());}staticunsignedgetSUBriOpcode(unsignedis64Bit,int64_tImm){if(is64Bit){if(isInt<8>(Imm))returnX86::SUB64ri8;returnX86::SUB64ri32;}else{if(isInt<8>(Imm))returnX86::SUB32ri8;returnX86::SUB32ri;}}staticunsignedgetADDriOpcode(unsignedis64Bit,int64_tImm){if(is64Bit){if(isInt<8>(Imm))returnX86::ADD64ri8;returnX86::ADD64ri32;}else{if(isInt<8>(Imm))returnX86::ADD32ri8;returnX86::ADD32ri;<