@@ -126,9 +126,15 @@ void ClangOpcodesEmitter::EmitInterp(raw_ostream &OS, StringRef N,
126
126
127
127
// Emit calls to read arguments.
128
128
for (size_t I = 0 , N = Args.size (); I < N; ++I) {
129
- OS << " auto V" << I;
129
+ const auto *Arg = Args[I];
130
+ bool AsRef = Arg->getValueAsBit (" AsRef" );
131
+
132
+ if (AsRef)
133
+ OS << " const auto &V" << I;
134
+ else
135
+ OS << " const auto V" << I;
130
136
OS << " = " ;
131
- OS << " ReadArg<" << Args[I] ->getValueAsString (" Name" )
137
+ OS << " ReadArg<" << Arg ->getValueAsString (" Name" )
132
138
<< " >(S, PC);\n " ;
133
139
}
134
140
@@ -192,8 +198,14 @@ void ClangOpcodesEmitter::EmitEmitter(raw_ostream &OS, StringRef N,
192
198
193
199
// Emit the list of arguments.
194
200
OS << " bool ByteCodeEmitter::emit" << ID << " (" ;
195
- for (size_t I = 0 , N = Args.size (); I < N; ++I)
196
- OS << Args[I]->getValueAsString (" Name" ) << " A" << I << " , " ;
201
+ for (size_t I = 0 , N = Args.size (); I < N; ++I) {
202
+ const auto *Arg = Args[I];
203
+ bool AsRef = Arg->getValueAsBit (" AsRef" );
204
+ auto Name = Arg->getValueAsString (" Name" );
205
+
206
+ OS << (AsRef ? " const " : " " ) << Name << " " << (AsRef ? " &" : " " ) << " A"
207
+ << I << " , " ;
208
+ }
197
209
OS << " const SourceInfo &L) {\n " ;
198
210
199
211
// Emit a call to write the opcodes.
@@ -218,8 +230,14 @@ void ClangOpcodesEmitter::EmitProto(raw_ostream &OS, StringRef N,
218
230
auto Args = R->getValueAsListOfDefs (" Args" );
219
231
Enumerate (R, N, [&OS, &Args](ArrayRef<const Record *> TS, const Twine &ID) {
220
232
OS << " bool emit" << ID << " (" ;
221
- for (auto *Arg : Args)
222
- OS << Arg->getValueAsString (" Name" ) << " , " ;
233
+ for (size_t I = 0 , N = Args.size (); I < N; ++I) {
234
+ const auto *Arg = Args[I];
235
+ bool AsRef = Arg->getValueAsBit (" AsRef" );
236
+ auto Name = Arg->getValueAsString (" Name" );
237
+
238
+ OS << (AsRef ? " const " : " " ) << Name << " " << (AsRef ? " &" : " " )
239
+ << " , " ;
240
+ }
223
241
OS << " const SourceInfo &);\n " ;
224
242
});
225
243
@@ -275,8 +293,14 @@ void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N,
275
293
OS << " ::" << EmitFuncName << " (" ;
276
294
for (size_t I = 0 , N = Types->size (); I < N; ++I)
277
295
OS << " PrimType T" << I << " , " ;
278
- for (size_t I = 0 , N = Args.size (); I < N; ++I)
279
- OS << Args[I]->getValueAsString (" Name" ) << " A" << I << " , " ;
296
+ for (size_t I = 0 , N = Args.size (); I < N; ++I) {
297
+ const auto *Arg = Args[I];
298
+ bool AsRef = Arg->getValueAsBit (" AsRef" );
299
+ auto Name = Arg->getValueAsString (" Name" );
300
+
301
+ OS << (AsRef ? " const " : " " ) << Name << " " << (AsRef ? " &" : " " ) << " A"
302
+ << I << " , " ;
303
+ }
280
304
OS << " const SourceInfo &I) {\n " ;
281
305
282
306
std::function<void (size_t , const Twine &)> Rec;
@@ -343,8 +367,14 @@ void ClangOpcodesEmitter::EmitEval(raw_ostream &OS, StringRef N,
343
367
auto Args = R->getValueAsListOfDefs (" Args" );
344
368
345
369
OS << " bool EvalEmitter::emit" << ID << " (" ;
346
- for (size_t I = 0 , N = Args.size (); I < N; ++I)
347
- OS << Args[I]->getValueAsString (" Name" ) << " A" << I << " , " ;
370
+ for (size_t I = 0 , N = Args.size (); I < N; ++I) {
371
+ const auto *Arg = Args[I];
372
+ bool AsRef = Arg->getValueAsBit (" AsRef" );
373
+ auto Name = Arg->getValueAsString (" Name" );
374
+
375
+ OS << (AsRef ? " const " : " " ) << Name << " "
376
+ << (AsRef ? " &" : " " ) << " A" << I << " , " ;
377
+ }
348
378
OS << " const SourceInfo &L) {\n " ;
349
379
OS << " if (!isActive()) return true;\n " ;
350
380
OS << " CurrentSource = L;\n " ;
0 commit comments