annotate gcc/go/gofrontend/ast-dump.cc @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // ast-dump.cc -- AST debug dump. -*- C++ -*-
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 // Copyright 2011 The Go Authors. All rights reserved.
kono
parents:
diff changeset
4 // Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
5 // license that can be found in the LICENSE file.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #include "go-system.h"
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 #include <iostream>
kono
parents:
diff changeset
10 #include <fstream>
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
11 #include <sstream>
111
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 #include "gogo.h"
kono
parents:
diff changeset
14 #include "expressions.h"
kono
parents:
diff changeset
15 #include "statements.h"
kono
parents:
diff changeset
16 #include "types.h"
kono
parents:
diff changeset
17 #include "ast-dump.h"
kono
parents:
diff changeset
18 #include "go-c.h"
kono
parents:
diff changeset
19 #include "go-dump.h"
kono
parents:
diff changeset
20 #include "go-diagnostics.h"
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 // The -fgo-dump-ast flag to activate AST dumps.
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 Go_dump ast_dump_flag("ast");
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 // This class is used to traverse the tree to look for blocks and
kono
parents:
diff changeset
27 // function headers.
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 class Ast_dump_traverse_blocks_and_functions : public Traverse
kono
parents:
diff changeset
30 {
kono
parents:
diff changeset
31 public:
kono
parents:
diff changeset
32 Ast_dump_traverse_blocks_and_functions(Ast_dump_context* ast_dump_context)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
33 : Traverse(traverse_blocks | traverse_functions | traverse_variables),
111
kono
parents:
diff changeset
34 ast_dump_context_(ast_dump_context)
kono
parents:
diff changeset
35 { }
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 protected:
kono
parents:
diff changeset
38 int
kono
parents:
diff changeset
39 block(Block*);
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 int
kono
parents:
diff changeset
42 function(Named_object*);
kono
parents:
diff changeset
43
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
44 int
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
45 variable(Named_object*);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
46
111
kono
parents:
diff changeset
47 private:
kono
parents:
diff changeset
48 Ast_dump_context* ast_dump_context_;
kono
parents:
diff changeset
49 };
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 // This class is used to traverse the tree to look for statements.
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 class Ast_dump_traverse_statements : public Traverse
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 public:
kono
parents:
diff changeset
56 Ast_dump_traverse_statements(Ast_dump_context* ast_dump_context)
kono
parents:
diff changeset
57 : Traverse(traverse_statements),
kono
parents:
diff changeset
58 ast_dump_context_(ast_dump_context)
kono
parents:
diff changeset
59 { }
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 protected:
kono
parents:
diff changeset
62 int
kono
parents:
diff changeset
63 statement(Block*, size_t* pindex, Statement*);
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 private:
kono
parents:
diff changeset
66 Ast_dump_context* ast_dump_context_;
kono
parents:
diff changeset
67 };
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 // For each block we enclose it in brackets.
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 int Ast_dump_traverse_blocks_and_functions::block(Block * block)
kono
parents:
diff changeset
72 {
kono
parents:
diff changeset
73 if (block == NULL)
kono
parents:
diff changeset
74 {
kono
parents:
diff changeset
75 this->ast_dump_context_->ostream() << std::endl;
kono
parents:
diff changeset
76 return TRAVERSE_EXIT;
kono
parents:
diff changeset
77 }
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 this->ast_dump_context_->print_indent();
kono
parents:
diff changeset
80 this->ast_dump_context_->ostream() << "{" << std::endl;
kono
parents:
diff changeset
81 this->ast_dump_context_->indent();
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 // Dump statememts.
kono
parents:
diff changeset
84 Ast_dump_traverse_statements adts(this->ast_dump_context_);
kono
parents:
diff changeset
85 block->traverse(&adts);
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 this->ast_dump_context_->unindent();
kono
parents:
diff changeset
88 this->ast_dump_context_->print_indent();
kono
parents:
diff changeset
89 this->ast_dump_context_->ostream() << "}" << std::endl;
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 return TRAVERSE_SKIP_COMPONENTS;
kono
parents:
diff changeset
92 }
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 // Dump each traversed statement.
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 int
kono
parents:
diff changeset
97 Ast_dump_traverse_statements::statement(Block* block, size_t* pindex,
kono
parents:
diff changeset
98 Statement* statement)
kono
parents:
diff changeset
99 {
kono
parents:
diff changeset
100 statement->dump_statement(this->ast_dump_context_);
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 if (statement->is_block_statement())
kono
parents:
diff changeset
103 {
kono
parents:
diff changeset
104 Ast_dump_traverse_blocks_and_functions adtbf(this->ast_dump_context_);
kono
parents:
diff changeset
105 statement->traverse(block, pindex, &adtbf);
kono
parents:
diff changeset
106 }
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 return TRAVERSE_SKIP_COMPONENTS;
kono
parents:
diff changeset
109 }
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 // Dump the function header.
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 int
kono
parents:
diff changeset
114 Ast_dump_traverse_blocks_and_functions::function(Named_object* no)
kono
parents:
diff changeset
115 {
kono
parents:
diff changeset
116 this->ast_dump_context_->ostream() << no->name();
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 go_assert(no->is_function());
kono
parents:
diff changeset
119 Function* func = no->func_value();
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 this->ast_dump_context_->ostream() << "(";
kono
parents:
diff changeset
122 this->ast_dump_context_->dump_typed_identifier_list(
kono
parents:
diff changeset
123 func->type()->parameters());
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 this->ast_dump_context_->ostream() << ")";
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 Function::Results* res = func->result_variables();
kono
parents:
diff changeset
128 if (res != NULL && !res->empty())
kono
parents:
diff changeset
129 {
kono
parents:
diff changeset
130 this->ast_dump_context_->ostream() << " (";
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 for (Function::Results::const_iterator it = res->begin();
kono
parents:
diff changeset
133 it != res->end();
kono
parents:
diff changeset
134 it++)
kono
parents:
diff changeset
135 {
kono
parents:
diff changeset
136 if (it != res->begin())
kono
parents:
diff changeset
137 this->ast_dump_context_->ostream() << ",";
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
138 Named_object* rno = (*it);
111
kono
parents:
diff changeset
139
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
140 this->ast_dump_context_->ostream() << rno->name() << " ";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
141 go_assert(rno->is_result_variable());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
142 Result_variable* resvar = rno->result_var_value();
111
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 this->ast_dump_context_->dump_type(resvar->type());
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 }
kono
parents:
diff changeset
147 this->ast_dump_context_->ostream() << ")";
kono
parents:
diff changeset
148 }
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 this->ast_dump_context_->ostream() << " : ";
kono
parents:
diff changeset
151 this->ast_dump_context_->dump_type(func->type());
kono
parents:
diff changeset
152 this->ast_dump_context_->ostream() << std::endl;
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 return TRAVERSE_CONTINUE;
kono
parents:
diff changeset
155 }
kono
parents:
diff changeset
156
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
157 // Dump variable preinits
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
158
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
159 int
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
160 Ast_dump_traverse_blocks_and_functions::variable(Named_object* no)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
162 if (!no->is_variable())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
163 return TRAVERSE_CONTINUE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
164
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
165 Variable* var = no->var_value();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
166 if (var->has_pre_init())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
167 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
168 this->ast_dump_context_->ostream() << "// preinit block for var "
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
169 << no->message_name() << "\n";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
170 var->preinit()->traverse(this);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
171 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
172
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
173 return TRAVERSE_CONTINUE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
175
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
176
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
177
111
kono
parents:
diff changeset
178 // Class Ast_dump_context.
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 Ast_dump_context::Ast_dump_context(std::ostream* out /* = NULL */,
kono
parents:
diff changeset
181 bool dump_subblocks /* = true */)
kono
parents:
diff changeset
182 : indent_(0), dump_subblocks_(dump_subblocks), ostream_(out), gogo_(NULL)
kono
parents:
diff changeset
183 {
kono
parents:
diff changeset
184 }
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 // Dump files will be named %basename%.dump.ast
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 const char* kAstDumpFileExtension = ".dump.ast";
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 // Dump the internal representation.
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 void
kono
parents:
diff changeset
193 Ast_dump_context::dump(Gogo* gogo, const char* basename)
kono
parents:
diff changeset
194 {
kono
parents:
diff changeset
195 std::ofstream out;
kono
parents:
diff changeset
196 std::string dumpname(basename);
kono
parents:
diff changeset
197 dumpname += ".dump.ast";
kono
parents:
diff changeset
198 out.open(dumpname.c_str());
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 if (out.fail())
kono
parents:
diff changeset
201 {
kono
parents:
diff changeset
202 go_error_at(Linemap::unknown_location(),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 "cannot open %s:%m; %<-fgo-dump-ast%> ignored",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 dumpname.c_str());
111
kono
parents:
diff changeset
205 return;
kono
parents:
diff changeset
206 }
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 this->gogo_ = gogo;
kono
parents:
diff changeset
209 this->ostream_ = &out;
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 Ast_dump_traverse_blocks_and_functions adtbf(this);
kono
parents:
diff changeset
212 gogo->traverse(&adtbf);
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 out.close();
kono
parents:
diff changeset
215 }
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 // Dump a textual representation of a type to the
kono
parents:
diff changeset
218 // the dump file.
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 void
kono
parents:
diff changeset
221 Ast_dump_context::dump_type(const Type* t)
kono
parents:
diff changeset
222 {
kono
parents:
diff changeset
223 if (t == NULL)
kono
parents:
diff changeset
224 this->ostream() << "(nil type)";
kono
parents:
diff changeset
225 else
kono
parents:
diff changeset
226 // FIXME: write a type pretty printer instead of
kono
parents:
diff changeset
227 // using mangled names.
kono
parents:
diff changeset
228 if (this->gogo_ != NULL)
kono
parents:
diff changeset
229 this->ostream() << "(" << t->mangled_name(this->gogo_) << ")";
kono
parents:
diff changeset
230 }
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 // Dump a textual representation of a block to the
kono
parents:
diff changeset
233 // the dump file.
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 void
kono
parents:
diff changeset
236 Ast_dump_context::dump_block(Block* b)
kono
parents:
diff changeset
237 {
kono
parents:
diff changeset
238 Ast_dump_traverse_blocks_and_functions adtbf(this);
kono
parents:
diff changeset
239 b->traverse(&adtbf);
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 // Dump a textual representation of an expression to the
kono
parents:
diff changeset
243 // the dump file.
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 void
kono
parents:
diff changeset
246 Ast_dump_context::dump_expression(const Expression* e)
kono
parents:
diff changeset
247 {
kono
parents:
diff changeset
248 e->dump_expression(this);
kono
parents:
diff changeset
249 }
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 // Dump a textual representation of an expression list to the
kono
parents:
diff changeset
252 // the dump file.
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 void
kono
parents:
diff changeset
255 Ast_dump_context::dump_expression_list(const Expression_list* el,
kono
parents:
diff changeset
256 bool as_pairs /* = false */)
kono
parents:
diff changeset
257 {
kono
parents:
diff changeset
258 if (el == NULL)
kono
parents:
diff changeset
259 return;
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 for (std::vector<Expression*>::const_iterator it = el->begin();
kono
parents:
diff changeset
262 it != el->end();
kono
parents:
diff changeset
263 it++)
kono
parents:
diff changeset
264 {
kono
parents:
diff changeset
265 if ( it != el->begin())
kono
parents:
diff changeset
266 this->ostream() << ",";
kono
parents:
diff changeset
267 if (*it != NULL)
kono
parents:
diff changeset
268 (*it)->dump_expression(this);
kono
parents:
diff changeset
269 else
kono
parents:
diff changeset
270 this->ostream() << "NULL";
kono
parents:
diff changeset
271 if (as_pairs)
kono
parents:
diff changeset
272 {
kono
parents:
diff changeset
273 this->ostream() << ":";
kono
parents:
diff changeset
274 ++it;
kono
parents:
diff changeset
275 (*it)->dump_expression(this);
kono
parents:
diff changeset
276 }
kono
parents:
diff changeset
277 }
kono
parents:
diff changeset
278 }
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 // Dump a textual representation of a typed identifier to the
kono
parents:
diff changeset
281 // the dump file.
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 void
kono
parents:
diff changeset
284 Ast_dump_context::dump_typed_identifier(const Typed_identifier* ti)
kono
parents:
diff changeset
285 {
kono
parents:
diff changeset
286 this->ostream() << ti->name() << " ";
kono
parents:
diff changeset
287 this->dump_type(ti->type());
kono
parents:
diff changeset
288 }
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 // Dump a textual representation of a typed identifier list to the
kono
parents:
diff changeset
291 // the dump file.
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 void
kono
parents:
diff changeset
294 Ast_dump_context::dump_typed_identifier_list(
kono
parents:
diff changeset
295 const Typed_identifier_list* ti_list)
kono
parents:
diff changeset
296 {
kono
parents:
diff changeset
297 if (ti_list == NULL)
kono
parents:
diff changeset
298 return;
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 for (Typed_identifier_list::const_iterator it = ti_list->begin();
kono
parents:
diff changeset
301 it != ti_list->end();
kono
parents:
diff changeset
302 it++)
kono
parents:
diff changeset
303 {
kono
parents:
diff changeset
304 if (it != ti_list->begin())
kono
parents:
diff changeset
305 this->ostream() << ",";
kono
parents:
diff changeset
306 this->dump_typed_identifier(&(*it));
kono
parents:
diff changeset
307 }
kono
parents:
diff changeset
308 }
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 // Dump a textual representation of a temporary variable to the
kono
parents:
diff changeset
311 // the dump file.
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 void
kono
parents:
diff changeset
314 Ast_dump_context::dump_temp_variable_name(const Statement* s)
kono
parents:
diff changeset
315 {
kono
parents:
diff changeset
316 go_assert(s->classification() == Statement::STATEMENT_TEMPORARY);
kono
parents:
diff changeset
317 // Use the statement address as part of the name for the temporary variable.
kono
parents:
diff changeset
318 this->ostream() << "tmp." << (uintptr_t) s;
kono
parents:
diff changeset
319 }
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 // Dump a textual representation of a label to the
kono
parents:
diff changeset
322 // the dump file.
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 void
kono
parents:
diff changeset
325 Ast_dump_context::dump_label_name(const Unnamed_label* l)
kono
parents:
diff changeset
326 {
kono
parents:
diff changeset
327 // Use the unnamed label address as part of the name for the temporary
kono
parents:
diff changeset
328 // variable.
kono
parents:
diff changeset
329 this->ostream() << "label." << (uintptr_t) l;
kono
parents:
diff changeset
330 }
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 // Produce a textual representation of an operator symbol.
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 static const char*
kono
parents:
diff changeset
335 op_string(Operator op)
kono
parents:
diff changeset
336 {
kono
parents:
diff changeset
337 // FIXME: This should be in line with symbols that are parsed,
kono
parents:
diff changeset
338 // exported and/or imported.
kono
parents:
diff changeset
339 switch (op)
kono
parents:
diff changeset
340 {
kono
parents:
diff changeset
341 case OPERATOR_PLUS:
kono
parents:
diff changeset
342 return "+";
kono
parents:
diff changeset
343 case OPERATOR_MINUS:
kono
parents:
diff changeset
344 return "-";
kono
parents:
diff changeset
345 case OPERATOR_NOT:
kono
parents:
diff changeset
346 return "!";
kono
parents:
diff changeset
347 case OPERATOR_XOR:
kono
parents:
diff changeset
348 return "^";
kono
parents:
diff changeset
349 case OPERATOR_OR:
kono
parents:
diff changeset
350 return "|";
kono
parents:
diff changeset
351 case OPERATOR_AND:
kono
parents:
diff changeset
352 return "&";
kono
parents:
diff changeset
353 case OPERATOR_MULT:
kono
parents:
diff changeset
354 return "*";
kono
parents:
diff changeset
355 case OPERATOR_OROR:
kono
parents:
diff changeset
356 return "||";
kono
parents:
diff changeset
357 case OPERATOR_ANDAND:
kono
parents:
diff changeset
358 return "&&";
kono
parents:
diff changeset
359 case OPERATOR_EQEQ:
kono
parents:
diff changeset
360 return "==";
kono
parents:
diff changeset
361 case OPERATOR_NOTEQ:
kono
parents:
diff changeset
362 return "!=";
kono
parents:
diff changeset
363 case OPERATOR_LT:
kono
parents:
diff changeset
364 return "<";
kono
parents:
diff changeset
365 case OPERATOR_LE:
kono
parents:
diff changeset
366 return "<=";
kono
parents:
diff changeset
367 case OPERATOR_GT:
kono
parents:
diff changeset
368 return ">";
kono
parents:
diff changeset
369 case OPERATOR_GE:
kono
parents:
diff changeset
370 return ">=";
kono
parents:
diff changeset
371 case OPERATOR_DIV:
kono
parents:
diff changeset
372 return "/";
kono
parents:
diff changeset
373 case OPERATOR_MOD:
kono
parents:
diff changeset
374 return "%";
kono
parents:
diff changeset
375 case OPERATOR_LSHIFT:
kono
parents:
diff changeset
376 return "<<";
kono
parents:
diff changeset
377 case OPERATOR_RSHIFT:
kono
parents:
diff changeset
378 return "//";
kono
parents:
diff changeset
379 case OPERATOR_BITCLEAR:
kono
parents:
diff changeset
380 return "&^";
kono
parents:
diff changeset
381 case OPERATOR_CHANOP:
kono
parents:
diff changeset
382 return "<-";
kono
parents:
diff changeset
383 case OPERATOR_PLUSEQ:
kono
parents:
diff changeset
384 return "+=";
kono
parents:
diff changeset
385 case OPERATOR_MINUSEQ:
kono
parents:
diff changeset
386 return "-=";
kono
parents:
diff changeset
387 case OPERATOR_OREQ:
kono
parents:
diff changeset
388 return "|=";
kono
parents:
diff changeset
389 case OPERATOR_XOREQ:
kono
parents:
diff changeset
390 return "^=";
kono
parents:
diff changeset
391 case OPERATOR_MULTEQ:
kono
parents:
diff changeset
392 return "*=";
kono
parents:
diff changeset
393 case OPERATOR_DIVEQ:
kono
parents:
diff changeset
394 return "/=";
kono
parents:
diff changeset
395 case OPERATOR_MODEQ:
kono
parents:
diff changeset
396 return "%=";
kono
parents:
diff changeset
397 case OPERATOR_LSHIFTEQ:
kono
parents:
diff changeset
398 return "<<=";
kono
parents:
diff changeset
399 case OPERATOR_RSHIFTEQ:
kono
parents:
diff changeset
400 return ">>=";
kono
parents:
diff changeset
401 case OPERATOR_ANDEQ:
kono
parents:
diff changeset
402 return "&=";
kono
parents:
diff changeset
403 case OPERATOR_BITCLEAREQ:
kono
parents:
diff changeset
404 return "&^=";
kono
parents:
diff changeset
405 case OPERATOR_PLUSPLUS:
kono
parents:
diff changeset
406 return "++";
kono
parents:
diff changeset
407 case OPERATOR_MINUSMINUS:
kono
parents:
diff changeset
408 return "--";
kono
parents:
diff changeset
409 case OPERATOR_COLON:
kono
parents:
diff changeset
410 return ":";
kono
parents:
diff changeset
411 case OPERATOR_COLONEQ:
kono
parents:
diff changeset
412 return ":=";
kono
parents:
diff changeset
413 case OPERATOR_SEMICOLON:
kono
parents:
diff changeset
414 return ";";
kono
parents:
diff changeset
415 case OPERATOR_DOT:
kono
parents:
diff changeset
416 return ".";
kono
parents:
diff changeset
417 case OPERATOR_ELLIPSIS:
kono
parents:
diff changeset
418 return "...";
kono
parents:
diff changeset
419 case OPERATOR_COMMA:
kono
parents:
diff changeset
420 return ",";
kono
parents:
diff changeset
421 case OPERATOR_LPAREN:
kono
parents:
diff changeset
422 return "(";
kono
parents:
diff changeset
423 case OPERATOR_RPAREN:
kono
parents:
diff changeset
424 return ")";
kono
parents:
diff changeset
425 case OPERATOR_LCURLY:
kono
parents:
diff changeset
426 return "{";
kono
parents:
diff changeset
427 case OPERATOR_RCURLY:
kono
parents:
diff changeset
428 return "}";
kono
parents:
diff changeset
429 case OPERATOR_LSQUARE:
kono
parents:
diff changeset
430 return "[";
kono
parents:
diff changeset
431 case OPERATOR_RSQUARE:
kono
parents:
diff changeset
432 return "]";
kono
parents:
diff changeset
433 default:
kono
parents:
diff changeset
434 go_unreachable();
kono
parents:
diff changeset
435 }
kono
parents:
diff changeset
436 return NULL;
kono
parents:
diff changeset
437 }
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 // Dump a textual representation of an operator to the
kono
parents:
diff changeset
440 // the dump file.
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 void
kono
parents:
diff changeset
443 Ast_dump_context::dump_operator(Operator op)
kono
parents:
diff changeset
444 {
kono
parents:
diff changeset
445 this->ostream() << op_string(op);
kono
parents:
diff changeset
446 }
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 // Size of a single indent.
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 const int Ast_dump_context::offset_ = 2;
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 // Print indenting spaces to dump file.
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 void
kono
parents:
diff changeset
455 Ast_dump_context::print_indent()
kono
parents:
diff changeset
456 {
kono
parents:
diff changeset
457 for (int i = 0; i < this->indent_ * this->offset_; i++)
kono
parents:
diff changeset
458 this->ostream() << " ";
kono
parents:
diff changeset
459 }
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 // Dump a textual representation of the ast to the
kono
parents:
diff changeset
462 // the dump file.
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 void Gogo::dump_ast(const char* basename)
kono
parents:
diff changeset
465 {
kono
parents:
diff changeset
466 if (::ast_dump_flag.is_enabled())
kono
parents:
diff changeset
467 {
kono
parents:
diff changeset
468 Ast_dump_context adc;
kono
parents:
diff changeset
469 adc.dump(this, basename);
kono
parents:
diff changeset
470 }
kono
parents:
diff changeset
471 }
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 // Implementation of String_dump interface.
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 void
kono
parents:
diff changeset
476 Ast_dump_context::write_c_string(const char* s)
kono
parents:
diff changeset
477 {
kono
parents:
diff changeset
478 this->ostream() << s;
kono
parents:
diff changeset
479 }
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 void
kono
parents:
diff changeset
482 Ast_dump_context::write_string(const std::string& s)
kono
parents:
diff changeset
483 {
kono
parents:
diff changeset
484 this->ostream() << s;
kono
parents:
diff changeset
485 }
kono
parents:
diff changeset
486
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
487 // Dump statement to stream.
111
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 void
kono
parents:
diff changeset
490 Ast_dump_context::dump_to_stream(const Statement* stm, std::ostream* out)
kono
parents:
diff changeset
491 {
kono
parents:
diff changeset
492 Ast_dump_context adc(out, false);
kono
parents:
diff changeset
493 stm->dump_statement(&adc);
kono
parents:
diff changeset
494 }
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 // Dump expression to stream.
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 void
kono
parents:
diff changeset
499 Ast_dump_context::dump_to_stream(const Expression* expr, std::ostream* out)
kono
parents:
diff changeset
500 {
kono
parents:
diff changeset
501 Ast_dump_context adc(out, false);
kono
parents:
diff changeset
502 expr->dump_expression(&adc);
kono
parents:
diff changeset
503 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
504
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
505 // Dump an expression to std::cerr. This is intended to be used
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
506 // from within a debugging session.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
507
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
508 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
509 debug_go_expression(const Expression* expr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
510 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
511 if (expr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
512 std::cerr << "<null>";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
513 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
514 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
515 Ast_dump_context::dump_to_stream(expr, &std::cerr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
516 std::string lstr = Linemap::location_to_string(expr->location());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
517 std::cerr << " // loc " << lstr << std::endl;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
518 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
519 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
520
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
521 // Shallow dump of stmt to std::cerr. This is intended to be used
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
522 // from within a debugging session.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
523
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
524 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
525 debug_go_statement(const Statement* stmt)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
526 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
527 if (stmt == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
528 std::cerr << "<null>\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
529 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
530 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
531 std::string lstr = Linemap::location_to_string(stmt->location());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
532 Statement *ncstmt = const_cast<Statement*>(stmt);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
533 Block_statement* bs = ncstmt->block_statement();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
534 if (bs != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
535 std::cerr << "Block " << bs->block()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
536 << " // location: " << lstr << std::endl;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
537 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
538 Ast_dump_context::dump_to_stream(stmt, &std::cerr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
539 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
540 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
541
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
542 // Deep dump of statement to std::cerr. This is intended to be used
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
543 // from within a debugging session.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
544
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
545 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
546 debug_go_statement_deep(const Statement* statement)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
547 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
548 Ast_dump_context adc(&std::cerr, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
549 statement->dump_statement(&adc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
550 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
551
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
552 // Shallow dump of a block to std::cerr. This is intended to be used
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
553 // from within a debugging session.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
554
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
555 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
556 debug_go_block(const Block* block)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
557 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
558 if (block == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
559 std::cerr << "<null>";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
560 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
561 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
562 std::cerr << "Block " << block
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
563 << " (enclosing " << block->enclosing() << "):\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
564 const std::vector<Statement*>* stmts = block->statements();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
565 if (stmts != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
566 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
567 for (size_t i = 0; i < stmts->size(); ++i)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
568 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
569 debug_go_statement(stmts->at(i));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
570 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
571 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
572 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
573 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
574
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
575 // Deep dump of a block to std:cerr. This is intended to be used
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
576 // from within a debugging session.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
577
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
578 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
579 debug_go_block_deep(const Block* block)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
580 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
581 Ast_dump_context adc(&std::cerr, true);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
582 Block* ncblock = const_cast<Block*>(block);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
583 adc.dump_block(ncblock);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
584 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
585
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
586 class Type_dumper
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
587 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
588 typedef Unordered_map(const Type*, unsigned) idx_map;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
589 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
590 Type_dumper(const Type* type)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
591 : top_(type), ntypes_(0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
592 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
593 this->worklist_.push_back(type);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
594 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
595
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
596 void visit();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
597
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
598 std::string stringResult() { return ss_.str(); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
599
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
600 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
601 void emitpre(unsigned tag, const Type* addr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
602 void typeref(const char*, const Type*, const char *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
603 void visit_forward_declaration_type(const Forward_declaration_type* fdt);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
604 void visit_function_type(const Function_type* ft);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
605 void visit_struct_type(const Struct_type* st);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
606 void visit_array_type(const Array_type* at);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
607 void visit_map_type(const Map_type* mt);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
608 void visit_channel_type(const Channel_type* mt);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
609 void visit_interface_type(const Interface_type* mt);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
610 void visit_methods(const Typed_identifier_list* methods,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
611 const char *tag);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
612 std::pair<bool, unsigned> lookup(const Type*);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
613
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
614 static const unsigned notag = 0xffffffff;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
615
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
616 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
617 const Type* top_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
618 idx_map types_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
619 unsigned ntypes_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
620 std::list<const Type*> worklist_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 std::ostringstream ss_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
622 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
623
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
624 // Look up a type, installing it in 'types_'. Return is <found, N>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
625 // where 'found' is true if type had been previously recorded, and N
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
626 // is the index/tag assigned to N. The input argument is appended to
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 // the work list if this is the first time we've seen it.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
628
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
629 std::pair<bool, unsigned> Type_dumper::lookup(const Type* t)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
630 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
631 std::pair<const Type*, unsigned> entry = std::make_pair(t, this->ntypes_);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
632 std::pair<idx_map::iterator, bool> ins = this->types_.insert(entry);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
633 if (ins.second)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
634 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
635 this->ntypes_++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
636 if (t != this->top_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
637 this->worklist_.push_back(t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
638 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
639 return std::make_pair(ins.second, ins.first->second);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
640 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
641
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
642 // Emit preamble prior to dumping a type, including the type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
643 // pointer itself and the tag we've assigned it. If no
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
644 // tag is specified (via special "notag" value) and/or the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
645 // pointer is null, then just emit an equivalent amount
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
646 // of spaces.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
647
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
648 void Type_dumper::emitpre(unsigned tag, const Type* ptr)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
649 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
650 char tbuf[50], pbuf[50], buf[200];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
651
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
652 tbuf[0] = '\0';
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
653 if (tag != notag)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
654 snprintf(tbuf, sizeof tbuf, "T%u", tag);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
655
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
656 pbuf[0] = '\0';
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
657 if (ptr != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
658 snprintf(pbuf, sizeof pbuf, "%p", (const void*) ptr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
659
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
660 snprintf(buf, sizeof buf, "%8s %16s ", tbuf, pbuf);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
661 this->ss_ << buf;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
662 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
663
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
664 // Emit a reference to a type into the dump buffer. In most cases this means
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
665 // just the type tag, but for named types we also emit the name, and for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
666 // simple/primitive types (ex: int64) we emit the type itself. If "pref" is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
667 // non-NULL, emit the string prior to the reference, and if "suf" is non-NULL,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
668 // emit it following the reference.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
669
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
670 void Type_dumper::typeref(const char* pref, const Type* t, const char* suf)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
671 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
672 if (pref != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
673 this->ss_ << pref;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
674 std::pair<bool, unsigned> p = this->lookup(t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
675 unsigned tag = p.second;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
676 switch (t->classification())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
677 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
678 case Type::TYPE_NAMED:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
679 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
680 const Named_type* nt = t->named_type();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
681 const Named_object* no = nt->named_object();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
682 this->ss_ << "'" << no->message_name() << "' -> ";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
683 const Type* underlying = nt->real_type();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
684 this->typeref(NULL, underlying, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
685 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
686 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
687 case Type::TYPE_POINTER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
688 this->typeref("*", t->points_to(), NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
689 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
690 case Type::TYPE_ERROR:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
691 this->ss_ << "error_type";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
692 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
693 case Type::TYPE_INTEGER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
694 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
695 const Integer_type* it = t->integer_type();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
696 if (it->is_abstract())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
697 this->ss_ << "abstract_int";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
698 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
699 this->ss_ << (it->is_unsigned() ? "u" : "") << "int" << it->bits();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
700 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
701 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
702 case Type::TYPE_FLOAT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
703 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
704 const Float_type* ft = t->float_type();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
705 if (ft->is_abstract())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
706 this->ss_ << "abstract_float";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
707 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
708 this->ss_ << "float" << ft->bits();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
709 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
710 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
711 case Type::TYPE_COMPLEX:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
712 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
713 const Complex_type* ct = t->complex_type();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
714 if (ct->is_abstract())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
715 this->ss_ << "abstract_complex";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
716 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
717 this->ss_ << "complex" << ct->bits();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
718 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
719 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
720 case Type::TYPE_BOOLEAN:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
721 this->ss_ << "bool";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
722 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
723 case Type::TYPE_STRING:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
724 this->ss_ << "string";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
725 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
726 case Type::TYPE_NIL:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
727 this->ss_ << "nil_type";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
728 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
729 case Type::TYPE_VOID:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
730 this->ss_ << "void_type";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
731 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
732 case Type::TYPE_FUNCTION:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
733 case Type::TYPE_STRUCT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
734 case Type::TYPE_ARRAY:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
735 case Type::TYPE_MAP:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
736 case Type::TYPE_CHANNEL:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
737 case Type::TYPE_FORWARD:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
738 case Type::TYPE_INTERFACE:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
739 this->ss_ << "T" << tag;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
740 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
741
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
742 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
743 // This is a debugging routine, so instead of a go_unreachable()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
744 // issue a warning/error, to allow for the possibility that the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
745 // compiler we're debugging is in a bad state.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
746 this->ss_ << "<??? " << ((unsigned)t->classification()) << "> "
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
747 << "T" << tag;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
748 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
749 if (suf != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
750 this->ss_ << suf;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
751 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
752
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
753 void Type_dumper::visit_forward_declaration_type(const Forward_declaration_type* fdt)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
754 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
755 this->ss_ << "forward_declaration_type ";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
756 if (fdt->is_defined())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
757 this->typeref("-> ", fdt->real_type(), NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
758 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
759 this->ss_ << "'" << fdt->name() << "'";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
760 this->ss_ << "\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
762
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
763 void Type_dumper::visit_function_type(const Function_type* ft)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
764 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
765 this->ss_ << "function\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
766 const Typed_identifier* rec = ft->receiver();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
767 if (rec != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769 this->emitpre(notag, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 this->typeref("receiver ", rec->type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772 const Typed_identifier_list* parameters = ft->parameters();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 if (parameters != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
774 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
775 for (Typed_identifier_list::const_iterator p = parameters->begin();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
776 p != parameters->end();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
777 ++p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
778 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
779 this->emitpre(notag, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
780 this->typeref(" param ", p->type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
781 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
782 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
783 const Typed_identifier_list* results = ft->results();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
784 if (results != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
785 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
786 for (Typed_identifier_list::const_iterator p = results->begin();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
787 p != results->end();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
788 ++p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
789 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
790 this->emitpre(notag, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
791 this->typeref(" result ", p->type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
792 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
793 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
794 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
795
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
796 void Type_dumper::visit_struct_type(const Struct_type* st)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
797 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
798 this->ss_ << "struct\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
799 const Struct_field_list* fields = st->fields();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
800 if (fields != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
801 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
802 for (Struct_field_list::const_iterator p = fields->begin();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
803 p != fields->end();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
804 ++p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
805 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
806 this->emitpre(notag, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
807 this->typeref(" field ", p->type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
808 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
809 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
810 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
811
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
812 void Type_dumper::visit_array_type(const Array_type* at)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
813 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
814 this->ss_ << "array [";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
815 if (at->length() != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
816 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
817 int64_t len = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
818 if (at->int_length(&len))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
819 this->ss_ << len;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
820 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
821 this->typeref("] ", at->element_type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
822 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
823
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
824 void Type_dumper::visit_map_type(const Map_type* mt)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
825 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
826 this->ss_ << "map [";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
827 this->typeref(NULL, mt->key_type(), NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
828 this->typeref("] ", mt->val_type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
829 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
830
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
831 void Type_dumper::visit_methods(const Typed_identifier_list* methods,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
832 const char *tag)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
833 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
834 if (tag != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
835 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
836 this->emitpre(notag, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
837 this->ss_ << tag << "\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
838 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
839 for (Typed_identifier_list::const_iterator p = methods->begin();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
840 p != methods->end();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
841 ++p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
842 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
843 this->emitpre(notag, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
844 if (p->name().empty())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
845 this->typeref(" embedded method ", p->type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
846 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
847 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
848 this->ss_ << " method '" << p->name() << "' ";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
849 this->typeref(NULL, p->type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
850 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
851 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
852 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
853
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
854 void Type_dumper::visit_interface_type(const Interface_type* it)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
855 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
856 const Typed_identifier_list* methods =
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
857 (it->methods_are_finalized() ? it->methods() : it->local_methods());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
858 if (methods == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
859 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
860 this->ss_ << "empty_interface\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
861 return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
862 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
863 this->ss_ << "interface";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
864 if (! it->methods_are_finalized())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
865 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
866 this->ss_ << " [unfinalized]\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
867 visit_methods(it->local_methods(), NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
868 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
869 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
870 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
871 this->ss_ << "\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
872 visit_methods(it->local_methods(), "[parse_methods]");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
873 visit_methods(it->methods(), "[all_methods]");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
874 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
875 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
876
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
877 void Type_dumper::visit_channel_type(const Channel_type* ct)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
878 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
879 this->ss_ << "channel {";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
880 if (ct->may_send())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
881 this->ss_ << " send";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
882 if (ct->may_receive())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
883 this->ss_ << " receive";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
884 this->typeref(" } ", ct->element_type(), "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
885 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
886
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
887 void Type_dumper::visit()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
888 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
889 while (! this->worklist_.empty()) {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
890 const Type* t = this->worklist_.front();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
891 this->worklist_.pop_front();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
892
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
893 std::pair<bool, unsigned> p = this->lookup(t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
894 unsigned tag = p.second;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
895 this->emitpre(tag, t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
896
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
897 switch(t->classification())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
898 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
899 case Type::TYPE_ERROR:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
900 case Type::TYPE_INTEGER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
901 case Type::TYPE_FLOAT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
902 case Type::TYPE_COMPLEX:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
903 case Type::TYPE_BOOLEAN:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
904 case Type::TYPE_STRING:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
905 case Type::TYPE_VOID:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
906 case Type::TYPE_POINTER:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
907 case Type::TYPE_NIL:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
908 case Type::TYPE_NAMED:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
909 this->typeref(NULL, t, "\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
910 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
911 case Type::TYPE_FORWARD:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
912 this->visit_forward_declaration_type(t->forward_declaration_type());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
913 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
914
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
915 case Type::TYPE_FUNCTION:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
916 this->visit_function_type(t->function_type());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
917 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
918 case Type::TYPE_STRUCT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
919 this->visit_struct_type(t->struct_type());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
920 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
921 case Type::TYPE_ARRAY:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
922 this->visit_array_type(t->array_type());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
923 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
924 case Type::TYPE_MAP:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
925 this->visit_map_type(t->map_type());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
926 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
927 case Type::TYPE_CHANNEL:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
928 this->visit_channel_type(t->channel_type());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
929 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
930 case Type::TYPE_INTERFACE:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
931 this->visit_interface_type(t->interface_type());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
932 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
933 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
934 // This is a debugging routine, so instead of a go_unreachable()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
935 // issue a warning/error, to allow for the possibility that the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
936 // compiler we're debugging is in a bad state.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
937 this->ss_ << "<unknown/unrecognized classification "
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
938 << ((unsigned)t->classification()) << ">\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
939 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
940 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
941 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
942
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
943 // Dump a Go type for debugging purposes. This is a deep as opposed
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
944 // to shallow dump; all of the types reachable from the specified
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
945 // type will be dumped in addition to the type itself.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
946
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
947 void debug_go_type(const Type* type)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
948 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
949 if (type == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
950 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
951 std::cerr << "<NULL type>\n";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
952 return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
953 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
954 Type_dumper dumper(type);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
955 dumper.visit();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
956 std::cerr << dumper.stringResult();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
957 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
958
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
959 void debug_go_type(Type* type)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
960 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
961 const Type* ctype = type;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
962 debug_go_type(ctype);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
963 }