clang: include/clang/CodeGen/CGFunctionInfo.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef LLVM_CLANG_CODEGEN_CGFUNCTIONINFO_H
16#define LLVM_CLANG_CODEGEN_CGFUNCTIONINFO_H
17
22#include "llvm/IR/DerivedTypes.h"
23#include "llvm/ADT/FoldingSet.h"
24#include "llvm/Support/TrailingObjects.h"
25#include
26
29
30
31
33public:
35
36
37
38
39
40
42
43
44
46
47
48
50
51
52
53
54
55
56
57
58
59
60
61
63
64
65
67
68
69
70
71
73
74
75
76
77
79
80
81
82
84
85
86
87
88
89
93 };
94
95private:
96 llvm::Type *TypeData;
97 union {
100 };
101 struct DirectAttrInfo {
102 unsigned Offset;
103 unsigned Align;
104 };
105 struct IndirectAttrInfo {
106 unsigned Align;
107 unsigned AddrSpace;
108 };
109 union {
110 DirectAttrInfo DirectAttr;
113 };
114 Kind TheKind;
115 bool PaddingInReg : 1;
116 bool InAllocaSRet : 1;
117 bool InAllocaIndirect : 1;
118 bool IndirectByVal : 1;
119 bool IndirectRealign : 1;
120 bool SRetAfterThis : 1;
121 bool InReg : 1;
122 bool CanBeFlattened: 1;
123 bool SignExt : 1;
124 bool ZeroExt : 1;
125
126 bool canHavePaddingType() const {
129 }
130 void setPaddingType(llvm::Type *T) {
131 assert(canHavePaddingType());
133 }
134
135 void setUnpaddedCoerceToType(llvm::Type *T) {
138 }
139
140public:
147
149 llvm::Type *Padding = nullptr,
150 bool CanBeFlattened = true, unsigned Align = 0) {
152 AI.setCoerceToType(T);
153 AI.setPaddingType(Padding);
154 AI.setDirectOffset(Offset);
155 AI.setDirectAlign(Align);
156 AI.setCanBeFlattened(CanBeFlattened);
157 return AI;
158 }
161 AI.setInReg(true);
162 return AI;
163 }
164
168 AI.setCoerceToType(T);
169 AI.setPaddingType(nullptr);
170 AI.setDirectOffset(0);
171 AI.setDirectAlign(0);
172 AI.setSignExt(true);
173 return AI;
174 }
175
179 AI.setCoerceToType(T);
180 AI.setPaddingType(nullptr);
181 AI.setDirectOffset(0);
182 AI.setDirectAlign(0);
183 AI.setZeroExt(true);
184 return AI;
185 }
186
187
188
195
196
199 AI.setCoerceToType(T);
200 AI.setPaddingType(nullptr);
201 AI.setDirectOffset(0);
202 AI.setDirectAlign(0);
203 return AI;
204 }
205
208 AI.setInReg(true);
209 return AI;
210 }
215 bool ByVal = true, bool Realign = false,
216 llvm::Type *Padding = nullptr) {
218 AI.setIndirectAlign(Alignment);
219 AI.setIndirectByVal(ByVal);
220 AI.setIndirectRealign(Realign);
221 AI.setSRetAfterThis(false);
222 AI.setPaddingType(Padding);
223 AI.setIndirectAddrSpace(AddrSpace);
224 return AI;
225 }
226
227
229 bool Realign = false,
230 llvm::Type *Padding = nullptr) {
232 AI.setIndirectAlign(Alignment);
233 AI.setIndirectRealign(Realign);
234 AI.setPaddingType(Padding);
235 AI.setIndirectAddrSpace(AddrSpace);
236 return AI;
237 }
238
240 bool Realign = false) {
241 auto AI = getIndirect(Alignment, 0, ByVal, Realign);
242 AI.setInReg(true);
243 return AI;
244 }
247 AI.setInAllocaFieldIndex(FieldIndex);
248 AI.setInAllocaIndirect(Indirect);
249 return AI;
250 }
253 AI.setPaddingType(nullptr);
254 return AI;
255 }
257 llvm::Type *Padding) {
259 AI.setPaddingInReg(PaddingInReg);
260 AI.setPaddingType(Padding);
261 return AI;
262 }
263
264
265
266
268 llvm::Type *unpaddedCoerceToType) {
269#ifndef NDEBUG
270
271
272
273 auto unpaddedStruct = dyn_castllvm::StructType(unpaddedCoerceToType);
274 assert(!unpaddedStruct || unpaddedStruct->getNumElements() != 1);
275
276
277
278 unsigned unpaddedIndex = 0;
279 for (auto eltType : coerceToType->elements()) {
281 continue;
282 unpaddedIndex++;
283 }
284
285
286 if (unpaddedStruct) {
287 assert(unpaddedStruct->getNumElements() == unpaddedIndex);
288 } else {
289 assert(unpaddedIndex == 1);
290 }
291#endif
292
294 AI.setCoerceToType(coerceToType);
295 AI.setUnpaddedCoerceToType(unpaddedCoerceToType);
296 return AI;
297 }
298
300 unsigned Offset = 0,
301 llvm::Type *Padding = nullptr,
302 bool CanBeFlattened = true,
303 unsigned Align = 0) {
305 AI.setCoerceToType(T);
306 AI.setPaddingType(Padding);
307 AI.setDirectOffset(Offset);
308 AI.setDirectAlign(Align);
309 AI.setCanBeFlattened(CanBeFlattened);
310 return AI;
311 }
312
314 return eltType->isArrayTy() &&
315 eltType->getArrayElementType()->isIntegerTy(8);
316 }
317
328
333
334
337 "Not a direct or extend or target specific kind");
339 }
342 "Not a direct or extend or target specific kind");
344 }
345
348 "Not a direct or extend or target specific kind");
350 }
353 "Not a direct or extend or target specific kind");
355 }
356
358 assert(isExtend() && (SignExt + ZeroExt <= 1) && "Invalid kind / flags!");
359 return SignExt;
360 }
362 assert(isExtend() && "Invalid kind!");
363 SignExt = SExt;
364 }
365
367 assert(isExtend() && (SignExt + ZeroExt <= 1) && "Invalid kind / flags!");
368 return ZeroExt;
369 }
371 assert(isExtend() && "Invalid kind!");
372 ZeroExt = ZExt;
373 }
374
376 assert(isExtend() && (SignExt + ZeroExt <= 1) && "Invalid kind / flags!");
377 return !SignExt && !ZeroExt;
378 }
379
381 return (canHavePaddingType() ? PaddingType : nullptr);
382 }
383
385 return PaddingInReg;
386 }
388 PaddingInReg = PIR;
389 }
390
393 return TypeData;
394 }
395
400
405
410
413 if (auto structTy =
415 return structTy->elements();
416 } else {
418 }
419 }
420
423 "Invalid kind!");
424 return InReg;
425 }
426
429 "Invalid kind!");
430 InReg = IR;
431 }
432
433
442
444 assert(isIndirect() && "Invalid kind!");
445 return IndirectByVal;
446 }
448 assert(isIndirect() && "Invalid kind!");
449 IndirectByVal = IBV;
450 }
451
456
461
464 return IndirectRealign;
465 }
468 IndirectRealign = IR;
469 }
470
472 assert(isIndirect() && "Invalid kind!");
473 return SRetAfterThis;
474 }
476 assert(isIndirect() && "Invalid kind!");
477 SRetAfterThis = AfterThis;
478 }
479
481 assert(isInAlloca() && "Invalid kind!");
483 }
485 assert(isInAlloca() && "Invalid kind!");
487 }
488
490 assert(isInAlloca() && "Invalid kind!");
491 return InAllocaIndirect;
492 }
494 assert(isInAlloca() && "Invalid kind!");
496 }
497
498
499
501 assert(isInAlloca() && "Invalid kind!");
502 return InAllocaSRet;
503 }
504
506 assert(isInAlloca() && "Invalid kind!");
507 InAllocaSRet = SRet;
508 }
509
512 return CanBeFlattened;
513 }
514
517 CanBeFlattened = Flatten;
518 }
519
520 void dump() const;
521};
522
523
524
526
527
528 unsigned NumRequired;
529public:
531
534 assert(n != ~0U);
535 }
536
537
538
539
540
541
543 unsigned additional) {
545
547 additional += llvm::count_if(
550 return ExtInfo.hasPassObjectSize();
551 });
552
554 }
555
557 unsigned additional) {
559 }
560
564
568
572 return NumRequired;
573 }
574
575
577 return argIdx == ~0U || argIdx < NumRequired;
578 }
579
582 if (value == ~0U) return All;
584 }
585};
586
587
588
593
594
595
596class CGFunctionInfo final
597 : public llvm::FoldingSetNode,
598 private llvm::TrailingObjects<CGFunctionInfo, CGFunctionInfoArgInfo,
599 FunctionProtoType::ExtParameterInfo> {
602
603
604
605 unsigned CallingConvention : 8;
606
607
608
609 unsigned EffectiveCallingConvention : 8;
610
611
613 unsigned ASTCallingConvention : 6;
614
615
616 LLVM_PREFERRED_TYPE(bool)
617 unsigned InstanceMethod : 1;
618
619
620 LLVM_PREFERRED_TYPE(bool)
621 unsigned ChainCall : 1;
622
623
624
625 LLVM_PREFERRED_TYPE(bool)
626 unsigned DelegateCall : 1;
627
628
629 LLVM_PREFERRED_TYPE(bool)
630 unsigned CmseNSCall : 1;
631
632
633 LLVM_PREFERRED_TYPE(bool)
634 unsigned NoReturn : 1;
635
636
637 LLVM_PREFERRED_TYPE(bool)
638 unsigned ReturnsRetained : 1;
639
640
641 LLVM_PREFERRED_TYPE(bool)
642 unsigned NoCallerSavedRegs : 1;
643
644
645 LLVM_PREFERRED_TYPE(bool)
646 unsigned HasRegParm : 1;
647 unsigned RegParm : 3;
648
649
650 LLVM_PREFERRED_TYPE(bool)
651 unsigned NoCfCheck : 1;
652
653
654 unsigned MaxVectorWidth : 4;
655
657
658
659
660 llvm::StructType *ArgStruct;
661 unsigned ArgStructAlign : 31;
662 LLVM_PREFERRED_TYPE(bool)
663 unsigned HasExtParameterInfos : 1;
664
665 unsigned NumArgs;
666
667 ArgInfo *getArgsBuffer() {
668 return getTrailingObjects();
669 }
670 const ArgInfo *getArgsBuffer() const {
671 return getTrailingObjects();
672 }
673
674 ExtParameterInfo *getExtParameterInfosBuffer() {
675 return getTrailingObjects();
676 }
677 const ExtParameterInfo *getExtParameterInfosBuffer() const{
678 return getTrailingObjects();
679 }
680
682
683public:
684 static CGFunctionInfo *
685 create(unsigned llvmCC, bool instanceMethod, bool chainCall,
689 void operator delete(void *p) { ::operator delete(p); }
690
691
692
695 return NumArgs + 1;
696 }
698 return (HasExtParameterInfos ? NumArgs : 0);
699 }
700
703
710
715
716 unsigned arg_size() const { return NumArgs; }
717
718 bool isVariadic() const { return Required.allowsOptionalArgs(); }
723
725
727
729
731
733
734
735
737
738
740
741
743
744
745
749
750
751
753
754
755
757 return EffectiveCallingConvention;
758 }
760 EffectiveCallingConvention = Value;
761 }
762
765
772
774
777
779 if (!HasExtParameterInfos) return {};
780 return llvm::ArrayRef(getExtParameterInfosBuffer(), NumArgs);
781 }
783 assert(argIndex <= NumArgs);
784 if (!HasExtParameterInfos) return ExtParameterInfo();
786 }
787
788
790
791
792 llvm::StructType *getArgStruct() const { return ArgStruct; }
797 ArgStruct = Ty;
799 }
800
801
803 return MaxVectorWidth ? 1U << (MaxVectorWidth - 1) : 0;
804 }
805
806
808 assert(llvm::isPowerOf2_32(Width) && "Expected power of 2 vector");
809 MaxVectorWidth = llvm::countr_zero(Width) + 1;
810 }
811
812 void Profile(llvm::FoldingSetNodeID &ID) {
814 ID.AddBoolean(InstanceMethod);
815 ID.AddBoolean(ChainCall);
816 ID.AddBoolean(DelegateCall);
817 ID.AddBoolean(NoReturn);
818 ID.AddBoolean(ReturnsRetained);
819 ID.AddBoolean(NoCallerSavedRegs);
820 ID.AddBoolean(HasRegParm);
821 ID.AddInteger(RegParm);
822 ID.AddBoolean(NoCfCheck);
823 ID.AddBoolean(CmseNSCall);
824 ID.AddInteger(Required.getOpaqueData());
825 ID.AddBoolean(HasExtParameterInfos);
826 if (HasExtParameterInfos) {
828 ID.AddInteger(paramInfo.getOpaqueValue());
829 }
831 for (const auto &I : arguments())
832 I.type.Profile(ID);
833 }
834 static void Profile(llvm::FoldingSetNodeID &ID, bool InstanceMethod,
840 ID.AddInteger(info.getCC());
841 ID.AddBoolean(InstanceMethod);
842 ID.AddBoolean(ChainCall);
852 ID.AddBoolean(!paramInfos.empty());
853 if (!paramInfos.empty()) {
854 for (auto paramInfo : paramInfos)
855 ID.AddInteger(paramInfo.getOpaqueValue());
856 }
858 for (const CanQualType &argType : argTypes)
859 argType.Profile(ID);
860 }
861};
862
863}
864}
865
866#endif
C Language Family Type Representation.
Represents a canonical, potentially-qualified type.
void Profile(llvm::FoldingSetNodeID &ID) const
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
ABIArgInfo - Helper class to encapsulate information about how a specific C type should be passed to ...
Definition CGFunctionInfo.h:32
bool isIndirect() const
Definition CGFunctionInfo.h:323
void setZeroExt(bool ZExt)
Definition CGFunctionInfo.h:370
unsigned getInAllocaFieldIndex() const
Definition CGFunctionInfo.h:480
void setIndirectAddrSpace(unsigned AddrSpace)
Definition CGFunctionInfo.h:457
bool isExpand() const
Definition CGFunctionInfo.h:325
static ABIArgInfo getNoExtend(llvm::IntegerType *T)
Definition CGFunctionInfo.h:197
bool getIndirectByVal() const
Definition CGFunctionInfo.h:443
llvm::StructType * getCoerceAndExpandType() const
Definition CGFunctionInfo.h:401
bool getIndirectRealign() const
Definition CGFunctionInfo.h:462
static ABIArgInfo getInAlloca(unsigned FieldIndex, bool Indirect=false)
Definition CGFunctionInfo.h:245
static ABIArgInfo getIgnore()
Definition CGFunctionInfo.h:211
static ABIArgInfo getExpand()
Definition CGFunctionInfo.h:251
Kind getKind() const
Definition CGFunctionInfo.h:318
void setCoerceToType(llvm::Type *T)
Definition CGFunctionInfo.h:396
llvm::Type * getUnpaddedCoerceAndExpandType() const
Definition CGFunctionInfo.h:406
bool isNoExt() const
Definition CGFunctionInfo.h:375
bool getCanBeFlattened() const
Definition CGFunctionInfo.h:510
unsigned getDirectOffset() const
Definition CGFunctionInfo.h:335
static bool isPaddingForCoerceAndExpand(llvm::Type *eltType)
Definition CGFunctionInfo.h:313
void setDirectOffset(unsigned Offset)
Definition CGFunctionInfo.h:340
static ABIArgInfo getTargetSpecific(llvm::Type *T=nullptr, unsigned Offset=0, llvm::Type *Padding=nullptr, bool CanBeFlattened=true, unsigned Align=0)
Definition CGFunctionInfo.h:299
void setPaddingInReg(bool PIR)
Definition CGFunctionInfo.h:387
bool getInAllocaSRet() const
Return true if this field of an inalloca struct should be returned to implement a struct return calli...
Definition CGFunctionInfo.h:500
void setIndirectAlign(CharUnits IA)
Definition CGFunctionInfo.h:438
llvm::Type * getPaddingType() const
Definition CGFunctionInfo.h:380
void setIndirectByVal(bool IBV)
Definition CGFunctionInfo.h:447
static ABIArgInfo getExtendInReg(QualType Ty, llvm::Type *T=nullptr)
Definition CGFunctionInfo.h:206
bool getPaddingInReg() const
Definition CGFunctionInfo.h:384
static ABIArgInfo getExpandWithPadding(bool PaddingInReg, llvm::Type *Padding)
Definition CGFunctionInfo.h:256
unsigned getDirectAlign() const
Definition CGFunctionInfo.h:346
unsigned getIndirectAddrSpace() const
Definition CGFunctionInfo.h:452
ABIArgInfo(Kind K=Direct)
Definition CGFunctionInfo.h:141
bool isDirect() const
Definition CGFunctionInfo.h:319
static ABIArgInfo getIndirectInReg(CharUnits Alignment, bool ByVal=true, bool Realign=false)
Definition CGFunctionInfo.h:239
void setIndirectRealign(bool IR)
Definition CGFunctionInfo.h:466
static ABIArgInfo getDirect(llvm::Type *T=nullptr, unsigned Offset=0, llvm::Type *Padding=nullptr, bool CanBeFlattened=true, unsigned Align=0)
Definition CGFunctionInfo.h:148
void setInReg(bool IR)
Definition CGFunctionInfo.h:427
Kind
Definition CGFunctionInfo.h:34
@ Extend
Extend - Valid only for integer argument types.
Definition CGFunctionInfo.h:45
@ Ignore
Ignore - Ignore the argument (treat as void).
Definition CGFunctionInfo.h:66
@ IndirectAliased
IndirectAliased - Similar to Indirect, but the pointer may be to an object that is otherwise referenc...
Definition CGFunctionInfo.h:62
@ KindFirst
Definition CGFunctionInfo.h:91
@ Expand
Expand - Only valid for aggregate argument types.
Definition CGFunctionInfo.h:72
@ TargetSpecific
TargetSpecific - Some argument types are passed as target specific types such as RISC-V's tuple type,...
Definition CGFunctionInfo.h:83
@ InAlloca
InAlloca - Pass the argument directly using the LLVM inalloca attribute.
Definition CGFunctionInfo.h:90
@ Indirect
Indirect - Pass the argument indirectly via a hidden pointer with the specified alignment (0 indicate...
Definition CGFunctionInfo.h:49
@ CoerceAndExpand
CoerceAndExpand - Only valid for aggregate argument types.
Definition CGFunctionInfo.h:78
@ KindLast
Definition CGFunctionInfo.h:92
@ Direct
Direct - Pass the argument directly using the normal converted LLVM type, or by coercing to another s...
Definition CGFunctionInfo.h:41
static ABIArgInfo getIndirect(CharUnits Alignment, unsigned AddrSpace, bool ByVal=true, bool Realign=false, llvm::Type *Padding=nullptr)
Definition CGFunctionInfo.h:214
ArrayRef< llvm::Type * > getCoerceAndExpandTypeSequence() const
Definition CGFunctionInfo.h:411
static ABIArgInfo getIndirectAliased(CharUnits Alignment, unsigned AddrSpace, bool Realign=false, llvm::Type *Padding=nullptr)
Pass this in memory using the IR byref attribute.
Definition CGFunctionInfo.h:228
void setSRetAfterThis(bool AfterThis)
Definition CGFunctionInfo.h:475
llvm::Type * PaddingType
Definition CGFunctionInfo.h:98
bool isTargetSpecific() const
Definition CGFunctionInfo.h:327
void setInAllocaIndirect(bool Indirect)
Definition CGFunctionInfo.h:493
void setInAllocaSRet(bool SRet)
Definition CGFunctionInfo.h:505
bool isCoerceAndExpand() const
Definition CGFunctionInfo.h:326
static ABIArgInfo getZeroExtend(QualType Ty, llvm::Type *T=nullptr)
Definition CGFunctionInfo.h:176
static ABIArgInfo getExtend(QualType Ty, llvm::Type *T=nullptr)
Definition CGFunctionInfo.h:189
DirectAttrInfo DirectAttr
Definition CGFunctionInfo.h:110
static ABIArgInfo getCoerceAndExpand(llvm::StructType *coerceToType, llvm::Type *unpaddedCoerceToType)
Definition CGFunctionInfo.h:267
unsigned AllocaFieldIndex
Definition CGFunctionInfo.h:112
unsigned getInAllocaIndirect() const
Definition CGFunctionInfo.h:489
bool isExtend() const
Definition CGFunctionInfo.h:321
llvm::Type * getCoerceToType() const
Definition CGFunctionInfo.h:391
bool isIndirectAliased() const
Definition CGFunctionInfo.h:324
void setInAllocaFieldIndex(unsigned FieldIndex)
Definition CGFunctionInfo.h:484
bool isSRetAfterThis() const
Definition CGFunctionInfo.h:471
IndirectAttrInfo IndirectAttr
Definition CGFunctionInfo.h:111
bool isInAlloca() const
Definition CGFunctionInfo.h:320
bool canHaveCoerceToType() const
Definition CGFunctionInfo.h:329
llvm::Type * UnpaddedCoerceAndExpandType
Definition CGFunctionInfo.h:99
void setSignExt(bool SExt)
Definition CGFunctionInfo.h:361
bool isZeroExt() const
Definition CGFunctionInfo.h:366
void setCanBeFlattened(bool Flatten)
Definition CGFunctionInfo.h:515
void setDirectAlign(unsigned Align)
Definition CGFunctionInfo.h:351
static ABIArgInfo getSignExtend(QualType Ty, llvm::Type *T=nullptr)
Definition CGFunctionInfo.h:165
bool getInReg() const
Definition CGFunctionInfo.h:421
CharUnits getIndirectAlign() const
Definition CGFunctionInfo.h:434
bool isSignExt() const
Definition CGFunctionInfo.h:357
static ABIArgInfo getDirectInReg(llvm::Type *T=nullptr)
Definition CGFunctionInfo.h:159
bool isIgnore() const
Definition CGFunctionInfo.h:322
bool usesInAlloca() const
Return true if this function uses inalloca arguments.
Definition CGFunctionInfo.h:789
FunctionType::ExtInfo getExtInfo() const
Definition CGFunctionInfo.h:766
bool isInstanceMethod() const
Definition CGFunctionInfo.h:724
bool isChainCall() const
Definition CGFunctionInfo.h:726
ABIArgInfo & getReturnInfo()
Definition CGFunctionInfo.h:775
bool isReturnsRetained() const
In ARC, whether this function retains its return value.
Definition CGFunctionInfo.h:736
unsigned getCallingConvention() const
getCallingConvention - Return the user specified calling convention, which has been translated into a...
Definition CGFunctionInfo.h:752
void Profile(llvm::FoldingSetNodeID &ID)
Definition CGFunctionInfo.h:812
const_arg_iterator arg_begin() const
Definition CGFunctionInfo.h:711
bool isNoCallerSavedRegs() const
Whether this function no longer saves caller registers.
Definition CGFunctionInfo.h:739
bool isNoReturn() const
Definition CGFunctionInfo.h:732
unsigned getRegParm() const
Definition CGFunctionInfo.h:764
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
Definition CGFunctionInfo.h:778
CanQualType getReturnType() const
Definition CGFunctionInfo.h:773
bool isNoCfCheck() const
Whether this function has nocf_check attribute.
Definition CGFunctionInfo.h:742
CallingConv getASTCallingConvention() const
getASTCallingConvention() - Return the AST-specified calling convention.
Definition CGFunctionInfo.h:746
const ABIArgInfo & getReturnInfo() const
Definition CGFunctionInfo.h:776
bool getHasRegParm() const
Definition CGFunctionInfo.h:763
ArrayRef< ArgInfo > arguments() const
Definition CGFunctionInfo.h:707
const ArgInfo * const_arg_iterator
Definition CGFunctionInfo.h:701
static CGFunctionInfo * create(unsigned llvmCC, bool instanceMethod, bool chainCall, bool delegateCall, const FunctionType::ExtInfo &extInfo, ArrayRef< ExtParameterInfo > paramInfos, CanQualType resultType, ArrayRef< CanQualType > argTypes, RequiredArgs required)
static void Profile(llvm::FoldingSetNodeID &ID, bool InstanceMethod, bool ChainCall, bool IsDelegateCall, const FunctionType::ExtInfo &info, ArrayRef< ExtParameterInfo > paramInfos, RequiredArgs required, CanQualType resultType, ArrayRef< CanQualType > argTypes)
Definition CGFunctionInfo.h:834
friend class TrailingObjects
Definition CGFunctionInfo.h:693
bool isCmseNSCall() const
Definition CGFunctionInfo.h:730
bool isDelegateCall() const
Definition CGFunctionInfo.h:728
MutableArrayRef< ArgInfo > arguments()
Definition CGFunctionInfo.h:704
const_arg_iterator arg_end() const
Definition CGFunctionInfo.h:712
unsigned getEffectiveCallingConvention() const
getEffectiveCallingConvention - Return the actual calling convention to use, which may depend on the ...
Definition CGFunctionInfo.h:756
bool isVariadic() const
Definition CGFunctionInfo.h:718
void setArgStruct(llvm::StructType *Ty, CharUnits Align)
Definition CGFunctionInfo.h:796
size_t numTrailingObjects(OverloadToken< ArgInfo >) const
Definition CGFunctionInfo.h:694
ExtParameterInfo getExtParameterInfo(unsigned argIndex) const
Definition CGFunctionInfo.h:782
unsigned getMaxVectorWidth() const
Return the maximum vector width in the arguments.
Definition CGFunctionInfo.h:802
arg_iterator arg_begin()
Definition CGFunctionInfo.h:713
CharUnits getArgStructAlignment() const
Definition CGFunctionInfo.h:793
size_t numTrailingObjects(OverloadToken< ExtParameterInfo >) const
Definition CGFunctionInfo.h:697
unsigned arg_size() const
Definition CGFunctionInfo.h:716
RequiredArgs getRequiredArgs() const
Definition CGFunctionInfo.h:719
arg_iterator arg_end()
Definition CGFunctionInfo.h:714
ArgInfo * arg_iterator
Definition CGFunctionInfo.h:702
void setEffectiveCallingConvention(unsigned Value)
Definition CGFunctionInfo.h:759
unsigned getNumRequiredArgs() const
Definition CGFunctionInfo.h:720
llvm::StructType * getArgStruct() const
Get the struct type used to represent all the arguments in memory.
Definition CGFunctionInfo.h:792
void setMaxVectorWidth(unsigned Width)
Set the maximum vector width in the arguments.
Definition CGFunctionInfo.h:807
A class for recording the number of arguments that a function signature requires.
Definition CGFunctionInfo.h:525
static RequiredArgs forPrototypePlus(CanQual< FunctionProtoType > prototype, unsigned additional)
Definition CGFunctionInfo.h:556
bool allowsOptionalArgs() const
Definition CGFunctionInfo.h:569
unsigned getNumRequiredArgs() const
Definition CGFunctionInfo.h:570
static RequiredArgs forPrototype(CanQual< FunctionProtoType > prototype)
Definition CGFunctionInfo.h:565
RequiredArgs(unsigned n)
Definition CGFunctionInfo.h:533
static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, unsigned additional)
Compute the arguments required by the given formal prototype, given that there may be some additional...
Definition CGFunctionInfo.h:542
All_t
Definition CGFunctionInfo.h:530
@ All
Definition CGFunctionInfo.h:530
static RequiredArgs getFromOpaqueData(unsigned value)
Definition CGFunctionInfo.h:581
RequiredArgs(All_t _)
Definition CGFunctionInfo.h:532
bool isRequiredArg(unsigned argIdx) const
Return true if the argument at a given index is required.
Definition CGFunctionInfo.h:576
static RequiredArgs forPrototype(const FunctionProtoType *prototype)
Definition CGFunctionInfo.h:561
unsigned getOpaqueData() const
Definition CGFunctionInfo.h:580
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
bool isVariadic() const
Whether this function prototype is variadic.
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
A class which abstracts out some details necessary for making a call.
CallingConv getCC() const
bool getCmseNSCall() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
bool getHasRegParm() const
bool getProducesResult() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
A (possibly-)qualified type.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
Definition CGFunctionInfo.h:28
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
Definition CGFunctionInfo.h:589
CanQualType type
Definition CGFunctionInfo.h:590
ABIArgInfo info
Definition CGFunctionInfo.h:591