Lines Matching refs:OS
30 void run(raw_ostream &OS);
35 void EmitEnum(raw_ostream &OS, StringRef N, const Record *R);
38 void EmitInterp(raw_ostream &OS, StringRef N, const Record *R);
41 void EmitDisasm(raw_ostream &OS, StringRef N, const Record *R);
44 void EmitEmitter(raw_ostream &OS, StringRef N, const Record *R);
47 void EmitProto(raw_ostream &OS, StringRef N, const Record *R);
50 void EmitGroup(raw_ostream &OS, StringRef N, const Record *R);
53 void EmitEval(raw_ostream &OS, StringRef N, const Record *R);
55 void PrintTypes(raw_ostream &OS, ArrayRef<const Record *> Types);
86 void ClangOpcodesEmitter::run(raw_ostream &OS) {
93 EmitEnum(OS, N, Opcode);
94 EmitInterp(OS, N, Opcode);
95 EmitDisasm(OS, N, Opcode);
96 EmitProto(OS, N, Opcode);
97 EmitGroup(OS, N, Opcode);
98 EmitEmitter(OS, N, Opcode);
99 EmitEval(OS, N, Opcode);
103 void ClangOpcodesEmitter::EmitEnum(raw_ostream &OS, StringRef N,
105 OS << "#ifdef GET_OPCODE_NAMES\n";
106 Enumerate(R, N, [&OS](ArrayRef<const Record *>, const Twine &ID) {
107 OS << "OP_" << ID << ",\n";
109 OS << "#endif\n";
112 void ClangOpcodesEmitter::EmitInterp(raw_ostream &OS, StringRef N,
114 OS << "#ifdef GET_INTERP\n";
117 [this, R, &OS, &N](ArrayRef<const Record *> TS, const Twine &ID) {
122 OS << "case OP_" << ID << ": {\n";
125 OS << " bool DoReturn = (S.Current == StartFrame);\n";
133 OS << " const auto &V" << I;
135 OS << " const auto V" << I;
136 OS << " = ";
137 OS << "ReadArg<" << Arg->getValueAsString("Name")
142 OS << " if (!" << N;
143 PrintTypes(OS, TS);
144 OS << "(S";
146 OS << ", PC";
148 OS << ", OpPC";
150 OS << ", V" << I;
151 OS << "))\n";
152 OS << " return false;\n";
156 OS << " if (!S.Current || S.Current->isRoot())\n";
157 OS << " return true;\n";
159 OS << " if (DoReturn)\n";
160 OS << " return true;\n";
163 OS << " continue;\n";
164 OS << "}\n";
166 OS << "#endif\n";
169 void ClangOpcodesEmitter::EmitDisasm(raw_ostream &OS, StringRef N,
171 OS << "#ifdef GET_DISASM\n";
172 Enumerate(R, N, [R, &OS](ArrayRef<const Record *>, const Twine &ID) {
173 OS << "case OP_" << ID << ":\n";
174 OS << " PrintName(\"" << ID << "\");\n";
175 OS << " OS << \"\\t\"";
178 OS << " << ReadArg<" << Arg->getValueAsString("Name") << ">(P, PC)";
179 OS << " << \" \"";
182 OS << " << \"\\n\";\n";
183 OS << " continue;\n";
185 OS << "#endif\n";
188 void ClangOpcodesEmitter::EmitEmitter(raw_ostream &OS, StringRef N,
193 OS << "#ifdef GET_LINK_IMPL\n";
194 Enumerate(R, N, [R, &OS](ArrayRef<const Record *>, const Twine &ID) {
198 OS << "bool ByteCodeEmitter::emit" << ID << "(";
204 OS << (AsRef ? "const " : " ") << Name << " " << (AsRef ? "&" : "") << "A"
207 OS << "const SourceInfo &L) {\n";
210 OS << " return emitOp<";
213 OS << ", ";
214 OS << Args[I]->getValueAsString("Name");
216 OS << ">(OP_" << ID;
218 OS << ", A" << I;
219 OS << ", L);\n";
220 OS << "}\n";
222 OS << "#endif\n";
225 void ClangOpcodesEmitter::EmitProto(raw_ostream &OS, StringRef N,
227 OS << "#if defined(GET_EVAL_PROTO) || defined(GET_LINK_PROTO)\n";
229 Enumerate(R, N, [&OS, &Args](ArrayRef<const Record *> TS, const Twine &ID) {
230 OS << "bool emit" << ID << "(";
236 OS << (AsRef ? "const " : " ") << Name << " " << (AsRef ? "&" : "")
239 OS << "const SourceInfo &);\n";
245 OS << "#if defined(GET_EVAL_PROTO)\n";
246 OS << "template<";
249 OS << ", ";
250 OS << "PrimType";
252 OS << ">\n";
253 OS << "bool emit" << N << "(";
255 OS << Arg->getValueAsString("Name") << ", ";
256 OS << "const SourceInfo &);\n";
257 OS << "#endif\n";
260 OS << "#endif\n";
263 void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N,
274 OS << "#if defined(GET_EVAL_PROTO) || defined(GET_LINK_PROTO)\n";
275 OS << "[[nodiscard]] bool " << EmitFuncName << "(";
277 OS << "PrimType, ";
279 OS << Arg->getValueAsString("Name") << ", ";
280 OS << "const SourceInfo &I);\n";
281 OS << "#endif\n";
284 OS << "#if defined(GET_EVAL_IMPL) || defined(GET_LINK_IMPL)\n";
285 OS << "bool\n";
286 OS << "#if defined(GET_EVAL_IMPL)\n";
287 OS << "EvalEmitter\n";
288 OS << "#else\n";
289 OS << "ByteCodeEmitter\n";
290 OS << "#endif\n";
291 OS << "::" << EmitFuncName << "(";
293 OS << "PrimType T" << I << ", ";
299 OS << (AsRef ? "const " : " ") << Name << " " << (AsRef ? "&" : "") << "A"
302 OS << "const SourceInfo &I) {\n";
306 Rec = [this, &Rec, &OS, Types, &Args, R, &TS, N,
312 OS << "#ifdef GET_LINK_IMPL\n";
313 OS << " return emit" << ID << "\n";
314 OS << "#else\n";
315 OS << " return emit" << N;
316 PrintTypes(OS, TS);
317 OS << "\n#endif\n";
318 OS << " ";
320 OS << " return emit" << ID;
323 OS << "(";
325 OS << "A" << I << ", ";
327 OS << "I);\n";
333 OS << " switch (T" << I << ") {\n";
336 OS << " case PT_" << Case->getName() << ":\n";
343 OS << " default: llvm_unreachable(\"invalid type: " << EmitFuncName
345 OS << " }\n";
346 OS << " llvm_unreachable(\"invalid enum value\");\n";
353 OS << "}\n";
354 OS << "#endif\n";
357 void ClangOpcodesEmitter::EmitEval(raw_ostream &OS, StringRef N,
362 OS << "#ifdef GET_EVAL_IMPL\n";
364 [this, R, &N, &OS](ArrayRef<const Record *> TS, const Twine &ID) {
367 OS << "bool EvalEmitter::emit" << ID << "(";
373 OS << (AsRef ? "const " : " ") << Name << " "
376 OS << "const SourceInfo &L) {\n";
377 OS << " if (!isActive()) return true;\n";
378 OS << " CurrentSource = L;\n";
380 OS << " return " << N;
381 PrintTypes(OS, TS);
382 OS << "(S, OpPC";
384 OS << ", A" << I;
385 OS << ");\n";
386 OS << "}\n";
389 OS << "#endif\n";
392 void ClangOpcodesEmitter::PrintTypes(raw_ostream &OS,
396 OS << "<";
399 OS << ", ";
400 OS << "PT_" << Types[I]->getName();
402 OS << ">";
405 void clang::EmitClangOpcodes(const RecordKeeper &Records, raw_ostream &OS) {
406 ClangOpcodesEmitter(Records).run(OS);