Don't crash on index into erroneous map.
[gcc.git] / gcc / go / gofrontend / gogo.cc
1 // gogo.cc -- Go frontend parsed representation.
2
3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
6
7 #include "go-system.h"
8
9 #include "go-c.h"
10 #include "go-dump.h"
11 #include "lex.h"
12 #include "types.h"
13 #include "statements.h"
14 #include "expressions.h"
15 #include "dataflow.h"
16 #include "import.h"
17 #include "export.h"
18 #include "gogo.h"
19
20 // Class Gogo.
21
22 Gogo::Gogo(int int_type_size, int float_type_size, int pointer_size)
23 : package_(NULL),
24 functions_(),
25 globals_(new Bindings(NULL)),
26 imports_(),
27 imported_unsafe_(false),
28 packages_(),
29 map_descriptors_(NULL),
30 type_descriptor_decls_(NULL),
31 init_functions_(),
32 need_init_fn_(false),
33 init_fn_name_(),
34 imported_init_fns_(),
35 unique_prefix_(),
36 interface_types_()
37 {
38 const source_location loc = BUILTINS_LOCATION;
39
40 Named_type* uint8_type = Type::make_integer_type("uint8", true, 8,
41 RUNTIME_TYPE_KIND_UINT8);
42 this->add_named_type(uint8_type);
43 this->add_named_type(Type::make_integer_type("uint16", true, 16,
44 RUNTIME_TYPE_KIND_UINT16));
45 this->add_named_type(Type::make_integer_type("uint32", true, 32,
46 RUNTIME_TYPE_KIND_UINT32));
47 this->add_named_type(Type::make_integer_type("uint64", true, 64,
48 RUNTIME_TYPE_KIND_UINT64));
49
50 this->add_named_type(Type::make_integer_type("int8", false, 8,
51 RUNTIME_TYPE_KIND_INT8));
52 this->add_named_type(Type::make_integer_type("int16", false, 16,
53 RUNTIME_TYPE_KIND_INT16));
54 this->add_named_type(Type::make_integer_type("int32", false, 32,
55 RUNTIME_TYPE_KIND_INT32));
56 this->add_named_type(Type::make_integer_type("int64", false, 64,
57 RUNTIME_TYPE_KIND_INT64));
58
59 this->add_named_type(Type::make_float_type("float32", 32,
60 RUNTIME_TYPE_KIND_FLOAT32));
61 this->add_named_type(Type::make_float_type("float64", 64,
62 RUNTIME_TYPE_KIND_FLOAT64));
63
64 this->add_named_type(Type::make_complex_type("complex64", 64,
65 RUNTIME_TYPE_KIND_COMPLEX64));
66 this->add_named_type(Type::make_complex_type("complex128", 128,
67 RUNTIME_TYPE_KIND_COMPLEX128));
68
69 if (int_type_size < 32)
70 int_type_size = 32;
71 this->add_named_type(Type::make_integer_type("uint", true,
72 int_type_size,
73 RUNTIME_TYPE_KIND_UINT));
74 Named_type* int_type = Type::make_integer_type("int", false, int_type_size,
75 RUNTIME_TYPE_KIND_INT);
76 this->add_named_type(int_type);
77
78 // "byte" is an alias for "uint8". Construct a Named_object which
79 // points to UINT8_TYPE. Note that this breaks the normal pairing
80 // in which a Named_object points to a Named_type which points back
81 // to the same Named_object.
82 Named_object* byte_type = this->declare_type("byte", loc);
83 byte_type->set_type_value(uint8_type);
84
85 this->add_named_type(Type::make_integer_type("uintptr", true,
86 pointer_size,
87 RUNTIME_TYPE_KIND_UINTPTR));
88
89 this->add_named_type(Type::make_float_type("float", float_type_size,
90 RUNTIME_TYPE_KIND_FLOAT));
91
92 this->add_named_type(Type::make_complex_type("complex", float_type_size * 2,
93 RUNTIME_TYPE_KIND_COMPLEX));
94
95 this->add_named_type(Type::make_named_bool_type());
96
97 this->add_named_type(Type::make_named_string_type());
98
99 this->globals_->add_constant(Typed_identifier("true",
100 Type::make_boolean_type(),
101 loc),
102 NULL,
103 Expression::make_boolean(true, loc),
104 0);
105 this->globals_->add_constant(Typed_identifier("false",
106 Type::make_boolean_type(),
107 loc),
108 NULL,
109 Expression::make_boolean(false, loc),
110 0);
111
112 this->globals_->add_constant(Typed_identifier("nil", Type::make_nil_type(),
113 loc),
114 NULL,
115 Expression::make_nil(loc),
116 0);
117
118 Type* abstract_int_type = Type::make_abstract_integer_type();
119 this->globals_->add_constant(Typed_identifier("iota", abstract_int_type,
120 loc),
121 NULL,
122 Expression::make_iota(),
123 0);
124
125 Function_type* new_type = Type::make_function_type(NULL, NULL, NULL, loc);
126 new_type->set_is_varargs();
127 new_type->set_is_builtin();
128 this->globals_->add_function_declaration("new", NULL, new_type, loc);
129
130 Function_type* make_type = Type::make_function_type(NULL, NULL, NULL, loc);
131 make_type->set_is_varargs();
132 make_type->set_is_builtin();
133 this->globals_->add_function_declaration("make", NULL, make_type, loc);
134
135 Typed_identifier_list* len_result = new Typed_identifier_list();
136 len_result->push_back(Typed_identifier("", int_type, loc));
137 Function_type* len_type = Type::make_function_type(NULL, NULL, len_result,
138 loc);
139 len_type->set_is_builtin();
140 this->globals_->add_function_declaration("len", NULL, len_type, loc);
141
142 Typed_identifier_list* cap_result = new Typed_identifier_list();
143 cap_result->push_back(Typed_identifier("", int_type, loc));
144 Function_type* cap_type = Type::make_function_type(NULL, NULL, len_result,
145 loc);
146 cap_type->set_is_builtin();
147 this->globals_->add_function_declaration("cap", NULL, cap_type, loc);
148
149 Function_type* print_type = Type::make_function_type(NULL, NULL, NULL, loc);
150 print_type->set_is_varargs();
151 print_type->set_is_builtin();
152 this->globals_->add_function_declaration("print", NULL, print_type, loc);
153
154 print_type = Type::make_function_type(NULL, NULL, NULL, loc);
155 print_type->set_is_varargs();
156 print_type->set_is_builtin();
157 this->globals_->add_function_declaration("println", NULL, print_type, loc);
158
159 Type *empty = Type::make_interface_type(NULL, loc);
160 Typed_identifier_list* panic_parms = new Typed_identifier_list();
161 panic_parms->push_back(Typed_identifier("e", empty, loc));
162 Function_type *panic_type = Type::make_function_type(NULL, panic_parms,
163 NULL, loc);
164 panic_type->set_is_builtin();
165 this->globals_->add_function_declaration("panic", NULL, panic_type, loc);
166
167 Typed_identifier_list* recover_result = new Typed_identifier_list();
168 recover_result->push_back(Typed_identifier("", empty, loc));
169 Function_type* recover_type = Type::make_function_type(NULL, NULL,
170 recover_result,
171 loc);
172 recover_type->set_is_builtin();
173 this->globals_->add_function_declaration("recover", NULL, recover_type, loc);
174
175 Function_type* close_type = Type::make_function_type(NULL, NULL, NULL, loc);
176 close_type->set_is_varargs();
177 close_type->set_is_builtin();
178 this->globals_->add_function_declaration("close", NULL, close_type, loc);
179
180 Typed_identifier_list* closed_result = new Typed_identifier_list();
181 closed_result->push_back(Typed_identifier("", Type::lookup_bool_type(),
182 loc));
183 Function_type* closed_type = Type::make_function_type(NULL, NULL,
184 closed_result, loc);
185 closed_type->set_is_varargs();
186 closed_type->set_is_builtin();
187 this->globals_->add_function_declaration("closed", NULL, closed_type, loc);
188
189 Typed_identifier_list* copy_result = new Typed_identifier_list();
190 copy_result->push_back(Typed_identifier("", int_type, loc));
191 Function_type* copy_type = Type::make_function_type(NULL, NULL,
192 copy_result, loc);
193 copy_type->set_is_varargs();
194 copy_type->set_is_builtin();
195 this->globals_->add_function_declaration("copy", NULL, copy_type, loc);
196
197 Function_type* append_type = Type::make_function_type(NULL, NULL, NULL, loc);
198 append_type->set_is_varargs();
199 append_type->set_is_builtin();
200 this->globals_->add_function_declaration("append", NULL, append_type, loc);
201
202 Function_type* cmplx_type = Type::make_function_type(NULL, NULL, NULL, loc);
203 cmplx_type->set_is_varargs();
204 cmplx_type->set_is_builtin();
205 this->globals_->add_function_declaration("cmplx", NULL, cmplx_type, loc);
206
207 Function_type* real_type = Type::make_function_type(NULL, NULL, NULL, loc);
208 real_type->set_is_varargs();
209 real_type->set_is_builtin();
210 this->globals_->add_function_declaration("real", NULL, real_type, loc);
211
212 Function_type* imag_type = Type::make_function_type(NULL, NULL, NULL, loc);
213 imag_type->set_is_varargs();
214 imag_type->set_is_builtin();
215 this->globals_->add_function_declaration("imag", NULL, cmplx_type, loc);
216
217 this->define_builtin_function_trees();
218
219 // Declare "init", to ensure that it is not defined with parameters
220 // or return values.
221 this->declare_function("init",
222 Type::make_function_type(NULL, NULL, NULL, loc),
223 loc);
224 }
225
226 // Munge name for use in an error message.
227
228 std::string
229 Gogo::message_name(const std::string& name)
230 {
231 return go_localize_identifier(Gogo::unpack_hidden_name(name).c_str());
232 }
233
234 // Get the package name.
235
236 const std::string&
237 Gogo::package_name() const
238 {
239 gcc_assert(this->package_ != NULL);
240 return this->package_->name();
241 }
242
243 // Set the package name.
244
245 void
246 Gogo::set_package_name(const std::string& package_name,
247 source_location location)
248 {
249 if (this->package_ != NULL && this->package_->name() != package_name)
250 {
251 error_at(location, "expected package %<%s%>",
252 Gogo::message_name(this->package_->name()).c_str());
253 return;
254 }
255
256 // If the user did not specify a unique prefix, we always use "go".
257 // This in effect requires that the package name be unique.
258 if (this->unique_prefix_.empty())
259 this->unique_prefix_ = "go";
260
261 this->package_ = this->register_package(package_name, this->unique_prefix_,
262 location);
263
264 // We used to permit people to qualify symbols with the current
265 // package name (e.g., P.x), but we no longer do.
266 // this->globals_->add_package(package_name, this->package_);
267
268 if (package_name == "main")
269 {
270 // Declare "main" as a function which takes no parameters and
271 // returns no value.
272 this->declare_function("main",
273 Type::make_function_type(NULL, NULL, NULL,
274 BUILTINS_LOCATION),
275 BUILTINS_LOCATION);
276 }
277 }
278
279 // Import a package.
280
281 void
282 Gogo::import_package(const std::string& filename,
283 const std::string& local_name,
284 bool is_local_name_exported,
285 source_location location)
286 {
287 if (filename == "unsafe")
288 {
289 this->import_unsafe(local_name, is_local_name_exported, location);
290 return;
291 }
292
293 Imports::const_iterator p = this->imports_.find(filename);
294 if (p != this->imports_.end())
295 {
296 Package* package = p->second;
297 package->set_location(location);
298 package->set_is_imported();
299 std::string ln = local_name;
300 bool is_ln_exported = is_local_name_exported;
301 if (ln.empty())
302 {
303 ln = package->name();
304 is_ln_exported = Lex::is_exported_name(ln);
305 }
306 if (ln != ".")
307 {
308 ln = this->pack_hidden_name(ln, is_ln_exported);
309 this->package_->bindings()->add_package(ln, package);
310 }
311 else
312 {
313 Bindings* bindings = package->bindings();
314 for (Bindings::const_declarations_iterator p =
315 bindings->begin_declarations();
316 p != bindings->end_declarations();
317 ++p)
318 this->add_named_object(p->second);
319 }
320 return;
321 }
322
323 Import::Stream* stream = Import::open_package(filename, location);
324 if (stream == NULL)
325 {
326 error_at(location, "import file %qs not found", filename.c_str());
327 return;
328 }
329
330 Import imp(stream, location);
331 imp.register_builtin_types(this);
332 Package* package = imp.import(this, local_name, is_local_name_exported);
333 this->imports_.insert(std::make_pair(filename, package));
334 package->set_is_imported();
335
336 delete stream;
337 }
338
339 // Add an import control function for an imported package to the list.
340
341 void
342 Gogo::add_import_init_fn(const std::string& package_name,
343 const std::string& init_name, int prio)
344 {
345 for (std::set<Import_init>::const_iterator p =
346 this->imported_init_fns_.begin();
347 p != this->imported_init_fns_.end();
348 ++p)
349 {
350 if (p->init_name() == init_name
351 && (p->package_name() != package_name || p->priority() != prio))
352 {
353 error("duplicate package initialization name %qs",
354 Gogo::message_name(init_name).c_str());
355 inform(UNKNOWN_LOCATION, "used by package %qs at priority %d",
356 Gogo::message_name(p->package_name()).c_str(),
357 p->priority());
358 inform(UNKNOWN_LOCATION, " and by package %qs at priority %d",
359 Gogo::message_name(package_name).c_str(), prio);
360 return;
361 }
362 }
363
364 this->imported_init_fns_.insert(Import_init(package_name, init_name,
365 prio));
366 }
367
368 // Return whether we are at the global binding level.
369
370 bool
371 Gogo::in_global_scope() const
372 {
373 return this->functions_.empty();
374 }
375
376 // Return the current binding contour.
377
378 Bindings*
379 Gogo::current_bindings()
380 {
381 if (!this->functions_.empty())
382 return this->functions_.back().blocks.back()->bindings();
383 else if (this->package_ != NULL)
384 return this->package_->bindings();
385 else
386 return this->globals_;
387 }
388
389 const Bindings*
390 Gogo::current_bindings() const
391 {
392 if (!this->functions_.empty())
393 return this->functions_.back().blocks.back()->bindings();
394 else if (this->package_ != NULL)
395 return this->package_->bindings();
396 else
397 return this->globals_;
398 }
399
400 // Return the current block.
401
402 Block*
403 Gogo::current_block()
404 {
405 if (this->functions_.empty())
406 return NULL;
407 else
408 return this->functions_.back().blocks.back();
409 }
410
411 // Look up a name in the current binding contour. If PFUNCTION is not
412 // NULL, set it to the function in which the name is defined, or NULL
413 // if the name is defined in global scope.
414
415 Named_object*
416 Gogo::lookup(const std::string& name, Named_object** pfunction) const
417 {
418 if (pfunction != NULL)
419 *pfunction = NULL;
420
421 if (Gogo::is_sink_name(name))
422 return Named_object::make_sink();
423
424 for (Open_functions::const_reverse_iterator p = this->functions_.rbegin();
425 p != this->functions_.rend();
426 ++p)
427 {
428 Named_object* ret = p->blocks.back()->bindings()->lookup(name);
429 if (ret != NULL)
430 {
431 if (pfunction != NULL)
432 *pfunction = p->function;
433 return ret;
434 }
435 }
436
437 if (this->package_ != NULL)
438 {
439 Named_object* ret = this->package_->bindings()->lookup(name);
440 if (ret != NULL)
441 {
442 if (ret->package() != NULL)
443 ret->package()->set_used();
444 return ret;
445 }
446 }
447
448 // We do not look in the global namespace. If we did, the global
449 // namespace would effectively hide names which were defined in
450 // package scope which we have not yet seen. Instead,
451 // define_global_names is called after parsing is over to connect
452 // undefined names at package scope with names defined at global
453 // scope.
454
455 return NULL;
456 }
457
458 // Look up a name in the current block, without searching enclosing
459 // blocks.
460
461 Named_object*
462 Gogo::lookup_in_block(const std::string& name) const
463 {
464 gcc_assert(!this->functions_.empty());
465 gcc_assert(!this->functions_.back().blocks.empty());
466 return this->functions_.back().blocks.back()->bindings()->lookup_local(name);
467 }
468
469 // Look up a name in the global namespace.
470
471 Named_object*
472 Gogo::lookup_global(const char* name) const
473 {
474 return this->globals_->lookup(name);
475 }
476
477 // Add an imported package.
478
479 Package*
480 Gogo::add_imported_package(const std::string& real_name,
481 const std::string& alias_arg,
482 bool is_alias_exported,
483 const std::string& unique_prefix,
484 source_location location,
485 bool* padd_to_globals)
486 {
487 // FIXME: Now that we compile packages as a whole, should we permit
488 // importing the current package?
489 if (this->package_name() == real_name
490 && this->unique_prefix() == unique_prefix)
491 {
492 *padd_to_globals = false;
493 if (!alias_arg.empty() && alias_arg != ".")
494 {
495 std::string alias = this->pack_hidden_name(alias_arg,
496 is_alias_exported);
497 this->package_->bindings()->add_package(alias, this->package_);
498 }
499 return this->package_;
500 }
501 else if (alias_arg == ".")
502 {
503 *padd_to_globals = true;
504 return this->register_package(real_name, unique_prefix, location);
505 }
506 else if (alias_arg == "_")
507 {
508 Package* ret = this->register_package(real_name, unique_prefix, location);
509 ret->set_uses_sink_alias();
510 return ret;
511 }
512 else
513 {
514 *padd_to_globals = false;
515 std::string alias = alias_arg;
516 if (alias.empty())
517 {
518 alias = real_name;
519 is_alias_exported = Lex::is_exported_name(alias);
520 }
521 alias = this->pack_hidden_name(alias, is_alias_exported);
522 Named_object* no = this->add_package(real_name, alias, unique_prefix,
523 location);
524 if (!no->is_package())
525 return NULL;
526 return no->package_value();
527 }
528 }
529
530 // Add a package.
531
532 Named_object*
533 Gogo::add_package(const std::string& real_name, const std::string& alias,
534 const std::string& unique_prefix, source_location location)
535 {
536 gcc_assert(this->in_global_scope());
537
538 // Register the package. Note that we might have already seen it in
539 // an earlier import.
540 Package* package = this->register_package(real_name, unique_prefix, location);
541
542 return this->package_->bindings()->add_package(alias, package);
543 }
544
545 // Register a package. This package may or may not be imported. This
546 // returns the Package structure for the package, creating if it
547 // necessary.
548
549 Package*
550 Gogo::register_package(const std::string& package_name,
551 const std::string& unique_prefix,
552 source_location location)
553 {
554 gcc_assert(!unique_prefix.empty() && !package_name.empty());
555 std::string name = unique_prefix + '.' + package_name;
556 Package* package = NULL;
557 std::pair<Packages::iterator, bool> ins =
558 this->packages_.insert(std::make_pair(name, package));
559 if (!ins.second)
560 {
561 // We have seen this package name before.
562 package = ins.first->second;
563 gcc_assert(package != NULL);
564 gcc_assert(package->name() == package_name
565 && package->unique_prefix() == unique_prefix);
566 if (package->location() == UNKNOWN_LOCATION)
567 package->set_location(location);
568 }
569 else
570 {
571 // First time we have seen this package name.
572 package = new Package(package_name, unique_prefix, location);
573 gcc_assert(ins.first->second == NULL);
574 ins.first->second = package;
575 }
576
577 return package;
578 }
579
580 // Start compiling a function.
581
582 Named_object*
583 Gogo::start_function(const std::string& name, Function_type* type,
584 bool add_method_to_type, source_location location)
585 {
586 bool at_top_level = this->functions_.empty();
587
588 Block* block = new Block(NULL, location);
589
590 Function* enclosing = (at_top_level
591 ? NULL
592 : this->functions_.back().function->func_value());
593
594 Function* function = new Function(type, enclosing, block, location);
595
596 if (type->is_method())
597 {
598 const Typed_identifier* receiver = type->receiver();
599 Variable* this_param = new Variable(receiver->type(), NULL, false,
600 true, true, location);
601 std::string name = receiver->name();
602 if (name.empty())
603 {
604 // We need to give receivers a name since they wind up in
605 // DECL_ARGUMENTS. FIXME.
606 static unsigned int count;
607 char buf[50];
608 snprintf(buf, sizeof buf, "r.%u", count);
609 ++count;
610 name = buf;
611 }
612 block->bindings()->add_variable(name, NULL, this_param);
613 }
614
615 const Typed_identifier_list* parameters = type->parameters();
616 bool is_varargs = type->is_varargs();
617 if (parameters != NULL)
618 {
619 for (Typed_identifier_list::const_iterator p = parameters->begin();
620 p != parameters->end();
621 ++p)
622 {
623 Variable* param = new Variable(p->type(), NULL, false, true, false,
624 location);
625 if (is_varargs && p + 1 == parameters->end())
626 param->set_is_varargs_parameter();
627
628 std::string name = p->name();
629 if (name.empty() || Gogo::is_sink_name(name))
630 {
631 // We need to give parameters a name since they wind up
632 // in DECL_ARGUMENTS. FIXME.
633 static unsigned int count;
634 char buf[50];
635 snprintf(buf, sizeof buf, "p.%u", count);
636 ++count;
637 name = buf;
638 }
639 block->bindings()->add_variable(name, NULL, param);
640 }
641 }
642
643 function->create_named_result_variables(this);
644
645 const std::string* pname;
646 std::string nested_name;
647 if (!name.empty())
648 pname = &name;
649 else
650 {
651 // Invent a name for a nested function.
652 static int nested_count;
653 char buf[30];
654 snprintf(buf, sizeof buf, ".$nested%d", nested_count);
655 ++nested_count;
656 nested_name = buf;
657 pname = &nested_name;
658 }
659
660 Named_object* ret;
661 if (Gogo::is_sink_name(*pname))
662 {
663 static int sink_count;
664 char buf[30];
665 snprintf(buf, sizeof buf, ".$sink%d", sink_count);
666 ++sink_count;
667 ret = Named_object::make_function(buf, NULL, function);
668 }
669 else if (!type->is_method())
670 {
671 ret = this->package_->bindings()->add_function(*pname, NULL, function);
672 if (!ret->is_function())
673 {
674 // Redefinition error.
675 ret = Named_object::make_function(name, NULL, function);
676 }
677 }
678 else
679 {
680 if (!add_method_to_type)
681 ret = Named_object::make_function(name, NULL, function);
682 else
683 {
684 gcc_assert(at_top_level);
685 Type* rtype = type->receiver()->type();
686
687 // We want to look through the pointer created by the
688 // parser, without getting an error if the type is not yet
689 // defined.
690 if (rtype->classification() == Type::TYPE_POINTER)
691 rtype = rtype->points_to();
692
693 if (rtype->is_error_type())
694 ret = Named_object::make_function(name, NULL, function);
695 else if (rtype->named_type() != NULL)
696 {
697 ret = rtype->named_type()->add_method(name, function);
698 if (!ret->is_function())
699 {
700 // Redefinition error.
701 ret = Named_object::make_function(name, NULL, function);
702 }
703 }
704 else if (rtype->forward_declaration_type() != NULL)
705 {
706 Named_object* type_no =
707 rtype->forward_declaration_type()->named_object();
708 if (type_no->is_unknown())
709 {
710 // If we are seeing methods it really must be a
711 // type. Declare it as such. An alternative would
712 // be to support lists of methods for unknown
713 // expressions. Either way the error messages if
714 // this is not a type are going to get confusing.
715 Named_object* declared =
716 this->declare_package_type(type_no->name(),
717 type_no->location());
718 gcc_assert(declared
719 == type_no->unknown_value()->real_named_object());
720 }
721 ret = rtype->forward_declaration_type()->add_method(name,
722 function);
723 }
724 else
725 gcc_unreachable();
726 }
727 this->package_->bindings()->add_method(ret);
728 }
729
730 this->functions_.resize(this->functions_.size() + 1);
731 Open_function& of(this->functions_.back());
732 of.function = ret;
733 of.blocks.push_back(block);
734
735 if (!type->is_method() && Gogo::unpack_hidden_name(name) == "init")
736 {
737 this->init_functions_.push_back(ret);
738 this->need_init_fn_ = true;
739 }
740
741 return ret;
742 }
743
744 // Finish compiling a function.
745
746 void
747 Gogo::finish_function(source_location location)
748 {
749 this->finish_block(location);
750 gcc_assert(this->functions_.back().blocks.empty());
751 this->functions_.pop_back();
752 }
753
754 // Return the current function.
755
756 Named_object*
757 Gogo::current_function() const
758 {
759 gcc_assert(!this->functions_.empty());
760 return this->functions_.back().function;
761 }
762
763 // Start a new block.
764
765 void
766 Gogo::start_block(source_location location)
767 {
768 gcc_assert(!this->functions_.empty());
769 Block* block = new Block(this->current_block(), location);
770 this->functions_.back().blocks.push_back(block);
771 }
772
773 // Finish a block.
774
775 Block*
776 Gogo::finish_block(source_location location)
777 {
778 gcc_assert(!this->functions_.empty());
779 gcc_assert(!this->functions_.back().blocks.empty());
780 Block* block = this->functions_.back().blocks.back();
781 this->functions_.back().blocks.pop_back();
782 block->set_end_location(location);
783 return block;
784 }
785
786 // Add an unknown name.
787
788 Named_object*
789 Gogo::add_unknown_name(const std::string& name, source_location location)
790 {
791 return this->package_->bindings()->add_unknown_name(name, location);
792 }
793
794 // Declare a function.
795
796 Named_object*
797 Gogo::declare_function(const std::string& name, Function_type* type,
798 source_location location)
799 {
800 if (!type->is_method())
801 return this->current_bindings()->add_function_declaration(name, NULL, type,
802 location);
803 else
804 {
805 // We don't bother to add this to the list of global
806 // declarations.
807 Type* rtype = type->receiver()->type();
808
809 // We want to look through the pointer created by the
810 // parser, without getting an error if the type is not yet
811 // defined.
812 if (rtype->classification() == Type::TYPE_POINTER)
813 rtype = rtype->points_to();
814
815 if (rtype->is_error_type())
816 return NULL;
817 else if (rtype->named_type() != NULL)
818 return rtype->named_type()->add_method_declaration(name, NULL, type,
819 location);
820 else if (rtype->forward_declaration_type() != NULL)
821 {
822 Forward_declaration_type* ftype = rtype->forward_declaration_type();
823 return ftype->add_method_declaration(name, type, location);
824 }
825 else
826 gcc_unreachable();
827 }
828 }
829
830 // Add a label definition.
831
832 Label*
833 Gogo::add_label_definition(const std::string& label_name,
834 source_location location)
835 {
836 gcc_assert(!this->functions_.empty());
837 Function* func = this->functions_.back().function->func_value();
838 Label* label = func->add_label_definition(label_name, location);
839 this->add_statement(Statement::make_label_statement(label, location));
840 return label;
841 }
842
843 // Add a label reference.
844
845 Label*
846 Gogo::add_label_reference(const std::string& label_name)
847 {
848 gcc_assert(!this->functions_.empty());
849 Function* func = this->functions_.back().function->func_value();
850 return func->add_label_reference(label_name);
851 }
852
853 // Add a statement.
854
855 void
856 Gogo::add_statement(Statement* statement)
857 {
858 gcc_assert(!this->functions_.empty()
859 && !this->functions_.back().blocks.empty());
860 this->functions_.back().blocks.back()->add_statement(statement);
861 }
862
863 // Add a block.
864
865 void
866 Gogo::add_block(Block* block, source_location location)
867 {
868 gcc_assert(!this->functions_.empty()
869 && !this->functions_.back().blocks.empty());
870 Statement* statement = Statement::make_block_statement(block, location);
871 this->functions_.back().blocks.back()->add_statement(statement);
872 }
873
874 // Add a constant.
875
876 Named_object*
877 Gogo::add_constant(const Typed_identifier& tid, Expression* expr,
878 int iota_value)
879 {
880 return this->current_bindings()->add_constant(tid, NULL, expr, iota_value);
881 }
882
883 // Add a type.
884
885 void
886 Gogo::add_type(const std::string& name, Type* type, source_location location)
887 {
888 Named_object* no = this->current_bindings()->add_type(name, NULL, type,
889 location);
890 if (!this->in_global_scope() && no->is_type())
891 no->type_value()->set_in_function(this->functions_.back().function);
892 }
893
894 // Add a named type.
895
896 void
897 Gogo::add_named_type(Named_type* type)
898 {
899 gcc_assert(this->in_global_scope());
900 this->current_bindings()->add_named_type(type);
901 }
902
903 // Declare a type.
904
905 Named_object*
906 Gogo::declare_type(const std::string& name, source_location location)
907 {
908 Bindings* bindings = this->current_bindings();
909 Named_object* no = bindings->add_type_declaration(name, NULL, location);
910 if (!this->in_global_scope() && no->is_type_declaration())
911 {
912 Named_object* f = this->functions_.back().function;
913 no->type_declaration_value()->set_in_function(f);
914 }
915 return no;
916 }
917
918 // Declare a type at the package level.
919
920 Named_object*
921 Gogo::declare_package_type(const std::string& name, source_location location)
922 {
923 return this->package_->bindings()->add_type_declaration(name, NULL, location);
924 }
925
926 // Define a type which was already declared.
927
928 void
929 Gogo::define_type(Named_object* no, Named_type* type)
930 {
931 this->current_bindings()->define_type(no, type);
932 }
933
934 // Add a variable.
935
936 Named_object*
937 Gogo::add_variable(const std::string& name, Variable* variable)
938 {
939 Named_object* no = this->current_bindings()->add_variable(name, NULL,
940 variable);
941
942 // In a function the middle-end wants to see a DECL_EXPR node.
943 if (no != NULL
944 && no->is_variable()
945 && !no->var_value()->is_parameter()
946 && !this->functions_.empty())
947 this->add_statement(Statement::make_variable_declaration(no));
948
949 return no;
950 }
951
952 // Add a sink--a reference to the blank identifier _.
953
954 Named_object*
955 Gogo::add_sink()
956 {
957 return Named_object::make_sink();
958 }
959
960 // Add a named object.
961
962 void
963 Gogo::add_named_object(Named_object* no)
964 {
965 this->current_bindings()->add_named_object(no);
966 }
967
968 // Record that we've seen an interface type.
969
970 void
971 Gogo::record_interface_type(Interface_type* itype)
972 {
973 this->interface_types_.push_back(itype);
974 }
975
976 // Return a name for a thunk object.
977
978 std::string
979 Gogo::thunk_name()
980 {
981 static int thunk_count;
982 char thunk_name[50];
983 snprintf(thunk_name, sizeof thunk_name, "$thunk%d", thunk_count);
984 ++thunk_count;
985 return thunk_name;
986 }
987
988 // Return whether a function is a thunk.
989
990 bool
991 Gogo::is_thunk(const Named_object* no)
992 {
993 return no->name().compare(0, 6, "$thunk") == 0;
994 }
995
996 // Define the global names. We do this only after parsing all the
997 // input files, because the program might define the global names
998 // itself.
999
1000 void
1001 Gogo::define_global_names()
1002 {
1003 for (Bindings::const_declarations_iterator p =
1004 this->globals_->begin_declarations();
1005 p != this->globals_->end_declarations();
1006 ++p)
1007 {
1008 Named_object* global_no = p->second;
1009 std::string name(Gogo::pack_hidden_name(global_no->name(), false));
1010 Named_object* no = this->package_->bindings()->lookup(name);
1011 if (no == NULL)
1012 continue;
1013 no = no->resolve();
1014 if (no->is_type_declaration())
1015 {
1016 if (global_no->is_type())
1017 {
1018 if (no->type_declaration_value()->has_methods())
1019 error_at(no->location(),
1020 "may not define methods for global type");
1021 no->set_type_value(global_no->type_value());
1022 }
1023 else
1024 {
1025 error_at(no->location(), "expected type");
1026 Type* errtype = Type::make_error_type();
1027 Named_object* err = Named_object::make_type("error", NULL,
1028 errtype,
1029 BUILTINS_LOCATION);
1030 no->set_type_value(err->type_value());
1031 }
1032 }
1033 else if (no->is_unknown())
1034 no->unknown_value()->set_real_named_object(global_no);
1035 }
1036 }
1037
1038 // Clear out names in file scope.
1039
1040 void
1041 Gogo::clear_file_scope()
1042 {
1043 this->package_->bindings()->clear_file_scope();
1044
1045 // Warn about packages which were imported but not used.
1046 for (Packages::iterator p = this->packages_.begin();
1047 p != this->packages_.end();
1048 ++p)
1049 {
1050 Package* package = p->second;
1051 if (package != this->package_
1052 && package->is_imported()
1053 && !package->used()
1054 && !package->uses_sink_alias()
1055 && !saw_errors())
1056 error_at(package->location(), "imported and not used: %s",
1057 Gogo::message_name(package->name()).c_str());
1058 package->clear_is_imported();
1059 package->clear_uses_sink_alias();
1060 package->clear_used();
1061 }
1062 }
1063
1064 // Traverse the tree.
1065
1066 void
1067 Gogo::traverse(Traverse* traverse)
1068 {
1069 // Traverse the current package first for consistency. The other
1070 // packages will only contain imported types, constants, and
1071 // declarations.
1072 if (this->package_->bindings()->traverse(traverse, true) == TRAVERSE_EXIT)
1073 return;
1074 for (Packages::const_iterator p = this->packages_.begin();
1075 p != this->packages_.end();
1076 ++p)
1077 {
1078 if (p->second != this->package_)
1079 {
1080 if (p->second->bindings()->traverse(traverse, true) == TRAVERSE_EXIT)
1081 break;
1082 }
1083 }
1084 }
1085
1086 // Traversal class used to verify types.
1087
1088 class Verify_types : public Traverse
1089 {
1090 public:
1091 Verify_types()
1092 : Traverse(traverse_types)
1093 { }
1094
1095 int
1096 type(Type*);
1097 };
1098
1099 // Verify that a type is correct.
1100
1101 int
1102 Verify_types::type(Type* t)
1103 {
1104 // Don't verify types defined in other packages.
1105 Named_type* nt = t->named_type();
1106 if (nt != NULL && nt->named_object()->package() != NULL)
1107 return TRAVERSE_SKIP_COMPONENTS;
1108
1109 if (!t->verify())
1110 return TRAVERSE_SKIP_COMPONENTS;
1111 return TRAVERSE_CONTINUE;
1112 }
1113
1114 // Verify that all types are correct.
1115
1116 void
1117 Gogo::verify_types()
1118 {
1119 Verify_types traverse;
1120 this->traverse(&traverse);
1121 }
1122
1123 // Traversal class used to lower parse tree.
1124
1125 class Lower_parse_tree : public Traverse
1126 {
1127 public:
1128 Lower_parse_tree(Gogo* gogo, Named_object* function)
1129 : Traverse(traverse_constants
1130 | traverse_functions
1131 | traverse_statements
1132 | traverse_expressions),
1133 gogo_(gogo), function_(function), iota_value_(-1)
1134 { }
1135
1136 int
1137 constant(Named_object*, bool);
1138
1139 int
1140 function(Named_object*);
1141
1142 int
1143 statement(Block*, size_t* pindex, Statement*);
1144
1145 int
1146 expression(Expression**);
1147
1148 private:
1149 // General IR.
1150 Gogo* gogo_;
1151 // The function we are traversing.
1152 Named_object* function_;
1153 // Value to use for the predeclared constant iota.
1154 int iota_value_;
1155 };
1156
1157 // Lower constants. We handle constants specially so that we can set
1158 // the right value for the predeclared constant iota. This works in
1159 // conjunction with the way we lower Const_expression objects.
1160
1161 int
1162 Lower_parse_tree::constant(Named_object* no, bool)
1163 {
1164 Named_constant* nc = no->const_value();
1165
1166 // Don't get into trouble if the constant's initializer expression
1167 // refers to the constant itself.
1168 if (nc->lowering())
1169 return TRAVERSE_CONTINUE;
1170 nc->set_lowering();
1171
1172 gcc_assert(this->iota_value_ == -1);
1173 this->iota_value_ = nc->iota_value();
1174 nc->traverse_expression(this);
1175 this->iota_value_ = -1;
1176
1177 nc->clear_lowering();
1178
1179 // We will traverse the expression a second time, but that will be
1180 // fast.
1181
1182 return TRAVERSE_CONTINUE;
1183 }
1184
1185 // Lower function closure types. Record the function while lowering
1186 // it, so that we can pass it down when lowering an expression.
1187
1188 int
1189 Lower_parse_tree::function(Named_object* no)
1190 {
1191 no->func_value()->set_closure_type();
1192
1193 gcc_assert(this->function_ == NULL);
1194 this->function_ = no;
1195 int t = no->func_value()->traverse(this);
1196 this->function_ = NULL;
1197
1198 if (t == TRAVERSE_EXIT)
1199 return t;
1200 return TRAVERSE_SKIP_COMPONENTS;
1201 }
1202
1203 // Lower statement parse trees.
1204
1205 int
1206 Lower_parse_tree::statement(Block* block, size_t* pindex, Statement* sorig)
1207 {
1208 // Lower the expressions first.
1209 int t = sorig->traverse_contents(this);
1210 if (t == TRAVERSE_EXIT)
1211 return t;
1212
1213 // Keep lowering until nothing changes.
1214 Statement* s = sorig;
1215 while (true)
1216 {
1217 Statement* snew = s->lower(this->gogo_, block);
1218 if (snew == s)
1219 break;
1220 s = snew;
1221 t = s->traverse_contents(this);
1222 if (t == TRAVERSE_EXIT)
1223 return t;
1224 }
1225
1226 if (s != sorig)
1227 block->replace_statement(*pindex, s);
1228
1229 return TRAVERSE_SKIP_COMPONENTS;
1230 }
1231
1232 // Lower expression parse trees.
1233
1234 int
1235 Lower_parse_tree::expression(Expression** pexpr)
1236 {
1237 // We have to lower all subexpressions first, so that we can get
1238 // their type if necessary. This is awkward, because we don't have
1239 // a postorder traversal pass.
1240 if ((*pexpr)->traverse_subexpressions(this) == TRAVERSE_EXIT)
1241 return TRAVERSE_EXIT;
1242 // Keep lowering until nothing changes.
1243 while (true)
1244 {
1245 Expression* e = *pexpr;
1246 Expression* enew = e->lower(this->gogo_, this->function_,
1247 this->iota_value_);
1248 if (enew == e)
1249 break;
1250 *pexpr = enew;
1251 }
1252 return TRAVERSE_SKIP_COMPONENTS;
1253 }
1254
1255 // Lower the parse tree. This is called after the parse is complete,
1256 // when all names should be resolved.
1257
1258 void
1259 Gogo::lower_parse_tree()
1260 {
1261 Lower_parse_tree lower_parse_tree(this, NULL);
1262 this->traverse(&lower_parse_tree);
1263 }
1264
1265 // Lower an expression.
1266
1267 void
1268 Gogo::lower_expression(Named_object* function, Expression** pexpr)
1269 {
1270 Lower_parse_tree lower_parse_tree(this, function);
1271 lower_parse_tree.expression(pexpr);
1272 }
1273
1274 // Lower a constant. This is called when lowering a reference to a
1275 // constant. We have to make sure that the constant has already been
1276 // lowered.
1277
1278 void
1279 Gogo::lower_constant(Named_object* no)
1280 {
1281 gcc_assert(no->is_const());
1282 Lower_parse_tree lower(this, NULL);
1283 lower.constant(no, false);
1284 }
1285
1286 // Look for interface types to finalize methods of inherited
1287 // interfaces.
1288
1289 class Finalize_methods : public Traverse
1290 {
1291 public:
1292 Finalize_methods(Gogo* gogo)
1293 : Traverse(traverse_types),
1294 gogo_(gogo)
1295 { }
1296
1297 int
1298 type(Type*);
1299
1300 private:
1301 Gogo* gogo_;
1302 };
1303
1304 // Finalize the methods of an interface type.
1305
1306 int
1307 Finalize_methods::type(Type* t)
1308 {
1309 // Check the classification so that we don't finalize the methods
1310 // twice for a named interface type.
1311 switch (t->classification())
1312 {
1313 case Type::TYPE_INTERFACE:
1314 t->interface_type()->finalize_methods();
1315 break;
1316
1317 case Type::TYPE_NAMED:
1318 {
1319 // We have to finalize the methods of the real type first.
1320 // But if the real type is a struct type, then we only want to
1321 // finalize the methods of the field types, not of the struct
1322 // type itself. We don't want to add methods to the struct,
1323 // since it has a name.
1324 Type* rt = t->named_type()->real_type();
1325 if (rt->classification() != Type::TYPE_STRUCT)
1326 {
1327 if (Type::traverse(rt, this) == TRAVERSE_EXIT)
1328 return TRAVERSE_EXIT;
1329 }
1330 else
1331 {
1332 if (rt->struct_type()->traverse_field_types(this) == TRAVERSE_EXIT)
1333 return TRAVERSE_EXIT;
1334 }
1335
1336 t->named_type()->finalize_methods(this->gogo_);
1337
1338 return TRAVERSE_SKIP_COMPONENTS;
1339 }
1340
1341 case Type::TYPE_STRUCT:
1342 t->struct_type()->finalize_methods(this->gogo_);
1343 break;
1344
1345 default:
1346 break;
1347 }
1348
1349 return TRAVERSE_CONTINUE;
1350 }
1351
1352 // Finalize method lists and build stub methods for types.
1353
1354 void
1355 Gogo::finalize_methods()
1356 {
1357 Finalize_methods finalize(this);
1358 this->traverse(&finalize);
1359 }
1360
1361 // Set types for unspecified variables and constants.
1362
1363 void
1364 Gogo::determine_types()
1365 {
1366 Bindings* bindings = this->current_bindings();
1367 for (Bindings::const_definitions_iterator p = bindings->begin_definitions();
1368 p != bindings->end_definitions();
1369 ++p)
1370 {
1371 if ((*p)->is_function())
1372 (*p)->func_value()->determine_types();
1373 else if ((*p)->is_variable())
1374 (*p)->var_value()->determine_type();
1375 else if ((*p)->is_const())
1376 (*p)->const_value()->determine_type();
1377
1378 // See if a variable requires us to build an initialization
1379 // function. We know that we will see all global variables
1380 // here.
1381 if (!this->need_init_fn_ && (*p)->is_variable())
1382 {
1383 Variable* variable = (*p)->var_value();
1384
1385 // If this is a global variable which requires runtime
1386 // initialization, we need an initialization function.
1387 if (!variable->is_global() || variable->init() == NULL)
1388 ;
1389 else if (variable->type()->interface_type() != NULL)
1390 this->need_init_fn_ = true;
1391 else if (variable->init()->is_constant())
1392 ;
1393 else if (!variable->init()->is_composite_literal())
1394 this->need_init_fn_ = true;
1395 else if (variable->init()->is_nonconstant_composite_literal())
1396 this->need_init_fn_ = true;
1397
1398 // If this is a global variable which holds a pointer value,
1399 // then we need an initialization function to register it as a
1400 // GC root.
1401 if (variable->is_global() && variable->type()->has_pointer())
1402 this->need_init_fn_ = true;
1403 }
1404 }
1405
1406 // Determine the types of constants in packages.
1407 for (Packages::const_iterator p = this->packages_.begin();
1408 p != this->packages_.end();
1409 ++p)
1410 p->second->determine_types();
1411 }
1412
1413 // Traversal class used for type checking.
1414
1415 class Check_types_traverse : public Traverse
1416 {
1417 public:
1418 Check_types_traverse(Gogo* gogo)
1419 : Traverse(traverse_variables
1420 | traverse_constants
1421 | traverse_statements
1422 | traverse_expressions),
1423 gogo_(gogo)
1424 { }
1425
1426 int
1427 variable(Named_object*);
1428
1429 int
1430 constant(Named_object*, bool);
1431
1432 int
1433 statement(Block*, size_t* pindex, Statement*);
1434
1435 int
1436 expression(Expression**);
1437
1438 private:
1439 // General IR.
1440 Gogo* gogo_;
1441 };
1442
1443 // Check that a variable initializer has the right type.
1444
1445 int
1446 Check_types_traverse::variable(Named_object* named_object)
1447 {
1448 if (named_object->is_variable())
1449 {
1450 Variable* var = named_object->var_value();
1451 Expression* init = var->init();
1452 std::string reason;
1453 if (init != NULL
1454 && !Type::are_assignable(var->type(), init->type(), &reason))
1455 {
1456 if (reason.empty())
1457 error_at(var->location(), "incompatible type in initialization");
1458 else
1459 error_at(var->location(),
1460 "incompatible type in initialization (%s)",
1461 reason.c_str());
1462 var->clear_init();
1463 }
1464 }
1465 return TRAVERSE_CONTINUE;
1466 }
1467
1468 // Check that a constant initializer has the right type.
1469
1470 int
1471 Check_types_traverse::constant(Named_object* named_object, bool)
1472 {
1473 Named_constant* constant = named_object->const_value();
1474 Type* ctype = constant->type();
1475 if (ctype->integer_type() == NULL
1476 && ctype->float_type() == NULL
1477 && ctype->complex_type() == NULL
1478 && !ctype->is_boolean_type()
1479 && !ctype->is_string_type())
1480 {
1481 if (!ctype->is_error_type())
1482 error_at(constant->location(), "invalid constant type");
1483 constant->set_error();
1484 }
1485 else if (!constant->expr()->is_constant())
1486 {
1487 error_at(constant->expr()->location(), "expression is not constant");
1488 constant->set_error();
1489 }
1490 else if (!Type::are_assignable(constant->type(), constant->expr()->type(),
1491 NULL))
1492 {
1493 error_at(constant->location(),
1494 "initialization expression has wrong type");
1495 constant->set_error();
1496 }
1497 return TRAVERSE_CONTINUE;
1498 }
1499
1500 // Check that types are valid in a statement.
1501
1502 int
1503 Check_types_traverse::statement(Block*, size_t*, Statement* s)
1504 {
1505 s->check_types(this->gogo_);
1506 return TRAVERSE_CONTINUE;
1507 }
1508
1509 // Check that types are valid in an expression.
1510
1511 int
1512 Check_types_traverse::expression(Expression** expr)
1513 {
1514 (*expr)->check_types(this->gogo_);
1515 return TRAVERSE_CONTINUE;
1516 }
1517
1518 // Check that types are valid.
1519
1520 void
1521 Gogo::check_types()
1522 {
1523 Check_types_traverse traverse(this);
1524 this->traverse(&traverse);
1525 }
1526
1527 // Check the types in a single block.
1528
1529 void
1530 Gogo::check_types_in_block(Block* block)
1531 {
1532 Check_types_traverse traverse(this);
1533 block->traverse(&traverse);
1534 }
1535
1536 // A traversal class used to find a single shortcut operator within an
1537 // expression.
1538
1539 class Find_shortcut : public Traverse
1540 {
1541 public:
1542 Find_shortcut()
1543 : Traverse(traverse_blocks
1544 | traverse_statements
1545 | traverse_expressions),
1546 found_(NULL)
1547 { }
1548
1549 // A pointer to the expression which was found, or NULL if none was
1550 // found.
1551 Expression**
1552 found() const
1553 { return this->found_; }
1554
1555 protected:
1556 int
1557 block(Block*)
1558 { return TRAVERSE_SKIP_COMPONENTS; }
1559
1560 int
1561 statement(Block*, size_t*, Statement*)
1562 { return TRAVERSE_SKIP_COMPONENTS; }
1563
1564 int
1565 expression(Expression**);
1566
1567 private:
1568 Expression** found_;
1569 };
1570
1571 // Find a shortcut expression.
1572
1573 int
1574 Find_shortcut::expression(Expression** pexpr)
1575 {
1576 Expression* expr = *pexpr;
1577 Binary_expression* be = expr->binary_expression();
1578 if (be == NULL)
1579 return TRAVERSE_CONTINUE;
1580 Operator op = be->op();
1581 if (op != OPERATOR_OROR && op != OPERATOR_ANDAND)
1582 return TRAVERSE_CONTINUE;
1583 gcc_assert(this->found_ == NULL);
1584 this->found_ = pexpr;
1585 return TRAVERSE_EXIT;
1586 }
1587
1588 // A traversal class used to turn shortcut operators into explicit if
1589 // statements.
1590
1591 class Shortcuts : public Traverse
1592 {
1593 public:
1594 Shortcuts()
1595 : Traverse(traverse_variables
1596 | traverse_statements)
1597 { }
1598
1599 protected:
1600 int
1601 variable(Named_object*);
1602
1603 int
1604 statement(Block*, size_t*, Statement*);
1605
1606 private:
1607 // Convert a shortcut operator.
1608 Statement*
1609 convert_shortcut(Block* enclosing, Expression** pshortcut);
1610 };
1611
1612 // Remove shortcut operators in a single statement.
1613
1614 int
1615 Shortcuts::statement(Block* block, size_t* pindex, Statement* s)
1616 {
1617 // FIXME: This approach doesn't work for switch statements, because
1618 // we add the new statements before the whole switch when we need to
1619 // instead add them just before the switch expression. The right
1620 // fix is probably to lower switch statements with nonconstant cases
1621 // to a series of conditionals.
1622 if (s->switch_statement() != NULL)
1623 return TRAVERSE_CONTINUE;
1624
1625 while (true)
1626 {
1627 Find_shortcut find_shortcut;
1628
1629 // If S is a variable declaration, then ordinary traversal won't
1630 // do anything. We want to explicitly traverse the
1631 // initialization expression if there is one.
1632 Variable_declaration_statement* vds = s->variable_declaration_statement();
1633 Expression* init = NULL;
1634 if (vds == NULL)
1635 s->traverse_contents(&find_shortcut);
1636 else
1637 {
1638 init = vds->var()->var_value()->init();
1639 if (init == NULL)
1640 return TRAVERSE_CONTINUE;
1641 init->traverse(&init, &find_shortcut);
1642 }
1643 Expression** pshortcut = find_shortcut.found();
1644 if (pshortcut == NULL)
1645 return TRAVERSE_CONTINUE;
1646
1647 Statement* snew = this->convert_shortcut(block, pshortcut);
1648 block->insert_statement_before(*pindex, snew);
1649 ++*pindex;
1650
1651 if (pshortcut == &init)
1652 vds->var()->var_value()->set_init(init);
1653 }
1654 }
1655
1656 // Remove shortcut operators in the initializer of a global variable.
1657
1658 int
1659 Shortcuts::variable(Named_object* no)
1660 {
1661 if (no->is_result_variable())
1662 return TRAVERSE_CONTINUE;
1663 Variable* var = no->var_value();
1664 Expression* init = var->init();
1665 if (!var->is_global() || init == NULL)
1666 return TRAVERSE_CONTINUE;
1667
1668 while (true)
1669 {
1670 Find_shortcut find_shortcut;
1671 init->traverse(&init, &find_shortcut);
1672 Expression** pshortcut = find_shortcut.found();
1673 if (pshortcut == NULL)
1674 return TRAVERSE_CONTINUE;
1675
1676 Statement* snew = this->convert_shortcut(NULL, pshortcut);
1677 var->add_preinit_statement(snew);
1678 if (pshortcut == &init)
1679 var->set_init(init);
1680 }
1681 }
1682
1683 // Given an expression which uses a shortcut operator, return a
1684 // statement which implements it, and update *PSHORTCUT accordingly.
1685
1686 Statement*
1687 Shortcuts::convert_shortcut(Block* enclosing, Expression** pshortcut)
1688 {
1689 Binary_expression* shortcut = (*pshortcut)->binary_expression();
1690 Expression* left = shortcut->left();
1691 Expression* right = shortcut->right();
1692 source_location loc = shortcut->location();
1693
1694 Block* retblock = new Block(enclosing, loc);
1695 retblock->set_end_location(loc);
1696
1697 Temporary_statement* ts = Statement::make_temporary(Type::make_boolean_type(),
1698 left, loc);
1699 retblock->add_statement(ts);
1700
1701 Block* block = new Block(retblock, loc);
1702 block->set_end_location(loc);
1703 Expression* tmpref = Expression::make_temporary_reference(ts, loc);
1704 Statement* assign = Statement::make_assignment(tmpref, right, loc);
1705 block->add_statement(assign);
1706
1707 Expression* cond = Expression::make_temporary_reference(ts, loc);
1708 if (shortcut->binary_expression()->op() == OPERATOR_OROR)
1709 cond = Expression::make_unary(OPERATOR_NOT, cond, loc);
1710
1711 Statement* if_statement = Statement::make_if_statement(cond, block, NULL,
1712 loc);
1713 retblock->add_statement(if_statement);
1714
1715 *pshortcut = Expression::make_temporary_reference(ts, loc);
1716
1717 delete shortcut;
1718
1719 // Now convert any shortcut operators in LEFT and RIGHT.
1720 Shortcuts shortcuts;
1721 retblock->traverse(&shortcuts);
1722
1723 return Statement::make_block_statement(retblock, loc);
1724 }
1725
1726 // Turn shortcut operators into explicit if statements. Doing this
1727 // considerably simplifies the order of evaluation rules.
1728
1729 void
1730 Gogo::remove_shortcuts()
1731 {
1732 Shortcuts shortcuts;
1733 this->traverse(&shortcuts);
1734 }
1735
1736 // A traversal class which finds all the expressions which must be
1737 // evaluated in order within a statement or larger expression. This
1738 // is used to implement the rules about order of evaluation.
1739
1740 class Find_eval_ordering : public Traverse
1741 {
1742 private:
1743 typedef std::vector<Expression**> Expression_pointers;
1744
1745 public:
1746 Find_eval_ordering()
1747 : Traverse(traverse_blocks
1748 | traverse_statements
1749 | traverse_expressions),
1750 exprs_()
1751 { }
1752
1753 size_t
1754 size() const
1755 { return this->exprs_.size(); }
1756
1757 typedef Expression_pointers::const_iterator const_iterator;
1758
1759 const_iterator
1760 begin() const
1761 { return this->exprs_.begin(); }
1762
1763 const_iterator
1764 end() const
1765 { return this->exprs_.end(); }
1766
1767 protected:
1768 int
1769 block(Block*)
1770 { return TRAVERSE_SKIP_COMPONENTS; }
1771
1772 int
1773 statement(Block*, size_t*, Statement*)
1774 { return TRAVERSE_SKIP_COMPONENTS; }
1775
1776 int
1777 expression(Expression**);
1778
1779 private:
1780 // A list of pointers to expressions with side-effects.
1781 Expression_pointers exprs_;
1782 };
1783
1784 // If an expression must be evaluated in order, put it on the list.
1785
1786 int
1787 Find_eval_ordering::expression(Expression** expression_pointer)
1788 {
1789 // We have to look at subexpressions before this one.
1790 if ((*expression_pointer)->traverse_subexpressions(this) == TRAVERSE_EXIT)
1791 return TRAVERSE_EXIT;
1792 if ((*expression_pointer)->must_eval_in_order())
1793 this->exprs_.push_back(expression_pointer);
1794 return TRAVERSE_SKIP_COMPONENTS;
1795 }
1796
1797 // A traversal class for ordering evaluations.
1798
1799 class Order_eval : public Traverse
1800 {
1801 public:
1802 Order_eval()
1803 : Traverse(traverse_variables
1804 | traverse_statements)
1805 { }
1806
1807 int
1808 variable(Named_object*);
1809
1810 int
1811 statement(Block*, size_t*, Statement*);
1812 };
1813
1814 // Implement the order of evaluation rules for a statement.
1815
1816 int
1817 Order_eval::statement(Block* block, size_t* pindex, Statement* s)
1818 {
1819 // FIXME: This approach doesn't work for switch statements, because
1820 // we add the new statements before the whole switch when we need to
1821 // instead add them just before the switch expression. The right
1822 // fix is probably to lower switch statements with nonconstant cases
1823 // to a series of conditionals.
1824 if (s->switch_statement() != NULL)
1825 return TRAVERSE_CONTINUE;
1826
1827 Find_eval_ordering find_eval_ordering;
1828
1829 // If S is a variable declaration, then ordinary traversal won't do
1830 // anything. We want to explicitly traverse the initialization
1831 // expression if there is one.
1832 Variable_declaration_statement* vds = s->variable_declaration_statement();
1833 Expression* init = NULL;
1834 Expression* orig_init = NULL;
1835 if (vds == NULL)
1836 s->traverse_contents(&find_eval_ordering);
1837 else
1838 {
1839 init = vds->var()->var_value()->init();
1840 if (init == NULL)
1841 return TRAVERSE_CONTINUE;
1842 orig_init = init;
1843
1844 // It might seem that this could be
1845 // init->traverse_subexpressions. Unfortunately that can fail
1846 // in a case like
1847 // var err os.Error
1848 // newvar, err := call(arg())
1849 // Here newvar will have an init of call result 0 of
1850 // call(arg()). If we only traverse subexpressions, we will
1851 // only find arg(), and we won't bother to move anything out.
1852 // Then we get to the assignment to err, we will traverse the
1853 // whole statement, and this time we will find both call() and
1854 // arg(), and so we will move them out. This will cause them to
1855 // be put into temporary variables before the assignment to err
1856 // but after the declaration of newvar. To avoid that problem,
1857 // we traverse the entire expression here.
1858 Expression::traverse(&init, &find_eval_ordering);
1859 }
1860
1861 if (find_eval_ordering.size() <= 1)
1862 {
1863 // If there is only one expression with a side-effect, we can
1864 // leave it in place.
1865 return TRAVERSE_CONTINUE;
1866 }
1867
1868 bool is_thunk = s->thunk_statement() != NULL;
1869 for (Find_eval_ordering::const_iterator p = find_eval_ordering.begin();
1870 p != find_eval_ordering.end();
1871 ++p)
1872 {
1873 Expression** pexpr = *p;
1874
1875 // If the last expression is a send or receive expression, we
1876 // may be ignoring the value; we don't want to evaluate it
1877 // early.
1878 if (p + 1 == find_eval_ordering.end()
1879 && ((*pexpr)->classification() == Expression::EXPRESSION_SEND
1880 || (*pexpr)->classification() == Expression::EXPRESSION_RECEIVE))
1881 break;
1882
1883 // The last expression in a thunk will be the call passed to go
1884 // or defer, which we must not evaluate early.
1885 if (is_thunk && p + 1 == find_eval_ordering.end())
1886 break;
1887
1888 source_location loc = (*pexpr)->location();
1889 Temporary_statement* ts = Statement::make_temporary(NULL, *pexpr, loc);
1890 block->insert_statement_before(*pindex, ts);
1891 ++*pindex;
1892
1893 *pexpr = Expression::make_temporary_reference(ts, loc);
1894 }
1895
1896 if (init != orig_init)
1897 vds->var()->var_value()->set_init(init);
1898
1899 return TRAVERSE_CONTINUE;
1900 }
1901
1902 // Implement the order of evaluation rules for the initializer of a
1903 // global variable.
1904
1905 int
1906 Order_eval::variable(Named_object* no)
1907 {
1908 if (no->is_result_variable())
1909 return TRAVERSE_CONTINUE;
1910 Variable* var = no->var_value();
1911 Expression* init = var->init();
1912 if (!var->is_global() || init == NULL)
1913 return TRAVERSE_CONTINUE;
1914
1915 Find_eval_ordering find_eval_ordering;
1916 init->traverse_subexpressions(&find_eval_ordering);
1917
1918 if (find_eval_ordering.size() <= 1)
1919 {
1920 // If there is only one expression with a side-effect, we can
1921 // leave it in place.
1922 return TRAVERSE_SKIP_COMPONENTS;
1923 }
1924
1925 for (Find_eval_ordering::const_iterator p = find_eval_ordering.begin();
1926 p != find_eval_ordering.end();
1927 ++p)
1928 {
1929 Expression** pexpr = *p;
1930 source_location loc = (*pexpr)->location();
1931 Temporary_statement* ts = Statement::make_temporary(NULL, *pexpr, loc);
1932 var->add_preinit_statement(ts);
1933 *pexpr = Expression::make_temporary_reference(ts, loc);
1934 }
1935
1936 return TRAVERSE_SKIP_COMPONENTS;
1937 }
1938
1939 // Use temporary variables to implement the order of evaluation rules.
1940
1941 void
1942 Gogo::order_evaluations()
1943 {
1944 Order_eval order_eval;
1945 this->traverse(&order_eval);
1946 }
1947
1948 // Traversal to convert calls to the predeclared recover function to
1949 // pass in an argument indicating whether it can recover from a panic
1950 // or not.
1951
1952 class Convert_recover : public Traverse
1953 {
1954 public:
1955 Convert_recover(Named_object* arg)
1956 : Traverse(traverse_expressions),
1957 arg_(arg)
1958 { }
1959
1960 protected:
1961 int
1962 expression(Expression**);
1963
1964 private:
1965 // The argument to pass to the function.
1966 Named_object* arg_;
1967 };
1968
1969 // Convert calls to recover.
1970
1971 int
1972 Convert_recover::expression(Expression** pp)
1973 {
1974 Call_expression* ce = (*pp)->call_expression();
1975 if (ce != NULL && ce->is_recover_call())
1976 ce->set_recover_arg(Expression::make_var_reference(this->arg_,
1977 ce->location()));
1978 return TRAVERSE_CONTINUE;
1979 }
1980
1981 // Traversal for build_recover_thunks.
1982
1983 class Build_recover_thunks : public Traverse
1984 {
1985 public:
1986 Build_recover_thunks(Gogo* gogo)
1987 : Traverse(traverse_functions),
1988 gogo_(gogo)
1989 { }
1990
1991 int
1992 function(Named_object*);
1993
1994 private:
1995 Expression*
1996 can_recover_arg(source_location);
1997
1998 // General IR.
1999 Gogo* gogo_;
2000 };
2001
2002 // If this function calls recover, turn it into a thunk.
2003
2004 int
2005 Build_recover_thunks::function(Named_object* orig_no)
2006 {
2007 Function* orig_func = orig_no->func_value();
2008 if (!orig_func->calls_recover()
2009 || orig_func->is_recover_thunk()
2010 || orig_func->has_recover_thunk())
2011 return TRAVERSE_CONTINUE;
2012
2013 Gogo* gogo = this->gogo_;
2014 source_location location = orig_func->location();
2015
2016 static int count;
2017 char buf[50];
2018
2019 Function_type* orig_fntype = orig_func->type();
2020 Typed_identifier_list* new_params = new Typed_identifier_list();
2021 std::string receiver_name;
2022 if (orig_fntype->is_method())
2023 {
2024 const Typed_identifier* receiver = orig_fntype->receiver();
2025 snprintf(buf, sizeof buf, "rt.%u", count);
2026 ++count;
2027 receiver_name = buf;
2028 new_params->push_back(Typed_identifier(receiver_name, receiver->type(),
2029 receiver->location()));
2030 }
2031 const Typed_identifier_list* orig_params = orig_fntype->parameters();
2032 if (orig_params != NULL && !orig_params->empty())
2033 {
2034 for (Typed_identifier_list::const_iterator p = orig_params->begin();
2035 p != orig_params->end();
2036 ++p)
2037 {
2038 snprintf(buf, sizeof buf, "pt.%u", count);
2039 ++count;
2040 new_params->push_back(Typed_identifier(buf, p->type(),
2041 p->location()));
2042 }
2043 }
2044 snprintf(buf, sizeof buf, "pr.%u", count);
2045 ++count;
2046 std::string can_recover_name = buf;
2047 new_params->push_back(Typed_identifier(can_recover_name,
2048 Type::make_boolean_type(),
2049 orig_fntype->location()));
2050
2051 const Typed_identifier_list* orig_results = orig_fntype->results();
2052 Typed_identifier_list* new_results;
2053 if (orig_results == NULL || orig_results->empty())
2054 new_results = NULL;
2055 else
2056 {
2057 new_results = new Typed_identifier_list();
2058 for (Typed_identifier_list::const_iterator p = orig_results->begin();
2059 p != orig_results->end();
2060 ++p)
2061 new_results->push_back(*p);
2062 }
2063
2064 Function_type *new_fntype = Type::make_function_type(NULL, new_params,
2065 new_results,
2066 orig_fntype->location());
2067 if (orig_fntype->is_varargs())
2068 new_fntype->set_is_varargs();
2069
2070 std::string name = orig_no->name() + "$recover";
2071 Named_object *new_no = gogo->start_function(name, new_fntype, false,
2072 location);
2073 Function *new_func = new_no->func_value();
2074 if (orig_func->enclosing() != NULL)
2075 new_func->set_enclosing(orig_func->enclosing());
2076
2077 // We build the code for the original function attached to the new
2078 // function, and then swap the original and new function bodies.
2079 // This means that existing references to the original function will
2080 // then refer to the new function. That makes this code a little
2081 // confusing, in that the reference to NEW_NO really refers to the
2082 // other function, not the one we are building.
2083
2084 Expression* closure = NULL;
2085 if (orig_func->needs_closure())
2086 {
2087 Named_object* orig_closure_no = orig_func->closure_var();
2088 Variable* orig_closure_var = orig_closure_no->var_value();
2089 Variable* new_var = new Variable(orig_closure_var->type(), NULL, false,
2090 true, false, location);
2091 snprintf(buf, sizeof buf, "closure.%u", count);
2092 ++count;
2093 Named_object* new_closure_no = Named_object::make_variable(buf, NULL,
2094 new_var);
2095 new_func->set_closure_var(new_closure_no);
2096 closure = Expression::make_var_reference(new_closure_no, location);
2097 }
2098
2099 Expression* fn = Expression::make_func_reference(new_no, closure, location);
2100
2101 Expression_list* args = new Expression_list();
2102 if (new_params != NULL)
2103 {
2104 // Note that we skip the last parameter, which is the boolean
2105 // indicating whether recover can succed.
2106 for (Typed_identifier_list::const_iterator p = new_params->begin();
2107 p + 1 != new_params->end();
2108 ++p)
2109 {
2110 Named_object* p_no = gogo->lookup(p->name(), NULL);
2111 gcc_assert(p_no != NULL
2112 && p_no->is_variable()
2113 && p_no->var_value()->is_parameter());
2114 args->push_back(Expression::make_var_reference(p_no, location));
2115 }
2116 }
2117 args->push_back(this->can_recover_arg(location));
2118
2119 Expression* call = Expression::make_call(fn, args, false, location);
2120
2121 Statement* s;
2122 if (orig_fntype->results() == NULL || orig_fntype->results()->empty())
2123 s = Statement::make_statement(call);
2124 else
2125 {
2126 Expression_list* vals = new Expression_list();
2127 vals->push_back(call);
2128 s = Statement::make_return_statement(new_func->type()->results(),
2129 vals, location);
2130 }
2131 s->determine_types();
2132 gogo->add_statement(s);
2133
2134 gogo->finish_function(location);
2135
2136 // Swap the function bodies and types.
2137 new_func->swap_for_recover(orig_func);
2138 orig_func->set_is_recover_thunk();
2139 new_func->set_calls_recover();
2140 new_func->set_has_recover_thunk();
2141
2142 Bindings* orig_bindings = orig_func->block()->bindings();
2143 Bindings* new_bindings = new_func->block()->bindings();
2144 if (orig_fntype->is_method())
2145 {
2146 // We changed the receiver to be a regular parameter. We have
2147 // to update the binding accordingly in both functions.
2148 Named_object* orig_rec_no = orig_bindings->lookup_local(receiver_name);
2149 gcc_assert(orig_rec_no != NULL
2150 && orig_rec_no->is_variable()
2151 && !orig_rec_no->var_value()->is_receiver());
2152 orig_rec_no->var_value()->set_is_receiver();
2153
2154 const std::string& new_receiver_name(orig_fntype->receiver()->name());
2155 Named_object* new_rec_no = new_bindings->lookup_local(new_receiver_name);
2156 gcc_assert(new_rec_no != NULL
2157 && new_rec_no->is_variable()
2158 && new_rec_no->var_value()->is_receiver());
2159 new_rec_no->var_value()->set_is_not_receiver();
2160 }
2161
2162 // Because we flipped blocks but not types, the can_recover
2163 // parameter appears in the (now) old bindings as a parameter.
2164 // Change it to a local variable, whereupon it will be discarded.
2165 Named_object* can_recover_no = orig_bindings->lookup_local(can_recover_name);
2166 gcc_assert(can_recover_no != NULL
2167 && can_recover_no->is_variable()
2168 && can_recover_no->var_value()->is_parameter());
2169 orig_bindings->remove_binding(can_recover_no);
2170
2171 // Add the can_recover argument to the (now) new bindings, and
2172 // attach it to any recover statements.
2173 Variable* can_recover_var = new Variable(Type::make_boolean_type(), NULL,
2174 false, true, false, location);
2175 can_recover_no = new_bindings->add_variable(can_recover_name, NULL,
2176 can_recover_var);
2177 Convert_recover convert_recover(can_recover_no);
2178 new_func->traverse(&convert_recover);
2179
2180 // Update the function pointers in any named results.
2181 new_func->update_named_result_variables();
2182 orig_func->update_named_result_variables();
2183
2184 return TRAVERSE_CONTINUE;
2185 }
2186
2187 // Return the expression to pass for the .can_recover parameter to the
2188 // new function. This indicates whether a call to recover may return
2189 // non-nil. The expression is
2190 // __go_can_recover(__builtin_return_address()).
2191
2192 Expression*
2193 Build_recover_thunks::can_recover_arg(source_location location)
2194 {
2195 static Named_object* builtin_return_address;
2196 if (builtin_return_address == NULL)
2197 {
2198 const source_location bloc = BUILTINS_LOCATION;
2199
2200 Typed_identifier_list* param_types = new Typed_identifier_list();
2201 Type* uint_type = Type::lookup_integer_type("uint");
2202 param_types->push_back(Typed_identifier("l", uint_type, bloc));
2203
2204 Typed_identifier_list* return_types = new Typed_identifier_list();
2205 Type* voidptr_type = Type::make_pointer_type(Type::make_void_type());
2206 return_types->push_back(Typed_identifier("", voidptr_type, bloc));
2207
2208 Function_type* fntype = Type::make_function_type(NULL, param_types,
2209 return_types, bloc);
2210 builtin_return_address =
2211 Named_object::make_function_declaration("__builtin_return_address",
2212 NULL, fntype, bloc);
2213 const char* n = "__builtin_return_address";
2214 builtin_return_address->func_declaration_value()->set_asm_name(n);
2215 }
2216
2217 static Named_object* can_recover;
2218 if (can_recover == NULL)
2219 {
2220 const source_location bloc = BUILTINS_LOCATION;
2221 Typed_identifier_list* param_types = new Typed_identifier_list();
2222 Type* voidptr_type = Type::make_pointer_type(Type::make_void_type());
2223 param_types->push_back(Typed_identifier("a", voidptr_type, bloc));
2224 Type* boolean_type = Type::make_boolean_type();
2225 Typed_identifier_list* results = new Typed_identifier_list();
2226 results->push_back(Typed_identifier("", boolean_type, bloc));
2227 Function_type* fntype = Type::make_function_type(NULL, param_types,
2228 results, bloc);
2229 can_recover = Named_object::make_function_declaration("__go_can_recover",
2230 NULL, fntype,
2231 bloc);
2232 can_recover->func_declaration_value()->set_asm_name("__go_can_recover");
2233 }
2234
2235 Expression* fn = Expression::make_func_reference(builtin_return_address,
2236 NULL, location);
2237
2238 mpz_t zval;
2239 mpz_init_set_ui(zval, 0UL);
2240 Expression* zexpr = Expression::make_integer(&zval, NULL, location);
2241 mpz_clear(zval);
2242 Expression_list *args = new Expression_list();
2243 args->push_back(zexpr);
2244
2245 Expression* call = Expression::make_call(fn, args, false, location);
2246
2247 args = new Expression_list();
2248 args->push_back(call);
2249
2250 fn = Expression::make_func_reference(can_recover, NULL, location);
2251 return Expression::make_call(fn, args, false, location);
2252 }
2253
2254 // Build thunks for functions which call recover. We build a new
2255 // function with an extra parameter, which is whether a call to
2256 // recover can succeed. We then move the body of this function to
2257 // that one. We then turn this function into a thunk which calls the
2258 // new one, passing the value of
2259 // __go_can_recover(__builtin_return_address()). The function will be
2260 // marked as not splitting the stack. This will cooperate with the
2261 // implementation of defer to make recover do the right thing.
2262
2263 void
2264 Gogo::build_recover_thunks()
2265 {
2266 Build_recover_thunks build_recover_thunks(this);
2267 this->traverse(&build_recover_thunks);
2268 }
2269
2270 // Look for named types to see whether we need to create an interface
2271 // method table.
2272
2273 class Build_method_tables : public Traverse
2274 {
2275 public:
2276 Build_method_tables(Gogo* gogo,
2277 const std::vector<Interface_type*>& interfaces)
2278 : Traverse(traverse_types),
2279 gogo_(gogo), interfaces_(interfaces)
2280 { }
2281
2282 int
2283 type(Type*);
2284
2285 private:
2286 // The IR.
2287 Gogo* gogo_;
2288 // A list of locally defined interfaces which have hidden methods.
2289 const std::vector<Interface_type*>& interfaces_;
2290 };
2291
2292 // Build all required interface method tables for types. We need to
2293 // ensure that we have an interface method table for every interface
2294 // which has a hidden method, for every named type which implements
2295 // that interface. Normally we can just build interface method tables
2296 // as we need them. However, in some cases we can require an
2297 // interface method table for an interface defined in a different
2298 // package for a type defined in that package. If that interface and
2299 // type both use a hidden method, that is OK. However, we will not be
2300 // able to build that interface method table when we need it, because
2301 // the type's hidden method will be static. So we have to build it
2302 // here, and just refer it from other packages as needed.
2303
2304 void
2305 Gogo::build_interface_method_tables()
2306 {
2307 std::vector<Interface_type*> hidden_interfaces;
2308 hidden_interfaces.reserve(this->interface_types_.size());
2309 for (std::vector<Interface_type*>::const_iterator pi =
2310 this->interface_types_.begin();
2311 pi != this->interface_types_.end();
2312 ++pi)
2313 {
2314 const Typed_identifier_list* methods = (*pi)->methods();
2315 if (methods == NULL)
2316 continue;
2317 for (Typed_identifier_list::const_iterator pm = methods->begin();
2318 pm != methods->end();
2319 ++pm)
2320 {
2321 if (Gogo::is_hidden_name(pm->name()))
2322 {
2323 hidden_interfaces.push_back(*pi);
2324 break;
2325 }
2326 }
2327 }
2328
2329 if (!hidden_interfaces.empty())
2330 {
2331 // Now traverse the tree looking for all named types.
2332 Build_method_tables bmt(this, hidden_interfaces);
2333 this->traverse(&bmt);
2334 }
2335
2336 // We no longer need the list of interfaces.
2337
2338 this->interface_types_.clear();
2339 }
2340
2341 // This is called for each type. For a named type, for each of the
2342 // interfaces with hidden methods that it implements, create the
2343 // method table.
2344
2345 int
2346 Build_method_tables::type(Type* type)
2347 {
2348 Named_type* nt = type->named_type();
2349 if (nt != NULL)
2350 {
2351 for (std::vector<Interface_type*>::const_iterator p =
2352 this->interfaces_.begin();
2353 p != this->interfaces_.end();
2354 ++p)
2355 {
2356 // We ask whether a pointer to the named type implements the
2357 // interface, because a pointer can implement more methods
2358 // than a value.
2359 if ((*p)->implements_interface(Type::make_pointer_type(nt), NULL))
2360 {
2361 nt->interface_method_table(this->gogo_, *p, false);
2362 nt->interface_method_table(this->gogo_, *p, true);
2363 }
2364 }
2365 }
2366 return TRAVERSE_CONTINUE;
2367 }
2368
2369 // Traversal class used to check for return statements.
2370
2371 class Check_return_statements_traverse : public Traverse
2372 {
2373 public:
2374 Check_return_statements_traverse()
2375 : Traverse(traverse_functions)
2376 { }
2377
2378 int
2379 function(Named_object*);
2380 };
2381
2382 // Check that a function has a return statement if it needs one.
2383
2384 int
2385 Check_return_statements_traverse::function(Named_object* no)
2386 {
2387 Function* func = no->func_value();
2388 const Function_type* fntype = func->type();
2389 const Typed_identifier_list* results = fntype->results();
2390
2391 // We only need a return statement if there is a return value.
2392 if (results == NULL || results->empty())
2393 return TRAVERSE_CONTINUE;
2394
2395 if (func->block()->may_fall_through())
2396 error_at(func->location(), "control reaches end of non-void function");
2397
2398 return TRAVERSE_CONTINUE;
2399 }
2400
2401 // Check return statements.
2402
2403 void
2404 Gogo::check_return_statements()
2405 {
2406 Check_return_statements_traverse traverse;
2407 this->traverse(&traverse);
2408 }
2409
2410 // Get the unique prefix to use before all exported symbols. This
2411 // must be unique across the entire link.
2412
2413 const std::string&
2414 Gogo::unique_prefix() const
2415 {
2416 gcc_assert(!this->unique_prefix_.empty());
2417 return this->unique_prefix_;
2418 }
2419
2420 // Set the unique prefix to use before all exported symbols. This
2421 // comes from the command line option -fgo-prefix=XXX.
2422
2423 void
2424 Gogo::set_unique_prefix(const std::string& arg)
2425 {
2426 gcc_assert(this->unique_prefix_.empty());
2427 this->unique_prefix_ = arg;
2428 }
2429
2430 // Work out the package priority. It is one more than the maximum
2431 // priority of an imported package.
2432
2433 int
2434 Gogo::package_priority() const
2435 {
2436 int priority = 0;
2437 for (Packages::const_iterator p = this->packages_.begin();
2438 p != this->packages_.end();
2439 ++p)
2440 if (p->second->priority() > priority)
2441 priority = p->second->priority();
2442 return priority + 1;
2443 }
2444
2445 // Export identifiers as requested.
2446
2447 void
2448 Gogo::do_exports()
2449 {
2450 // For now we always stream to a section. Later we may want to
2451 // support streaming to a separate file.
2452 Stream_to_section stream;
2453
2454 Export exp(&stream);
2455 exp.register_builtin_types(this);
2456 exp.export_globals(this->package_name(),
2457 this->unique_prefix(),
2458 this->package_priority(),
2459 (this->need_init_fn_ && this->package_name() != "main"
2460 ? this->get_init_fn_name()
2461 : ""),
2462 this->imported_init_fns_,
2463 this->package_->bindings());
2464 }
2465
2466 // Class Function.
2467
2468 Function::Function(Function_type* type, Function* enclosing, Block* block,
2469 source_location location)
2470 : type_(type), enclosing_(enclosing), named_results_(NULL),
2471 closure_var_(NULL), block_(block), location_(location), fndecl_(NULL),
2472 defer_stack_(NULL), calls_recover_(false), is_recover_thunk_(false),
2473 has_recover_thunk_(false)
2474 {
2475 }
2476
2477 // Create the named result variables.
2478
2479 void
2480 Function::create_named_result_variables(Gogo* gogo)
2481 {
2482 const Typed_identifier_list* results = this->type_->results();
2483 if (results == NULL
2484 || results->empty()
2485 || results->front().name().empty())
2486 return;
2487
2488 this->named_results_ = new Named_results();
2489 this->named_results_->reserve(results->size());
2490
2491 Block* block = this->block_;
2492 int index = 0;
2493 for (Typed_identifier_list::const_iterator p = results->begin();
2494 p != results->end();
2495 ++p, ++index)
2496 {
2497 std::string name = p->name();
2498 if (Gogo::is_sink_name(name))
2499 {
2500 static int unnamed_result_counter;
2501 char buf[100];
2502 snprintf(buf, sizeof buf, "_$%d", unnamed_result_counter);
2503 ++unnamed_result_counter;
2504 name = gogo->pack_hidden_name(buf, false);
2505 }
2506 Result_variable* result = new Result_variable(p->type(), this, index);
2507 Named_object* no = block->bindings()->add_result_variable(name, result);
2508 this->named_results_->push_back(no);
2509 }
2510 }
2511
2512 // Update the named result variables when cloning a function which
2513 // calls recover.
2514
2515 void
2516 Function::update_named_result_variables()
2517 {
2518 if (this->named_results_ == NULL)
2519 return;
2520
2521 for (Named_results::iterator p = this->named_results_->begin();
2522 p != this->named_results_->end();
2523 ++p)
2524 (*p)->result_var_value()->set_function(this);
2525 }
2526
2527 // Return the closure variable, creating it if necessary.
2528
2529 Named_object*
2530 Function::closure_var()
2531 {
2532 if (this->closure_var_ == NULL)
2533 {
2534 // We don't know the type of the variable yet. We add fields as
2535 // we find them.
2536 source_location loc = this->type_->location();
2537 Struct_field_list* sfl = new Struct_field_list;
2538 Type* struct_type = Type::make_struct_type(sfl, loc);
2539 Variable* var = new Variable(Type::make_pointer_type(struct_type),
2540 NULL, false, true, false, loc);
2541 this->closure_var_ = Named_object::make_variable("closure", NULL, var);
2542 // Note that the new variable is not in any binding contour.
2543 }
2544 return this->closure_var_;
2545 }
2546
2547 // Set the type of the closure variable.
2548
2549 void
2550 Function::set_closure_type()
2551 {
2552 if (this->closure_var_ == NULL)
2553 return;
2554 Named_object* closure = this->closure_var_;
2555 Struct_type* st = closure->var_value()->type()->deref()->struct_type();
2556 unsigned int index = 0;
2557 for (Closure_fields::const_iterator p = this->closure_fields_.begin();
2558 p != this->closure_fields_.end();
2559 ++p, ++index)
2560 {
2561 Named_object* no = p->first;
2562 char buf[20];
2563 snprintf(buf, sizeof buf, "%u", index);
2564 std::string n = no->name() + buf;
2565 Type* var_type;
2566 if (no->is_variable())
2567 var_type = no->var_value()->type();
2568 else
2569 var_type = no->result_var_value()->type();
2570 Type* field_type = Type::make_pointer_type(var_type);
2571 st->push_field(Struct_field(Typed_identifier(n, field_type, p->second)));
2572 }
2573 }
2574
2575 // Return whether this function is a method.
2576
2577 bool
2578 Function::is_method() const
2579 {
2580 return this->type_->is_method();
2581 }
2582
2583 // Add a label definition.
2584
2585 Label*
2586 Function::add_label_definition(const std::string& label_name,
2587 source_location location)
2588 {
2589 Label* lnull = NULL;
2590 std::pair<Labels::iterator, bool> ins =
2591 this->labels_.insert(std::make_pair(label_name, lnull));
2592 if (ins.second)
2593 {
2594 // This is a new label.
2595 Label* label = new Label(label_name);
2596 label->define(location);
2597 ins.first->second = label;
2598 return label;
2599 }
2600 else
2601 {
2602 // The label was already in the hash table.
2603 Label* label = ins.first->second;
2604 if (!label->is_defined())
2605 {
2606 label->define(location);
2607 return label;
2608 }
2609 else
2610 {
2611 error_at(location, "redefinition of label %qs",
2612 Gogo::message_name(label_name).c_str());
2613 inform(label->location(), "previous definition of %qs was here",
2614 Gogo::message_name(label_name).c_str());
2615 return new Label(label_name);
2616 }
2617 }
2618 }
2619
2620 // Add a reference to a label.
2621
2622 Label*
2623 Function::add_label_reference(const std::string& label_name)
2624 {
2625 Label* lnull = NULL;
2626 std::pair<Labels::iterator, bool> ins =
2627 this->labels_.insert(std::make_pair(label_name, lnull));
2628 if (!ins.second)
2629 {
2630 // The label was already in the hash table.
2631 return ins.first->second;
2632 }
2633 else
2634 {
2635 gcc_assert(ins.first->second == NULL);
2636 Label* label = new Label(label_name);
2637 ins.first->second = label;
2638 return label;
2639 }
2640 }
2641
2642 // Swap one function with another. This is used when building the
2643 // thunk we use to call a function which calls recover. It may not
2644 // work for any other case.
2645
2646 void
2647 Function::swap_for_recover(Function *x)
2648 {
2649 gcc_assert(this->enclosing_ == x->enclosing_);
2650 std::swap(this->named_results_, x->named_results_);
2651 std::swap(this->closure_var_, x->closure_var_);
2652 std::swap(this->block_, x->block_);
2653 gcc_assert(this->location_ == x->location_);
2654 gcc_assert(this->fndecl_ == NULL && x->fndecl_ == NULL);
2655 gcc_assert(this->defer_stack_ == NULL && x->defer_stack_ == NULL);
2656 }
2657
2658 // Traverse the tree.
2659
2660 int
2661 Function::traverse(Traverse* traverse)
2662 {
2663 unsigned int traverse_mask = traverse->traverse_mask();
2664
2665 if ((traverse_mask
2666 & (Traverse::traverse_types | Traverse::traverse_expressions))
2667 != 0)
2668 {
2669 if (Type::traverse(this->type_, traverse) == TRAVERSE_EXIT)
2670 return TRAVERSE_EXIT;
2671 }
2672
2673 // FIXME: We should check traverse_functions here if nested
2674 // functions are stored in block bindings.
2675 if (this->block_ != NULL
2676 && (traverse_mask
2677 & (Traverse::traverse_variables
2678 | Traverse::traverse_constants
2679 | Traverse::traverse_blocks
2680 | Traverse::traverse_statements
2681 | Traverse::traverse_expressions
2682 | Traverse::traverse_types)) != 0)
2683 {
2684 if (this->block_->traverse(traverse) == TRAVERSE_EXIT)
2685 return TRAVERSE_EXIT;
2686 }
2687
2688 return TRAVERSE_CONTINUE;
2689 }
2690
2691 // Work out types for unspecified variables and constants.
2692
2693 void
2694 Function::determine_types()
2695 {
2696 if (this->block_ != NULL)
2697 this->block_->determine_types();
2698 }
2699
2700 // Export the function.
2701
2702 void
2703 Function::export_func(Export* exp, const std::string& name) const
2704 {
2705 Function::export_func_with_type(exp, name, this->type_);
2706 }
2707
2708 // Export a function with a type.
2709
2710 void
2711 Function::export_func_with_type(Export* exp, const std::string& name,
2712 const Function_type* fntype)
2713 {
2714 exp->write_c_string("func ");
2715
2716 if (fntype->is_method())
2717 {
2718 exp->write_c_string("(");
2719 exp->write_type(fntype->receiver()->type());
2720 exp->write_c_string(") ");
2721 }
2722
2723 exp->write_string(name);
2724
2725 exp->write_c_string(" (");
2726 const Typed_identifier_list* parameters = fntype->parameters();
2727 if (parameters != NULL)
2728 {
2729 bool is_varargs = fntype->is_varargs();
2730 bool first = true;
2731 for (Typed_identifier_list::const_iterator p = parameters->begin();
2732 p != parameters->end();
2733 ++p)
2734 {
2735 if (first)
2736 first = false;
2737 else
2738 exp->write_c_string(", ");
2739 if (!is_varargs || p + 1 != parameters->end())
2740 exp->write_type(p->type());
2741 else
2742 {
2743 exp->write_c_string("...");
2744 exp->write_type(p->type()->array_type()->element_type());
2745 }
2746 }
2747 }
2748 exp->write_c_string(")");
2749
2750 const Typed_identifier_list* results = fntype->results();
2751 if (results != NULL)
2752 {
2753 if (results->size() == 1)
2754 {
2755 exp->write_c_string(" ");
2756 exp->write_type(results->begin()->type());
2757 }
2758 else
2759 {
2760 exp->write_c_string(" (");
2761 bool first = true;
2762 for (Typed_identifier_list::const_iterator p = results->begin();
2763 p != results->end();
2764 ++p)
2765 {
2766 if (first)
2767 first = false;
2768 else
2769 exp->write_c_string(", ");
2770 exp->write_type(p->type());
2771 }
2772 exp->write_c_string(")");
2773 }
2774 }
2775 exp->write_c_string(";\n");
2776 }
2777
2778 // Import a function.
2779
2780 void
2781 Function::import_func(Import* imp, std::string* pname,
2782 Typed_identifier** preceiver,
2783 Typed_identifier_list** pparameters,
2784 Typed_identifier_list** presults,
2785 bool* is_varargs)
2786 {
2787 imp->require_c_string("func ");
2788
2789 *preceiver = NULL;
2790 if (imp->peek_char() == '(')
2791 {
2792 imp->require_c_string("(");
2793 Type* rtype = imp->read_type();
2794 *preceiver = new Typed_identifier(Import::import_marker, rtype,
2795 imp->location());
2796 imp->require_c_string(") ");
2797 }
2798
2799 *pname = imp->read_identifier();
2800
2801 Typed_identifier_list* parameters;
2802 *is_varargs = false;
2803 imp->require_c_string(" (");
2804 if (imp->peek_char() == ')')
2805 parameters = NULL;
2806 else
2807 {
2808 parameters = new Typed_identifier_list();
2809 while (true)
2810 {
2811 if (imp->match_c_string("..."))
2812 {
2813 imp->advance(3);
2814 *is_varargs = true;
2815 }
2816
2817 Type* ptype = imp->read_type();
2818 if (*is_varargs)
2819 ptype = Type::make_array_type(ptype, NULL);
2820 parameters->push_back(Typed_identifier(Import::import_marker,
2821 ptype, imp->location()));
2822 if (imp->peek_char() != ',')
2823 break;
2824 gcc_assert(!*is_varargs);
2825 imp->require_c_string(", ");
2826 }
2827 }
2828 imp->require_c_string(")");
2829 *pparameters = parameters;
2830
2831 Typed_identifier_list* results;
2832 if (imp->peek_char() != ' ')
2833 results = NULL;
2834 else
2835 {
2836 results = new Typed_identifier_list();
2837 imp->require_c_string(" ");
2838 if (imp->peek_char() != '(')
2839 {
2840 Type* rtype = imp->read_type();
2841 results->push_back(Typed_identifier(Import::import_marker, rtype,
2842 imp->location()));
2843 }
2844 else
2845 {
2846 imp->require_c_string("(");
2847 while (true)
2848 {
2849 Type* rtype = imp->read_type();
2850 results->push_back(Typed_identifier(Import::import_marker,
2851 rtype, imp->location()));
2852 if (imp->peek_char() != ',')
2853 break;
2854 imp->require_c_string(", ");
2855 }
2856 imp->require_c_string(")");
2857 }
2858 }
2859 imp->require_c_string(";\n");
2860 *presults = results;
2861 }
2862
2863 // Class Block.
2864
2865 Block::Block(Block* enclosing, source_location location)
2866 : enclosing_(enclosing), statements_(),
2867 bindings_(new Bindings(enclosing == NULL
2868 ? NULL
2869 : enclosing->bindings())),
2870 start_location_(location),
2871 end_location_(UNKNOWN_LOCATION)
2872 {
2873 }
2874
2875 // Add a statement to a block.
2876
2877 void
2878 Block::add_statement(Statement* statement)
2879 {
2880 this->statements_.push_back(statement);
2881 }
2882
2883 // Add a statement to the front of a block. This is slow but is only
2884 // used for reference counts of parameters.
2885
2886 void
2887 Block::add_statement_at_front(Statement* statement)
2888 {
2889 this->statements_.insert(this->statements_.begin(), statement);
2890 }
2891
2892 // Replace a statement in a block.
2893
2894 void
2895 Block::replace_statement(size_t index, Statement* s)
2896 {
2897 gcc_assert(index < this->statements_.size());
2898 this->statements_[index] = s;
2899 }
2900
2901 // Add a statement before another statement.
2902
2903 void
2904 Block::insert_statement_before(size_t index, Statement* s)
2905 {
2906 gcc_assert(index < this->statements_.size());
2907 this->statements_.insert(this->statements_.begin() + index, s);
2908 }
2909
2910 // Add a statement after another statement.
2911
2912 void
2913 Block::insert_statement_after(size_t index, Statement* s)
2914 {
2915 gcc_assert(index < this->statements_.size());
2916 this->statements_.insert(this->statements_.begin() + index + 1, s);
2917 }
2918
2919 // Traverse the tree.
2920
2921 int
2922 Block::traverse(Traverse* traverse)
2923 {
2924 unsigned int traverse_mask = traverse->traverse_mask();
2925
2926 if ((traverse_mask & Traverse::traverse_blocks) != 0)
2927 {
2928 int t = traverse->block(this);
2929 if (t == TRAVERSE_EXIT)
2930 return TRAVERSE_EXIT;
2931 else if (t == TRAVERSE_SKIP_COMPONENTS)
2932 return TRAVERSE_CONTINUE;
2933 }
2934
2935 if ((traverse_mask
2936 & (Traverse::traverse_variables
2937 | Traverse::traverse_constants
2938 | Traverse::traverse_expressions
2939 | Traverse::traverse_types)) != 0)
2940 {
2941 for (Bindings::const_definitions_iterator pb =
2942 this->bindings_->begin_definitions();
2943 pb != this->bindings_->end_definitions();
2944 ++pb)
2945 {
2946 switch ((*pb)->classification())
2947 {
2948 case Named_object::NAMED_OBJECT_CONST:
2949 if ((traverse_mask & Traverse::traverse_constants) != 0)
2950 {
2951 if (traverse->constant(*pb, false) == TRAVERSE_EXIT)
2952 return TRAVERSE_EXIT;
2953 }
2954 if ((traverse_mask & Traverse::traverse_types) != 0
2955 || (traverse_mask & Traverse::traverse_expressions) != 0)
2956 {
2957 Type* t = (*pb)->const_value()->type();
2958 if (t != NULL
2959 && Type::traverse(t, traverse) == TRAVERSE_EXIT)
2960 return TRAVERSE_EXIT;
2961 }
2962 if ((traverse_mask & Traverse::traverse_expressions) != 0
2963 || (traverse_mask & Traverse::traverse_types) != 0)
2964 {
2965 if ((*pb)->const_value()->traverse_expression(traverse)
2966 == TRAVERSE_EXIT)
2967 return TRAVERSE_EXIT;
2968 }
2969 break;
2970
2971 case Named_object::NAMED_OBJECT_VAR:
2972 case Named_object::NAMED_OBJECT_RESULT_VAR:
2973 if ((traverse_mask & Traverse::traverse_variables) != 0)
2974 {
2975 if (traverse->variable(*pb) == TRAVERSE_EXIT)
2976 return TRAVERSE_EXIT;
2977 }
2978 if (((traverse_mask & Traverse::traverse_types) != 0
2979 || (traverse_mask & Traverse::traverse_expressions) != 0)
2980 && ((*pb)->is_result_variable()
2981 || (*pb)->var_value()->has_type()))
2982 {
2983 Type* t = ((*pb)->is_variable()
2984 ? (*pb)->var_value()->type()
2985 : (*pb)->result_var_value()->type());
2986 if (t != NULL
2987 && Type::traverse(t, traverse) == TRAVERSE_EXIT)
2988 return TRAVERSE_EXIT;
2989 }
2990 if ((*pb)->is_variable()
2991 && ((traverse_mask & Traverse::traverse_expressions) != 0
2992 || (traverse_mask & Traverse::traverse_types) != 0))
2993 {
2994 if ((*pb)->var_value()->traverse_expression(traverse)
2995 == TRAVERSE_EXIT)
2996 return TRAVERSE_EXIT;
2997 }
2998 break;
2999
3000 case Named_object::NAMED_OBJECT_FUNC:
3001 case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
3002 // FIXME: Where will nested functions be found?
3003 gcc_unreachable();
3004
3005 case Named_object::NAMED_OBJECT_TYPE:
3006 if ((traverse_mask & Traverse::traverse_types) != 0
3007 || (traverse_mask & Traverse::traverse_expressions) != 0)
3008 {
3009 if (Type::traverse((*pb)->type_value(), traverse)
3010 == TRAVERSE_EXIT)
3011 return TRAVERSE_EXIT;
3012 }
3013 break;
3014
3015 case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
3016 case Named_object::NAMED_OBJECT_UNKNOWN:
3017 break;
3018
3019 case Named_object::NAMED_OBJECT_PACKAGE:
3020 case Named_object::NAMED_OBJECT_SINK:
3021 gcc_unreachable();
3022
3023 default:
3024 gcc_unreachable();
3025 }
3026 }
3027 }
3028
3029 // No point in checking traverse_mask here--if we got here we always
3030 // want to walk the statements. The traversal can insert new
3031 // statements before or after the current statement. Inserting
3032 // statements before the current statement requires updating I via
3033 // the pointer; those statements will not be traversed. Any new
3034 // statements inserted after the current statement will be traversed
3035 // in their turn.
3036 for (size_t i = 0; i < this->statements_.size(); ++i)
3037 {
3038 if (this->statements_[i]->traverse(this, &i, traverse) == TRAVERSE_EXIT)
3039 return TRAVERSE_EXIT;
3040 }
3041
3042 return TRAVERSE_CONTINUE;
3043 }
3044
3045 // Work out types for unspecified variables and constants.
3046
3047 void
3048 Block::determine_types()
3049 {
3050 for (Bindings::const_definitions_iterator pb =
3051 this->bindings_->begin_definitions();
3052 pb != this->bindings_->end_definitions();
3053 ++pb)
3054 {
3055 if ((*pb)->is_variable())
3056 (*pb)->var_value()->determine_type();
3057 else if ((*pb)->is_const())
3058 (*pb)->const_value()->determine_type();
3059 }
3060
3061 for (std::vector<Statement*>::const_iterator ps = this->statements_.begin();
3062 ps != this->statements_.end();
3063 ++ps)
3064 (*ps)->determine_types();
3065 }
3066
3067 // Return true if the statements in this block may fall through.
3068
3069 bool
3070 Block::may_fall_through() const
3071 {
3072 if (this->statements_.empty())
3073 return true;
3074 return this->statements_.back()->may_fall_through();
3075 }
3076
3077 // Class Variable.
3078
3079 Variable::Variable(Type* type, Expression* init, bool is_global,
3080 bool is_parameter, bool is_receiver,
3081 source_location location)
3082 : type_(type), init_(init), preinit_(NULL), location_(location),
3083 is_global_(is_global), is_parameter_(is_parameter),
3084 is_receiver_(is_receiver), is_varargs_parameter_(false),
3085 is_address_taken_(false), seen_(false), init_is_lowered_(false),
3086 type_from_init_tuple_(false), type_from_range_index_(false),
3087 type_from_range_value_(false), type_from_chan_element_(false),
3088 is_type_switch_var_(false)
3089 {
3090 gcc_assert(type != NULL || init != NULL);
3091 gcc_assert(!is_parameter || init == NULL);
3092 }
3093
3094 // Traverse the initializer expression.
3095
3096 int
3097 Variable::traverse_expression(Traverse* traverse)
3098 {
3099 if (this->preinit_ != NULL)
3100 {
3101 if (this->preinit_->traverse(traverse) == TRAVERSE_EXIT)
3102 return TRAVERSE_EXIT;
3103 }
3104 if (this->init_ != NULL)
3105 {
3106 if (Expression::traverse(&this->init_, traverse) == TRAVERSE_EXIT)
3107 return TRAVERSE_EXIT;
3108 }
3109 return TRAVERSE_CONTINUE;
3110 }
3111
3112 // Lower the initialization expression after parsing is complete.
3113
3114 void
3115 Variable::lower_init_expression(Gogo* gogo, Named_object* function)
3116 {
3117 if (this->init_ != NULL && !this->init_is_lowered_)
3118 {
3119 if (this->seen_)
3120 {
3121 // We will give an error elsewhere, this is just to prevent
3122 // an infinite loop.
3123 return;
3124 }
3125 this->seen_ = true;
3126
3127 gogo->lower_expression(function, &this->init_);
3128
3129 this->seen_ = false;
3130
3131 this->init_is_lowered_ = true;
3132 }
3133 }
3134
3135 // Get the preinit block.
3136
3137 Block*
3138 Variable::preinit_block()
3139 {
3140 gcc_assert(this->is_global_);
3141 if (this->preinit_ == NULL)
3142 this->preinit_ = new Block(NULL, this->location());
3143 return this->preinit_;
3144 }
3145
3146 // Add a statement to be run before the initialization expression.
3147
3148 void
3149 Variable::add_preinit_statement(Statement* s)
3150 {
3151 Block* b = this->preinit_block();
3152 b->add_statement(s);
3153 b->set_end_location(s->location());
3154 }
3155
3156 // In an assignment which sets a variable to a tuple of EXPR, return
3157 // the type of the first element of the tuple.
3158
3159 Type*
3160 Variable::type_from_tuple(Expression* expr, bool report_error) const
3161 {
3162 if (expr->map_index_expression() != NULL)
3163 {
3164 Map_type* mt = expr->map_index_expression()->get_map_type();
3165 if (mt == NULL)
3166 return Type::make_error_type();
3167 return mt->val_type();
3168 }
3169 else if (expr->receive_expression() != NULL)
3170 {
3171 Expression* channel = expr->receive_expression()->channel();
3172 Type* channel_type = channel->type();
3173 if (channel_type->channel_type() == NULL)
3174 return Type::make_error_type();
3175 return channel_type->channel_type()->element_type();
3176 }
3177 else
3178 {
3179 if (report_error)
3180 error_at(this->location(), "invalid tuple definition");
3181 return Type::make_error_type();
3182 }
3183 }
3184
3185 // Given EXPR used in a range clause, return either the index type or
3186 // the value type of the range, depending upon GET_INDEX_TYPE.
3187
3188 Type*
3189 Variable::type_from_range(Expression* expr, bool get_index_type,
3190 bool report_error) const
3191 {
3192 Type* t = expr->type();
3193 if (t->array_type() != NULL
3194 || (t->points_to() != NULL
3195 && t->points_to()->array_type() != NULL
3196 && !t->points_to()->is_open_array_type()))
3197 {
3198 if (get_index_type)
3199 return Type::lookup_integer_type("int");
3200 else
3201 return t->deref()->array_type()->element_type();
3202 }
3203 else if (t->is_string_type())
3204 return Type::lookup_integer_type("int");
3205 else if (t->map_type() != NULL)
3206 {
3207 if (get_index_type)
3208 return t->map_type()->key_type();
3209 else
3210 return t->map_type()->val_type();
3211 }
3212 else if (t->channel_type() != NULL)
3213 {
3214 if (get_index_type)
3215 return t->channel_type()->element_type();
3216 else
3217 {
3218 if (report_error)
3219 error_at(this->location(),
3220 "invalid definition of value variable for channel range");
3221 return Type::make_error_type();
3222 }
3223 }
3224 else
3225 {
3226 if (report_error)
3227 error_at(this->location(), "invalid type for range clause");
3228 return Type::make_error_type();
3229 }
3230 }
3231
3232 // EXPR should be a channel. Return the channel's element type.
3233
3234 Type*
3235 Variable::type_from_chan_element(Expression* expr, bool report_error) const
3236 {
3237 Type* t = expr->type();
3238 if (t->channel_type() != NULL)
3239 return t->channel_type()->element_type();
3240 else
3241 {
3242 if (report_error)
3243 error_at(this->location(), "expected channel");
3244 return Type::make_error_type();
3245 }
3246 }
3247
3248 // Return the type of the Variable. This may be called before
3249 // Variable::determine_type is called, which means that we may need to
3250 // get the type from the initializer. FIXME: If we combine lowering
3251 // with type determination, then this should be unnecessary.
3252
3253 Type*
3254 Variable::type()
3255 {
3256 // A variable in a type switch with a nil case will have the wrong
3257 // type here. This gets fixed up in determine_type, below.
3258 Type* type = this->type_;
3259 Expression* init = this->init_;
3260 if (this->is_type_switch_var_
3261 && this->type_->is_nil_constant_as_type())
3262 {
3263 Type_guard_expression* tge = this->init_->type_guard_expression();
3264 gcc_assert(tge != NULL);
3265 init = tge->expr();
3266 type = NULL;
3267 }
3268
3269 if (this->seen_)
3270 {
3271 if (this->type_ == NULL || !this->type_->is_error_type())
3272 {
3273 error_at(this->location_, "variable initializer refers to itself");
3274 this->type_ = Type::make_error_type();
3275 }
3276 return this->type_;
3277 }
3278
3279 this->seen_ = true;
3280
3281 if (type != NULL)
3282 ;
3283 else if (this->type_from_init_tuple_)
3284 type = this->type_from_tuple(init, false);
3285 else if (this->type_from_range_index_ || this->type_from_range_value_)
3286 type = this->type_from_range(init, this->type_from_range_index_, false);
3287 else if (this->type_from_chan_element_)
3288 type = this->type_from_chan_element(init, false);
3289 else
3290 {
3291 gcc_assert(init != NULL);
3292 type = init->type();
3293 gcc_assert(type != NULL);
3294
3295 // Variables should not have abstract types.
3296 if (type->is_abstract())
3297 type = type->make_non_abstract_type();
3298
3299 if (type->is_void_type())
3300 type = Type::make_error_type();
3301 }
3302
3303 this->seen_ = false;
3304
3305 return type;
3306 }
3307
3308 // Fetch the type from a const pointer, in which case it should have
3309 // been set already.
3310
3311 Type*
3312 Variable::type() const
3313 {
3314 gcc_assert(this->type_ != NULL);
3315 return this->type_;
3316 }
3317
3318 // Set the type if necessary.
3319
3320 void
3321 Variable::determine_type()
3322 {
3323 // A variable in a type switch with a nil case will have the wrong
3324 // type here. It will have an initializer which is a type guard.
3325 // We want to initialize it to the value without the type guard, and
3326 // use the type of that value as well.
3327 if (this->is_type_switch_var_ && this->type_->is_nil_constant_as_type())
3328 {
3329 Type_guard_expression* tge = this->init_->type_guard_expression();
3330 gcc_assert(tge != NULL);
3331 this->type_ = NULL;
3332 this->init_ = tge->expr();
3333 }
3334
3335 if (this->init_ == NULL)
3336 gcc_assert(this->type_ != NULL && !this->type_->is_abstract());
3337 else if (this->type_from_init_tuple_)
3338 {
3339 Expression *init = this->init_;
3340 init->determine_type_no_context();
3341 this->type_ = this->type_from_tuple(init, true);
3342 this->init_ = NULL;
3343 }
3344 else if (this->type_from_range_index_ || this->type_from_range_value_)
3345 {
3346 Expression* init = this->init_;
3347 init->determine_type_no_context();
3348 this->type_ = this->type_from_range(init, this->type_from_range_index_,
3349 true);
3350 this->init_ = NULL;
3351 }
3352 else
3353 {
3354 // type_from_chan_element_ should have been cleared during
3355 // lowering.
3356 gcc_assert(!this->type_from_chan_element_);
3357
3358 Type_context context(this->type_, false);
3359 this->init_->determine_type(&context);
3360 if (this->type_ == NULL)
3361 {
3362 Type* type = this->init_->type();
3363 gcc_assert(type != NULL);
3364 if (type->is_abstract())
3365 type = type->make_non_abstract_type();
3366
3367 if (type->is_void_type())
3368 {
3369 error_at(this->location_, "variable has no type");
3370 type = Type::make_error_type();
3371 }
3372 else if (type->is_nil_type())
3373 {
3374 error_at(this->location_, "variable defined to nil type");
3375 type = Type::make_error_type();
3376 }
3377 else if (type->is_call_multiple_result_type())
3378 {
3379 error_at(this->location_,
3380 "single variable set to multiple value function call");
3381 type = Type::make_error_type();
3382 }
3383
3384 this->type_ = type;
3385 }
3386 }
3387 }
3388
3389 // Export the variable
3390
3391 void
3392 Variable::export_var(Export* exp, const std::string& name) const
3393 {
3394 gcc_assert(this->is_global_);
3395 exp->write_c_string("var ");
3396 exp->write_string(name);
3397 exp->write_c_string(" ");
3398 exp->write_type(this->type());
3399 exp->write_c_string(";\n");
3400 }
3401
3402 // Import a variable.
3403
3404 void
3405 Variable::import_var(Import* imp, std::string* pname, Type** ptype)
3406 {
3407 imp->require_c_string("var ");
3408 *pname = imp->read_identifier();
3409 imp->require_c_string(" ");
3410 *ptype = imp->read_type();
3411 imp->require_c_string(";\n");
3412 }
3413
3414 // Class Named_constant.
3415
3416 // Traverse the initializer expression.
3417
3418 int
3419 Named_constant::traverse_expression(Traverse* traverse)
3420 {
3421 return Expression::traverse(&this->expr_, traverse);
3422 }
3423
3424 // Determine the type of the constant.
3425
3426 void
3427 Named_constant::determine_type()
3428 {
3429 if (this->type_ != NULL)
3430 {
3431 Type_context context(this->type_, false);
3432 this->expr_->determine_type(&context);
3433 }
3434 else
3435 {
3436 // A constant may have an abstract type.
3437 Type_context context(NULL, true);
3438 this->expr_->determine_type(&context);
3439 this->type_ = this->expr_->type();
3440 gcc_assert(this->type_ != NULL);
3441 }
3442 }
3443
3444 // Indicate that we found and reported an error for this constant.
3445
3446 void
3447 Named_constant::set_error()
3448 {
3449 this->type_ = Type::make_error_type();
3450 this->expr_ = Expression::make_error(this->location_);
3451 }
3452
3453 // Export a constant.
3454
3455 void
3456 Named_constant::export_const(Export* exp, const std::string& name) const
3457 {
3458 exp->write_c_string("const ");
3459 exp->write_string(name);
3460 exp->write_c_string(" ");
3461 if (!this->type_->is_abstract())
3462 {
3463 exp->write_type(this->type_);
3464 exp->write_c_string(" ");
3465 }
3466 exp->write_c_string("= ");
3467 this->expr()->export_expression(exp);
3468 exp->write_c_string(";\n");
3469 }
3470
3471 // Import a constant.
3472
3473 void
3474 Named_constant::import_const(Import* imp, std::string* pname, Type** ptype,
3475 Expression** pexpr)
3476 {
3477 imp->require_c_string("const ");
3478 *pname = imp->read_identifier();
3479 imp->require_c_string(" ");
3480 if (imp->peek_char() == '=')
3481 *ptype = NULL;
3482 else
3483 {
3484 *ptype = imp->read_type();
3485 imp->require_c_string(" ");
3486 }
3487 imp->require_c_string("= ");
3488 *pexpr = Expression::import_expression(imp);
3489 imp->require_c_string(";\n");
3490 }
3491
3492 // Add a method.
3493
3494 Named_object*
3495 Type_declaration::add_method(const std::string& name, Function* function)
3496 {
3497 Named_object* ret = Named_object::make_function(name, NULL, function);
3498 this->methods_.push_back(ret);
3499 return ret;
3500 }
3501
3502 // Add a method declaration.
3503
3504 Named_object*
3505 Type_declaration::add_method_declaration(const std::string& name,
3506 Function_type* type,
3507 source_location location)
3508 {
3509 Named_object* ret = Named_object::make_function_declaration(name, NULL, type,
3510 location);
3511 this->methods_.push_back(ret);
3512 return ret;
3513 }
3514
3515 // Return whether any methods ere defined.
3516
3517 bool
3518 Type_declaration::has_methods() const
3519 {
3520 return !this->methods_.empty();
3521 }
3522
3523 // Define methods for the real type.
3524
3525 void
3526 Type_declaration::define_methods(Named_type* nt)
3527 {
3528 for (Methods::const_iterator p = this->methods_.begin();
3529 p != this->methods_.end();
3530 ++p)
3531 nt->add_existing_method(*p);
3532 }
3533
3534 // We are using the type. Return true if we should issue a warning.
3535
3536 bool
3537 Type_declaration::using_type()
3538 {
3539 bool ret = !this->issued_warning_;
3540 this->issued_warning_ = true;
3541 return ret;
3542 }
3543
3544 // Class Unknown_name.
3545
3546 // Set the real named object.
3547
3548 void
3549 Unknown_name::set_real_named_object(Named_object* no)
3550 {
3551 gcc_assert(this->real_named_object_ == NULL);
3552 gcc_assert(!no->is_unknown());
3553 this->real_named_object_ = no;
3554 }
3555
3556 // Class Named_object.
3557
3558 Named_object::Named_object(const std::string& name,
3559 const Package* package,
3560 Classification classification)
3561 : name_(name), package_(package), classification_(classification),
3562 tree_(NULL)
3563 {
3564 if (Gogo::is_sink_name(name))
3565 gcc_assert(classification == NAMED_OBJECT_SINK);
3566 }
3567
3568 // Make an unknown name. This is used by the parser. The name must
3569 // be resolved later. Unknown names are only added in the current
3570 // package.
3571
3572 Named_object*
3573 Named_object::make_unknown_name(const std::string& name,
3574 source_location location)
3575 {
3576 Named_object* named_object = new Named_object(name, NULL,
3577 NAMED_OBJECT_UNKNOWN);
3578 Unknown_name* value = new Unknown_name(location);
3579 named_object->u_.unknown_value = value;
3580 return named_object;
3581 }
3582
3583 // Make a constant.
3584
3585 Named_object*
3586 Named_object::make_constant(const Typed_identifier& tid,
3587 const Package* package, Expression* expr,
3588 int iota_value)
3589 {
3590 Named_object* named_object = new Named_object(tid.name(), package,
3591 NAMED_OBJECT_CONST);
3592 Named_constant* named_constant = new Named_constant(tid.type(), expr,
3593 iota_value,
3594 tid.location());
3595 named_object->u_.const_value = named_constant;
3596 return named_object;
3597 }
3598
3599 // Make a named type.
3600
3601 Named_object*
3602 Named_object::make_type(const std::string& name, const Package* package,
3603 Type* type, source_location location)
3604 {
3605 Named_object* named_object = new Named_object(name, package,
3606 NAMED_OBJECT_TYPE);
3607 Named_type* named_type = Type::make_named_type(named_object, type, location);
3608 named_object->u_.type_value = named_type;
3609 return named_object;
3610 }
3611
3612 // Make a type declaration.
3613
3614 Named_object*
3615 Named_object::make_type_declaration(const std::string& name,
3616 const Package* package,
3617 source_location location)
3618 {
3619 Named_object* named_object = new Named_object(name, package,
3620 NAMED_OBJECT_TYPE_DECLARATION);
3621 Type_declaration* type_declaration = new Type_declaration(location);
3622 named_object->u_.type_declaration = type_declaration;
3623 return named_object;
3624 }
3625
3626 // Make a variable.
3627
3628 Named_object*
3629 Named_object::make_variable(const std::string& name, const Package* package,
3630 Variable* variable)
3631 {
3632 Named_object* named_object = new Named_object(name, package,
3633 NAMED_OBJECT_VAR);
3634 named_object->u_.var_value = variable;
3635 return named_object;
3636 }
3637
3638 // Make a result variable.
3639
3640 Named_object*
3641 Named_object::make_result_variable(const std::string& name,
3642 Result_variable* result)
3643 {
3644 Named_object* named_object = new Named_object(name, NULL,
3645 NAMED_OBJECT_RESULT_VAR);
3646 named_object->u_.result_var_value = result;
3647 return named_object;
3648 }
3649
3650 // Make a sink. This is used for the special blank identifier _.
3651
3652 Named_object*
3653 Named_object::make_sink()
3654 {
3655 return new Named_object("_", NULL, NAMED_OBJECT_SINK);
3656 }
3657
3658 // Make a named function.
3659
3660 Named_object*
3661 Named_object::make_function(const std::string& name, const Package* package,
3662 Function* function)
3663 {
3664 Named_object* named_object = new Named_object(name, package,
3665 NAMED_OBJECT_FUNC);
3666 named_object->u_.func_value = function;
3667 return named_object;
3668 }
3669
3670 // Make a function declaration.
3671
3672 Named_object*
3673 Named_object::make_function_declaration(const std::string& name,
3674 const Package* package,
3675 Function_type* fntype,
3676 source_location location)
3677 {
3678 Named_object* named_object = new Named_object(name, package,
3679 NAMED_OBJECT_FUNC_DECLARATION);
3680 Function_declaration *func_decl = new Function_declaration(fntype, location);
3681 named_object->u_.func_declaration_value = func_decl;
3682 return named_object;
3683 }
3684
3685 // Make a package.
3686
3687 Named_object*
3688 Named_object::make_package(const std::string& alias, Package* package)
3689 {
3690 Named_object* named_object = new Named_object(alias, NULL,
3691 NAMED_OBJECT_PACKAGE);
3692 named_object->u_.package_value = package;
3693 return named_object;
3694 }
3695
3696 // Return the name to use in an error message.
3697
3698 std::string
3699 Named_object::message_name() const
3700 {
3701 if (this->package_ == NULL)
3702 return Gogo::message_name(this->name_);
3703 std::string ret = Gogo::message_name(this->package_->name());
3704 ret += '.';
3705 ret += Gogo::message_name(this->name_);
3706 return ret;
3707 }
3708
3709 // Set the type when a declaration is defined.
3710
3711 void
3712 Named_object::set_type_value(Named_type* named_type)
3713 {
3714 gcc_assert(this->classification_ == NAMED_OBJECT_TYPE_DECLARATION);
3715 Type_declaration* td = this->u_.type_declaration;
3716 td->define_methods(named_type);
3717 Named_object* in_function = td->in_function();
3718 if (in_function != NULL)
3719 named_type->set_in_function(in_function);
3720 delete td;
3721 this->classification_ = NAMED_OBJECT_TYPE;
3722 this->u_.type_value = named_type;
3723 }
3724
3725 // Define a function which was previously declared.
3726
3727 void
3728 Named_object::set_function_value(Function* function)
3729 {
3730 gcc_assert(this->classification_ == NAMED_OBJECT_FUNC_DECLARATION);
3731 this->classification_ = NAMED_OBJECT_FUNC;
3732 // FIXME: We should free the old value.
3733 this->u_.func_value = function;
3734 }
3735
3736 // Declare an unknown object as a type declaration.
3737
3738 void
3739 Named_object::declare_as_type()
3740 {
3741 gcc_assert(this->classification_ == NAMED_OBJECT_UNKNOWN);
3742 Unknown_name* unk = this->u_.unknown_value;
3743 this->classification_ = NAMED_OBJECT_TYPE_DECLARATION;
3744 this->u_.type_declaration = new Type_declaration(unk->location());
3745 delete unk;
3746 }
3747
3748 // Return the location of a named object.
3749
3750 source_location
3751 Named_object::location() const
3752 {
3753 switch (this->classification_)
3754 {
3755 default:
3756 case NAMED_OBJECT_UNINITIALIZED:
3757 gcc_unreachable();
3758
3759 case NAMED_OBJECT_UNKNOWN:
3760 return this->unknown_value()->location();
3761
3762 case NAMED_OBJECT_CONST:
3763 return this->const_value()->location();
3764
3765 case NAMED_OBJECT_TYPE:
3766 return this->type_value()->location();
3767
3768 case NAMED_OBJECT_TYPE_DECLARATION:
3769 return this->type_declaration_value()->location();
3770
3771 case NAMED_OBJECT_VAR:
3772 return this->var_value()->location();
3773
3774 case NAMED_OBJECT_RESULT_VAR:
3775 return this->result_var_value()->function()->location();
3776
3777 case NAMED_OBJECT_SINK:
3778 gcc_unreachable();
3779
3780 case NAMED_OBJECT_FUNC:
3781 return this->func_value()->location();
3782
3783 case NAMED_OBJECT_FUNC_DECLARATION:
3784 return this->func_declaration_value()->location();
3785
3786 case NAMED_OBJECT_PACKAGE:
3787 return this->package_value()->location();
3788 }
3789 }
3790
3791 // Export a named object.
3792
3793 void
3794 Named_object::export_named_object(Export* exp) const
3795 {
3796 switch (this->classification_)
3797 {
3798 default:
3799 case NAMED_OBJECT_UNINITIALIZED:
3800 case NAMED_OBJECT_UNKNOWN:
3801 gcc_unreachable();
3802
3803 case NAMED_OBJECT_CONST:
3804 this->const_value()->export_const(exp, this->name_);
3805 break;
3806
3807 case NAMED_OBJECT_TYPE:
3808 this->type_value()->export_named_type(exp, this->name_);
3809 break;
3810
3811 case NAMED_OBJECT_TYPE_DECLARATION:
3812 error_at(this->type_declaration_value()->location(),
3813 "attempt to export %<%s%> which was declared but not defined",
3814 this->message_name().c_str());
3815 break;
3816
3817 case NAMED_OBJECT_FUNC_DECLARATION:
3818 this->func_declaration_value()->export_func(exp, this->name_);
3819 break;
3820
3821 case NAMED_OBJECT_VAR:
3822 this->var_value()->export_var(exp, this->name_);
3823 break;
3824
3825 case NAMED_OBJECT_RESULT_VAR:
3826 case NAMED_OBJECT_SINK:
3827 gcc_unreachable();
3828
3829 case NAMED_OBJECT_FUNC:
3830 this->func_value()->export_func(exp, this->name_);
3831 break;
3832 }
3833 }
3834
3835 // Class Bindings.
3836
3837 Bindings::Bindings(Bindings* enclosing)
3838 : enclosing_(enclosing), named_objects_(), bindings_()
3839 {
3840 }
3841
3842 // Clear imports.
3843
3844 void
3845 Bindings::clear_file_scope()
3846 {
3847 Contour::iterator p = this->bindings_.begin();
3848 while (p != this->bindings_.end())
3849 {
3850 bool keep;
3851 if (p->second->package() != NULL)
3852 keep = false;
3853 else if (p->second->is_package())
3854 keep = false;
3855 else if (p->second->is_function()
3856 && !p->second->func_value()->type()->is_method()
3857 && Gogo::unpack_hidden_name(p->second->name()) == "init")
3858 keep = false;
3859 else
3860 keep = true;
3861
3862 if (keep)
3863 ++p;
3864 else
3865 p = this->bindings_.erase(p);
3866 }
3867 }
3868
3869 // Look up a symbol.
3870
3871 Named_object*
3872 Bindings::lookup(const std::string& name) const
3873 {
3874 Contour::const_iterator p = this->bindings_.find(name);
3875 if (p != this->bindings_.end())
3876 return p->second->resolve();
3877 else if (this->enclosing_ != NULL)
3878 return this->enclosing_->lookup(name);
3879 else
3880 return NULL;
3881 }
3882
3883 // Look up a symbol locally.
3884
3885 Named_object*
3886 Bindings::lookup_local(const std::string& name) const
3887 {
3888 Contour::const_iterator p = this->bindings_.find(name);
3889 if (p == this->bindings_.end())
3890 return NULL;
3891 return p->second;
3892 }
3893
3894 // Remove an object from a set of bindings. This is used for a
3895 // special case in thunks for functions which call recover.
3896
3897 void
3898 Bindings::remove_binding(Named_object* no)
3899 {
3900 Contour::iterator pb = this->bindings_.find(no->name());
3901 gcc_assert(pb != this->bindings_.end());
3902 this->bindings_.erase(pb);
3903 for (std::vector<Named_object*>::iterator pn = this->named_objects_.begin();
3904 pn != this->named_objects_.end();
3905 ++pn)
3906 {
3907 if (*pn == no)
3908 {
3909 this->named_objects_.erase(pn);
3910 return;
3911 }
3912 }
3913 gcc_unreachable();
3914 }
3915
3916 // Add a method to the list of objects. This is not added to the
3917 // lookup table. This is so that we have a single list of objects
3918 // declared at the top level, which we walk through when it's time to
3919 // convert to trees.
3920
3921 void
3922 Bindings::add_method(Named_object* method)
3923 {
3924 this->named_objects_.push_back(method);
3925 }
3926
3927 // Add a generic Named_object to a Contour.
3928
3929 Named_object*
3930 Bindings::add_named_object_to_contour(Contour* contour,
3931 Named_object* named_object)
3932 {
3933 gcc_assert(named_object == named_object->resolve());
3934 const std::string& name(named_object->name());
3935 gcc_assert(!Gogo::is_sink_name(name));
3936
3937 std::pair<Contour::iterator, bool> ins =
3938 contour->insert(std::make_pair(name, named_object));
3939 if (!ins.second)
3940 {
3941 // The name was already there.
3942 if (named_object->package() != NULL
3943 && ins.first->second->package() == named_object->package()
3944 && (ins.first->second->classification()
3945 == named_object->classification()))
3946 {
3947 // This is a second import of the same object.
3948 return ins.first->second;
3949 }
3950 ins.first->second = this->new_definition(ins.first->second,
3951 named_object);
3952 return ins.first->second;
3953 }
3954 else
3955 {
3956 // Don't push declarations on the list. We push them on when
3957 // and if we find the definitions. That way we genericize the
3958 // functions in order.
3959 if (!named_object->is_type_declaration()
3960 && !named_object->is_function_declaration()
3961 && !named_object->is_unknown())
3962 this->named_objects_.push_back(named_object);
3963 return named_object;
3964 }
3965 }
3966
3967 // We had an existing named object OLD_OBJECT, and we've seen a new
3968 // one NEW_OBJECT with the same name. FIXME: This does not free the
3969 // new object when we don't need it.
3970
3971 Named_object*
3972 Bindings::new_definition(Named_object* old_object, Named_object* new_object)
3973 {
3974 std::string reason;
3975 switch (old_object->classification())
3976 {
3977 default:
3978 case Named_object::NAMED_OBJECT_UNINITIALIZED:
3979 gcc_unreachable();
3980
3981 case Named_object::NAMED_OBJECT_UNKNOWN:
3982 {
3983 Named_object* real = old_object->unknown_value()->real_named_object();
3984 if (real != NULL)
3985 return this->new_definition(real, new_object);
3986 gcc_assert(!new_object->is_unknown());
3987 old_object->unknown_value()->set_real_named_object(new_object);
3988 if (!new_object->is_type_declaration()
3989 && !new_object->is_function_declaration())
3990 this->named_objects_.push_back(new_object);
3991 return new_object;
3992 }
3993
3994 case Named_object::NAMED_OBJECT_CONST:
3995 break;
3996
3997 case Named_object::NAMED_OBJECT_TYPE:
3998 if (new_object->is_type_declaration())
3999 return old_object;
4000 break;
4001
4002 case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
4003 if (new_object->is_type_declaration())
4004 return old_object;
4005 if (new_object->is_type())
4006 {
4007 old_object->set_type_value(new_object->type_value());
4008 new_object->type_value()->set_named_object(old_object);
4009 this->named_objects_.push_back(old_object);
4010 return old_object;
4011 }
4012 break;
4013
4014 case Named_object::NAMED_OBJECT_VAR:
4015 case Named_object::NAMED_OBJECT_RESULT_VAR:
4016 break;
4017
4018 case Named_object::NAMED_OBJECT_SINK:
4019 gcc_unreachable();
4020
4021 case Named_object::NAMED_OBJECT_FUNC:
4022 if (new_object->is_function_declaration())
4023 {
4024 if (!new_object->func_declaration_value()->asm_name().empty())
4025 sorry("__asm__ for function definitions");
4026 Function_type* old_type = old_object->func_value()->type();
4027 Function_type* new_type =
4028 new_object->func_declaration_value()->type();
4029 if (old_type->is_valid_redeclaration(new_type, &reason))
4030 return old_object;
4031 }
4032 break;
4033
4034 case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
4035 {
4036 Function_type* old_type = old_object->func_declaration_value()->type();
4037 if (new_object->is_function_declaration())
4038 {
4039 Function_type* new_type =
4040 new_object->func_declaration_value()->type();
4041 if (old_type->is_valid_redeclaration(new_type, &reason))
4042 return old_object;
4043 }
4044 if (new_object->is_function())
4045 {
4046 Function_type* new_type = new_object->func_value()->type();
4047 if (old_type->is_valid_redeclaration(new_type, &reason))
4048 {
4049 if (!old_object->func_declaration_value()->asm_name().empty())
4050 sorry("__asm__ for function definitions");
4051 old_object->set_function_value(new_object->func_value());
4052 this->named_objects_.push_back(old_object);
4053 return old_object;
4054 }
4055 }
4056 }
4057 break;
4058
4059 case Named_object::NAMED_OBJECT_PACKAGE:
4060 if (new_object->is_package()
4061 && (old_object->package_value()->name()
4062 == new_object->package_value()->name()))
4063 return old_object;
4064
4065 break;
4066 }
4067
4068 std::string n = old_object->message_name();
4069 if (reason.empty())
4070 error_at(new_object->location(), "redefinition of %qs", n.c_str());
4071 else
4072 error_at(new_object->location(), "redefinition of %qs: %s", n.c_str(),
4073 reason.c_str());
4074
4075 inform(old_object->location(), "previous definition of %qs was here",
4076 n.c_str());
4077
4078 return old_object;
4079 }
4080
4081 // Add a named type.
4082
4083 Named_object*
4084 Bindings::add_named_type(Named_type* named_type)
4085 {
4086 return this->add_named_object(named_type->named_object());
4087 }
4088
4089 // Add a function.
4090
4091 Named_object*
4092 Bindings::add_function(const std::string& name, const Package* package,
4093 Function* function)
4094 {
4095 return this->add_named_object(Named_object::make_function(name, package,
4096 function));
4097 }
4098
4099 // Add a function declaration.
4100
4101 Named_object*
4102 Bindings::add_function_declaration(const std::string& name,
4103 const Package* package,
4104 Function_type* type,
4105 source_location location)
4106 {
4107 Named_object* no = Named_object::make_function_declaration(name, package,
4108 type, location);
4109 return this->add_named_object(no);
4110 }
4111
4112 // Define a type which was previously declared.
4113
4114 void
4115 Bindings::define_type(Named_object* no, Named_type* type)
4116 {
4117 no->set_type_value(type);
4118 this->named_objects_.push_back(no);
4119 }
4120
4121 // Traverse bindings.
4122
4123 int
4124 Bindings::traverse(Traverse* traverse, bool is_global)
4125 {
4126 unsigned int traverse_mask = traverse->traverse_mask();
4127
4128 // We don't use an iterator because we permit the traversal to add
4129 // new global objects.
4130 for (size_t i = 0; i < this->named_objects_.size(); ++i)
4131 {
4132 Named_object* p = this->named_objects_[i];
4133 switch (p->classification())
4134 {
4135 case Named_object::NAMED_OBJECT_CONST:
4136 if ((traverse_mask & Traverse::traverse_constants) != 0)
4137 {
4138 if (traverse->constant(p, is_global) == TRAVERSE_EXIT)
4139 return TRAVERSE_EXIT;
4140 }
4141 if ((traverse_mask & Traverse::traverse_types) != 0
4142 || (traverse_mask & Traverse::traverse_expressions) != 0)
4143 {
4144 Type* t = p->const_value()->type();
4145 if (t != NULL
4146 && Type::traverse(t, traverse) == TRAVERSE_EXIT)
4147 return TRAVERSE_EXIT;
4148 }
4149 if ((traverse_mask & Traverse::traverse_expressions) != 0)
4150 {
4151 if (p->const_value()->traverse_expression(traverse)
4152 == TRAVERSE_EXIT)
4153 return TRAVERSE_EXIT;
4154 }
4155 break;
4156
4157 case Named_object::NAMED_OBJECT_VAR:
4158 case Named_object::NAMED_OBJECT_RESULT_VAR:
4159 if ((traverse_mask & Traverse::traverse_variables) != 0)
4160 {
4161 if (traverse->variable(p) == TRAVERSE_EXIT)
4162 return TRAVERSE_EXIT;
4163 }
4164 if (((traverse_mask & Traverse::traverse_types) != 0
4165 || (traverse_mask & Traverse::traverse_expressions) != 0)
4166 && (p->is_result_variable()
4167 || p->var_value()->has_type()))
4168 {
4169 Type* t = (p->is_variable()
4170 ? p->var_value()->type()
4171 : p->result_var_value()->type());
4172 if (t != NULL
4173 && Type::traverse(t, traverse) == TRAVERSE_EXIT)
4174 return TRAVERSE_EXIT;
4175 }
4176 if (p->is_variable()
4177 && (traverse_mask & Traverse::traverse_expressions) != 0)
4178 {
4179 if (p->var_value()->traverse_expression(traverse)
4180 == TRAVERSE_EXIT)
4181 return TRAVERSE_EXIT;
4182 }
4183 break;
4184
4185 case Named_object::NAMED_OBJECT_FUNC:
4186 if ((traverse_mask & Traverse::traverse_functions) != 0)
4187 {
4188 int t = traverse->function(p);
4189 if (t == TRAVERSE_EXIT)
4190 return TRAVERSE_EXIT;
4191 else if (t == TRAVERSE_SKIP_COMPONENTS)
4192 break;
4193 }
4194
4195 if ((traverse_mask
4196 & (Traverse::traverse_variables
4197 | Traverse::traverse_constants
4198 | Traverse::traverse_functions
4199 | Traverse::traverse_blocks
4200 | Traverse::traverse_statements
4201 | Traverse::traverse_expressions
4202 | Traverse::traverse_types)) != 0)
4203 {
4204 if (p->func_value()->traverse(traverse) == TRAVERSE_EXIT)
4205 return TRAVERSE_EXIT;
4206 }
4207 break;
4208
4209 case Named_object::NAMED_OBJECT_PACKAGE:
4210 // These are traversed in Gogo::traverse.
4211 gcc_assert(is_global);
4212 break;
4213
4214 case Named_object::NAMED_OBJECT_TYPE:
4215 if ((traverse_mask & Traverse::traverse_types) != 0
4216 || (traverse_mask & Traverse::traverse_expressions) != 0)
4217 {
4218 if (Type::traverse(p->type_value(), traverse) == TRAVERSE_EXIT)
4219 return TRAVERSE_EXIT;
4220 }
4221 break;
4222
4223 case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
4224 case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
4225 case Named_object::NAMED_OBJECT_UNKNOWN:
4226 break;
4227
4228 case Named_object::NAMED_OBJECT_SINK:
4229 default:
4230 gcc_unreachable();
4231 }
4232 }
4233
4234 return TRAVERSE_CONTINUE;
4235 }
4236
4237 // Class Package.
4238
4239 Package::Package(const std::string& name, const std::string& unique_prefix,
4240 source_location location)
4241 : name_(name), unique_prefix_(unique_prefix), bindings_(new Bindings(NULL)),
4242 priority_(0), location_(location), used_(false), is_imported_(false),
4243 uses_sink_alias_(false)
4244 {
4245 gcc_assert(!name.empty() && !unique_prefix.empty());
4246 }
4247
4248 // Set the priority. We may see multiple priorities for an imported
4249 // package; we want to use the largest one.
4250
4251 void
4252 Package::set_priority(int priority)
4253 {
4254 if (priority > this->priority_)
4255 this->priority_ = priority;
4256 }
4257
4258 // Determine types of constants. Everything else in a package
4259 // (variables, function declarations) should already have a fixed
4260 // type. Constants may have abstract types.
4261
4262 void
4263 Package::determine_types()
4264 {
4265 Bindings* bindings = this->bindings_;
4266 for (Bindings::const_definitions_iterator p = bindings->begin_definitions();
4267 p != bindings->end_definitions();
4268 ++p)
4269 {
4270 if ((*p)->is_const())
4271 (*p)->const_value()->determine_type();
4272 }
4273 }
4274
4275 // Class Traverse.
4276
4277 // Destructor.
4278
4279 Traverse::~Traverse()
4280 {
4281 if (this->types_seen_ != NULL)
4282 delete this->types_seen_;
4283 if (this->expressions_seen_ != NULL)
4284 delete this->expressions_seen_;
4285 }
4286
4287 // Record that we are looking at a type, and return true if we have
4288 // already seen it.
4289
4290 bool
4291 Traverse::remember_type(const Type* type)
4292 {
4293 if (type->is_error_type())
4294 return true;
4295 gcc_assert((this->traverse_mask() & traverse_types) != 0
4296 || (this->traverse_mask() & traverse_expressions) != 0);
4297 // We only have to remember named types, as they are the only ones
4298 // we can see multiple times in a traversal.
4299 if (type->classification() != Type::TYPE_NAMED)
4300 return false;
4301 if (this->types_seen_ == NULL)
4302 this->types_seen_ = new Types_seen();
4303 std::pair<Types_seen::iterator, bool> ins = this->types_seen_->insert(type);
4304 return !ins.second;
4305 }
4306
4307 // Record that we are looking at an expression, and return true if we
4308 // have already seen it.
4309
4310 bool
4311 Traverse::remember_expression(const Expression* expression)
4312 {
4313 gcc_assert((this->traverse_mask() & traverse_types) != 0
4314 || (this->traverse_mask() & traverse_expressions) != 0);
4315 if (this->expressions_seen_ == NULL)
4316 this->expressions_seen_ = new Expressions_seen();
4317 std::pair<Expressions_seen::iterator, bool> ins =
4318 this->expressions_seen_->insert(expression);
4319 return !ins.second;
4320 }
4321
4322 // The default versions of these functions should never be called: the
4323 // traversal mask indicates which functions may be called.
4324
4325 int
4326 Traverse::variable(Named_object*)
4327 {
4328 gcc_unreachable();
4329 }
4330
4331 int
4332 Traverse::constant(Named_object*, bool)
4333 {
4334 gcc_unreachable();
4335 }
4336
4337 int
4338 Traverse::function(Named_object*)
4339 {
4340 gcc_unreachable();
4341 }
4342
4343 int
4344 Traverse::block(Block*)
4345 {
4346 gcc_unreachable();
4347 }
4348
4349 int
4350 Traverse::statement(Block*, size_t*, Statement*)
4351 {
4352 gcc_unreachable();
4353 }
4354
4355 int
4356 Traverse::expression(Expression**)
4357 {
4358 gcc_unreachable();
4359 }
4360
4361 int
4362 Traverse::type(Type*)
4363 {
4364 gcc_unreachable();
4365 }