LLVM 20.0.0git
Macros | Typedefs | Functions | Variables
PrologEpilogInserter.cpp File Reference
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/BitVector.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/InitializePasses.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Pass.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormatVariadic.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.
 
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.
 
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.
 
static void insertCSRSaves (MachineBasicBlock &SaveBlock, ArrayRef< CalleeSavedInfo > CSI)
 Insert spill code for the callee-saved registers used in the function.
 
static void insertCSRRestores (MachineBasicBlock &RestoreBlock, std::vector< CalleeSavedInfo > &CSI)
 Insert restore code for the callee-saved registers used in the function.
 
static void AdjustStackOffset (MachineFrameInfo &MFI, int FrameIdx, bool StackGrowsDown, int64_t &Offset, Align &MaxAlign)
 AdjustStackOffset - Helper function used to adjust the stack frame offset.
 
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.
 
static bool scavengeStackSlot (MachineFrameInfo &MFI, int FrameIdx, bool StackGrowsDown, Align MaxAlign, BitVector &StackBytesFree)
 Assign frame object to an unused portion of the stack in the fixed stack object range.
 
static void AssignProtectedObjSet (const StackObjSet &UnassignedObjs, SmallSet< int, 16 > &ProtectedObjs, MachineFrameInfo &MFI, bool StackGrowsDown, int64_t &Offset, Align &MaxAlign)
 AssignProtectedObjSet - Helper function to assign large stack objects (i.e., those required to be close to the Stack Protector) to stack offsets.
 

Variables

 DEBUG_TYPE
 
Prologue Epilogue Insertion &Frame Finalization
 
Prologue Epilogue Insertion &Frame false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "prologepilog"

Definition at line 73 of file PrologEpilogInserter.cpp.

Typedef Documentation

◆ MBBVector

Definition at line 75 of file PrologEpilogInserter.cpp.

◆ SavedDbgValuesMap

Definition at line 178 of file PrologEpilogInserter.cpp.

◆ StackObjSet

using StackObjSet = SmallSetVector<int, 8>

StackObjSet - A set of stack object indexes.

Definition at line 176 of file PrologEpilogInserter.cpp.

Function Documentation

◆ AdjustStackOffset()

static void AdjustStackOffset ( MachineFrameInfo MFI,
int  FrameIdx,
bool  StackGrowsDown,
int64_t &  Offset,
Align MaxAlign 
)
inlinestatic

AdjustStackOffset - Helper function used to adjust the stack frame offset.

Definition at line 701 of file PrologEpilogInserter.cpp.

References llvm::alignTo(), llvm::dbgs(), llvm::MachineFrameInfo::getObjectAlign(), llvm::MachineFrameInfo::getObjectSize(), LLVM_DEBUG, llvm::Offset, and llvm::MachineFrameInfo::setObjectOffset().

Referenced by AssignProtectedObjSet().

◆ assignCalleeSavedSpillSlots()

static void assignCalleeSavedSpillSlots ( MachineFunction F,
const BitVector SavedRegs,
unsigned MinCSFrameIndex,
unsigned MaxCSFrameIndex 
)
static

◆ AssignProtectedObjSet()

void LocalStackSlotImpl::AssignProtectedObjSet ( const StackObjSet UnassignedObjs,
SmallSet< int, 16 > &  ProtectedObjs,
MachineFrameInfo MFI,
bool  StackGrowsDown,
int64_t &  Offset,
Align MaxAlign 
)
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 836 of file PrologEpilogInserter.cpp.

References AdjustStackOffset(), llvm::SmallSet< T, N, C >::insert(), and llvm::Offset.

◆ computeFreeStackSlots()

static void computeFreeStackSlots ( MachineFrameInfo MFI,
bool  StackGrowsDown,
unsigned  MinCSFrameIndex,
unsigned  MaxCSFrameIndex,
int64_t  FixedCSEnd,
BitVector StackBytesFree 
)
inlinestatic

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( PEI  ,
DEBUG_TYPE  ,
"Prologue/Epilogue Insertion"  ,
false  ,
false   
)

◆ insertCSRRestores()

static void insertCSRRestores ( MachineBasicBlock RestoreBlock,
std::vector< CalleeSavedInfo > &  CSI 
)
static

◆ insertCSRSaves()

static void insertCSRSaves ( MachineBasicBlock SaveBlock,
ArrayRef< CalleeSavedInfo CSI 
)
static

◆ scavengeStackSlot()

static bool scavengeStackSlot ( MachineFrameInfo MFI,
int  FrameIdx,
bool  StackGrowsDown,
Align  MaxAlign,
BitVector StackBytesFree 
)
inlinestatic

◆ stashEntryDbgValues()

static void stashEntryDbgValues ( MachineBasicBlock MBB,
SavedDbgValuesMap EntryDbgValues 
)
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 184 of file PrologEpilogInserter.cpp.

References llvm::any_of(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::DIExpression::fragmentsOverlap(), MBB, MI, llvm::none_of(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().

◆ STATISTIC() [1/3]

STATISTIC ( NumBytesStackSpace  ,
"Number of bytes used for stack in all functions"   
)

◆ STATISTIC() [2/3]

STATISTIC ( NumFuncSeen  ,
"Number of functions seen in PEI"   
)

◆ STATISTIC() [3/3]

STATISTIC ( NumLeafFuncWithSpills  ,
"Number of leaf functions with CSRs"   
)

◆ updateLiveness()

static void updateLiveness ( MachineFunction MF)
static

Variable Documentation

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 156 of file PrologEpilogInserter.cpp.

◆ false

Prologue Epilogue Insertion& Frame false

Definition at line 157 of file PrologEpilogInserter.cpp.

◆ Finalization

Prologue Epilogue Insertion& Frame Finalization

Definition at line 157 of file PrologEpilogInserter.cpp.