22
22
23
23
namespace clang ::CIRGen {
24
24
25
- struct CIRGenFunctionInfoArgInfo {
26
- CanQualType type;
27
- };
28
-
29
25
// / A class for recording the number of arguments that a function signature
30
26
// / requires.
31
27
class RequiredArgs {
@@ -71,18 +67,19 @@ class RequiredArgs {
71
67
}
72
68
};
73
69
70
+ // The TrailingObjects for this class contain the function return type in the
71
+ // first CanQualType slot, followed by the argument types.
74
72
class CIRGenFunctionInfo final
75
73
: public llvm::FoldingSetNode,
76
- private llvm::TrailingObjects<CIRGenFunctionInfo,
77
- CIRGenFunctionInfoArgInfo> {
78
- using ArgInfo = CIRGenFunctionInfoArgInfo;
79
-
74
+ private llvm::TrailingObjects<CIRGenFunctionInfo, CanQualType> {
80
75
RequiredArgs required;
81
76
82
77
unsigned numArgs;
83
78
84
- ArgInfo *getArgsBuffer () { return getTrailingObjects<ArgInfo>(); }
85
- const ArgInfo *getArgsBuffer () const { return getTrailingObjects<ArgInfo>(); }
79
+ CanQualType *getArgTypes () { return getTrailingObjects<CanQualType>(); }
80
+ const CanQualType *getArgTypes () const {
81
+ return getTrailingObjects<CanQualType>();
82
+ }
86
83
87
84
CIRGenFunctionInfo () : required(RequiredArgs::All) {}
88
85
@@ -97,8 +94,8 @@ class CIRGenFunctionInfo final
97
94
// these have to be public.
98
95
friend class TrailingObjects ;
99
96
100
- using const_arg_iterator = const ArgInfo *;
101
- using arg_iterator = ArgInfo *;
97
+ using const_arg_iterator = const CanQualType *;
98
+ using arg_iterator = CanQualType *;
102
99
103
100
// This function has to be CamelCase because llvm::FoldingSet requires so.
104
101
// NOLINTNEXTLINE(readability-identifier-naming)
@@ -113,49 +110,41 @@ class CIRGenFunctionInfo final
113
110
114
111
// NOLINTNEXTLINE(readability-identifier-naming)
115
112
void Profile (llvm::FoldingSetNodeID &id) {
116
- // It's unfortunate that we are looping over the arguments twice (here and
117
- // in the static Profile function we call from here), but if the Profile
118
- // functions get out of sync, we can end up with incorrect function
119
- // signatures, and we don't have the argument types in the format that the
120
- // static Profile function requires.
121
- llvm::SmallVector<CanQualType, 16 > argTypes;
122
- for (const ArgInfo &argInfo : arguments ())
123
- argTypes.push_back (argInfo.type );
124
-
125
- Profile (id, required, getReturnType (), argTypes);
113
+ // If the Profile functions get out of sync, we can end up with incorrect
114
+ // function signatures, so we call the static Profile function here rather
115
+ // than duplicating the logic.
116
+ Profile (id, required, getReturnType (), arguments ());
126
117
}
127
118
128
- llvm::ArrayRef<ArgInfo > arguments () const {
129
- return llvm::ArrayRef<ArgInfo>( argInfoBegin (), numArgs);
119
+ llvm::ArrayRef<CanQualType > arguments () const {
120
+ return llvm::ArrayRef<CanQualType>( argTypesBegin (), numArgs);
130
121
}
131
122
132
- llvm::ArrayRef<ArgInfo > requiredArguments () const {
133
- return llvm::ArrayRef<ArgInfo>( argInfoBegin (), getNumRequiredArgs ());
123
+ llvm::ArrayRef<CanQualType > requiredArguments () const {
124
+ return llvm::ArrayRef<CanQualType>( argTypesBegin (), getNumRequiredArgs ());
134
125
}
135
126
136
- CanQualType getReturnType () const { return getArgsBuffer ()[0 ]. type ; }
127
+ CanQualType getReturnType () const { return getArgTypes ()[0 ]; }
137
128
138
- const_arg_iterator argInfoBegin () const { return getArgsBuffer () + 1 ; }
139
- const_arg_iterator argInfoEnd () const {
140
- return getArgsBuffer () + 1 + numArgs;
141
- }
142
- arg_iterator argInfoBegin () { return getArgsBuffer () + 1 ; }
143
- arg_iterator argInfoEnd () { return getArgsBuffer () + 1 + numArgs; }
129
+ const_arg_iterator argTypesBegin () const { return getArgTypes () + 1 ; }
130
+ const_arg_iterator argTypesEnd () const { return getArgTypes () + 1 + numArgs; }
131
+ arg_iterator argTypesBegin () { return getArgTypes () + 1 ; }
132
+ arg_iterator argTypesEnd () { return getArgTypes () + 1 + numArgs; }
144
133
145
- unsigned argInfoSize () const { return numArgs; }
134
+ unsigned argTypeSize () const { return numArgs; }
146
135
147
- llvm::MutableArrayRef<ArgInfo> argInfos () {
148
- return llvm::MutableArrayRef<ArgInfo>( argInfoBegin (), numArgs);
136
+ llvm::MutableArrayRef<CanQualType> argTypes () {
137
+ return llvm::MutableArrayRef<CanQualType>( argTypesBegin (), numArgs);
149
138
}
150
- llvm::ArrayRef<ArgInfo> argInfos () const {
151
- return llvm::ArrayRef<ArgInfo>( argInfoBegin (), numArgs);
139
+ llvm::ArrayRef<CanQualType> argTypes () const {
140
+ return llvm::ArrayRef<CanQualType>( argTypesBegin (), numArgs);
152
141
}
153
142
154
143
bool isVariadic () const { return required.allowsOptionalArgs (); }
155
144
RequiredArgs getRequiredArgs () const { return required; }
156
145
unsigned getNumRequiredArgs () const {
157
146
return isVariadic () ? getRequiredArgs ().getNumRequiredArgs ()
158
- : argInfoSize ();
147
+ : argTypeSize ();
159
148
}
160
149
};
161
150
0 commit comments