LLVM
10.0.0svn
|
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RegisterScavenging.h"
#include "llvm/CodeGen/TargetFrameLowering.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/CodeGen/WinEHFuncInfo.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Pass.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <functional>
#include <limits>
#include <utility>
#include <vector>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "prologepilog" |
Typedefs | |
using | MBBVector = SmallVector< MachineBasicBlock *, 4 > |
using | StackObjSet = SmallSetVector< int, 8 > |
StackObjSet - A set of stack object indexes. More... | |
using | SavedDbgValuesMap = SmallDenseMap< MachineBasicBlock *, SmallVector< MachineInstr *, 4 >, 4 > |
Functions | |
STATISTIC (NumLeafFuncWithSpills, "Number of leaf functions with CSRs") | |
STATISTIC (NumFuncSeen, "Number of functions seen in PEI") | |
INITIALIZE_PASS_BEGIN (PEI, DEBUG_TYPE, "Prologue/Epilogue Insertion", false, false) INITIALIZE_PASS_END(PEI | |
STATISTIC (NumBytesStackSpace, "Number of bytes used for stack in all functions") | |
static void | stashEntryDbgValues (MachineBasicBlock &MBB, SavedDbgValuesMap &EntryDbgValues) |
Stash DBG_VALUEs that describe parameters and which are placed at the start of the block. More... | |
static void | assignCalleeSavedSpillSlots (MachineFunction &F, const BitVector &SavedRegs, unsigned &MinCSFrameIndex, unsigned &MaxCSFrameIndex) |
static void | updateLiveness (MachineFunction &MF) |
Helper function to update the liveness information for the callee-saved registers. More... | |
static void | insertCSRSaves (MachineBasicBlock &SaveBlock, ArrayRef< CalleeSavedInfo > CSI) |
Insert restore code for the callee-saved registers used in the function. More... | |
static void | insertCSRRestores (MachineBasicBlock &RestoreBlock, std::vector< CalleeSavedInfo > &CSI) |
Insert restore code for the callee-saved registers used in the function. More... | |
static void | AdjustStackOffset (MachineFrameInfo &MFI, int FrameIdx, bool StackGrowsDown, int64_t &Offset, unsigned &MaxAlign, unsigned Skew) |
AdjustStackOffset - Helper function used to adjust the stack frame offset. More... | |
static void | computeFreeStackSlots (MachineFrameInfo &MFI, bool StackGrowsDown, unsigned MinCSFrameIndex, unsigned MaxCSFrameIndex, int64_t FixedCSEnd, BitVector &StackBytesFree) |
Compute which bytes of fixed and callee-save stack area are unused and keep track of them in StackBytesFree. More... | |
static bool | scavengeStackSlot (MachineFrameInfo &MFI, int FrameIdx, bool StackGrowsDown, unsigned MaxAlign, BitVector &StackBytesFree) |
Assign frame object to an unused portion of the stack in the fixed stack object range. More... | |
static void | AssignProtectedObjSet (const StackObjSet &UnassignedObjs, SmallSet< int, 16 > &ProtectedObjs, MachineFrameInfo &MFI, bool StackGrowsDown, int64_t &Offset, unsigned &MaxAlign, unsigned Skew) |
AssignProtectedObjSet - Helper function to assign large stack objects (i.e., those required to be close to the Stack Protector) to stack offsets. More... | |
Variables | |
static cl::opt< unsigned > | WarnStackSize ("warn-stack-size", cl::Hidden, cl::init((unsigned) -1), cl::desc("Warn for stack size bigger than the given" " number")) |
DEBUG_TYPE | |
Prologue Epilogue Insertion &Frame | Finalization |
Prologue Epilogue Insertion &Frame | false |
#define DEBUG_TYPE "prologepilog" |
Definition at line 74 of file PrologEpilogInserter.cpp.
Referenced by stashEntryDbgValues().
using MBBVector = SmallVector<MachineBasicBlock *, 4> |
Definition at line 76 of file PrologEpilogInserter.cpp.
using SavedDbgValuesMap = SmallDenseMap<MachineBasicBlock *, SmallVector<MachineInstr *, 4>, 4> |
Definition at line 173 of file PrologEpilogInserter.cpp.
using StackObjSet = SmallSetVector<int, 8> |
StackObjSet - A set of stack object indexes.
Definition at line 170 of file PrologEpilogInserter.cpp.
|
inlinestatic |
AdjustStackOffset - Helper function used to adjust the stack frame offset.
Definition at line 634 of file PrologEpilogInserter.cpp.
References llvm::alignTo(), llvm::dbgs(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::MachineFrameInfo::getObjectSize(), LLVM_DEBUG, llvm::max(), and llvm::MachineFrameInfo::setObjectOffset().
Referenced by AssignProtectedObjSet(), and INITIALIZE_PASS().
|
static |
Definition at line 380 of file PrologEpilogInserter.cpp.
References llvm::TargetFrameLowering::assignCalleeSavedSpillSlots(), llvm::MachineFrameInfo::CreateFixedSpillStackObject(), llvm::MachineFrameInfo::CreateStackObject(), llvm::BitVector::empty(), llvm::MachineRegisterInfo::getCalleeSavedRegs(), llvm::TargetFrameLowering::getCalleeSavedSpillSlots(), llvm::MachineFunction::getFrameInfo(), llvm::TargetSubtargetInfo::getFrameLowering(), llvm::TargetRegisterInfo::getMinimalPhysRegClass(), llvm::MachineFunction::getRegInfo(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::TargetRegisterInfo::getSpillAlignment(), llvm::TargetRegisterInfo::getSpillSize(), llvm::TargetFrameLowering::getStackAlignment(), llvm::MachineFunction::getSubtarget(), llvm::TargetRegisterInfo::hasReservedSpillSlot(), llvm::TargetFrameLowering::SpillSlot::Offset, llvm::TargetFrameLowering::SpillSlot::Reg, Reg, llvm::MachineFrameInfo::setCalleeSavedInfo(), Size, and llvm::BitVector::test().
Referenced by insertCSRRestores().
|
static |
AssignProtectedObjSet - Helper function to assign large stack objects (i.e., those required to be close to the Stack Protector) to stack offsets.
Definition at line 768 of file PrologEpilogInserter.cpp.
References llvm::TargetFrameLowering::adjustForHiPEPrologue(), llvm::TargetFrameLowering::adjustForSegmentedStacks(), llvm::MachineFrameInfo::adjustsStack(), AdjustStackOffset(), llvm::alignTo(), llvm::DIExpression::ApplyOffset, assert(), llvm::SetVector< T, Vector, Set >::begin(), llvm::SmallVectorTemplateCommon< T >::begin(), llvm::MachineBasicBlock::begin(), llvm::MachineOperand::ChangeToRegister(), computeFreeStackSlots(), llvm::SmallPtrSetImpl< NodeRef >::count(), llvm::dbgs(), llvm::TargetStackID::Default, llvm::df_ext_begin(), llvm::df_ext_end(), llvm::numbers::e, E, llvm::TargetFrameLowering::eliminateCallFramePseudoInstr(), llvm::TargetRegisterInfo::eliminateFrameIndex(), llvm::TargetFrameLowering::emitEpilogue(), llvm::TargetFrameLowering::emitPrologue(), llvm::SmallVectorBase::empty(), llvm::SetVector< T, Vector, Set >::empty(), llvm::TargetFrameLowering::enableStackSlotScavenging(), llvm::SetVector< T, Vector, Set >::end(), llvm::SmallVectorTemplateCommon< T >::end(), llvm::MachineBasicBlock::end(), llvm::Function::getCallingConv(), llvm::MachineInstr::getDebugExpression(), llvm::TargetFrameLowering::getFrameIndexReference(), llvm::TargetFrameLowering::getFrameIndexReferencePreferSP(), llvm::MachineFunction::getFrameInfo(), llvm::TargetSubtargetInfo::getFrameLowering(), llvm::MachineFunction::getFunction(), llvm::MachineOperand::getImm(), llvm::MachineOperand::getIndex(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::MachineFrameInfo::getLocalFrameMaxAlign(), llvm::MachineFrameInfo::getLocalFrameObjectCount(), llvm::MachineFrameInfo::getLocalFrameObjectMap(), llvm::MachineFrameInfo::getLocalFrameSize(), llvm::MachineFrameInfo::getMaxAlignment(), llvm::MachineFrameInfo::getMaxCallFrameSize(), llvm::MachineFunction::getMMI(), llvm::MachineBasicBlock::getNumber(), llvm::MachineFunction::getNumBlockIDs(), llvm::MachineInstr::getNumOperands(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::MachineFrameInfo::getObjectIndexBegin(), llvm::MachineFrameInfo::getObjectIndexEnd(), llvm::MachineFrameInfo::getObjectOffset(), llvm::MachineFrameInfo::getObjectSize(), llvm::MachineFrameInfo::getObjectSSPLayout(), llvm::TargetFrameLowering::getOffsetOfLocalArea(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::TargetMachine::getOptLevel(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::TargetFrameLowering::getStackAlignment(), llvm::TargetFrameLowering::getStackAlignmentSkew(), llvm::TargetFrameLowering::getStackGrowthDirection(), llvm::MachineFrameInfo::getStackID(), llvm::MachineFrameInfo::getStackProtectorIndex(), llvm::MachineFunction::getSubtarget(), llvm::MachineFunction::getTarget(), llvm::TargetFrameLowering::getTransientStackAlignment(), llvm::MachineFrameInfo::getUseLocalStackAllocationBlock(), llvm::MachineFunction::getWinEHFuncInfo(), llvm::TargetFrameLowering::hasFP(), llvm::TargetFrameLowering::hasReservedCallFrame(), llvm::MachineFrameInfo::hasStackProtectorIndex(), llvm::MachineFrameInfo::hasVarSizedObjects(), llvm::CallingConv::HiPE, I, llvm::ARM_PROC::IE, if(), llvm::TargetFrameLowering::inlineStackProbe(), llvm::SetVector< T, Vector, Set >::insert(), llvm::SmallSet< T, N, C >::insert(), llvm::DIExpression::isComplex(), llvm::MachineFrameInfo::isDeadObjectIndex(), llvm::MachineInstr::isDebugValue(), llvm::MachineOperand::isFI(), llvm::TargetFrameLowering::isFPCloseToIncomingSP(), llvm::DIExpression::isImplicit(), llvm::MachineInstr::isIndirectDebugValue(), llvm::MachineFrameInfo::isObjectPreAllocated(), LLVM_DEBUG, llvm_unreachable, llvm::max(), MI, llvm::TargetFrameLowering::needsFrameIndexResolution(), llvm::TargetRegisterInfo::needsStackRealignment(), llvm::CodeGenOpt::None, llvm::TargetMachine::Options, llvm::TargetFrameLowering::orderFrameObjects(), llvm::DIExpression::prepend(), llvm::DIExpression::prependOpcodes(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), Reg, llvm::TargetRegisterInfo::requiresFrameIndexReplacementScavenging(), llvm::SmallVectorImpl< T >::resize(), scavengeStackSlot(), llvm::MachineModuleInfo::setHasNosplitStack(), llvm::MachineModuleInfo::setHasSplitStack(), llvm::MachineOperand::setImm(), llvm::MachineOperand::setIsDebug(), llvm::MachineOperand::setMetadata(), llvm::MachineFrameInfo::setObjectOffset(), llvm::MachineFrameInfo::setStackSize(), llvm::MachineFunction::shouldSplitStack(), Size, llvm::MachineFrameInfo::SSPLK_AddrOf, llvm::MachineFrameInfo::SSPLK_LargeArray, llvm::MachineFrameInfo::SSPLK_None, llvm::MachineFrameInfo::SSPLK_SmallArray, llvm::ARM_MB::ST, llvm::TargetFrameLowering::StackGrowsDown, llvm::TargetOptions::StackSymbolOrdering, llvm::DIExpression::StackValue, llvm::TargetFrameLowering::targetHandlesStackFrameRounding(), TII, TRI, llvm::TargetRegisterInfo::useFPForScavengingIndex(), and llvm::Align::value().
Referenced by INITIALIZE_PASS().
|
inlinestatic |
Compute which bytes of fixed and callee-save stack area are unused and keep track of them in StackBytesFree.
Definition at line 665 of file PrologEpilogInserter.cpp.
References llvm::TargetStackID::Default, llvm::MachineFrameInfo::getObjectIndexBegin(), llvm::MachineFrameInfo::getObjectOffset(), llvm::MachineFrameInfo::getObjectSize(), llvm::MachineFrameInfo::getStackID(), llvm::max(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::BitVector::reset(), and llvm::BitVector::resize().
Referenced by AssignProtectedObjSet().
INITIALIZE_PASS_BEGIN | ( | PEI | , |
DEBUG_TYPE | , | ||
"Prologue/Epilogue Insertion" | , | ||
false | , | ||
false | |||
) |
|
static |
Insert restore code for the callee-saved registers used in the function.
Definition at line 560 of file PrologEpilogInserter.cpp.
References assert(), assignCalleeSavedSpillSlots(), llvm::MachineBasicBlock::begin(), llvm::BuildMI(), llvm::TargetFrameLowering::determineCalleeSaves(), F(), llvm::MCInstrInfo::get(), llvm::MachineFrameInfo::getCalleeSavedInfo(), llvm::MachineBasicBlock::getFirstTerminator(), llvm::MachineFunction::getFrameInfo(), llvm::TargetSubtargetInfo::getFrameLowering(), llvm::MachineFunction::getFunction(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::getKillRegState(), llvm::TargetRegisterInfo::getMinimalPhysRegClass(), llvm::MachineBasicBlock::getParent(), llvm::MachineFunction::getProperties(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::MachineFunction::getSubtarget(), llvm::MachineFrameInfo::hasCalls(), llvm::MachineFunctionProperties::hasProperty(), I, insertCSRSaves(), llvm::TargetInstrInfo::loadRegFromStackSlot(), llvm::max(), llvm::MachineFunctionProperties::NoVRegs, Reg, llvm::TargetFrameLowering::restoreCalleeSavedRegisters(), llvm::reverse(), llvm::MachineFrameInfo::setCalleeSavedInfoValid(), TII, TRI, and updateLiveness().
|
static |
Insert restore code for the callee-saved registers used in the function.
Definition at line 533 of file PrologEpilogInserter.cpp.
References llvm::MachineBasicBlock::begin(), llvm::BuildMI(), llvm::MCInstrInfo::get(), llvm::TargetSubtargetInfo::getFrameLowering(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::getKillRegState(), llvm::TargetRegisterInfo::getMinimalPhysRegClass(), llvm::MachineBasicBlock::getParent(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::MachineFunction::getSubtarget(), I, Reg, llvm::TargetFrameLowering::spillCalleeSavedRegisters(), llvm::TargetInstrInfo::storeRegToStackSlot(), TII, and TRI.
Referenced by insertCSRRestores().
|
inlinestatic |
Assign frame object to an unused portion of the stack in the fixed stack object range.
Return true if the allocation was successful.
Definition at line 707 of file PrologEpilogInserter.cpp.
References llvm::alignTo(), llvm::BitVector::clear(), llvm::dbgs(), llvm::BitVector::find_first(), llvm::BitVector::find_next(), llvm::MachineFrameInfo::getObjectAlignment(), llvm::MachineFrameInfo::getObjectSize(), llvm::MachineFrameInfo::isVariableSizedObjectIndex(), LLVM_DEBUG, llvm::BitVector::none(), llvm::BitVector::reset(), llvm::MachineFrameInfo::setObjectOffset(), llvm::BitVector::size(), and llvm::BitVector::test().
Referenced by AssignProtectedObjSet().
|
static |
Stash DBG_VALUEs that describe parameters and which are placed at the start of the block.
Later on, after the prologue code has been emitted, the stashed DBG_VALUEs will be reinserted at the start of the block.
Definition at line 178 of file PrologEpilogInserter.cpp.
References llvm::MachineFrameInfo::adjustsStack(), assert(), llvm::MachineFunction::begin(), llvm::TargetFrameLowering::canSimplifyCallFramePseudos(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), DEBUG_TYPE, llvm::LLVMContext::diagnose(), llvm::numbers::e, E, llvm::TargetFrameLowering::eliminateCallFramePseudoInstr(), llvm::MachineFunction::end(), llvm::InlineAsm::Extra_IsAlignStack, F(), llvm::DIExpression::fragmentsOverlap(), llvm::MachineFunction::front(), llvm::TargetInstrInfo::getCallFrameDestroyOpcode(), llvm::TargetInstrInfo::getCallFrameSetupOpcode(), llvm::Function::getContext(), llvm::MachineFunction::getFrameInfo(), llvm::TargetSubtargetInfo::getFrameLowering(), llvm::TargetInstrInfo::getFrameSize(), llvm::MachineFunction::getFunction(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::MachineFrameInfo::getMaxCallFrameSize(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::MachineFrameInfo::getRestorePoint(), llvm::MachineFrameInfo::getSavePoint(), llvm::MachineFrameInfo::getStackSize(), llvm::Function::getSubprogram(), llvm::MachineFunction::getSubtarget(), llvm::MachineFunction::getTarget(), llvm::Function::hasFnAttribute(), I, llvm::TargetInstrInfo::isFrameInstr(), llvm::MachineFrameInfo::isMaxCallFrameSizeComputed(), MI, llvm::InlineAsm::MIOp_ExtraInfo, llvm::none_of(), llvm::TargetFrameLowering::processFunctionBeforeFrameFinalized(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::MachineBasicBlock::push_back(), llvm::TargetRegisterInfo::requiresFrameIndexScavenging(), llvm::TargetRegisterInfo::requiresRegisterScavenging(), llvm::scavengeFrameVirtualRegs(), llvm::MachineFrameInfo::setAdjustsStack(), llvm::MachineFrameInfo::setMaxCallFrameSize(), llvm::MachineFrameInfo::setRestorePoint(), llvm::MachineFrameInfo::setSavePoint(), Size, TII, TRI, llvm::LLVMTargetMachine::usesPhysRegsForPEI(), and WarnStackSize.
STATISTIC | ( | NumLeafFuncWithSpills | , |
"Number of leaf functions with CSRs" | |||
) |
STATISTIC | ( | NumFuncSeen | , |
"Number of functions seen in PEI" | |||
) |
|
static |
Helper function to update the liveness information for the callee-saved registers.
Definition at line 460 of file PrologEpilogInserter.cpp.
References llvm::MachineFunction::front(), llvm::MachineFunction::getFrameInfo(), and llvm::MachineFrameInfo::getSavePoint().
Referenced by insertCSRRestores().
DEBUG_TYPE |
Definition at line 150 of file PrologEpilogInserter.cpp.
Prologue Epilogue Insertion& Frame false |
Definition at line 150 of file PrologEpilogInserter.cpp.
Prologue Epilogue Insertion& Frame Finalization |
Definition at line 150 of file PrologEpilogInserter.cpp.