32 : CallingConv(CC), IsVarArg(isVarArg), MF(mf),
33 TRI(*MF.getSubtarget().getRegisterInfo()), Locs(locs),
Context(C),
52 if (MinSize > (
int)Size)
54 if (MinAlign > (
int)Align)
64 void CCState::MarkAllocated(
unsigned Reg) {
66 UsedRegs[*AI/32] |= 1 << (*AI&31);
73 for (
auto const &ValAssign : Locs) {
74 if (ValAssign.isRegLoc()) {
90 unsigned NumArgs = Ins.
size();
92 for (
unsigned i = 0;
i != NumArgs; ++
i) {
93 MVT ArgVT = Ins[
i].VT;
97 dbgs() <<
"Formal argument #" <<
i <<
" has unhandled type "
110 for (
unsigned i = 0, e = Outs.
size();
i != e; ++
i) {
124 for (
unsigned i = 0, e = Outs.
size();
i != e; ++
i) {
129 dbgs() <<
"Return operand #" <<
i <<
" has unhandled type "
141 unsigned NumOps = Outs.
size();
142 for (
unsigned i = 0;
i != NumOps; ++
i) {
143 MVT ArgVT = Outs[
i].VT;
147 dbgs() <<
"Call operand #" <<
i <<
" has unhandled type "
159 unsigned NumOps = ArgVTs.
size();
160 for (
unsigned i = 0;
i != NumOps; ++
i) {
161 MVT ArgVT = ArgVTs[
i];
165 dbgs() <<
"Call operand #" <<
i <<
" has unhandled type "
177 for (
unsigned i = 0, e = Ins.
size();
i != e; ++
i) {
182 dbgs() <<
"Call result #" <<
i <<
" has unhandled type "
194 dbgs() <<
"Call result has unhandled type "
213 unsigned SavedStackOffset = StackOffset;
214 unsigned SavedMaxStackArgAlign = MaxStackArgAlign;
215 unsigned NumLocs = Locs.size();
224 bool HaveRegParm =
true;
225 while (HaveRegParm) {
229 <<
" while computing remaining regparms\n";
233 HaveRegParm = Locs.back().isRegLoc();
237 assert(NumLocs < Locs.size() &&
"CC assignment failed to add location");
238 for (
unsigned I = NumLocs,
E = Locs.size();
I !=
E; ++
I)
239 if (Locs[
I].isRegLoc())
245 StackOffset = SavedStackOffset;
246 MaxStackArgAlign = SavedMaxStackArgAlign;
247 Locs.resize(NumLocs);
259 for (
MVT RegVT : RegParmTypes) {
276 if (CalleeCC == CallerCC)
279 CCState CCInfo1(CalleeCC,
false, MF, RVLocs1, C);
283 CCState CCInfo2(CallerCC,
false, MF, RVLocs2, C);
286 if (RVLocs1.
size() != RVLocs2.
size())
288 for (
unsigned I = 0,
E = RVLocs1.
size();
I !=
E; ++
I) {
void AnalyzeCallResult(const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn Fn)
AnalyzeCallResult - Analyze the return values of a call, incorporating info about the passed values i...
void push_back(const T &Elt)
LocInfo getLocInfo() const
Describes a register that needs to be forwarded from the prologue to a musttail call.
unsigned addLiveIn(unsigned PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
void AnalyzeFormalArguments(const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn Fn)
AnalyzeFormalArguments - Analyze an array of argument values, incorporating info about the formals in...
bool CCAssignFn(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
CCAssignFn - This function assigns a location for Val, updating State to reflect the change...
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
unsigned getByValSize() const
uint64_t alignTo(uint64_t Value, uint64_t Align, uint64_t Skew=0)
Returns the next integer (mod 2**64) that is greater than or equal to Value and is a multiple of Alig...
bool CheckReturn(const SmallVectorImpl< ISD::OutputArg > &ArgsFlags, CCAssignFn Fn)
CheckReturn - Analyze the return values of a function, returning true if the return can be performed ...
virtual void HandleByVal(CCState *, unsigned &, unsigned) const
Target-specific cleanup for formal ByVal parameters.
std::string getEVTString() const
getEVTString - This function returns value type as a string, e.g.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
struct fuzzer::@269 Flags
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void addLoc(const CCValAssign &V)
Reg
All possible values of the reg field in the ModR/M byte.
static bool isValueTypeInRegForCC(CallingConv::ID CC, MVT VT)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
unsigned getLocReg() const
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
X86_FastCall - 'fast' analog of X86_StdCall.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
static GCRegistry::Add< CoreCLRGC > E("coreclr","CoreCLR-compatible GC")
constexpr uint64_t MinAlign(uint64_t A, uint64_t B)
MinAlign - A and B are either alignments or offsets.
bool IsShadowAllocatedReg(unsigned Reg) const
A shadow allocated register is a register that was allocated but wasn't added to the location list (L...
bool isInteger() const
isInteger - Return true if this is an integer, or a vector integer type.
MVT - Machine Value Type.
This is an important class for using LLVM in a threaded context.
bool isVector() const
isVector - Return true if this is a vector value type.
MCRegAliasIterator enumerates all registers aliasing Reg.
static bool resultsCompatible(CallingConv::ID CalleeCC, CallingConv::ID CallerCC, MachineFunction &MF, LLVMContext &C, const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn CalleeFn, CCAssignFn CallerFn)
Returns true if the results of the two calling conventions are compatible.
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
EVT - Extended Value Type.
void HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, int MinSize, int MinAlign, ISD::ArgFlagsTy ArgFlags)
Allocate space on the stack large enough to pass an argument by value.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
void getRemainingRegParmsForType(SmallVectorImpl< MCPhysReg > &Regs, MVT VT, CCAssignFn Fn)
Compute the remaining unused register parameters that would be used for the given value type...
unsigned getByValAlign() const
CCState - This class holds information needed while lowering arguments and return values...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
virtual const TargetLowering * getTargetLowering() const
CCValAssign - Represent assignment of one arg/retval to a location.
CCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF, SmallVectorImpl< CCValAssign > &locs, LLVMContext &C)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack","Very portable GC for uncooperative code generators")
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
virtual const TargetRegisterClass * getRegClassFor(MVT VT) const
Return the register class that should be used for the specified value type.
void AnalyzeCallOperands(const SmallVectorImpl< ISD::OutputArg > &Outs, CCAssignFn Fn)
AnalyzeCallOperands - Analyze the outgoing arguments to a call, incorporating info about the passed v...
A utility class that uses RAII to save and restore the value of a variable.
void analyzeMustTailForwardedRegisters(SmallVectorImpl< ForwardedRegister > &Forwards, ArrayRef< MVT > RegParmTypes, CCAssignFn Fn)
Compute the set of registers that need to be preserved and forwarded to any musttail calls...
void AnalyzeReturn(const SmallVectorImpl< ISD::OutputArg > &Outs, CCAssignFn Fn)
AnalyzeReturn - Analyze the returned values of a return, incorporating info about the result values i...
LLVM_ATTRIBUTE_ALWAYS_INLINE size_type size() const
bool isAllocated(unsigned Reg) const
isAllocated - Return true if the specified register (or an alias) is allocated.
static CCValAssign getMem(unsigned ValNo, MVT ValVT, unsigned Offset, MVT LocVT, LocInfo HTP)
void clearByValRegsInfo()
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file provides utility classes that use RAII to save and restore values.
unsigned getLocMemOffset() const
unsigned AllocateStack(unsigned Size, unsigned Align)
AllocateStack - Allocate a chunk of stack space with the specified size and alignment.
This file describes how to lower LLVM code to machine code.
void ensureMaxAlignment(unsigned Align)