|
LLVM 24.0.0git
|
#include "AArch64FrameLowering.h"#include "AArch64InstrInfo.h"#include "AArch64MachineFunctionInfo.h"#include "AArch64PrologueEpilogue.h"#include "AArch64RegisterInfo.h"#include "AArch64SMEAttributes.h"#include "AArch64Subtarget.h"#include "MCTargetDesc/AArch64AddressingModes.h"#include "MCTargetDesc/AArch64MCTargetDesc.h"#include "llvm/ADT/ScopeExit.h"#include "llvm/ADT/SmallVector.h"#include "llvm/Analysis/ValueTracking.h"#include "llvm/CodeGen/CFIInstBuilder.h"#include "llvm/CodeGen/LivePhysRegs.h"#include "llvm/CodeGen/MachineBasicBlock.h"#include "llvm/CodeGen/MachineFrameInfo.h"#include "llvm/CodeGen/MachineFunction.h"#include "llvm/CodeGen/MachineInstr.h"#include "llvm/CodeGen/MachineInstrBuilder.h"#include "llvm/CodeGen/MachineMemOperand.h"#include "llvm/CodeGen/MachineModuleInfo.h"#include "llvm/CodeGen/MachineOperand.h"#include "llvm/CodeGen/MachineRegisterInfo.h"#include "llvm/CodeGen/RegisterScavenging.h"#include "llvm/CodeGen/TargetInstrInfo.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/DataLayout.h"#include "llvm/IR/DebugLoc.h"#include "llvm/IR/Function.h"#include "llvm/IR/Module.h"#include "llvm/MC/MCAsmInfo.h"#include "llvm/MC/MCDwarf.h"#include "llvm/Support/Debug.h"#include "llvm/Support/ErrorHandling.h"#include "llvm/Support/FormatVariadic.h"#include "llvm/Support/MathExtras.h"#include "llvm/Support/raw_ostream.h"#include "llvm/Target/TargetMachine.h"#include <cassert>#include <cstdint>#include <iterator>#include <optional>#include <vector>Go to the source code of this file.
Classes | |
| struct | StackAccess |
Macros | |
| #define | DEBUG_TYPE "frame-info" |
| #define | CASE(n) |
| #define | CASE(n) |
Enumerations | |
| enum class | AssignObjectOffsets { No , Yes } |
Variables | |
| static const unsigned | DefaultSafeSPDisplacement = 255 |
| This is the biggest offset to the stack pointer we can encode in aarch64 instructions (without using a separate calculation and a temp register). | |
| #define CASE | ( | n | ) |
| #define CASE | ( | n | ) |
| #define DEBUG_TYPE "frame-info" |
Definition at line 266 of file AArch64FrameLowering.cpp.
|
strong |
| Enumerator | |
|---|---|
| No | |
| Yes | |
Definition at line 314 of file AArch64FrameLowering.cpp.
| void computeCalleeSaveRegisterGroups | ( | const AArch64FrameLowering & | AFL, |
| MachineFunction & | MF, | ||
| ArrayRef< CalleeSavedInfo > | CSI, | ||
| const TargetRegisterInfo * | TRI, | ||
| SmallVectorImpl< RegGroupInfo > & | RegGroups, | ||
| bool | NeedsFrameRecord ) |
Definition at line 1733 of file AArch64FrameLowering.cpp.
References llvm::alignDown(), llvm::Aligned, llvm::alignTo(), llvm::all_of(), llvm::any_of(), assert(), llvm::SmallVectorTemplateCommon< T, typename >::begin(), CC, contains(), llvm::Count, llvm::CallingConv::CXX_FAST_TLS, llvm::ArrayRef< T >::empty(), llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::AArch64FunctionInfo::getCalleeSavedStackSize(), llvm::Function::getCallingConv(), llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getFunction(), llvm::MachineFunction::getInfo(), llvm::MachineFrameInfo::getObjectAlign(), llvm::AArch64FunctionInfo::getPPRCalleeSavedStackSize(), llvm::AArch64FunctionInfo::getPredicateRegForFillSpill(), getStackHazardSize(), llvm::MachineFunction::getSubtarget(), llvm::AArch64FunctionInfo::getZPRCalleeSavedStackSize(), llvm::AArch64FunctionInfo::hasCalleeSaveStackFreeSpace(), llvm::AArch64FunctionInfo::hasSplitSVEObjects(), llvm::AArch64FunctionInfo::hasStackHazardSlotIndex(), llvm::AArch64FrameLowering::hasSVECalleeSavesAboveFrameRecord(), llvm::AArch64FunctionInfo::hasSwiftAsyncContext(), invalidateRegisterPairing(), llvm::AArch64InstrInfo::isFpOrNEON(), isTargetWindows(), isValidMemOpOffset(), llvm_unreachable, llvm::MachineFunction::needsWinCFI(), llvm::Offset, llvm::CallingConv::PreserveAll, llvm::CallingConv::PreserveMost, produceCompactUnwindFrame(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), Reg, llvm::seq(), llvm::AArch64FunctionInfo::setCalleeSaveBaseToFrameRecordOffset(), llvm::MachineFrameInfo::setObjectAlignment(), llvm::ArrayRef< T >::size(), TII, TRI, and llvm::CallingConv::Win64.
Referenced by llvm::AArch64FrameLowering::restoreCalleeSavedRegisters(), and llvm::AArch64FrameLowering::spillCalleeSavedRegisters().
|
static |
Process all the SVE stack objects and the SVE stack size and offsets for each object.
If AssignOffsets is "Yes", the offsets get assigned (and SVE stack sizes set). Returns the size of the SVE stack.
Definition at line 3144 of file AArch64FrameLowering.cpp.
References llvm::alignTo(), assert(), llvm::dbgs(), E(), llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getInfo(), llvm::MachineFrameInfo::getObjectAlign(), llvm::MachineFrameInfo::getObjectIndexBegin(), llvm::MachineFrameInfo::getObjectIndexEnd(), llvm::MachineFrameInfo::getObjectSize(), llvm::MachineFrameInfo::getStackID(), llvm::MachineFrameInfo::getStackProtectorIndex(), getSVECalleeSaveSlotRange(), llvm::MachineFrameInfo::hasScalableStackID(), llvm::AArch64FunctionInfo::hasSplitSVEObjects(), llvm::MachineFrameInfo::hasStackProtectorIndex(), I, llvm::MachineFrameInfo::isCalleeSavedObjectIndex(), llvm::MachineFrameInfo::isDeadObjectIndex(), LLVM_DEBUG, llvm::Offset, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::report_fatal_error(), llvm::TargetStackID::ScalablePredicateVector, llvm::TargetStackID::ScalableVector, llvm::MachineFrameInfo::setObjectOffset(), llvm::AArch64FunctionInfo::setStackSizeSVE(), uint64_t, and Yes.
Referenced by llvm::AArch64FrameLowering::determineCalleeSaves(), and llvm::AArch64FrameLowering::processFunctionBeforeFrameFinalized().
| bool enableMultiVectorSpillFill | ( | const AArch64Subtarget & | Subtarget, |
| MachineFunction & | MF ) |
Definition at line 1716 of file AArch64FrameLowering.cpp.
References llvm::AArch64Subtarget::getCLOpts(), llvm::MachineFunction::getInfo(), llvm::SMEAttrs::hasStreamingBody(), llvm::SMEAttrs::hasStreamingInterface(), and llvm::AArch64Subtarget::isStreaming().
Referenced by llvm::AArch64FrameLowering::assignCalleeSavedSpillSlots(), llvm::AArch64FrameLowering::determineCalleeSaves(), llvm::AArch64FrameLowering::restoreCalleeSavedRegisters(), and llvm::AArch64FrameLowering::spillCalleeSavedRegisters().
|
static |
Look at each instruction that references stack frames and return the stack size limit beyond which some of these instructions will require a scratch register during their expansion later.
Definition at line 445 of file AArch64FrameLowering.cpp.
References llvm::AArch64FrameOffsetCannotUpdate, DefaultSafeSPDisplacement, llvm::isAArch64FrameOffsetLegal(), MBB, MI, and llvm::Offset.
Referenced by llvm::AArch64FrameLowering::determineCalleeSaves(), llvm::ARMFrameLowering::determineCalleeSaves(), and llvm::CSKYFrameLowering::determineCalleeSaves().
| MCRegister findFreePredicateReg | ( | BitVector & | SavedRegs | ) |
Definition at line 1705 of file AArch64FrameLowering.cpp.
References llvm::BitVector::test().
Referenced by llvm::AArch64FrameLowering::determineCalleeSaves().
|
static |
Definition at line 2459 of file AArch64FrameLowering.cpp.
References getMMOFrameID(), and MI.
Referenced by llvm::AArch64FrameLowering::orderFrameObjects().
|
static |
Definition at line 894 of file AArch64FrameLowering.cpp.
References llvm::MachineRegisterInfo::getCalleeSavedRegs(), llvm::MachineFunction::getRegInfo(), and MBB.
Referenced by llvm::AArch64FrameLowering::canUseAsPrologue(), and llvm::RISCVFrameLowering::findScratchNonCalleeSaveRegister().
|
static |
Definition at line 2439 of file AArch64FrameLowering.cpp.
References llvm::dyn_cast(), llvm::dyn_cast_or_null(), llvm::MachineFrameInfo::getObjectAllocation(), llvm::MachineFrameInfo::getObjectIndexBegin(), llvm::MachineFrameInfo::getObjectIndexEnd(), llvm::MachineMemOperand::getPseudoValue(), llvm::getUnderlyingObject(), and llvm::MachineMemOperand::getValue().
Referenced by getLdStFrameID().
|
static |
Definition at line 1547 of file AArch64FrameLowering.cpp.
References llvm::getKillRegState(), llvm::MachineFunction::getRegInfo(), llvm::MachineRegisterInfo::isLiveIn(), and Reg.
Referenced by llvm::AArch64FrameLowering::spillCalleeSavedRegisters().
|
static |
Definition at line 752 of file AArch64FrameLowering.cpp.
|
static |
Definition at line 321 of file AArch64FrameLowering.cpp.
References llvm::MachineFunction::getSubtarget().
Referenced by llvm::AArch64FrameLowering::assignCalleeSavedSpillSlots(), computeCalleeSaveRegisterGroups(), llvm::AArch64FrameLowering::determineCalleeSaves(), and llvm::AArch64FrameLowering::getPPRStackSize().
|
static |
returns true if there are any SVE callee saves.
Definition at line 3122 of file AArch64FrameLowering.cpp.
References assert(), contains(), llvm::MachineFrameInfo::getCalleeSavedInfo(), and llvm::MachineFrameInfo::isCalleeSavedInfoValid().
Referenced by determineSVEStackSizes().
|
static |
Returns true if Reg1 and Reg2 cannot be paired using a ldp/stp instruction.
WindowsCFI requires that only consecutive registers can be paired. LR and FP need to be allocated together when the frame needs to save the frame-record. This means any other register pairing with LR is invalid.
Definition at line 1608 of file AArch64FrameLowering.cpp.
References invalidateWindowsRegisterPairing(), and TRI.
Referenced by computeCalleeSaveRegisterGroups().
|
static |
Definition at line 1569 of file AArch64FrameLowering.cpp.
References TRI.
Referenced by invalidateRegisterPairing().
|
static |
Definition at line 345 of file AArch64FrameLowering.cpp.
References llvm::MachineFunction::getFrameInfo(), llvm::MachineFunction::getInfo(), llvm::MachineFrameInfo::getObjectIndexBegin(), llvm::MachineFrameInfo::getObjectIndexEnd(), llvm::AArch64FrameLowering::getSVEStackSize(), and llvm::MachineFrameInfo::hasScalableStackID().
|
static |
Definition at line 2468 of file AArch64FrameLowering.cpp.
References MI.
|
static |
Definition at line 363 of file AArch64FrameLowering.cpp.
References llvm::MachineFunction::getSubtarget().
Referenced by llvm::AArch64FrameLowering::assignCalleeSavedSpillSlots(), computeCalleeSaveRegisterGroups(), llvm::AArch64FrameLowering::hasSVECalleeSavesAboveFrameRecord(), orderZPRCalleeSavesForGroups(), llvm::AArch64FrameLowering::restoreCalleeSavedRegisters(), and llvm::AArch64FrameLowering::spillCalleeSavedRegisters().
|
static |
Definition at line 1627 of file AArch64FrameLowering.cpp.
References llvm::Offset, and TII.
Referenced by computeCalleeSaveRegisterGroups().
|
inlinestatic |
Definition at line 4253 of file AArch64FrameLowering.cpp.
References StackAccess::print().
|
static |
Definition at line 2913 of file AArch64FrameLowering.cpp.
References A(), llvm::alignTo(), assert(), B(), llvm::MutableArrayRef< T >::drop_until(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::MachineFunction::getInfo(), llvm::AArch64FunctionInfo::getPPRCalleeSavedStackSize(), llvm::AArch64FunctionInfo::getPredicateRegForFillSpill(), llvm::AArch64FunctionInfo::getZPRCalleeSavedStackSize(), llvm::AArch64FunctionInfo::hasSplitSVEObjects(), isTargetWindows(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Single, llvm::ArrayRef< T >::size(), and llvm::sort().
Referenced by llvm::AArch64FrameLowering::assignCalleeSavedSpillSlots().
|
static |
Definition at line 1557 of file AArch64FrameLowering.cpp.
References llvm::Function::getAttributes(), llvm::Function::getCallingConv(), llvm::MachineFunction::getFunction(), llvm::MachineFunction::getInfo(), llvm::MachineFunction::getSubtarget(), llvm::AArch64Subtarget::getTargetLowering(), llvm::AArch64FunctionInfo::isSVECC(), llvm::AArch64Subtarget::isTargetMachO(), llvm::AArch64FrameLowering::requiresSaveVG(), and llvm::CallingConv::SwiftTail.
Referenced by computeCalleeSaveRegisterGroups(), and llvm::AArch64FrameLowering::determineCalleeSaves().
This is the biggest offset to the stack pointer we can encode in aarch64 instructions (without using a separate calculation and a temp register).
Note that the exception here are vector stores/loads which cannot encode any displacements (see estimateRSStackSizeLimit(), isAArch64FrameOffsetLegal()).
Definition at line 440 of file AArch64FrameLowering.cpp.
Referenced by estimateRSStackSizeLimit(), and llvm::AArch64FrameLowering::hasFPImpl().