Lines Matching full: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 << ", Result";
152 OS << ", V" << I;
153 OS << "))\n";
154 OS << " return false;\n";
158 OS << " if (!S.Current || S.Current->isRoot())\n";
159 OS << " return true;\n";
161 OS << " if (DoReturn)\n";
162 OS << " return true;\n";
165 OS << " continue;\n";
166 OS << "}\n";
168 OS << "#endif\n";
171 void ClangOpcodesEmitter::EmitDisasm(raw_ostream &OS, StringRef N,
173 OS << "#ifdef GET_DISASM\n";
174 Enumerate(R, N, [R, &OS](ArrayRef<const Record *>, const Twine &ID) {
175 OS << "case OP_" << ID << ":\n";
176 OS << " PrintName(\"" << ID << "\");\n";
177 OS << " OS << \"\\t\"";
180 OS << " << ReadArg<" << Arg->getValueAsString("Name") << ">(P, PC)";
181 OS << " << \" \"";
184 OS << " << \"\\n\";\n";
185 OS << " continue;\n";
187 OS << "#endif\n";
190 void ClangOpcodesEmitter::EmitEmitter(raw_ostream &OS, StringRef N,
195 OS << "#ifdef GET_LINK_IMPL\n";
196 Enumerate(R, N, [R, &OS](ArrayRef<const Record *>, const Twine &ID) {
200 OS << "bool ByteCodeEmitter::emit" << ID << "(";
206 OS << (AsRef ? "const " : " ") << Name << " " << (AsRef ? "&" : "") << "A"
209 OS << "const SourceInfo &L) {\n";
212 OS << " return emitOp<";
215 OS << ", ";
216 OS << Args[I]->getValueAsString("Name");
218 OS << ">(OP_" << ID;
220 OS << ", A" << I;
221 OS << ", L);\n";
222 OS << "}\n";
224 OS << "#endif\n";
227 void ClangOpcodesEmitter::EmitProto(raw_ostream &OS, StringRef N,
229 OS << "#if defined(GET_EVAL_PROTO) || defined(GET_LINK_PROTO)\n";
231 Enumerate(R, N, [&OS, &Args](ArrayRef<const Record *> TS, const Twine &ID) {
232 OS << "bool emit" << ID << "(";
238 OS << (AsRef ? "const " : " ") << Name << " " << (AsRef ? "&" : "")
241 OS << "const SourceInfo &);\n";
247 OS << "#if defined(GET_EVAL_PROTO)\n";
248 OS << "template<";
251 OS << ", ";
252 OS << "PrimType";
254 OS << ">\n";
255 OS << "bool emit" << N << "(";
257 OS << Arg->getValueAsString("Name") << ", ";
258 OS << "const SourceInfo &);\n";
259 OS << "#endif\n";
262 OS << "#endif\n";
265 void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N,
276 OS << "#if defined(GET_EVAL_PROTO) || defined(GET_LINK_PROTO)\n";
277 OS << "[[nodiscard]] bool " << EmitFuncName << "(";
279 OS << "PrimType, ";
281 OS << Arg->getValueAsString("Name") << ", ";
282 OS << "const SourceInfo &I);\n";
283 OS << "#endif\n";
286 OS << "#if defined(GET_EVAL_IMPL) || defined(GET_LINK_IMPL)\n";
287 OS << "bool\n";
288 OS << "#if defined(GET_EVAL_IMPL)\n";
289 OS << "EvalEmitter\n";
290 OS << "#else\n";
291 OS << "ByteCodeEmitter\n";
292 OS << "#endif\n";
293 OS << "::" << EmitFuncName << "(";
295 OS << "PrimType T" << I << ", ";
301 OS << (AsRef ? "const " : " ") << Name << " " << (AsRef ? "&" : "") << "A"
304 OS << "const SourceInfo &I) {\n";
308 Rec = [this, &Rec, &OS, Types, &Args, R, &TS, N,
314 OS << "#ifdef GET_LINK_IMPL\n";
315 OS << " return emit" << ID << "\n";
316 OS << "#else\n";
317 OS << " return emit" << N;
318 PrintTypes(OS, TS);
319 OS << "\n#endif\n";
320 OS << " ";
322 OS << " return emit" << ID;
325 OS << "(";
327 OS << "A" << I << ", ";
329 OS << "I);\n";
335 OS << " switch (T" << I << ") {\n";
338 OS << " case PT_" << Case->getName() << ":\n";
345 OS << " default: llvm_unreachable(\"invalid type: " << EmitFuncName
347 OS << " }\n";
348 OS << " llvm_unreachable(\"invalid enum value\");\n";
355 OS << "}\n";
356 OS << "#endif\n";
359 void ClangOpcodesEmitter::EmitEval(raw_ostream &OS, StringRef N,
364 OS << "#ifdef GET_EVAL_IMPL\n";
366 [this, R, &N, &OS](ArrayRef<const Record *> TS, const Twine &ID) {
369 OS << "bool EvalEmitter::emit" << ID << "(";
375 OS << (AsRef ? "const " : " ") << Name << " "
378 OS << "const SourceInfo &L) {\n";
379 OS << " if (!isActive()) return true;\n";
380 OS << " CurrentSource = L;\n";
382 OS << " return " << N;
383 PrintTypes(OS, TS);
384 OS << "(S, OpPC";
386 OS << ", A" << I;
387 OS << ");\n";
388 OS << "}\n";
391 OS << "#endif\n";
394 void ClangOpcodesEmitter::PrintTypes(raw_ostream &OS,
398 OS << "<";
401 OS << ", ";
402 OS << "PT_" << Types[I]->getName();
404 OS << ">";
407 void clang::EmitClangOpcodes(RecordKeeper &Records, raw_ostream &OS) {
408 ClangOpcodesEmitter(Records).run(OS);