579b8a3ee5e3815541e0db1e320a134fe6c882fe
[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 <fstream>
10
11 #include "filenames.h"
12
13 #include "go-c.h"
14 #include "go-diagnostics.h"
15 #include "go-encode-id.h"
16 #include "go-dump.h"
17 #include "go-optimize.h"
18 #include "lex.h"
19 #include "types.h"
20 #include "statements.h"
21 #include "expressions.h"
22 #include "runtime.h"
23 #include "import.h"
24 #include "export.h"
25 #include "backend.h"
26 #include "gogo.h"
27
28 // Class Gogo.
29
30 Gogo::Gogo(Backend* backend, Linemap* linemap, int, int pointer_size)
31 : backend_(backend),
32 linemap_(linemap),
33 package_(NULL),
34 functions_(),
35 globals_(new Bindings(NULL)),
36 file_block_names_(),
37 imports_(),
38 imported_unsafe_(false),
39 current_file_imported_unsafe_(false),
40 packages_(),
41 init_functions_(),
42 var_deps_(),
43 need_init_fn_(false),
44 init_fn_name_(),
45 imported_init_fns_(),
46 pkgpath_(),
47 pkgpath_symbol_(),
48 prefix_(),
49 pkgpath_set_(false),
50 pkgpath_from_option_(false),
51 prefix_from_option_(false),
52 relative_import_path_(),
53 c_header_(),
54 check_divide_by_zero_(true),
55 check_divide_overflow_(true),
56 compiling_runtime_(false),
57 debug_escape_level_(0),
58 nil_check_size_threshold_(4096),
59 verify_types_(),
60 interface_types_(),
61 specific_type_functions_(),
62 specific_type_functions_are_written_(false),
63 named_types_are_converted_(false),
64 analysis_sets_(),
65 gc_roots_()
66 {
67 const Location loc = Linemap::predeclared_location();
68
69 Named_type* uint8_type = Type::make_integer_type("uint8", true, 8,
70 RUNTIME_TYPE_KIND_UINT8);
71 this->add_named_type(uint8_type);
72 this->add_named_type(Type::make_integer_type("uint16", true, 16,
73 RUNTIME_TYPE_KIND_UINT16));
74 this->add_named_type(Type::make_integer_type("uint32", true, 32,
75 RUNTIME_TYPE_KIND_UINT32));
76 this->add_named_type(Type::make_integer_type("uint64", true, 64,
77 RUNTIME_TYPE_KIND_UINT64));
78
79 this->add_named_type(Type::make_integer_type("int8", false, 8,
80 RUNTIME_TYPE_KIND_INT8));
81 this->add_named_type(Type::make_integer_type("int16", false, 16,
82 RUNTIME_TYPE_KIND_INT16));
83 Named_type* int32_type = Type::make_integer_type("int32", false, 32,
84 RUNTIME_TYPE_KIND_INT32);
85 this->add_named_type(int32_type);
86 this->add_named_type(Type::make_integer_type("int64", false, 64,
87 RUNTIME_TYPE_KIND_INT64));
88
89 this->add_named_type(Type::make_float_type("float32", 32,
90 RUNTIME_TYPE_KIND_FLOAT32));
91 this->add_named_type(Type::make_float_type("float64", 64,
92 RUNTIME_TYPE_KIND_FLOAT64));
93
94 this->add_named_type(Type::make_complex_type("complex64", 64,
95 RUNTIME_TYPE_KIND_COMPLEX64));
96 this->add_named_type(Type::make_complex_type("complex128", 128,
97 RUNTIME_TYPE_KIND_COMPLEX128));
98
99 int int_type_size = pointer_size;
100 if (int_type_size < 32)
101 int_type_size = 32;
102 this->add_named_type(Type::make_integer_type("uint", true,
103 int_type_size,
104 RUNTIME_TYPE_KIND_UINT));
105 Named_type* int_type = Type::make_integer_type("int", false, int_type_size,
106 RUNTIME_TYPE_KIND_INT);
107 this->add_named_type(int_type);
108
109 this->add_named_type(Type::make_integer_type("uintptr", true,
110 pointer_size,
111 RUNTIME_TYPE_KIND_UINTPTR));
112
113 // "byte" is an alias for "uint8".
114 uint8_type->integer_type()->set_is_byte();
115 Named_object* byte_type = Named_object::make_type("byte", NULL, uint8_type,
116 loc);
117 byte_type->type_value()->set_is_alias();
118 this->add_named_type(byte_type->type_value());
119
120 // "rune" is an alias for "int32".
121 int32_type->integer_type()->set_is_rune();
122 Named_object* rune_type = Named_object::make_type("rune", NULL, int32_type,
123 loc);
124 rune_type->type_value()->set_is_alias();
125 this->add_named_type(rune_type->type_value());
126
127 this->add_named_type(Type::make_named_bool_type());
128
129 this->add_named_type(Type::make_named_string_type());
130
131 // "error" is interface { Error() string }.
132 {
133 Typed_identifier_list *methods = new Typed_identifier_list;
134 Typed_identifier_list *results = new Typed_identifier_list;
135 results->push_back(Typed_identifier("", Type::lookup_string_type(), loc));
136 Type *method_type = Type::make_function_type(NULL, NULL, results, loc);
137 methods->push_back(Typed_identifier("Error", method_type, loc));
138 Interface_type *error_iface = Type::make_interface_type(methods, loc);
139 error_iface->finalize_methods();
140 Named_type *error_type = Named_object::make_type("error", NULL, error_iface, loc)->type_value();
141 this->add_named_type(error_type);
142 }
143
144 this->globals_->add_constant(Typed_identifier("true",
145 Type::make_boolean_type(),
146 loc),
147 NULL,
148 Expression::make_boolean(true, loc),
149 0);
150 this->globals_->add_constant(Typed_identifier("false",
151 Type::make_boolean_type(),
152 loc),
153 NULL,
154 Expression::make_boolean(false, loc),
155 0);
156
157 this->globals_->add_constant(Typed_identifier("nil", Type::make_nil_type(),
158 loc),
159 NULL,
160 Expression::make_nil(loc),
161 0);
162
163 Type* abstract_int_type = Type::make_abstract_integer_type();
164 this->globals_->add_constant(Typed_identifier("iota", abstract_int_type,
165 loc),
166 NULL,
167 Expression::make_iota(),
168 0);
169
170 Function_type* new_type = Type::make_function_type(NULL, NULL, NULL, loc);
171 new_type->set_is_varargs();
172 new_type->set_is_builtin();
173 this->globals_->add_function_declaration("new", NULL, new_type, loc);
174
175 Function_type* make_type = Type::make_function_type(NULL, NULL, NULL, loc);
176 make_type->set_is_varargs();
177 make_type->set_is_builtin();
178 this->globals_->add_function_declaration("make", NULL, make_type, loc);
179
180 Typed_identifier_list* len_result = new Typed_identifier_list();
181 len_result->push_back(Typed_identifier("", int_type, loc));
182 Function_type* len_type = Type::make_function_type(NULL, NULL, len_result,
183 loc);
184 len_type->set_is_builtin();
185 this->globals_->add_function_declaration("len", NULL, len_type, loc);
186
187 Typed_identifier_list* cap_result = new Typed_identifier_list();
188 cap_result->push_back(Typed_identifier("", int_type, loc));
189 Function_type* cap_type = Type::make_function_type(NULL, NULL, len_result,
190 loc);
191 cap_type->set_is_builtin();
192 this->globals_->add_function_declaration("cap", NULL, cap_type, loc);
193
194 Function_type* print_type = Type::make_function_type(NULL, NULL, NULL, loc);
195 print_type->set_is_varargs();
196 print_type->set_is_builtin();
197 this->globals_->add_function_declaration("print", NULL, print_type, loc);
198
199 print_type = Type::make_function_type(NULL, NULL, NULL, loc);
200 print_type->set_is_varargs();
201 print_type->set_is_builtin();
202 this->globals_->add_function_declaration("println", NULL, print_type, loc);
203
204 Type *empty = Type::make_empty_interface_type(loc);
205 Typed_identifier_list* panic_parms = new Typed_identifier_list();
206 panic_parms->push_back(Typed_identifier("e", empty, loc));
207 Function_type *panic_type = Type::make_function_type(NULL, panic_parms,
208 NULL, loc);
209 panic_type->set_is_builtin();
210 this->globals_->add_function_declaration("panic", NULL, panic_type, loc);
211
212 Typed_identifier_list* recover_result = new Typed_identifier_list();
213 recover_result->push_back(Typed_identifier("", empty, loc));
214 Function_type* recover_type = Type::make_function_type(NULL, NULL,
215 recover_result,
216 loc);
217 recover_type->set_is_builtin();
218 this->globals_->add_function_declaration("recover", NULL, recover_type, loc);
219
220 Function_type* close_type = Type::make_function_type(NULL, NULL, NULL, loc);
221 close_type->set_is_varargs();
222 close_type->set_is_builtin();
223 this->globals_->add_function_declaration("close", NULL, close_type, loc);
224
225 Typed_identifier_list* copy_result = new Typed_identifier_list();
226 copy_result->push_back(Typed_identifier("", int_type, loc));
227 Function_type* copy_type = Type::make_function_type(NULL, NULL,
228 copy_result, loc);
229 copy_type->set_is_varargs();
230 copy_type->set_is_builtin();
231 this->globals_->add_function_declaration("copy", NULL, copy_type, loc);
232
233 Function_type* append_type = Type::make_function_type(NULL, NULL, NULL, loc);
234 append_type->set_is_varargs();
235 append_type->set_is_builtin();
236 this->globals_->add_function_declaration("append", NULL, append_type, loc);
237
238 Function_type* complex_type = Type::make_function_type(NULL, NULL, NULL, loc);
239 complex_type->set_is_varargs();
240 complex_type->set_is_builtin();
241 this->globals_->add_function_declaration("complex", NULL, complex_type, loc);
242
243 Function_type* real_type = Type::make_function_type(NULL, NULL, NULL, loc);
244 real_type->set_is_varargs();
245 real_type->set_is_builtin();
246 this->globals_->add_function_declaration("real", NULL, real_type, loc);
247
248 Function_type* imag_type = Type::make_function_type(NULL, NULL, NULL, loc);
249 imag_type->set_is_varargs();
250 imag_type->set_is_builtin();
251 this->globals_->add_function_declaration("imag", NULL, imag_type, loc);
252
253 Function_type* delete_type = Type::make_function_type(NULL, NULL, NULL, loc);
254 delete_type->set_is_varargs();
255 delete_type->set_is_builtin();
256 this->globals_->add_function_declaration("delete", NULL, delete_type, loc);
257 }
258
259 // Convert a pkgpath into a string suitable for a symbol. Note that
260 // this transformation is convenient but imperfect. A -fgo-pkgpath
261 // option of a/b_c will conflict with a -fgo-pkgpath option of a_b/c,
262 // possibly leading to link time errors.
263
264 std::string
265 Gogo::pkgpath_for_symbol(const std::string& pkgpath)
266 {
267 std::string s = pkgpath;
268 for (size_t i = 0; i < s.length(); ++i)
269 {
270 char c = s[i];
271 if ((c >= 'a' && c <= 'z')
272 || (c >= 'A' && c <= 'Z')
273 || (c >= '0' && c <= '9'))
274 ;
275 else
276 s[i] = '_';
277 }
278 return s;
279 }
280
281 // Get the package path to use for type reflection data. This should
282 // ideally be unique across the entire link.
283
284 const std::string&
285 Gogo::pkgpath() const
286 {
287 go_assert(this->pkgpath_set_);
288 return this->pkgpath_;
289 }
290
291 // Set the package path from the -fgo-pkgpath command line option.
292
293 void
294 Gogo::set_pkgpath(const std::string& arg)
295 {
296 go_assert(!this->pkgpath_set_);
297 this->pkgpath_ = arg;
298 this->pkgpath_set_ = true;
299 this->pkgpath_from_option_ = true;
300 }
301
302 // Get the package path to use for symbol names.
303
304 const std::string&
305 Gogo::pkgpath_symbol() const
306 {
307 go_assert(this->pkgpath_set_);
308 return this->pkgpath_symbol_;
309 }
310
311 // Set the unique prefix to use to determine the package path, from
312 // the -fgo-prefix command line option.
313
314 void
315 Gogo::set_prefix(const std::string& arg)
316 {
317 go_assert(!this->prefix_from_option_);
318 this->prefix_ = arg;
319 this->prefix_from_option_ = true;
320 }
321
322 // Munge name for use in an error message.
323
324 std::string
325 Gogo::message_name(const std::string& name)
326 {
327 return go_localize_identifier(Gogo::unpack_hidden_name(name).c_str());
328 }
329
330 // Get the package name.
331
332 const std::string&
333 Gogo::package_name() const
334 {
335 go_assert(this->package_ != NULL);
336 return this->package_->package_name();
337 }
338
339 // Set the package name.
340
341 void
342 Gogo::set_package_name(const std::string& package_name,
343 Location location)
344 {
345 if (this->package_ != NULL)
346 {
347 if (this->package_->package_name() != package_name)
348 go_error_at(location, "expected package %<%s%>",
349 Gogo::message_name(this->package_->package_name()).c_str());
350 return;
351 }
352
353 // Now that we know the name of the package we are compiling, set
354 // the package path to use for reflect.Type.PkgPath and global
355 // symbol names.
356 if (this->pkgpath_set_)
357 this->pkgpath_symbol_ = Gogo::pkgpath_for_symbol(this->pkgpath_);
358 else
359 {
360 if (!this->prefix_from_option_ && package_name == "main")
361 {
362 this->pkgpath_ = package_name;
363 this->pkgpath_symbol_ = Gogo::pkgpath_for_symbol(package_name);
364 }
365 else
366 {
367 if (!this->prefix_from_option_)
368 this->prefix_ = "go";
369 this->pkgpath_ = this->prefix_ + '.' + package_name;
370 this->pkgpath_symbol_ = (Gogo::pkgpath_for_symbol(this->prefix_) + '.'
371 + Gogo::pkgpath_for_symbol(package_name));
372 }
373 this->pkgpath_set_ = true;
374 }
375
376 this->package_ = this->register_package(this->pkgpath_,
377 this->pkgpath_symbol_, location);
378 this->package_->set_package_name(package_name, location);
379
380 if (this->is_main_package())
381 {
382 // Declare "main" as a function which takes no parameters and
383 // returns no value.
384 Location uloc = Linemap::unknown_location();
385 this->declare_function(Gogo::pack_hidden_name("main", false),
386 Type::make_function_type (NULL, NULL, NULL, uloc),
387 uloc);
388 }
389 }
390
391 // Return whether this is the "main" package. This is not true if
392 // -fgo-pkgpath or -fgo-prefix was used.
393
394 bool
395 Gogo::is_main_package() const
396 {
397 return (this->package_name() == "main"
398 && !this->pkgpath_from_option_
399 && !this->prefix_from_option_);
400 }
401
402 // Import a package.
403
404 void
405 Gogo::import_package(const std::string& filename,
406 const std::string& local_name,
407 bool is_local_name_exported,
408 bool must_exist,
409 Location location)
410 {
411 if (filename.empty())
412 {
413 go_error_at(location, "import path is empty");
414 return;
415 }
416
417 const char *pf = filename.data();
418 const char *pend = pf + filename.length();
419 while (pf < pend)
420 {
421 unsigned int c;
422 int adv = Lex::fetch_char(pf, &c);
423 if (adv == 0)
424 {
425 go_error_at(location, "import path contains invalid UTF-8 sequence");
426 return;
427 }
428 if (c == '\0')
429 {
430 go_error_at(location, "import path contains NUL");
431 return;
432 }
433 if (c < 0x20 || c == 0x7f)
434 {
435 go_error_at(location, "import path contains control character");
436 return;
437 }
438 if (c == '\\')
439 {
440 go_error_at(location, "import path contains backslash; use slash");
441 return;
442 }
443 if (Lex::is_unicode_space(c))
444 {
445 go_error_at(location, "import path contains space character");
446 return;
447 }
448 if (c < 0x7f && strchr("!\"#$%&'()*,:;<=>?[]^`{|}", c) != NULL)
449 {
450 go_error_at(location,
451 "import path contains invalid character '%c'", c);
452 return;
453 }
454 pf += adv;
455 }
456
457 if (IS_ABSOLUTE_PATH(filename.c_str()))
458 {
459 go_error_at(location, "import path cannot be absolute path");
460 return;
461 }
462
463 if (local_name == "init")
464 go_error_at(location, "cannot import package as init");
465
466 if (filename == "unsafe")
467 {
468 this->import_unsafe(local_name, is_local_name_exported, location);
469 this->current_file_imported_unsafe_ = true;
470 return;
471 }
472
473 Imports::const_iterator p = this->imports_.find(filename);
474 if (p != this->imports_.end())
475 {
476 Package* package = p->second;
477 package->set_location(location);
478 std::string ln = local_name;
479 bool is_ln_exported = is_local_name_exported;
480 if (ln.empty())
481 {
482 ln = package->package_name();
483 go_assert(!ln.empty());
484 is_ln_exported = Lex::is_exported_name(ln);
485 }
486 if (ln == "_")
487 ;
488 else if (ln == ".")
489 {
490 Bindings* bindings = package->bindings();
491 for (Bindings::const_declarations_iterator p =
492 bindings->begin_declarations();
493 p != bindings->end_declarations();
494 ++p)
495 this->add_dot_import_object(p->second);
496 std::string dot_alias = "." + package->package_name();
497 package->add_alias(dot_alias, location);
498 }
499 else
500 {
501 package->add_alias(ln, location);
502 ln = this->pack_hidden_name(ln, is_ln_exported);
503 this->package_->bindings()->add_package(ln, package);
504 }
505 return;
506 }
507
508 Import::Stream* stream = Import::open_package(filename, location,
509 this->relative_import_path_);
510 if (stream == NULL)
511 {
512 if (must_exist)
513 go_error_at(location, "import file %qs not found", filename.c_str());
514 return;
515 }
516
517 Import imp(stream, location);
518 imp.register_builtin_types(this);
519 Package* package = imp.import(this, local_name, is_local_name_exported);
520 if (package != NULL)
521 {
522 if (package->pkgpath() == this->pkgpath())
523 go_error_at(location,
524 ("imported package uses same package path as package "
525 "being compiled (see -fgo-pkgpath option)"));
526
527 this->imports_.insert(std::make_pair(filename, package));
528 }
529
530 delete stream;
531 }
532
533 Import_init *
534 Gogo::lookup_init(const std::string& init_name)
535 {
536 Import_init tmp("", init_name, -1);
537 Import_init_set::iterator it = this->imported_init_fns_.find(&tmp);
538 return (it != this->imported_init_fns_.end()) ? *it : NULL;
539 }
540
541 // Add an import control function for an imported package to the list.
542
543 void
544 Gogo::add_import_init_fn(const std::string& package_name,
545 const std::string& init_name, int prio)
546 {
547 for (Import_init_set::iterator p =
548 this->imported_init_fns_.begin();
549 p != this->imported_init_fns_.end();
550 ++p)
551 {
552 Import_init *ii = (*p);
553 if (ii->init_name() == init_name)
554 {
555 // If a test of package P1, built as part of package P1,
556 // imports package P2, and P2 imports P1 (perhaps
557 // indirectly), then we will see the same import name with
558 // different import priorities. That is OK, so don't give
559 // an error about it.
560 if (ii->package_name() != package_name)
561 {
562 go_error_at(Linemap::unknown_location(),
563 "duplicate package initialization name %qs",
564 Gogo::message_name(init_name).c_str());
565 go_inform(Linemap::unknown_location(), "used by package %qs",
566 Gogo::message_name(ii->package_name()).c_str());
567 go_inform(Linemap::unknown_location(), " and by package %qs",
568 Gogo::message_name(package_name).c_str());
569 }
570 ii->set_priority(prio);
571 return;
572 }
573 }
574
575 Import_init* nii = new Import_init(package_name, init_name, prio);
576 this->imported_init_fns_.insert(nii);
577 }
578
579 // Return whether we are at the global binding level.
580
581 bool
582 Gogo::in_global_scope() const
583 {
584 return this->functions_.empty();
585 }
586
587 // Return the current binding contour.
588
589 Bindings*
590 Gogo::current_bindings()
591 {
592 if (!this->functions_.empty())
593 return this->functions_.back().blocks.back()->bindings();
594 else if (this->package_ != NULL)
595 return this->package_->bindings();
596 else
597 return this->globals_;
598 }
599
600 const Bindings*
601 Gogo::current_bindings() const
602 {
603 if (!this->functions_.empty())
604 return this->functions_.back().blocks.back()->bindings();
605 else if (this->package_ != NULL)
606 return this->package_->bindings();
607 else
608 return this->globals_;
609 }
610
611 void
612 Gogo::update_init_priority(Import_init* ii,
613 std::set<const Import_init *>* visited)
614 {
615 visited->insert(ii);
616 int succ_prior = -1;
617
618 for (std::set<std::string>::const_iterator pci =
619 ii->precursors().begin();
620 pci != ii->precursors().end();
621 ++pci)
622 {
623 Import_init* succ = this->lookup_init(*pci);
624 if (visited->find(succ) == visited->end())
625 update_init_priority(succ, visited);
626 succ_prior = std::max(succ_prior, succ->priority());
627 }
628 if (ii->priority() <= succ_prior)
629 ii->set_priority(succ_prior + 1);
630 }
631
632 void
633 Gogo::recompute_init_priorities()
634 {
635 std::set<Import_init *> nonroots;
636
637 for (Import_init_set::const_iterator p =
638 this->imported_init_fns_.begin();
639 p != this->imported_init_fns_.end();
640 ++p)
641 {
642 const Import_init *ii = *p;
643 for (std::set<std::string>::const_iterator pci =
644 ii->precursors().begin();
645 pci != ii->precursors().end();
646 ++pci)
647 {
648 Import_init* ii = this->lookup_init(*pci);
649 nonroots.insert(ii);
650 }
651 }
652
653 // Recursively update priorities starting at roots.
654 std::set<const Import_init*> visited;
655 for (Import_init_set::iterator p =
656 this->imported_init_fns_.begin();
657 p != this->imported_init_fns_.end();
658 ++p)
659 {
660 Import_init* ii = *p;
661 if (nonroots.find(ii) != nonroots.end())
662 continue;
663 update_init_priority(ii, &visited);
664 }
665 }
666
667 // Add statements to INIT_STMTS which run the initialization
668 // functions for imported packages. This is only used for the "main"
669 // package.
670
671 void
672 Gogo::init_imports(std::vector<Bstatement*>& init_stmts, Bfunction *bfunction)
673 {
674 go_assert(this->is_main_package());
675
676 if (this->imported_init_fns_.empty())
677 return;
678
679 Location unknown_loc = Linemap::unknown_location();
680 Function_type* func_type =
681 Type::make_function_type(NULL, NULL, NULL, unknown_loc);
682 Btype* fntype = func_type->get_backend_fntype(this);
683
684 // Recompute init priorities based on a walk of the init graph.
685 recompute_init_priorities();
686
687 // We must call them in increasing priority order.
688 std::vector<const Import_init*> v;
689 for (Import_init_set::const_iterator p =
690 this->imported_init_fns_.begin();
691 p != this->imported_init_fns_.end();
692 ++p)
693 {
694 if ((*p)->priority() < 0)
695 go_error_at(Linemap::unknown_location(),
696 "internal error: failed to set init priority for %s",
697 (*p)->package_name().c_str());
698 v.push_back(*p);
699 }
700 std::sort(v.begin(), v.end(), priority_compare);
701
702 // We build calls to the init functions, which take no arguments.
703 std::vector<Bexpression*> empty_args;
704 for (std::vector<const Import_init*>::const_iterator p = v.begin();
705 p != v.end();
706 ++p)
707 {
708 const Import_init* ii = *p;
709 std::string user_name = ii->package_name() + ".init";
710 const std::string& init_name(ii->init_name());
711
712 Bfunction* pfunc = this->backend()->function(fntype, user_name, init_name,
713 true, true, true, false,
714 false, false, unknown_loc);
715 Bexpression* pfunc_code =
716 this->backend()->function_code_expression(pfunc, unknown_loc);
717 Bexpression* pfunc_call =
718 this->backend()->call_expression(bfunction, pfunc_code, empty_args,
719 NULL, unknown_loc);
720 init_stmts.push_back(this->backend()->expression_statement(bfunction,
721 pfunc_call));
722 }
723 }
724
725 // Register global variables with the garbage collector. We need to
726 // register all variables which can hold a pointer value. They become
727 // roots during the mark phase. We build a struct that is easy to
728 // hook into a list of roots.
729
730 // type gcRoot struct {
731 // decl unsafe.Pointer // Pointer to variable.
732 // size uintptr // Total size of variable.
733 // ptrdata uintptr // Length of variable's gcdata.
734 // gcdata *byte // Pointer mask.
735 // }
736 //
737 // type gcRootList struct {
738 // next *gcRootList
739 // count int
740 // roots [...]gcRoot
741 // }
742
743 // The last entry in the roots array has a NULL decl field.
744
745 void
746 Gogo::register_gc_vars(const std::vector<Named_object*>& var_gc,
747 std::vector<Bstatement*>& init_stmts,
748 Bfunction* init_bfn)
749 {
750 if (var_gc.empty() && this->gc_roots_.empty())
751 return;
752
753 Type* pvt = Type::make_pointer_type(Type::make_void_type());
754 Type* uintptr_type = Type::lookup_integer_type("uintptr");
755 Type* byte_type = this->lookup_global("byte")->type_value();
756 Type* pointer_byte_type = Type::make_pointer_type(byte_type);
757 Struct_type* root_type =
758 Type::make_builtin_struct_type(4,
759 "decl", pvt,
760 "size", uintptr_type,
761 "ptrdata", uintptr_type,
762 "gcdata", pointer_byte_type);
763
764 Location builtin_loc = Linemap::predeclared_location();
765 unsigned long roots_len = var_gc.size() + this->gc_roots_.size();
766 Expression* length = Expression::make_integer_ul(roots_len, NULL,
767 builtin_loc);
768 Array_type* root_array_type = Type::make_array_type(root_type, length);
769 root_array_type->set_is_array_incomparable();
770
771 Type* int_type = Type::lookup_integer_type("int");
772 Struct_type* root_list_type =
773 Type::make_builtin_struct_type(3,
774 "next", pvt,
775 "count", int_type,
776 "roots", root_array_type);
777
778 // Build an initializer for the roots array.
779
780 Expression_list* roots_init = new Expression_list();
781
782 for (std::vector<Named_object*>::const_iterator p = var_gc.begin();
783 p != var_gc.end();
784 ++p)
785 {
786 Expression_list* init = new Expression_list();
787
788 Location no_loc = (*p)->location();
789 Expression* decl = Expression::make_var_reference(*p, no_loc);
790 Expression* decl_addr =
791 Expression::make_unary(OPERATOR_AND, decl, no_loc);
792 decl_addr->unary_expression()->set_does_not_escape();
793 decl_addr = Expression::make_cast(pvt, decl_addr, no_loc);
794 init->push_back(decl_addr);
795
796 Expression* size =
797 Expression::make_type_info(decl->type(),
798 Expression::TYPE_INFO_SIZE);
799 init->push_back(size);
800
801 Expression* ptrdata =
802 Expression::make_type_info(decl->type(),
803 Expression::TYPE_INFO_BACKEND_PTRDATA);
804 init->push_back(ptrdata);
805
806 Expression* gcdata = Expression::make_ptrmask_symbol(decl->type());
807 init->push_back(gcdata);
808
809 Expression* root_ctor =
810 Expression::make_struct_composite_literal(root_type, init, no_loc);
811 roots_init->push_back(root_ctor);
812 }
813
814 for (std::vector<Expression*>::const_iterator p = this->gc_roots_.begin();
815 p != this->gc_roots_.end();
816 ++p)
817 {
818 Expression_list *init = new Expression_list();
819
820 Expression* expr = *p;
821 Location eloc = expr->location();
822 init->push_back(Expression::make_cast(pvt, expr, eloc));
823
824 Type* type = expr->type()->points_to();
825 go_assert(type != NULL);
826
827 Expression* size =
828 Expression::make_type_info(type,
829 Expression::TYPE_INFO_SIZE);
830 init->push_back(size);
831
832 Expression* ptrdata =
833 Expression::make_type_info(type,
834 Expression::TYPE_INFO_BACKEND_PTRDATA);
835 init->push_back(ptrdata);
836
837 Expression* gcdata = Expression::make_ptrmask_symbol(type);
838 init->push_back(gcdata);
839
840 Expression* root_ctor =
841 Expression::make_struct_composite_literal(root_type, init, eloc);
842 roots_init->push_back(root_ctor);
843 }
844
845 // Build a constructor for the struct.
846
847 Expression_list* root_list_init = new Expression_list();
848 root_list_init->push_back(Expression::make_nil(builtin_loc));
849 root_list_init->push_back(Expression::make_integer_ul(roots_len, int_type,
850 builtin_loc));
851
852 Expression* roots_ctor =
853 Expression::make_array_composite_literal(root_array_type, roots_init,
854 builtin_loc);
855 root_list_init->push_back(roots_ctor);
856
857 Expression* root_list_ctor =
858 Expression::make_struct_composite_literal(root_list_type, root_list_init,
859 builtin_loc);
860
861 Expression* root_addr = Expression::make_unary(OPERATOR_AND, root_list_ctor,
862 builtin_loc);
863 root_addr->unary_expression()->set_is_gc_root();
864 Expression* register_roots = Runtime::make_call(Runtime::REGISTER_GC_ROOTS,
865 builtin_loc, 1, root_addr);
866
867 Translate_context context(this, NULL, NULL, NULL);
868 Bexpression* bcall = register_roots->get_backend(&context);
869 init_stmts.push_back(this->backend()->expression_statement(init_bfn, bcall));
870 }
871
872 // Build the decl for the initialization function.
873
874 Named_object*
875 Gogo::initialization_function_decl()
876 {
877 std::string name = this->get_init_fn_name();
878 Location loc = this->package_->location();
879
880 Function_type* fntype = Type::make_function_type(NULL, NULL, NULL, loc);
881 Function* initfn = new Function(fntype, NULL, NULL, loc);
882 return Named_object::make_function(name, NULL, initfn);
883 }
884
885 // Create the magic initialization function. CODE_STMT is the
886 // code that it needs to run.
887
888 Named_object*
889 Gogo::create_initialization_function(Named_object* initfn,
890 Bstatement* code_stmt)
891 {
892 // Make sure that we thought we needed an initialization function,
893 // as otherwise we will not have reported it in the export data.
894 go_assert(this->is_main_package() || this->need_init_fn_);
895
896 if (initfn == NULL)
897 initfn = this->initialization_function_decl();
898
899 // Bind the initialization function code to a block.
900 Bfunction* fndecl = initfn->func_value()->get_or_make_decl(this, initfn);
901 Location pkg_loc = this->package_->location();
902 std::vector<Bvariable*> vars;
903 this->backend()->block(fndecl, NULL, vars, pkg_loc, pkg_loc);
904
905 if (!this->backend()->function_set_body(fndecl, code_stmt))
906 {
907 go_assert(saw_errors());
908 return NULL;
909 }
910 return initfn;
911 }
912
913 // Search for references to VAR in any statements or called functions.
914
915 class Find_var : public Traverse
916 {
917 public:
918 // A hash table we use to avoid looping. The index is the name of a
919 // named object. We only look through objects defined in this
920 // package.
921 typedef Unordered_set(const void*) Seen_objects;
922
923 Find_var(Named_object* var, Seen_objects* seen_objects)
924 : Traverse(traverse_expressions),
925 var_(var), seen_objects_(seen_objects), found_(false)
926 { }
927
928 // Whether the variable was found.
929 bool
930 found() const
931 { return this->found_; }
932
933 int
934 expression(Expression**);
935
936 private:
937 // The variable we are looking for.
938 Named_object* var_;
939 // Names of objects we have already seen.
940 Seen_objects* seen_objects_;
941 // True if the variable was found.
942 bool found_;
943 };
944
945 // See if EXPR refers to VAR, looking through function calls and
946 // variable initializations.
947
948 int
949 Find_var::expression(Expression** pexpr)
950 {
951 Expression* e = *pexpr;
952
953 Var_expression* ve = e->var_expression();
954 if (ve != NULL)
955 {
956 Named_object* v = ve->named_object();
957 if (v == this->var_)
958 {
959 this->found_ = true;
960 return TRAVERSE_EXIT;
961 }
962
963 if (v->is_variable() && v->package() == NULL)
964 {
965 Expression* init = v->var_value()->init();
966 if (init != NULL)
967 {
968 std::pair<Seen_objects::iterator, bool> ins =
969 this->seen_objects_->insert(v);
970 if (ins.second)
971 {
972 // This is the first time we have seen this name.
973 if (Expression::traverse(&init, this) == TRAVERSE_EXIT)
974 return TRAVERSE_EXIT;
975 }
976 }
977 }
978 }
979
980 // We traverse the code of any function or bound method we see. Note that
981 // this means that we will traverse the code of a function or bound method
982 // whose address is taken even if it is not called.
983 Func_expression* fe = e->func_expression();
984 Bound_method_expression* bme = e->bound_method_expression();
985 if (fe != NULL || bme != NULL)
986 {
987 const Named_object* f = fe != NULL ? fe->named_object() : bme->function();
988 if (f->is_function() && f->package() == NULL)
989 {
990 std::pair<Seen_objects::iterator, bool> ins =
991 this->seen_objects_->insert(f);
992 if (ins.second)
993 {
994 // This is the first time we have seen this name.
995 if (f->func_value()->block()->traverse(this) == TRAVERSE_EXIT)
996 return TRAVERSE_EXIT;
997 }
998 }
999 }
1000
1001 Temporary_reference_expression* tre = e->temporary_reference_expression();
1002 if (tre != NULL)
1003 {
1004 Temporary_statement* ts = tre->statement();
1005 Expression* init = ts->init();
1006 if (init != NULL)
1007 {
1008 std::pair<Seen_objects::iterator, bool> ins =
1009 this->seen_objects_->insert(ts);
1010 if (ins.second)
1011 {
1012 // This is the first time we have seen this temporary
1013 // statement.
1014 if (Expression::traverse(&init, this) == TRAVERSE_EXIT)
1015 return TRAVERSE_EXIT;
1016 }
1017 }
1018 }
1019
1020 return TRAVERSE_CONTINUE;
1021 }
1022
1023 // Return true if EXPR, PREINIT, or DEP refers to VAR.
1024
1025 static bool
1026 expression_requires(Expression* expr, Block* preinit, Named_object* dep,
1027 Named_object* var)
1028 {
1029 Find_var::Seen_objects seen_objects;
1030 Find_var find_var(var, &seen_objects);
1031 if (expr != NULL)
1032 Expression::traverse(&expr, &find_var);
1033 if (preinit != NULL)
1034 preinit->traverse(&find_var);
1035 if (dep != NULL)
1036 {
1037 Expression* init = dep->var_value()->init();
1038 if (init != NULL)
1039 Expression::traverse(&init, &find_var);
1040 if (dep->var_value()->has_pre_init())
1041 dep->var_value()->preinit()->traverse(&find_var);
1042 }
1043
1044 return find_var.found();
1045 }
1046
1047 // Sort variable initializations. If the initialization expression
1048 // for variable A refers directly or indirectly to the initialization
1049 // expression for variable B, then we must initialize B before A.
1050
1051 class Var_init
1052 {
1053 public:
1054 Var_init()
1055 : var_(NULL), init_(NULL), dep_count_(0)
1056 { }
1057
1058 Var_init(Named_object* var, Bstatement* init)
1059 : var_(var), init_(init), dep_count_(0)
1060 { }
1061
1062 // Return the variable.
1063 Named_object*
1064 var() const
1065 { return this->var_; }
1066
1067 // Return the initialization expression.
1068 Bstatement*
1069 init() const
1070 { return this->init_; }
1071
1072 // Return the number of remaining dependencies.
1073 size_t
1074 dep_count() const
1075 { return this->dep_count_; }
1076
1077 // Increment the number of dependencies.
1078 void
1079 add_dependency()
1080 { ++this->dep_count_; }
1081
1082 // Decrement the number of dependencies.
1083 void
1084 remove_dependency()
1085 { --this->dep_count_; }
1086
1087 private:
1088 // The variable being initialized.
1089 Named_object* var_;
1090 // The initialization statement.
1091 Bstatement* init_;
1092 // The number of initializations this is dependent on. A variable
1093 // initialization should not be emitted if any of its dependencies
1094 // have not yet been resolved.
1095 size_t dep_count_;
1096 };
1097
1098 // For comparing Var_init keys in a map.
1099
1100 inline bool
1101 operator<(const Var_init& v1, const Var_init& v2)
1102 { return v1.var()->name() < v2.var()->name(); }
1103
1104 typedef std::list<Var_init> Var_inits;
1105
1106 // Sort the variable initializations. The rule we follow is that we
1107 // emit them in the order they appear in the array, except that if the
1108 // initialization expression for a variable V1 depends upon another
1109 // variable V2 then we initialize V1 after V2.
1110
1111 static void
1112 sort_var_inits(Gogo* gogo, Var_inits* var_inits)
1113 {
1114 if (var_inits->empty())
1115 return;
1116
1117 typedef std::pair<Named_object*, Named_object*> No_no;
1118 typedef std::map<No_no, bool> Cache;
1119 Cache cache;
1120
1121 // A mapping from a variable initialization to a set of
1122 // variable initializations that depend on it.
1123 typedef std::map<Var_init, std::set<Var_init*> > Init_deps;
1124 Init_deps init_deps;
1125 bool init_loop = false;
1126 for (Var_inits::iterator p1 = var_inits->begin();
1127 p1 != var_inits->end();
1128 ++p1)
1129 {
1130 Named_object* var = p1->var();
1131 Expression* init = var->var_value()->init();
1132 Block* preinit = var->var_value()->preinit();
1133 Named_object* dep = gogo->var_depends_on(var->var_value());
1134
1135 // Start walking through the list to see which variables VAR
1136 // needs to wait for.
1137 for (Var_inits::iterator p2 = var_inits->begin();
1138 p2 != var_inits->end();
1139 ++p2)
1140 {
1141 if (var == p2->var())
1142 continue;
1143
1144 Named_object* p2var = p2->var();
1145 No_no key(var, p2var);
1146 std::pair<Cache::iterator, bool> ins =
1147 cache.insert(std::make_pair(key, false));
1148 if (ins.second)
1149 ins.first->second = expression_requires(init, preinit, dep, p2var);
1150 if (ins.first->second)
1151 {
1152 // VAR depends on P2VAR.
1153 init_deps[*p2].insert(&(*p1));
1154 p1->add_dependency();
1155
1156 // Check for cycles.
1157 key = std::make_pair(p2var, var);
1158 ins = cache.insert(std::make_pair(key, false));
1159 if (ins.second)
1160 ins.first->second =
1161 expression_requires(p2var->var_value()->init(),
1162 p2var->var_value()->preinit(),
1163 gogo->var_depends_on(p2var->var_value()),
1164 var);
1165 if (ins.first->second)
1166 {
1167 go_error_at(var->location(),
1168 ("initialization expressions for %qs and "
1169 "%qs depend upon each other"),
1170 var->message_name().c_str(),
1171 p2var->message_name().c_str());
1172 go_inform(p2->var()->location(), "%qs defined here",
1173 p2var->message_name().c_str());
1174 init_loop = true;
1175 break;
1176 }
1177 }
1178 }
1179 }
1180
1181 // If there are no dependencies then the declaration order is sorted.
1182 if (!init_deps.empty() && !init_loop)
1183 {
1184 // Otherwise, sort variable initializations by emitting all variables with
1185 // no dependencies in declaration order. VAR_INITS is already in
1186 // declaration order.
1187 Var_inits ready;
1188 while (!var_inits->empty())
1189 {
1190 Var_inits::iterator v1;;
1191 for (v1 = var_inits->begin(); v1 != var_inits->end(); ++v1)
1192 {
1193 if (v1->dep_count() == 0)
1194 break;
1195 }
1196 go_assert(v1 != var_inits->end());
1197
1198 // V1 either has no dependencies or its dependencies have already
1199 // been emitted, add it to READY next. When V1 is emitted, remove
1200 // a dependency from each V that depends on V1.
1201 ready.splice(ready.end(), *var_inits, v1);
1202
1203 Init_deps::iterator p1 = init_deps.find(*v1);
1204 if (p1 != init_deps.end())
1205 {
1206 std::set<Var_init*> resolved = p1->second;
1207 for (std::set<Var_init*>::iterator pv = resolved.begin();
1208 pv != resolved.end();
1209 ++pv)
1210 (*pv)->remove_dependency();
1211 init_deps.erase(p1);
1212 }
1213 }
1214 var_inits->swap(ready);
1215 go_assert(init_deps.empty());
1216 }
1217
1218 // VAR_INITS is in the correct order. For each VAR in VAR_INITS,
1219 // check for a loop of VAR on itself.
1220 // interpret as a loop.
1221 for (Var_inits::const_iterator p = var_inits->begin();
1222 p != var_inits->end();
1223 ++p)
1224 gogo->check_self_dep(p->var());
1225 }
1226
1227 // Give an error if the initialization expression for VAR depends on
1228 // itself. We only check if INIT is not NULL and there is no
1229 // dependency; when INIT is NULL, it means that PREINIT sets VAR,
1230 // which we will interpret as a loop.
1231
1232 void
1233 Gogo::check_self_dep(Named_object* var)
1234 {
1235 Expression* init = var->var_value()->init();
1236 Block* preinit = var->var_value()->preinit();
1237 Named_object* dep = this->var_depends_on(var->var_value());
1238 if (init != NULL
1239 && dep == NULL
1240 && expression_requires(init, preinit, NULL, var))
1241 go_error_at(var->location(),
1242 "initialization expression for %qs depends upon itself",
1243 var->message_name().c_str());
1244 }
1245
1246 // Write out the global definitions.
1247
1248 void
1249 Gogo::write_globals()
1250 {
1251 this->build_interface_method_tables();
1252
1253 Bindings* bindings = this->current_bindings();
1254
1255 for (Bindings::const_declarations_iterator p = bindings->begin_declarations();
1256 p != bindings->end_declarations();
1257 ++p)
1258 {
1259 // If any function declarations needed a descriptor, make sure
1260 // we build it.
1261 Named_object* no = p->second;
1262 if (no->is_function_declaration())
1263 no->func_declaration_value()->build_backend_descriptor(this);
1264 }
1265
1266 // Lists of globally declared types, variables, constants, and functions
1267 // that must be defined.
1268 std::vector<Btype*> type_decls;
1269 std::vector<Bvariable*> var_decls;
1270 std::vector<Bexpression*> const_decls;
1271 std::vector<Bfunction*> func_decls;
1272
1273 // The init function declaration and associated Bfunction, if necessary.
1274 Named_object* init_fndecl = NULL;
1275 Bfunction* init_bfn = NULL;
1276
1277 std::vector<Bstatement*> init_stmts;
1278 std::vector<Bstatement*> var_init_stmts;
1279
1280 if (this->is_main_package())
1281 {
1282 init_fndecl = this->initialization_function_decl();
1283 init_bfn = init_fndecl->func_value()->get_or_make_decl(this, init_fndecl);
1284 this->init_imports(init_stmts, init_bfn);
1285 }
1286
1287 // A list of variable initializations.
1288 Var_inits var_inits;
1289
1290 // A list of variables which need to be registered with the garbage
1291 // collector.
1292 size_t count_definitions = bindings->size_definitions();
1293 std::vector<Named_object*> var_gc;
1294 var_gc.reserve(count_definitions);
1295
1296 for (Bindings::const_definitions_iterator p = bindings->begin_definitions();
1297 p != bindings->end_definitions();
1298 ++p)
1299 {
1300 Named_object* no = *p;
1301 go_assert(!no->is_type_declaration() && !no->is_function_declaration());
1302
1303 // There is nothing to do for a package.
1304 if (no->is_package())
1305 continue;
1306
1307 // There is nothing to do for an object which was imported from
1308 // a different package into the global scope.
1309 if (no->package() != NULL)
1310 continue;
1311
1312 // Skip blank named functions and constants.
1313 if ((no->is_function() && no->func_value()->is_sink())
1314 || (no->is_const() && no->const_value()->is_sink()))
1315 continue;
1316
1317 // There is nothing useful we can output for constants which
1318 // have ideal or non-integral type.
1319 if (no->is_const())
1320 {
1321 Type* type = no->const_value()->type();
1322 if (type == NULL)
1323 type = no->const_value()->expr()->type();
1324 if (type->is_abstract() || !type->is_numeric_type())
1325 continue;
1326 }
1327
1328 if (!no->is_variable())
1329 no->get_backend(this, const_decls, type_decls, func_decls);
1330 else
1331 {
1332 Variable* var = no->var_value();
1333 Bvariable* bvar = no->get_backend_variable(this, NULL);
1334 var_decls.push_back(bvar);
1335
1336 // Check for a sink variable, which may be used to run an
1337 // initializer purely for its side effects.
1338 bool is_sink = no->name()[0] == '_' && no->name()[1] == '.';
1339
1340 Bstatement* var_init_stmt = NULL;
1341 if (!var->has_pre_init())
1342 {
1343 // If the backend representation of the variable initializer is
1344 // constant, we can just set the initial value using
1345 // global_var_set_init instead of during the init() function.
1346 // The initializer is constant if it is the zero-value of the
1347 // variable's type or if the initial value is an immutable value
1348 // that is not copied to the heap.
1349 bool is_static_initializer = false;
1350 if (var->init() == NULL)
1351 is_static_initializer = true;
1352 else
1353 {
1354 Type* var_type = var->type();
1355 Expression* init = var->init();
1356 Expression* init_cast =
1357 Expression::make_cast(var_type, init, var->location());
1358 is_static_initializer = init_cast->is_static_initializer();
1359 }
1360
1361 // Non-constant variable initializations might need to create
1362 // temporary variables, which will need the initialization
1363 // function as context.
1364 Named_object* var_init_fn;
1365 if (is_static_initializer)
1366 var_init_fn = NULL;
1367 else
1368 {
1369 if (init_fndecl == NULL)
1370 {
1371 init_fndecl = this->initialization_function_decl();
1372 Function* func = init_fndecl->func_value();
1373 init_bfn = func->get_or_make_decl(this, init_fndecl);
1374 }
1375 var_init_fn = init_fndecl;
1376 }
1377 Bexpression* var_binit = var->get_init(this, var_init_fn);
1378
1379 if (var_binit == NULL)
1380 ;
1381 else if (is_static_initializer)
1382 {
1383 if (expression_requires(var->init(), NULL,
1384 this->var_depends_on(var), no))
1385 go_error_at(no->location(),
1386 "initialization expression for %qs depends "
1387 "upon itself",
1388 no->message_name().c_str());
1389 this->backend()->global_variable_set_init(bvar, var_binit);
1390 }
1391 else if (is_sink)
1392 var_init_stmt =
1393 this->backend()->expression_statement(init_bfn, var_binit);
1394 else
1395 {
1396 Location loc = var->location();
1397 Bexpression* var_expr =
1398 this->backend()->var_expression(bvar, loc);
1399 var_init_stmt =
1400 this->backend()->assignment_statement(init_bfn, var_expr,
1401 var_binit, loc);
1402 }
1403 }
1404 else
1405 {
1406 // We are going to create temporary variables which
1407 // means that we need an fndecl.
1408 if (init_fndecl == NULL)
1409 init_fndecl = this->initialization_function_decl();
1410
1411 Bvariable* var_decl = is_sink ? NULL : bvar;
1412 var_init_stmt = var->get_init_block(this, init_fndecl, var_decl);
1413 }
1414
1415 if (var_init_stmt != NULL)
1416 {
1417 if (var->init() == NULL && !var->has_pre_init())
1418 var_init_stmts.push_back(var_init_stmt);
1419 else
1420 var_inits.push_back(Var_init(no, var_init_stmt));
1421 }
1422 else if (this->var_depends_on(var) != NULL)
1423 {
1424 // This variable is initialized from something that is
1425 // not in its init or preinit. This variable needs to
1426 // participate in dependency analysis sorting, in case
1427 // some other variable depends on this one.
1428 Btype* btype = no->var_value()->type()->get_backend(this);
1429 Bexpression* zero = this->backend()->zero_expression(btype);
1430 Bstatement* zero_stmt =
1431 this->backend()->expression_statement(init_bfn, zero);
1432 var_inits.push_back(Var_init(no, zero_stmt));
1433 }
1434
1435 // Collect a list of all global variables with pointers,
1436 // to register them for the garbage collector.
1437 if (!is_sink && var->type()->has_pointer())
1438 {
1439 // Avoid putting runtime.gcRoots itself on the list.
1440 if (this->compiling_runtime()
1441 && this->package_name() == "runtime"
1442 && Gogo::unpack_hidden_name(no->name()) == "gcRoots")
1443 ;
1444 else
1445 var_gc.push_back(no);
1446 }
1447 }
1448 }
1449
1450 // Register global variables with the garbage collector.
1451 this->register_gc_vars(var_gc, init_stmts, init_bfn);
1452
1453 // Simple variable initializations, after all variables are
1454 // registered.
1455 init_stmts.push_back(this->backend()->statement_list(var_init_stmts));
1456
1457 // Complete variable initializations, first sorting them into a
1458 // workable order.
1459 if (!var_inits.empty())
1460 {
1461 sort_var_inits(this, &var_inits);
1462 for (Var_inits::const_iterator p = var_inits.begin();
1463 p != var_inits.end();
1464 ++p)
1465 init_stmts.push_back(p->init());
1466 }
1467
1468 // After all the variables are initialized, call the init
1469 // functions if there are any. Init functions take no arguments, so
1470 // we pass in EMPTY_ARGS to call them.
1471 std::vector<Bexpression*> empty_args;
1472 for (std::vector<Named_object*>::const_iterator p =
1473 this->init_functions_.begin();
1474 p != this->init_functions_.end();
1475 ++p)
1476 {
1477 Location func_loc = (*p)->location();
1478 Function* func = (*p)->func_value();
1479 Bfunction* initfn = func->get_or_make_decl(this, *p);
1480 Bexpression* func_code =
1481 this->backend()->function_code_expression(initfn, func_loc);
1482 Bexpression* call = this->backend()->call_expression(init_bfn, func_code,
1483 empty_args,
1484 NULL, func_loc);
1485 Bstatement* ist = this->backend()->expression_statement(init_bfn, call);
1486 init_stmts.push_back(ist);
1487 }
1488
1489 // Set up a magic function to do all the initialization actions.
1490 // This will be called if this package is imported.
1491 Bstatement* init_fncode = this->backend()->statement_list(init_stmts);
1492 if (this->need_init_fn_ || this->is_main_package())
1493 {
1494 init_fndecl =
1495 this->create_initialization_function(init_fndecl, init_fncode);
1496 if (init_fndecl != NULL)
1497 func_decls.push_back(init_fndecl->func_value()->get_decl());
1498 }
1499
1500 // We should not have seen any new bindings created during the conversion.
1501 go_assert(count_definitions == this->current_bindings()->size_definitions());
1502
1503 // Define all globally declared values.
1504 if (!saw_errors())
1505 this->backend()->write_global_definitions(type_decls, const_decls,
1506 func_decls, var_decls);
1507 }
1508
1509 // Return the current block.
1510
1511 Block*
1512 Gogo::current_block()
1513 {
1514 if (this->functions_.empty())
1515 return NULL;
1516 else
1517 return this->functions_.back().blocks.back();
1518 }
1519
1520 // Look up a name in the current binding contour. If PFUNCTION is not
1521 // NULL, set it to the function in which the name is defined, or NULL
1522 // if the name is defined in global scope.
1523
1524 Named_object*
1525 Gogo::lookup(const std::string& name, Named_object** pfunction) const
1526 {
1527 if (pfunction != NULL)
1528 *pfunction = NULL;
1529
1530 if (Gogo::is_sink_name(name))
1531 return Named_object::make_sink();
1532
1533 for (Open_functions::const_reverse_iterator p = this->functions_.rbegin();
1534 p != this->functions_.rend();
1535 ++p)
1536 {
1537 Named_object* ret = p->blocks.back()->bindings()->lookup(name);
1538 if (ret != NULL)
1539 {
1540 if (pfunction != NULL)
1541 *pfunction = p->function;
1542 return ret;
1543 }
1544 }
1545
1546 if (this->package_ != NULL)
1547 {
1548 Named_object* ret = this->package_->bindings()->lookup(name);
1549 if (ret != NULL)
1550 {
1551 if (ret->package() != NULL)
1552 {
1553 std::string dot_alias = "." + ret->package()->package_name();
1554 ret->package()->note_usage(dot_alias);
1555 }
1556 return ret;
1557 }
1558 }
1559
1560 // We do not look in the global namespace. If we did, the global
1561 // namespace would effectively hide names which were defined in
1562 // package scope which we have not yet seen. Instead,
1563 // define_global_names is called after parsing is over to connect
1564 // undefined names at package scope with names defined at global
1565 // scope.
1566
1567 return NULL;
1568 }
1569
1570 // Look up a name in the current block, without searching enclosing
1571 // blocks.
1572
1573 Named_object*
1574 Gogo::lookup_in_block(const std::string& name) const
1575 {
1576 go_assert(!this->functions_.empty());
1577 go_assert(!this->functions_.back().blocks.empty());
1578 return this->functions_.back().blocks.back()->bindings()->lookup_local(name);
1579 }
1580
1581 // Look up a name in the global namespace.
1582
1583 Named_object*
1584 Gogo::lookup_global(const char* name) const
1585 {
1586 return this->globals_->lookup(name);
1587 }
1588
1589 // Add an imported package.
1590
1591 Package*
1592 Gogo::add_imported_package(const std::string& real_name,
1593 const std::string& alias_arg,
1594 bool is_alias_exported,
1595 const std::string& pkgpath,
1596 const std::string& pkgpath_symbol,
1597 Location location,
1598 bool* padd_to_globals)
1599 {
1600 Package* ret = this->register_package(pkgpath, pkgpath_symbol, location);
1601 ret->set_package_name(real_name, location);
1602
1603 *padd_to_globals = false;
1604
1605 if (alias_arg == "_")
1606 ;
1607 else if (alias_arg == ".")
1608 {
1609 *padd_to_globals = true;
1610 std::string dot_alias = "." + real_name;
1611 ret->add_alias(dot_alias, location);
1612 }
1613 else
1614 {
1615 std::string alias = alias_arg;
1616 if (alias.empty())
1617 {
1618 alias = real_name;
1619 is_alias_exported = Lex::is_exported_name(alias);
1620 }
1621 ret->add_alias(alias, location);
1622 alias = this->pack_hidden_name(alias, is_alias_exported);
1623 Named_object* no = this->package_->bindings()->add_package(alias, ret);
1624 if (!no->is_package())
1625 return NULL;
1626 }
1627
1628 return ret;
1629 }
1630
1631 // Register a package. This package may or may not be imported. This
1632 // returns the Package structure for the package, creating if it
1633 // necessary. LOCATION is the location of the import statement that
1634 // led us to see this package. PKGPATH_SYMBOL is the symbol to use
1635 // for names in the package; it may be the empty string, in which case
1636 // we either get it later or make a guess when we need it.
1637
1638 Package*
1639 Gogo::register_package(const std::string& pkgpath,
1640 const std::string& pkgpath_symbol, Location location)
1641 {
1642 Package* package = NULL;
1643 std::pair<Packages::iterator, bool> ins =
1644 this->packages_.insert(std::make_pair(pkgpath, package));
1645 if (!ins.second)
1646 {
1647 // We have seen this package name before.
1648 package = ins.first->second;
1649 go_assert(package != NULL && package->pkgpath() == pkgpath);
1650 if (!pkgpath_symbol.empty())
1651 package->set_pkgpath_symbol(pkgpath_symbol);
1652 if (Linemap::is_unknown_location(package->location()))
1653 package->set_location(location);
1654 }
1655 else
1656 {
1657 // First time we have seen this package name.
1658 package = new Package(pkgpath, pkgpath_symbol, location);
1659 go_assert(ins.first->second == NULL);
1660 ins.first->second = package;
1661 }
1662
1663 return package;
1664 }
1665
1666 // Return the pkgpath symbol for a package, given the pkgpath.
1667
1668 std::string
1669 Gogo::pkgpath_symbol_for_package(const std::string& pkgpath)
1670 {
1671 Packages::iterator p = this->packages_.find(pkgpath);
1672 go_assert(p != this->packages_.end());
1673 return p->second->pkgpath_symbol();
1674 }
1675
1676 // Start compiling a function.
1677
1678 Named_object*
1679 Gogo::start_function(const std::string& name, Function_type* type,
1680 bool add_method_to_type, Location location)
1681 {
1682 bool at_top_level = this->functions_.empty();
1683
1684 Block* block = new Block(NULL, location);
1685
1686 Named_object* enclosing = (at_top_level
1687 ? NULL
1688 : this->functions_.back().function);
1689
1690 Function* function = new Function(type, enclosing, block, location);
1691
1692 if (type->is_method())
1693 {
1694 const Typed_identifier* receiver = type->receiver();
1695 Variable* this_param = new Variable(receiver->type(), NULL, false,
1696 true, true, location);
1697 std::string rname = receiver->name();
1698 if (rname.empty() || Gogo::is_sink_name(rname))
1699 {
1700 // We need to give receivers a name since they wind up in
1701 // DECL_ARGUMENTS. FIXME.
1702 static unsigned int count;
1703 char buf[50];
1704 snprintf(buf, sizeof buf, "r.%u", count);
1705 ++count;
1706 rname = buf;
1707 }
1708 block->bindings()->add_variable(rname, NULL, this_param);
1709 }
1710
1711 const Typed_identifier_list* parameters = type->parameters();
1712 bool is_varargs = type->is_varargs();
1713 if (parameters != NULL)
1714 {
1715 for (Typed_identifier_list::const_iterator p = parameters->begin();
1716 p != parameters->end();
1717 ++p)
1718 {
1719 Variable* param = new Variable(p->type(), NULL, false, true, false,
1720 p->location());
1721 if (is_varargs && p + 1 == parameters->end())
1722 param->set_is_varargs_parameter();
1723
1724 std::string pname = p->name();
1725 if (pname.empty() || Gogo::is_sink_name(pname))
1726 {
1727 // We need to give parameters a name since they wind up
1728 // in DECL_ARGUMENTS. FIXME.
1729 static unsigned int count;
1730 char buf[50];
1731 snprintf(buf, sizeof buf, "p.%u", count);
1732 ++count;
1733 pname = buf;
1734 }
1735 block->bindings()->add_variable(pname, NULL, param);
1736 }
1737 }
1738
1739 function->create_result_variables(this);
1740
1741 const std::string* pname;
1742 std::string nested_name;
1743 bool is_init = false;
1744 if (Gogo::unpack_hidden_name(name) == "init" && !type->is_method())
1745 {
1746 if ((type->parameters() != NULL && !type->parameters()->empty())
1747 || (type->results() != NULL && !type->results()->empty()))
1748 go_error_at(location,
1749 "func init must have no arguments and no return values");
1750 // There can be multiple "init" functions, so give them each a
1751 // different name.
1752 nested_name = this->init_function_name();
1753 pname = &nested_name;
1754 is_init = true;
1755 }
1756 else if (!name.empty())
1757 pname = &name;
1758 else
1759 {
1760 // Invent a name for a nested function.
1761 nested_name = this->nested_function_name();
1762 pname = &nested_name;
1763 }
1764
1765 Named_object* ret;
1766 if (Gogo::is_sink_name(*pname))
1767 {
1768 std::string sname(this->sink_function_name());
1769 ret = Named_object::make_function(sname, NULL, function);
1770 ret->func_value()->set_is_sink();
1771
1772 if (!type->is_method())
1773 ret = this->package_->bindings()->add_named_object(ret);
1774 else if (add_method_to_type)
1775 {
1776 // We should report errors even for sink methods.
1777 Type* rtype = type->receiver()->type();
1778 // Avoid points_to and deref to avoid getting an error if
1779 // the type is not yet defined.
1780 if (rtype->classification() == Type::TYPE_POINTER)
1781 rtype = rtype->points_to();
1782 while (rtype->named_type() != NULL
1783 && rtype->named_type()->is_alias())
1784 rtype = rtype->named_type()->real_type()->forwarded();
1785 if (rtype->is_error_type())
1786 ;
1787 else if (rtype->named_type() != NULL)
1788 {
1789 if (rtype->named_type()->named_object()->package() != NULL)
1790 go_error_at(type->receiver()->location(),
1791 "may not define methods on non-local type");
1792 }
1793 else if (rtype->forward_declaration_type() != NULL)
1794 {
1795 // Go ahead and add the method in case we need to report
1796 // an error when we see the definition.
1797 rtype->forward_declaration_type()->add_existing_method(ret);
1798 }
1799 else
1800 go_error_at(type->receiver()->location(),
1801 ("invalid receiver type "
1802 "(receiver must be a named type)"));
1803 }
1804 }
1805 else if (!type->is_method())
1806 {
1807 ret = this->package_->bindings()->add_function(*pname, NULL, function);
1808 if (!ret->is_function() || ret->func_value() != function)
1809 {
1810 // Redefinition error. Invent a name to avoid knockon
1811 // errors.
1812 std::string rname(this->redefined_function_name());
1813 ret = this->package_->bindings()->add_function(rname, NULL, function);
1814 }
1815 }
1816 else
1817 {
1818 if (!add_method_to_type)
1819 ret = Named_object::make_function(name, NULL, function);
1820 else
1821 {
1822 go_assert(at_top_level);
1823 Type* rtype = type->receiver()->type();
1824
1825 // We want to look through the pointer created by the
1826 // parser, without getting an error if the type is not yet
1827 // defined.
1828 if (rtype->classification() == Type::TYPE_POINTER)
1829 rtype = rtype->points_to();
1830
1831 while (rtype->named_type() != NULL
1832 && rtype->named_type()->is_alias())
1833 rtype = rtype->named_type()->real_type()->forwarded();
1834
1835 if (rtype->is_error_type())
1836 ret = Named_object::make_function(name, NULL, function);
1837 else if (rtype->named_type() != NULL)
1838 {
1839 if (rtype->named_type()->named_object()->package() != NULL)
1840 {
1841 go_error_at(type->receiver()->location(),
1842 "may not define methods on non-local type");
1843 ret = Named_object::make_function(name, NULL, function);
1844 }
1845 else
1846 {
1847 ret = rtype->named_type()->add_method(name, function);
1848 if (!ret->is_function())
1849 {
1850 // Redefinition error.
1851 ret = Named_object::make_function(name, NULL, function);
1852 }
1853 }
1854 }
1855 else if (rtype->forward_declaration_type() != NULL)
1856 {
1857 Named_object* type_no =
1858 rtype->forward_declaration_type()->named_object();
1859 if (type_no->is_unknown())
1860 {
1861 // If we are seeing methods it really must be a
1862 // type. Declare it as such. An alternative would
1863 // be to support lists of methods for unknown
1864 // expressions. Either way the error messages if
1865 // this is not a type are going to get confusing.
1866 Named_object* declared =
1867 this->declare_package_type(type_no->name(),
1868 type_no->location());
1869 go_assert(declared
1870 == type_no->unknown_value()->real_named_object());
1871 }
1872 ret = rtype->forward_declaration_type()->add_method(name,
1873 function);
1874 }
1875 else
1876 {
1877 go_error_at(type->receiver()->location(),
1878 ("invalid receiver type (receiver must "
1879 "be a named type)"));
1880 ret = Named_object::make_function(name, NULL, function);
1881 }
1882 }
1883 this->package_->bindings()->add_method(ret);
1884 }
1885
1886 this->functions_.resize(this->functions_.size() + 1);
1887 Open_function& of(this->functions_.back());
1888 of.function = ret;
1889 of.blocks.push_back(block);
1890
1891 if (is_init)
1892 {
1893 this->init_functions_.push_back(ret);
1894 this->need_init_fn_ = true;
1895 }
1896
1897 return ret;
1898 }
1899
1900 // Finish compiling a function.
1901
1902 void
1903 Gogo::finish_function(Location location)
1904 {
1905 this->finish_block(location);
1906 go_assert(this->functions_.back().blocks.empty());
1907 this->functions_.pop_back();
1908 }
1909
1910 // Return the current function.
1911
1912 Named_object*
1913 Gogo::current_function() const
1914 {
1915 go_assert(!this->functions_.empty());
1916 return this->functions_.back().function;
1917 }
1918
1919 // Start a new block.
1920
1921 void
1922 Gogo::start_block(Location location)
1923 {
1924 go_assert(!this->functions_.empty());
1925 Block* block = new Block(this->current_block(), location);
1926 this->functions_.back().blocks.push_back(block);
1927 }
1928
1929 // Finish a block.
1930
1931 Block*
1932 Gogo::finish_block(Location location)
1933 {
1934 go_assert(!this->functions_.empty());
1935 go_assert(!this->functions_.back().blocks.empty());
1936 Block* block = this->functions_.back().blocks.back();
1937 this->functions_.back().blocks.pop_back();
1938 block->set_end_location(location);
1939 return block;
1940 }
1941
1942 // Add an erroneous name.
1943
1944 Named_object*
1945 Gogo::add_erroneous_name(const std::string& name)
1946 {
1947 return this->package_->bindings()->add_erroneous_name(name);
1948 }
1949
1950 // Add an unknown name.
1951
1952 Named_object*
1953 Gogo::add_unknown_name(const std::string& name, Location location)
1954 {
1955 return this->package_->bindings()->add_unknown_name(name, location);
1956 }
1957
1958 // Declare a function.
1959
1960 Named_object*
1961 Gogo::declare_function(const std::string& name, Function_type* type,
1962 Location location)
1963 {
1964 if (!type->is_method())
1965 return this->current_bindings()->add_function_declaration(name, NULL, type,
1966 location);
1967 else
1968 {
1969 // We don't bother to add this to the list of global
1970 // declarations.
1971 Type* rtype = type->receiver()->type();
1972
1973 // We want to look through the pointer created by the
1974 // parser, without getting an error if the type is not yet
1975 // defined.
1976 if (rtype->classification() == Type::TYPE_POINTER)
1977 rtype = rtype->points_to();
1978
1979 if (rtype->is_error_type())
1980 return NULL;
1981 else if (rtype->named_type() != NULL)
1982 return rtype->named_type()->add_method_declaration(name, NULL, type,
1983 location);
1984 else if (rtype->forward_declaration_type() != NULL)
1985 {
1986 Forward_declaration_type* ftype = rtype->forward_declaration_type();
1987 return ftype->add_method_declaration(name, NULL, type, location);
1988 }
1989 else
1990 {
1991 go_error_at(type->receiver()->location(),
1992 "invalid receiver type (receiver must be a named type)");
1993 return Named_object::make_erroneous_name(name);
1994 }
1995 }
1996 }
1997
1998 // Add a label definition.
1999
2000 Label*
2001 Gogo::add_label_definition(const std::string& label_name,
2002 Location location)
2003 {
2004 go_assert(!this->functions_.empty());
2005 Function* func = this->functions_.back().function->func_value();
2006 Label* label = func->add_label_definition(this, label_name, location);
2007 this->add_statement(Statement::make_label_statement(label, location));
2008 return label;
2009 }
2010
2011 // Add a label reference.
2012
2013 Label*
2014 Gogo::add_label_reference(const std::string& label_name,
2015 Location location, bool issue_goto_errors)
2016 {
2017 go_assert(!this->functions_.empty());
2018 Function* func = this->functions_.back().function->func_value();
2019 return func->add_label_reference(this, label_name, location,
2020 issue_goto_errors);
2021 }
2022
2023 // Return the current binding state.
2024
2025 Bindings_snapshot*
2026 Gogo::bindings_snapshot(Location location)
2027 {
2028 return new Bindings_snapshot(this->current_block(), location);
2029 }
2030
2031 // Add a statement.
2032
2033 void
2034 Gogo::add_statement(Statement* statement)
2035 {
2036 go_assert(!this->functions_.empty()
2037 && !this->functions_.back().blocks.empty());
2038 this->functions_.back().blocks.back()->add_statement(statement);
2039 }
2040
2041 // Add a block.
2042
2043 void
2044 Gogo::add_block(Block* block, Location location)
2045 {
2046 go_assert(!this->functions_.empty()
2047 && !this->functions_.back().blocks.empty());
2048 Statement* statement = Statement::make_block_statement(block, location);
2049 this->functions_.back().blocks.back()->add_statement(statement);
2050 }
2051
2052 // Add a constant.
2053
2054 Named_object*
2055 Gogo::add_constant(const Typed_identifier& tid, Expression* expr,
2056 int iota_value)
2057 {
2058 return this->current_bindings()->add_constant(tid, NULL, expr, iota_value);
2059 }
2060
2061 // Add a type.
2062
2063 void
2064 Gogo::add_type(const std::string& name, Type* type, Location location)
2065 {
2066 Named_object* no = this->current_bindings()->add_type(name, NULL, type,
2067 location);
2068 if (!this->in_global_scope() && no->is_type())
2069 {
2070 Named_object* f = this->functions_.back().function;
2071 unsigned int index;
2072 if (f->is_function())
2073 index = f->func_value()->new_local_type_index();
2074 else
2075 index = 0;
2076 no->type_value()->set_in_function(f, index);
2077 }
2078 }
2079
2080 // Add a named type.
2081
2082 void
2083 Gogo::add_named_type(Named_type* type)
2084 {
2085 go_assert(this->in_global_scope());
2086 this->current_bindings()->add_named_type(type);
2087 }
2088
2089 // Declare a type.
2090
2091 Named_object*
2092 Gogo::declare_type(const std::string& name, Location location)
2093 {
2094 Bindings* bindings = this->current_bindings();
2095 Named_object* no = bindings->add_type_declaration(name, NULL, location);
2096 if (!this->in_global_scope() && no->is_type_declaration())
2097 {
2098 Named_object* f = this->functions_.back().function;
2099 unsigned int index;
2100 if (f->is_function())
2101 index = f->func_value()->new_local_type_index();
2102 else
2103 index = 0;
2104 no->type_declaration_value()->set_in_function(f, index);
2105 }
2106 return no;
2107 }
2108
2109 // Declare a type at the package level.
2110
2111 Named_object*
2112 Gogo::declare_package_type(const std::string& name, Location location)
2113 {
2114 return this->package_->bindings()->add_type_declaration(name, NULL, location);
2115 }
2116
2117 // Declare a function at the package level.
2118
2119 Named_object*
2120 Gogo::declare_package_function(const std::string& name, Function_type* type,
2121 Location location)
2122 {
2123 return this->package_->bindings()->add_function_declaration(name, NULL, type,
2124 location);
2125 }
2126
2127 // Define a type which was already declared.
2128
2129 void
2130 Gogo::define_type(Named_object* no, Named_type* type)
2131 {
2132 this->current_bindings()->define_type(no, type);
2133 }
2134
2135 // Add a variable.
2136
2137 Named_object*
2138 Gogo::add_variable(const std::string& name, Variable* variable)
2139 {
2140 Named_object* no = this->current_bindings()->add_variable(name, NULL,
2141 variable);
2142
2143 // In a function the middle-end wants to see a DECL_EXPR node.
2144 if (no != NULL
2145 && no->is_variable()
2146 && !no->var_value()->is_parameter()
2147 && !this->functions_.empty())
2148 this->add_statement(Statement::make_variable_declaration(no));
2149
2150 return no;
2151 }
2152
2153 // Add a sink--a reference to the blank identifier _.
2154
2155 Named_object*
2156 Gogo::add_sink()
2157 {
2158 return Named_object::make_sink();
2159 }
2160
2161 // Add a named object for a dot import.
2162
2163 void
2164 Gogo::add_dot_import_object(Named_object* no)
2165 {
2166 // If the name already exists, then it was defined in some file seen
2167 // earlier. If the earlier name is just a declaration, don't add
2168 // this name, because that will cause the previous declaration to
2169 // merge to this imported name, which should not happen. Just add
2170 // this name to the list of file block names to get appropriate
2171 // errors if we see a later definition.
2172 Named_object* e = this->package_->bindings()->lookup(no->name());
2173 if (e != NULL && e->package() == NULL)
2174 {
2175 if (e->is_unknown())
2176 e = e->resolve();
2177 if (e->package() == NULL
2178 && (e->is_type_declaration()
2179 || e->is_function_declaration()
2180 || e->is_unknown()))
2181 {
2182 this->add_file_block_name(no->name(), no->location());
2183 return;
2184 }
2185 }
2186
2187 this->current_bindings()->add_named_object(no);
2188 }
2189
2190 // Add a linkname. This implements the go:linkname compiler directive.
2191 // We only support this for functions and function declarations.
2192
2193 void
2194 Gogo::add_linkname(const std::string& go_name, bool is_exported,
2195 const std::string& ext_name, Location loc)
2196 {
2197 Named_object* no =
2198 this->package_->bindings()->lookup(this->pack_hidden_name(go_name,
2199 is_exported));
2200 if (no == NULL)
2201 go_error_at(loc, "%s is not defined", go_name.c_str());
2202 else if (no->is_function())
2203 no->func_value()->set_asm_name(ext_name);
2204 else if (no->is_function_declaration())
2205 no->func_declaration_value()->set_asm_name(ext_name);
2206 else
2207 go_error_at(loc,
2208 ("%s is not a function; "
2209 "//go:linkname is only supported for functions"),
2210 go_name.c_str());
2211 }
2212
2213 // Mark all local variables used. This is used when some types of
2214 // parse error occur.
2215
2216 void
2217 Gogo::mark_locals_used()
2218 {
2219 for (Open_functions::iterator pf = this->functions_.begin();
2220 pf != this->functions_.end();
2221 ++pf)
2222 {
2223 for (std::vector<Block*>::iterator pb = pf->blocks.begin();
2224 pb != pf->blocks.end();
2225 ++pb)
2226 (*pb)->bindings()->mark_locals_used();
2227 }
2228 }
2229
2230 // Record that we've seen an interface type.
2231
2232 void
2233 Gogo::record_interface_type(Interface_type* itype)
2234 {
2235 this->interface_types_.push_back(itype);
2236 }
2237
2238 // Define the global names. We do this only after parsing all the
2239 // input files, because the program might define the global names
2240 // itself.
2241
2242 void
2243 Gogo::define_global_names()
2244 {
2245 if (this->is_main_package())
2246 {
2247 // Every Go program has to import the runtime package, so that
2248 // it is properly initialized.
2249 this->import_package("runtime", "_", false, false,
2250 Linemap::predeclared_location());
2251 }
2252
2253 for (Bindings::const_declarations_iterator p =
2254 this->globals_->begin_declarations();
2255 p != this->globals_->end_declarations();
2256 ++p)
2257 {
2258 Named_object* global_no = p->second;
2259 std::string name(Gogo::pack_hidden_name(global_no->name(), false));
2260 Named_object* no = this->package_->bindings()->lookup(name);
2261 if (no == NULL)
2262 continue;
2263 no = no->resolve();
2264 if (no->is_type_declaration())
2265 {
2266 if (global_no->is_type())
2267 {
2268 if (no->type_declaration_value()->has_methods())
2269 {
2270 for (std::vector<Named_object*>::const_iterator p =
2271 no->type_declaration_value()->methods()->begin();
2272 p != no->type_declaration_value()->methods()->end();
2273 p++)
2274 go_error_at((*p)->location(),
2275 "may not define methods on non-local type");
2276 }
2277 no->set_type_value(global_no->type_value());
2278 }
2279 else
2280 {
2281 go_error_at(no->location(), "expected type");
2282 Type* errtype = Type::make_error_type();
2283 Named_object* err =
2284 Named_object::make_type("erroneous_type", NULL, errtype,
2285 Linemap::predeclared_location());
2286 no->set_type_value(err->type_value());
2287 }
2288 }
2289 else if (no->is_unknown())
2290 no->unknown_value()->set_real_named_object(global_no);
2291 }
2292
2293 // Give an error if any name is defined in both the package block
2294 // and the file block. For example, this can happen if one file
2295 // imports "fmt" and another file defines a global variable fmt.
2296 for (Bindings::const_declarations_iterator p =
2297 this->package_->bindings()->begin_declarations();
2298 p != this->package_->bindings()->end_declarations();
2299 ++p)
2300 {
2301 if (p->second->is_unknown()
2302 && p->second->unknown_value()->real_named_object() == NULL)
2303 {
2304 // No point in warning about an undefined name, as we will
2305 // get other errors later anyhow.
2306 continue;
2307 }
2308 File_block_names::const_iterator pf =
2309 this->file_block_names_.find(p->second->name());
2310 if (pf != this->file_block_names_.end())
2311 {
2312 std::string n = p->second->message_name();
2313 go_error_at(p->second->location(),
2314 "%qs defined as both imported name and global name",
2315 n.c_str());
2316 go_inform(pf->second, "%qs imported here", n.c_str());
2317 }
2318
2319 // No package scope identifier may be named "init".
2320 if (!p->second->is_function()
2321 && Gogo::unpack_hidden_name(p->second->name()) == "init")
2322 {
2323 go_error_at(p->second->location(),
2324 "cannot declare init - must be func");
2325 }
2326 }
2327 }
2328
2329 // Clear out names in file scope.
2330
2331 void
2332 Gogo::clear_file_scope()
2333 {
2334 this->package_->bindings()->clear_file_scope(this);
2335
2336 // Warn about packages which were imported but not used.
2337 bool quiet = saw_errors();
2338 for (Packages::iterator p = this->packages_.begin();
2339 p != this->packages_.end();
2340 ++p)
2341 {
2342 Package* package = p->second;
2343 if (package != this->package_ && !quiet)
2344 {
2345 for (Package::Aliases::const_iterator p1 = package->aliases().begin();
2346 p1 != package->aliases().end();
2347 ++p1)
2348 {
2349 if (!p1->second->used())
2350 {
2351 // Give a more refined error message if the alias name is known.
2352 std::string pkg_name = package->package_name();
2353 if (p1->first != pkg_name && p1->first[0] != '.')
2354 {
2355 go_error_at(p1->second->location(),
2356 "imported and not used: %s as %s",
2357 Gogo::message_name(pkg_name).c_str(),
2358 Gogo::message_name(p1->first).c_str());
2359 }
2360 else
2361 go_error_at(p1->second->location(),
2362 "imported and not used: %s",
2363 Gogo::message_name(pkg_name).c_str());
2364 }
2365 }
2366 }
2367 package->clear_used();
2368 }
2369
2370 this->current_file_imported_unsafe_ = false;
2371 }
2372
2373 // Queue up a type specific function for later writing. These are
2374 // written out in write_specific_type_functions, called after the
2375 // parse tree is lowered.
2376
2377 void
2378 Gogo::queue_specific_type_function(Type* type, Named_type* name, int64_t size,
2379 const std::string& hash_name,
2380 Function_type* hash_fntype,
2381 const std::string& equal_name,
2382 Function_type* equal_fntype)
2383 {
2384 go_assert(!this->specific_type_functions_are_written_);
2385 go_assert(!this->in_global_scope());
2386 Specific_type_function* tsf = new Specific_type_function(type, name, size,
2387 hash_name,
2388 hash_fntype,
2389 equal_name,
2390 equal_fntype);
2391 this->specific_type_functions_.push_back(tsf);
2392 }
2393
2394 // Look for types which need specific hash or equality functions.
2395
2396 class Specific_type_functions : public Traverse
2397 {
2398 public:
2399 Specific_type_functions(Gogo* gogo)
2400 : Traverse(traverse_types),
2401 gogo_(gogo)
2402 { }
2403
2404 int
2405 type(Type*);
2406
2407 private:
2408 Gogo* gogo_;
2409 };
2410
2411 int
2412 Specific_type_functions::type(Type* t)
2413 {
2414 Named_object* hash_fn;
2415 Named_object* equal_fn;
2416 switch (t->classification())
2417 {
2418 case Type::TYPE_NAMED:
2419 {
2420 Named_type* nt = t->named_type();
2421 if (nt->is_alias())
2422 return TRAVERSE_CONTINUE;
2423 if (t->needs_specific_type_functions(this->gogo_))
2424 t->type_functions(this->gogo_, nt, NULL, NULL, &hash_fn, &equal_fn);
2425
2426 // If this is a struct type, we don't want to make functions
2427 // for the unnamed struct.
2428 Type* rt = nt->real_type();
2429 if (rt->struct_type() == NULL)
2430 {
2431 if (Type::traverse(rt, this) == TRAVERSE_EXIT)
2432 return TRAVERSE_EXIT;
2433 }
2434 else
2435 {
2436 // If this type is defined in another package, then we don't
2437 // need to worry about the unexported fields.
2438 bool is_defined_elsewhere = nt->named_object()->package() != NULL;
2439 const Struct_field_list* fields = rt->struct_type()->fields();
2440 for (Struct_field_list::const_iterator p = fields->begin();
2441 p != fields->end();
2442 ++p)
2443 {
2444 if (is_defined_elsewhere
2445 && Gogo::is_hidden_name(p->field_name()))
2446 continue;
2447 if (Type::traverse(p->type(), this) == TRAVERSE_EXIT)
2448 return TRAVERSE_EXIT;
2449 }
2450 }
2451
2452 return TRAVERSE_SKIP_COMPONENTS;
2453 }
2454
2455 case Type::TYPE_STRUCT:
2456 case Type::TYPE_ARRAY:
2457 if (t->needs_specific_type_functions(this->gogo_))
2458 t->type_functions(this->gogo_, NULL, NULL, NULL, &hash_fn, &equal_fn);
2459 break;
2460
2461 default:
2462 break;
2463 }
2464
2465 return TRAVERSE_CONTINUE;
2466 }
2467
2468 // Write out type specific functions.
2469
2470 void
2471 Gogo::write_specific_type_functions()
2472 {
2473 Specific_type_functions stf(this);
2474 this->traverse(&stf);
2475
2476 while (!this->specific_type_functions_.empty())
2477 {
2478 Specific_type_function* tsf = this->specific_type_functions_.back();
2479 this->specific_type_functions_.pop_back();
2480 tsf->type->write_specific_type_functions(this, tsf->name, tsf->size,
2481 tsf->hash_name,
2482 tsf->hash_fntype,
2483 tsf->equal_name,
2484 tsf->equal_fntype);
2485 delete tsf;
2486 }
2487 this->specific_type_functions_are_written_ = true;
2488 }
2489
2490 // Traverse the tree.
2491
2492 void
2493 Gogo::traverse(Traverse* traverse)
2494 {
2495 // Traverse the current package first for consistency. The other
2496 // packages will only contain imported types, constants, and
2497 // declarations.
2498 if (this->package_->bindings()->traverse(traverse, true) == TRAVERSE_EXIT)
2499 return;
2500 for (Packages::const_iterator p = this->packages_.begin();
2501 p != this->packages_.end();
2502 ++p)
2503 {
2504 if (p->second != this->package_)
2505 {
2506 if (p->second->bindings()->traverse(traverse, true) == TRAVERSE_EXIT)
2507 break;
2508 }
2509 }
2510 }
2511
2512 // Add a type to verify. This is used for types of sink variables, in
2513 // order to give appropriate error messages.
2514
2515 void
2516 Gogo::add_type_to_verify(Type* type)
2517 {
2518 this->verify_types_.push_back(type);
2519 }
2520
2521 // Traversal class used to verify types.
2522
2523 class Verify_types : public Traverse
2524 {
2525 public:
2526 Verify_types()
2527 : Traverse(traverse_types)
2528 { }
2529
2530 int
2531 type(Type*);
2532 };
2533
2534 // Verify that a type is correct.
2535
2536 int
2537 Verify_types::type(Type* t)
2538 {
2539 if (!t->verify())
2540 return TRAVERSE_SKIP_COMPONENTS;
2541 return TRAVERSE_CONTINUE;
2542 }
2543
2544 // Verify that all types are correct.
2545
2546 void
2547 Gogo::verify_types()
2548 {
2549 Verify_types traverse;
2550 this->traverse(&traverse);
2551
2552 for (std::vector<Type*>::iterator p = this->verify_types_.begin();
2553 p != this->verify_types_.end();
2554 ++p)
2555 (*p)->verify();
2556 this->verify_types_.clear();
2557 }
2558
2559 // Traversal class used to lower parse tree.
2560
2561 class Lower_parse_tree : public Traverse
2562 {
2563 public:
2564 Lower_parse_tree(Gogo* gogo, Named_object* function)
2565 : Traverse(traverse_variables
2566 | traverse_constants
2567 | traverse_functions
2568 | traverse_statements
2569 | traverse_expressions),
2570 gogo_(gogo), function_(function), iota_value_(-1), inserter_()
2571 { }
2572
2573 void
2574 set_inserter(const Statement_inserter* inserter)
2575 { this->inserter_ = *inserter; }
2576
2577 int
2578 variable(Named_object*);
2579
2580 int
2581 constant(Named_object*, bool);
2582
2583 int
2584 function(Named_object*);
2585
2586 int
2587 statement(Block*, size_t* pindex, Statement*);
2588
2589 int
2590 expression(Expression**);
2591
2592 private:
2593 // General IR.
2594 Gogo* gogo_;
2595 // The function we are traversing.
2596 Named_object* function_;
2597 // Value to use for the predeclared constant iota.
2598 int iota_value_;
2599 // Current statement inserter for use by expressions.
2600 Statement_inserter inserter_;
2601 };
2602
2603 // Lower variables.
2604
2605 int
2606 Lower_parse_tree::variable(Named_object* no)
2607 {
2608 if (!no->is_variable())
2609 return TRAVERSE_CONTINUE;
2610
2611 if (no->is_variable() && no->var_value()->is_global())
2612 {
2613 // Global variables can have loops in their initialization
2614 // expressions. This is handled in lower_init_expression.
2615 no->var_value()->lower_init_expression(this->gogo_, this->function_,
2616 &this->inserter_);
2617 return TRAVERSE_CONTINUE;
2618 }
2619
2620 // This is a local variable. We are going to return
2621 // TRAVERSE_SKIP_COMPONENTS here because we want to traverse the
2622 // initialization expression when we reach the variable declaration
2623 // statement. However, that means that we need to traverse the type
2624 // ourselves.
2625 if (no->var_value()->has_type())
2626 {
2627 Type* type = no->var_value()->type();
2628 if (type != NULL)
2629 {
2630 if (Type::traverse(type, this) == TRAVERSE_EXIT)
2631 return TRAVERSE_EXIT;
2632 }
2633 }
2634 go_assert(!no->var_value()->has_pre_init());
2635
2636 return TRAVERSE_SKIP_COMPONENTS;
2637 }
2638
2639 // Lower constants. We handle constants specially so that we can set
2640 // the right value for the predeclared constant iota. This works in
2641 // conjunction with the way we lower Const_expression objects.
2642
2643 int
2644 Lower_parse_tree::constant(Named_object* no, bool)
2645 {
2646 Named_constant* nc = no->const_value();
2647
2648 // Don't get into trouble if the constant's initializer expression
2649 // refers to the constant itself.
2650 if (nc->lowering())
2651 return TRAVERSE_CONTINUE;
2652 nc->set_lowering();
2653
2654 go_assert(this->iota_value_ == -1);
2655 this->iota_value_ = nc->iota_value();
2656 nc->traverse_expression(this);
2657 this->iota_value_ = -1;
2658
2659 nc->clear_lowering();
2660
2661 // We will traverse the expression a second time, but that will be
2662 // fast.
2663
2664 return TRAVERSE_CONTINUE;
2665 }
2666
2667 // Lower the body of a function, and set the closure type. Record the
2668 // function while lowering it, so that we can pass it down when
2669 // lowering an expression.
2670
2671 int
2672 Lower_parse_tree::function(Named_object* no)
2673 {
2674 no->func_value()->set_closure_type();
2675
2676 go_assert(this->function_ == NULL);
2677 this->function_ = no;
2678 int t = no->func_value()->traverse(this);
2679 this->function_ = NULL;
2680
2681 if (t == TRAVERSE_EXIT)
2682 return t;
2683 return TRAVERSE_SKIP_COMPONENTS;
2684 }
2685
2686 // Lower statement parse trees.
2687
2688 int
2689 Lower_parse_tree::statement(Block* block, size_t* pindex, Statement* sorig)
2690 {
2691 // Because we explicitly traverse the statement's contents
2692 // ourselves, we want to skip block statements here. There is
2693 // nothing to lower in a block statement.
2694 if (sorig->is_block_statement())
2695 return TRAVERSE_CONTINUE;
2696
2697 Statement_inserter hold_inserter(this->inserter_);
2698 this->inserter_ = Statement_inserter(block, pindex);
2699
2700 // Lower the expressions first.
2701 int t = sorig->traverse_contents(this);
2702 if (t == TRAVERSE_EXIT)
2703 {
2704 this->inserter_ = hold_inserter;
2705 return t;
2706 }
2707
2708 // Keep lowering until nothing changes.
2709 Statement* s = sorig;
2710 while (true)
2711 {
2712 Statement* snew = s->lower(this->gogo_, this->function_, block,
2713 &this->inserter_);
2714 if (snew == s)
2715 break;
2716 s = snew;
2717 t = s->traverse_contents(this);
2718 if (t == TRAVERSE_EXIT)
2719 {
2720 this->inserter_ = hold_inserter;
2721 return t;
2722 }
2723 }
2724
2725 if (s != sorig)
2726 block->replace_statement(*pindex, s);
2727
2728 this->inserter_ = hold_inserter;
2729 return TRAVERSE_SKIP_COMPONENTS;
2730 }
2731
2732 // Lower expression parse trees.
2733
2734 int
2735 Lower_parse_tree::expression(Expression** pexpr)
2736 {
2737 // We have to lower all subexpressions first, so that we can get
2738 // their type if necessary. This is awkward, because we don't have
2739 // a postorder traversal pass.
2740 if ((*pexpr)->traverse_subexpressions(this) == TRAVERSE_EXIT)
2741 return TRAVERSE_EXIT;
2742 // Keep lowering until nothing changes.
2743 while (true)
2744 {
2745 Expression* e = *pexpr;
2746 Expression* enew = e->lower(this->gogo_, this->function_,
2747 &this->inserter_, this->iota_value_);
2748 if (enew == e)
2749 break;
2750 if (enew->traverse_subexpressions(this) == TRAVERSE_EXIT)
2751 return TRAVERSE_EXIT;
2752 *pexpr = enew;
2753 }
2754 return TRAVERSE_SKIP_COMPONENTS;
2755 }
2756
2757 // Lower the parse tree. This is called after the parse is complete,
2758 // when all names should be resolved.
2759
2760 void
2761 Gogo::lower_parse_tree()
2762 {
2763 Lower_parse_tree lower_parse_tree(this, NULL);
2764 this->traverse(&lower_parse_tree);
2765
2766 // There might be type definitions that involve expressions such as the
2767 // array length. Make sure to lower these expressions as well. Otherwise,
2768 // errors hidden within a type can introduce unexpected errors into later
2769 // passes.
2770 for (std::vector<Type*>::iterator p = this->verify_types_.begin();
2771 p != this->verify_types_.end();
2772 ++p)
2773 Type::traverse(*p, &lower_parse_tree);
2774 }
2775
2776 // Lower a block.
2777
2778 void
2779 Gogo::lower_block(Named_object* function, Block* block)
2780 {
2781 Lower_parse_tree lower_parse_tree(this, function);
2782 block->traverse(&lower_parse_tree);
2783 }
2784
2785 // Lower an expression. INSERTER may be NULL, in which case the
2786 // expression had better not need to create any temporaries.
2787
2788 void
2789 Gogo::lower_expression(Named_object* function, Statement_inserter* inserter,
2790 Expression** pexpr)
2791 {
2792 Lower_parse_tree lower_parse_tree(this, function);
2793 if (inserter != NULL)
2794 lower_parse_tree.set_inserter(inserter);
2795 lower_parse_tree.expression(pexpr);
2796 }
2797
2798 // Lower a constant. This is called when lowering a reference to a
2799 // constant. We have to make sure that the constant has already been
2800 // lowered.
2801
2802 void
2803 Gogo::lower_constant(Named_object* no)
2804 {
2805 go_assert(no->is_const());
2806 Lower_parse_tree lower(this, NULL);
2807 lower.constant(no, false);
2808 }
2809
2810 // Traverse the tree to create function descriptors as needed.
2811
2812 class Create_function_descriptors : public Traverse
2813 {
2814 public:
2815 Create_function_descriptors(Gogo* gogo)
2816 : Traverse(traverse_functions | traverse_expressions),
2817 gogo_(gogo)
2818 { }
2819
2820 int
2821 function(Named_object*);
2822
2823 int
2824 expression(Expression**);
2825
2826 private:
2827 Gogo* gogo_;
2828 };
2829
2830 // Create a descriptor for every top-level exported function.
2831
2832 int
2833 Create_function_descriptors::function(Named_object* no)
2834 {
2835 if (no->is_function()
2836 && no->func_value()->enclosing() == NULL
2837 && !no->func_value()->is_method()
2838 && !Gogo::is_hidden_name(no->name())
2839 && !Gogo::is_thunk(no))
2840 no->func_value()->descriptor(this->gogo_, no);
2841
2842 return TRAVERSE_CONTINUE;
2843 }
2844
2845 // If we see a function referenced in any way other than calling it,
2846 // create a descriptor for it.
2847
2848 int
2849 Create_function_descriptors::expression(Expression** pexpr)
2850 {
2851 Expression* expr = *pexpr;
2852
2853 Func_expression* fe = expr->func_expression();
2854 if (fe != NULL)
2855 {
2856 // We would not get here for a call to this function, so this is
2857 // a reference to a function other than calling it. We need a
2858 // descriptor.
2859 if (fe->closure() != NULL)
2860 return TRAVERSE_CONTINUE;
2861 Named_object* no = fe->named_object();
2862 if (no->is_function() && !no->func_value()->is_method())
2863 no->func_value()->descriptor(this->gogo_, no);
2864 else if (no->is_function_declaration()
2865 && !no->func_declaration_value()->type()->is_method()
2866 && !Linemap::is_predeclared_location(no->location()))
2867 no->func_declaration_value()->descriptor(this->gogo_, no);
2868 return TRAVERSE_CONTINUE;
2869 }
2870
2871 Bound_method_expression* bme = expr->bound_method_expression();
2872 if (bme != NULL)
2873 {
2874 // We would not get here for a call to this method, so this is a
2875 // method value. We need to create a thunk.
2876 Bound_method_expression::create_thunk(this->gogo_, bme->method(),
2877 bme->function());
2878 return TRAVERSE_CONTINUE;
2879 }
2880
2881 Interface_field_reference_expression* ifre =
2882 expr->interface_field_reference_expression();
2883 if (ifre != NULL)
2884 {
2885 // We would not get here for a call to this interface method, so
2886 // this is a method value. We need to create a thunk.
2887 Interface_type* type = ifre->expr()->type()->interface_type();
2888 if (type != NULL)
2889 Interface_field_reference_expression::create_thunk(this->gogo_, type,
2890 ifre->name());
2891 return TRAVERSE_CONTINUE;
2892 }
2893
2894 Call_expression* ce = expr->call_expression();
2895 if (ce != NULL)
2896 {
2897 Expression* fn = ce->fn();
2898 if (fn->func_expression() != NULL
2899 || fn->bound_method_expression() != NULL
2900 || fn->interface_field_reference_expression() != NULL)
2901 {
2902 // Traverse the arguments but not the function.
2903 Expression_list* args = ce->args();
2904 if (args != NULL)
2905 {
2906 if (args->traverse(this) == TRAVERSE_EXIT)
2907 return TRAVERSE_EXIT;
2908 }
2909 return TRAVERSE_SKIP_COMPONENTS;
2910 }
2911 }
2912
2913 return TRAVERSE_CONTINUE;
2914 }
2915
2916 // Create function descriptors as needed. We need a function
2917 // descriptor for all exported functions and for all functions that
2918 // are referenced without being called.
2919
2920 void
2921 Gogo::create_function_descriptors()
2922 {
2923 // Create a function descriptor for any exported function that is
2924 // declared in this package. This is so that we have a descriptor
2925 // for functions written in assembly. Gather the descriptors first
2926 // so that we don't add declarations while looping over them.
2927 std::vector<Named_object*> fndecls;
2928 Bindings* b = this->package_->bindings();
2929 for (Bindings::const_declarations_iterator p = b->begin_declarations();
2930 p != b->end_declarations();
2931 ++p)
2932 {
2933 Named_object* no = p->second;
2934 if (no->is_function_declaration()
2935 && !no->func_declaration_value()->type()->is_method()
2936 && !Linemap::is_predeclared_location(no->location())
2937 && !Gogo::is_hidden_name(no->name()))
2938 fndecls.push_back(no);
2939 }
2940 for (std::vector<Named_object*>::const_iterator p = fndecls.begin();
2941 p != fndecls.end();
2942 ++p)
2943 (*p)->func_declaration_value()->descriptor(this, *p);
2944 fndecls.clear();
2945
2946 Create_function_descriptors cfd(this);
2947 this->traverse(&cfd);
2948 }
2949
2950 // Look for interface types to finalize methods of inherited
2951 // interfaces.
2952
2953 class Finalize_methods : public Traverse
2954 {
2955 public:
2956 Finalize_methods(Gogo* gogo)
2957 : Traverse(traverse_types),
2958 gogo_(gogo)
2959 { }
2960
2961 int
2962 type(Type*);
2963
2964 private:
2965 Gogo* gogo_;
2966 };
2967
2968 // Finalize the methods of an interface type.
2969
2970 int
2971 Finalize_methods::type(Type* t)
2972 {
2973 // Check the classification so that we don't finalize the methods
2974 // twice for a named interface type.
2975 switch (t->classification())
2976 {
2977 case Type::TYPE_INTERFACE:
2978 t->interface_type()->finalize_methods();
2979 break;
2980
2981 case Type::TYPE_NAMED:
2982 {
2983 Named_type* nt = t->named_type();
2984 Type* rt = nt->real_type();
2985 if (rt->classification() != Type::TYPE_STRUCT)
2986 {
2987 // Finalize the methods of the real type first.
2988 if (Type::traverse(rt, this) == TRAVERSE_EXIT)
2989 return TRAVERSE_EXIT;
2990
2991 // Finalize the methods of this type.
2992 nt->finalize_methods(this->gogo_);
2993 }
2994 else
2995 {
2996 // We don't want to finalize the methods of a named struct
2997 // type, as the methods should be attached to the named
2998 // type, not the struct type. We just want to finalize
2999 // the field types.
3000 //
3001 // It is possible that a field type refers indirectly to
3002 // this type, such as via a field with function type with
3003 // an argument or result whose type is this type. To
3004 // avoid the cycle, first finalize the methods of any
3005 // embedded types, which are the only types we need to
3006 // know to finalize the methods of this type.
3007 const Struct_field_list* fields = rt->struct_type()->fields();
3008 if (fields != NULL)
3009 {
3010 for (Struct_field_list::const_iterator pf = fields->begin();
3011 pf != fields->end();
3012 ++pf)
3013 {
3014 if (pf->is_anonymous())
3015 {
3016 if (Type::traverse(pf->type(), this) == TRAVERSE_EXIT)
3017 return TRAVERSE_EXIT;
3018 }
3019 }
3020 }
3021
3022 // Finalize the methods of this type.
3023 nt->finalize_methods(this->gogo_);
3024
3025 // Finalize all the struct fields.
3026 if (rt->struct_type()->traverse_field_types(this) == TRAVERSE_EXIT)
3027 return TRAVERSE_EXIT;
3028 }
3029
3030 // If this type is defined in a different package, then finalize the
3031 // types of all the methods, since we won't see them otherwise.
3032 if (nt->named_object()->package() != NULL && nt->has_any_methods())
3033 {
3034 const Methods* methods = nt->methods();
3035 for (Methods::const_iterator p = methods->begin();
3036 p != methods->end();
3037 ++p)
3038 {
3039 if (Type::traverse(p->second->type(), this) == TRAVERSE_EXIT)
3040 return TRAVERSE_EXIT;
3041 }
3042 }
3043
3044 // Finalize the types of all methods that are declared but not
3045 // defined, since we won't see the declarations otherwise.
3046 if (nt->named_object()->package() == NULL
3047 && nt->local_methods() != NULL)
3048 {
3049 const Bindings* methods = nt->local_methods();
3050 for (Bindings::const_declarations_iterator p =
3051 methods->begin_declarations();
3052 p != methods->end_declarations();
3053 p++)
3054 {
3055 if (p->second->is_function_declaration())
3056 {
3057 Type* mt = p->second->func_declaration_value()->type();
3058 if (Type::traverse(mt, this) == TRAVERSE_EXIT)
3059 return TRAVERSE_EXIT;
3060 }
3061 }
3062 }
3063
3064 return TRAVERSE_SKIP_COMPONENTS;
3065 }
3066
3067 case Type::TYPE_STRUCT:
3068 // Traverse the field types first in case there is an embedded
3069 // field with methods that the struct should inherit.
3070 if (t->struct_type()->traverse_field_types(this) == TRAVERSE_EXIT)
3071 return TRAVERSE_EXIT;
3072 t->struct_type()->finalize_methods(this->gogo_);
3073 return TRAVERSE_SKIP_COMPONENTS;
3074
3075 default:
3076 break;
3077 }
3078
3079 return TRAVERSE_CONTINUE;
3080 }
3081
3082 // Finalize method lists and build stub methods for types.
3083
3084 void
3085 Gogo::finalize_methods()
3086 {
3087 Finalize_methods finalize(this);
3088 this->traverse(&finalize);
3089 }
3090
3091 // Set types for unspecified variables and constants.
3092
3093 void
3094 Gogo::determine_types()
3095 {
3096 Bindings* bindings = this->current_bindings();
3097 for (Bindings::const_definitions_iterator p = bindings->begin_definitions();
3098 p != bindings->end_definitions();
3099 ++p)
3100 {
3101 if ((*p)->is_function())
3102 (*p)->func_value()->determine_types();
3103 else if ((*p)->is_variable())
3104 (*p)->var_value()->determine_type();
3105 else if ((*p)->is_const())
3106 (*p)->const_value()->determine_type();
3107
3108 // See if a variable requires us to build an initialization
3109 // function. We know that we will see all global variables
3110 // here.
3111 if (!this->need_init_fn_ && (*p)->is_variable())
3112 {
3113 Variable* variable = (*p)->var_value();
3114
3115 // If this is a global variable which requires runtime
3116 // initialization, we need an initialization function.
3117 if (!variable->is_global())
3118 ;
3119 else if (variable->init() == NULL)
3120 ;
3121 else if (variable->type()->interface_type() != NULL)
3122 this->need_init_fn_ = true;
3123 else if (variable->init()->is_constant())
3124 ;
3125 else if (!variable->init()->is_composite_literal())
3126 this->need_init_fn_ = true;
3127 else if (variable->init()->is_nonconstant_composite_literal())
3128 this->need_init_fn_ = true;
3129
3130 // If this is a global variable which holds a pointer value,
3131 // then we need an initialization function to register it as a
3132 // GC root.
3133 if (variable->is_global() && variable->type()->has_pointer())
3134 this->need_init_fn_ = true;
3135 }
3136 }
3137
3138 // Determine the types of constants in packages.
3139 for (Packages::const_iterator p = this->packages_.begin();
3140 p != this->packages_.end();
3141 ++p)
3142 p->second->determine_types();
3143 }
3144
3145 // Traversal class used for type checking.
3146
3147 class Check_types_traverse : public Traverse
3148 {
3149 public:
3150 Check_types_traverse(Gogo* gogo)
3151 : Traverse(traverse_variables
3152 | traverse_constants
3153 | traverse_functions
3154 | traverse_statements
3155 | traverse_expressions),
3156 gogo_(gogo)
3157 { }
3158
3159 int
3160 variable(Named_object*);
3161
3162 int
3163 constant(Named_object*, bool);
3164
3165 int
3166 function(Named_object*);
3167
3168 int
3169 statement(Block*, size_t* pindex, Statement*);
3170
3171 int
3172 expression(Expression**);
3173
3174 private:
3175 // General IR.
3176 Gogo* gogo_;
3177 };
3178
3179 // Check that a variable initializer has the right type.
3180
3181 int
3182 Check_types_traverse::variable(Named_object* named_object)
3183 {
3184 if (named_object->is_variable())
3185 {
3186 Variable* var = named_object->var_value();
3187
3188 // Give error if variable type is not defined.
3189 var->type()->base();
3190
3191 Expression* init = var->init();
3192 std::string reason;
3193 if (init != NULL
3194 && !Type::are_assignable(var->type(), init->type(), &reason))
3195 {
3196 if (reason.empty())
3197 go_error_at(var->location(), "incompatible type in initialization");
3198 else
3199 go_error_at(var->location(),
3200 "incompatible type in initialization (%s)",
3201 reason.c_str());
3202 init = Expression::make_error(named_object->location());
3203 var->clear_init();
3204 }
3205 else if (init != NULL
3206 && init->func_expression() != NULL)
3207 {
3208 Named_object* no = init->func_expression()->named_object();
3209 Function_type* fntype;
3210 if (no->is_function())
3211 fntype = no->func_value()->type();
3212 else if (no->is_function_declaration())
3213 fntype = no->func_declaration_value()->type();
3214 else
3215 go_unreachable();
3216
3217 // Builtin functions cannot be used as function values for variable
3218 // initialization.
3219 if (fntype->is_builtin())
3220 {
3221 go_error_at(init->location(),
3222 "invalid use of special builtin function %qs; "
3223 "must be called",
3224 no->message_name().c_str());
3225 }
3226 }
3227 if (!var->is_used()
3228 && !var->is_global()
3229 && !var->is_parameter()
3230 && !var->is_receiver()
3231 && !var->type()->is_error()
3232 && (init == NULL || !init->is_error_expression())
3233 && !Lex::is_invalid_identifier(named_object->name()))
3234 go_error_at(var->location(), "%qs declared and not used",
3235 named_object->message_name().c_str());
3236 }
3237 return TRAVERSE_CONTINUE;
3238 }
3239
3240 // Check that a constant initializer has the right type.
3241
3242 int
3243 Check_types_traverse::constant(Named_object* named_object, bool)
3244 {
3245 Named_constant* constant = named_object->const_value();
3246 Type* ctype = constant->type();
3247 if (ctype->integer_type() == NULL
3248 && ctype->float_type() == NULL
3249 && ctype->complex_type() == NULL
3250 && !ctype->is_boolean_type()
3251 && !ctype->is_string_type())
3252 {
3253 if (ctype->is_nil_type())
3254 go_error_at(constant->location(), "const initializer cannot be nil");
3255 else if (!ctype->is_error())
3256 go_error_at(constant->location(), "invalid constant type");
3257 constant->set_error();
3258 }
3259 else if (!constant->expr()->is_constant())
3260 {
3261 go_error_at(constant->expr()->location(), "expression is not constant");
3262 constant->set_error();
3263 }
3264 else if (!Type::are_assignable(constant->type(), constant->expr()->type(),
3265 NULL))
3266 {
3267 go_error_at(constant->location(),
3268 "initialization expression has wrong type");
3269 constant->set_error();
3270 }
3271 return TRAVERSE_CONTINUE;
3272 }
3273
3274 // There are no types to check in a function, but this is where we
3275 // issue warnings about labels which are defined but not referenced.
3276
3277 int
3278 Check_types_traverse::function(Named_object* no)
3279 {
3280 no->func_value()->check_labels();
3281 return TRAVERSE_CONTINUE;
3282 }
3283
3284 // Check that types are valid in a statement.
3285
3286 int
3287 Check_types_traverse::statement(Block*, size_t*, Statement* s)
3288 {
3289 s->check_types(this->gogo_);
3290 return TRAVERSE_CONTINUE;
3291 }
3292
3293 // Check that types are valid in an expression.
3294
3295 int
3296 Check_types_traverse::expression(Expression** expr)
3297 {
3298 (*expr)->check_types(this->gogo_);
3299 return TRAVERSE_CONTINUE;
3300 }
3301
3302 // Check that types are valid.
3303
3304 void
3305 Gogo::check_types()
3306 {
3307 Check_types_traverse traverse(this);
3308 this->traverse(&traverse);
3309
3310 Bindings* bindings = this->current_bindings();
3311 for (Bindings::const_declarations_iterator p = bindings->begin_declarations();
3312 p != bindings->end_declarations();
3313 ++p)
3314 {
3315 // Also check the types in a function declaration's signature.
3316 Named_object* no = p->second;
3317 if (no->is_function_declaration())
3318 no->func_declaration_value()->check_types();
3319 }
3320 }
3321
3322 // Check the types in a single block.
3323
3324 void
3325 Gogo::check_types_in_block(Block* block)
3326 {
3327 Check_types_traverse traverse(this);
3328 block->traverse(&traverse);
3329 }
3330
3331 // A traversal class used to find a single shortcut operator within an
3332 // expression.
3333
3334 class Find_shortcut : public Traverse
3335 {
3336 public:
3337 Find_shortcut()
3338 : Traverse(traverse_blocks
3339 | traverse_statements
3340 | traverse_expressions),
3341 found_(NULL)
3342 { }
3343
3344 // A pointer to the expression which was found, or NULL if none was
3345 // found.
3346 Expression**
3347 found() const
3348 { return this->found_; }
3349
3350 protected:
3351 int
3352 block(Block*)
3353 { return TRAVERSE_SKIP_COMPONENTS; }
3354
3355 int
3356 statement(Block*, size_t*, Statement*)
3357 { return TRAVERSE_SKIP_COMPONENTS; }
3358
3359 int
3360 expression(Expression**);
3361
3362 private:
3363 Expression** found_;
3364 };
3365
3366 // Find a shortcut expression.
3367
3368 int
3369 Find_shortcut::expression(Expression** pexpr)
3370 {
3371 Expression* expr = *pexpr;
3372 Binary_expression* be = expr->binary_expression();
3373 if (be == NULL)
3374 return TRAVERSE_CONTINUE;
3375 Operator op = be->op();
3376 if (op != OPERATOR_OROR && op != OPERATOR_ANDAND)
3377 return TRAVERSE_CONTINUE;
3378 go_assert(this->found_ == NULL);
3379 this->found_ = pexpr;
3380 return TRAVERSE_EXIT;
3381 }
3382
3383 // A traversal class used to turn shortcut operators into explicit if
3384 // statements.
3385
3386 class Shortcuts : public Traverse
3387 {
3388 public:
3389 Shortcuts(Gogo* gogo)
3390 : Traverse(traverse_variables
3391 | traverse_statements),
3392 gogo_(gogo)
3393 { }
3394
3395 protected:
3396 int
3397 variable(Named_object*);
3398
3399 int
3400 statement(Block*, size_t*, Statement*);
3401
3402 private:
3403 // Convert a shortcut operator.
3404 Statement*
3405 convert_shortcut(Block* enclosing, Expression** pshortcut);
3406
3407 // The IR.
3408 Gogo* gogo_;
3409 };
3410
3411 // Remove shortcut operators in a single statement.
3412
3413 int
3414 Shortcuts::statement(Block* block, size_t* pindex, Statement* s)
3415 {
3416 // FIXME: This approach doesn't work for switch statements, because
3417 // we add the new statements before the whole switch when we need to
3418 // instead add them just before the switch expression. The right
3419 // fix is probably to lower switch statements with nonconstant cases
3420 // to a series of conditionals.
3421 if (s->switch_statement() != NULL)
3422 return TRAVERSE_CONTINUE;
3423
3424 while (true)
3425 {
3426 Find_shortcut find_shortcut;
3427
3428 // If S is a variable declaration, then ordinary traversal won't
3429 // do anything. We want to explicitly traverse the
3430 // initialization expression if there is one.
3431 Variable_declaration_statement* vds = s->variable_declaration_statement();
3432 Expression* init = NULL;
3433 if (vds == NULL)
3434 s->traverse_contents(&find_shortcut);
3435 else
3436 {
3437 init = vds->var()->var_value()->init();
3438 if (init == NULL)
3439 return TRAVERSE_CONTINUE;
3440 init->traverse(&init, &find_shortcut);
3441 }
3442 Expression** pshortcut = find_shortcut.found();
3443 if (pshortcut == NULL)
3444 return TRAVERSE_CONTINUE;
3445
3446 Statement* snew = this->convert_shortcut(block, pshortcut);
3447 block->insert_statement_before(*pindex, snew);
3448 ++*pindex;
3449
3450 if (pshortcut == &init)
3451 vds->var()->var_value()->set_init(init);
3452 }
3453 }
3454
3455 // Remove shortcut operators in the initializer of a global variable.
3456
3457 int
3458 Shortcuts::variable(Named_object* no)
3459 {
3460 if (no->is_result_variable())
3461 return TRAVERSE_CONTINUE;
3462 Variable* var = no->var_value();
3463 Expression* init = var->init();
3464 if (!var->is_global() || init == NULL)
3465 return TRAVERSE_CONTINUE;
3466
3467 while (true)
3468 {
3469 Find_shortcut find_shortcut;
3470 init->traverse(&init, &find_shortcut);
3471 Expression** pshortcut = find_shortcut.found();
3472 if (pshortcut == NULL)
3473 return TRAVERSE_CONTINUE;
3474
3475 Statement* snew = this->convert_shortcut(NULL, pshortcut);
3476 var->add_preinit_statement(this->gogo_, snew);
3477 if (pshortcut == &init)
3478 var->set_init(init);
3479 }
3480 }
3481
3482 // Given an expression which uses a shortcut operator, return a
3483 // statement which implements it, and update *PSHORTCUT accordingly.
3484
3485 Statement*
3486 Shortcuts::convert_shortcut(Block* enclosing, Expression** pshortcut)
3487 {
3488 Binary_expression* shortcut = (*pshortcut)->binary_expression();
3489 Expression* left = shortcut->left();
3490 Expression* right = shortcut->right();
3491 Location loc = shortcut->location();
3492
3493 Block* retblock = new Block(enclosing, loc);
3494 retblock->set_end_location(loc);
3495
3496 Temporary_statement* ts = Statement::make_temporary(shortcut->type(),
3497 left, loc);
3498 retblock->add_statement(ts);
3499
3500 Block* block = new Block(retblock, loc);
3501 block->set_end_location(loc);
3502 Expression* tmpref = Expression::make_temporary_reference(ts, loc);
3503 Statement* assign = Statement::make_assignment(tmpref, right, loc);
3504 block->add_statement(assign);
3505
3506 Expression* cond = Expression::make_temporary_reference(ts, loc);
3507 if (shortcut->binary_expression()->op() == OPERATOR_OROR)
3508 cond = Expression::make_unary(OPERATOR_NOT, cond, loc);
3509
3510 Statement* if_statement = Statement::make_if_statement(cond, block, NULL,
3511 loc);
3512 retblock->add_statement(if_statement);
3513
3514 *pshortcut = Expression::make_temporary_reference(ts, loc);
3515
3516 delete shortcut;
3517
3518 // Now convert any shortcut operators in LEFT and RIGHT.
3519 Shortcuts shortcuts(this->gogo_);
3520 retblock->traverse(&shortcuts);
3521
3522 return Statement::make_block_statement(retblock, loc);
3523 }
3524
3525 // Turn shortcut operators into explicit if statements. Doing this
3526 // considerably simplifies the order of evaluation rules.
3527
3528 void
3529 Gogo::remove_shortcuts()
3530 {
3531 Shortcuts shortcuts(this);
3532 this->traverse(&shortcuts);
3533 }
3534
3535 // A traversal class which finds all the expressions which must be
3536 // evaluated in order within a statement or larger expression. This
3537 // is used to implement the rules about order of evaluation.
3538
3539 class Find_eval_ordering : public Traverse
3540 {
3541 private:
3542 typedef std::vector<Expression**> Expression_pointers;
3543
3544 public:
3545 Find_eval_ordering()
3546 : Traverse(traverse_blocks
3547 | traverse_statements
3548 | traverse_expressions),
3549 exprs_()
3550 { }
3551
3552 size_t
3553 size() const
3554 { return this->exprs_.size(); }
3555
3556 typedef Expression_pointers::const_iterator const_iterator;
3557
3558 const_iterator
3559 begin() const
3560 { return this->exprs_.begin(); }
3561
3562 const_iterator
3563 end() const
3564 { return this->exprs_.end(); }
3565
3566 protected:
3567 int
3568 block(Block*)
3569 { return TRAVERSE_SKIP_COMPONENTS; }
3570
3571 int
3572 statement(Block*, size_t*, Statement*)
3573 { return TRAVERSE_SKIP_COMPONENTS; }
3574
3575 int
3576 expression(Expression**);
3577
3578 private:
3579 // A list of pointers to expressions with side-effects.
3580 Expression_pointers exprs_;
3581 };
3582
3583 // If an expression must be evaluated in order, put it on the list.
3584
3585 int
3586 Find_eval_ordering::expression(Expression** expression_pointer)
3587 {
3588 // We have to look at subexpressions before this one.
3589 if ((*expression_pointer)->traverse_subexpressions(this) == TRAVERSE_EXIT)
3590 return TRAVERSE_EXIT;
3591 if ((*expression_pointer)->must_eval_in_order())
3592 this->exprs_.push_back(expression_pointer);
3593 return TRAVERSE_SKIP_COMPONENTS;
3594 }
3595
3596 // A traversal class for ordering evaluations.
3597
3598 class Order_eval : public Traverse
3599 {
3600 public:
3601 Order_eval(Gogo* gogo)
3602 : Traverse(traverse_variables
3603 | traverse_statements),
3604 gogo_(gogo)
3605 { }
3606
3607 int
3608 variable(Named_object*);
3609
3610 int
3611 statement(Block*, size_t*, Statement*);
3612
3613 private:
3614 // The IR.
3615 Gogo* gogo_;
3616 };
3617
3618 // Implement the order of evaluation rules for a statement.
3619
3620 int
3621 Order_eval::statement(Block* block, size_t* pindex, Statement* stmt)
3622 {
3623 // FIXME: This approach doesn't work for switch statements, because
3624 // we add the new statements before the whole switch when we need to
3625 // instead add them just before the switch expression. The right
3626 // fix is probably to lower switch statements with nonconstant cases
3627 // to a series of conditionals.
3628 if (stmt->switch_statement() != NULL)
3629 return TRAVERSE_CONTINUE;
3630
3631 Find_eval_ordering find_eval_ordering;
3632
3633 // If S is a variable declaration, then ordinary traversal won't do
3634 // anything. We want to explicitly traverse the initialization
3635 // expression if there is one.
3636 Variable_declaration_statement* vds = stmt->variable_declaration_statement();
3637 Expression* init = NULL;
3638 Expression* orig_init = NULL;
3639 if (vds == NULL)
3640 stmt->traverse_contents(&find_eval_ordering);
3641 else
3642 {
3643 init = vds->var()->var_value()->init();
3644 if (init == NULL)
3645 return TRAVERSE_CONTINUE;
3646 orig_init = init;
3647
3648 // It might seem that this could be
3649 // init->traverse_subexpressions. Unfortunately that can fail
3650 // in a case like
3651 // var err os.Error
3652 // newvar, err := call(arg())
3653 // Here newvar will have an init of call result 0 of
3654 // call(arg()). If we only traverse subexpressions, we will
3655 // only find arg(), and we won't bother to move anything out.
3656 // Then we get to the assignment to err, we will traverse the
3657 // whole statement, and this time we will find both call() and
3658 // arg(), and so we will move them out. This will cause them to
3659 // be put into temporary variables before the assignment to err
3660 // but after the declaration of newvar. To avoid that problem,
3661 // we traverse the entire expression here.
3662 Expression::traverse(&init, &find_eval_ordering);
3663 }
3664
3665 size_t c = find_eval_ordering.size();
3666 if (c == 0)
3667 return TRAVERSE_CONTINUE;
3668
3669 // If there is only one expression with a side-effect, we can
3670 // usually leave it in place.
3671 if (c == 1)
3672 {
3673 switch (stmt->classification())
3674 {
3675 case Statement::STATEMENT_ASSIGNMENT:
3676 // For an assignment statement, we need to evaluate an
3677 // expression on the right hand side before we evaluate any
3678 // index expression on the left hand side, so for that case
3679 // we always move the expression. Otherwise we mishandle
3680 // m[0] = len(m) where m is a map.
3681 break;
3682
3683 case Statement::STATEMENT_EXPRESSION:
3684 {
3685 // If this is a call statement that doesn't return any
3686 // values, it will not have been counted as a value to
3687 // move. We need to move any subexpressions in case they
3688 // are themselves call statements that require passing a
3689 // closure.
3690 Expression* expr = stmt->expression_statement()->expr();
3691 if (expr->call_expression() != NULL
3692 && expr->call_expression()->result_count() == 0)
3693 break;
3694 return TRAVERSE_CONTINUE;
3695 }
3696
3697 default:
3698 // We can leave the expression in place.
3699 return TRAVERSE_CONTINUE;
3700 }
3701 }
3702
3703 bool is_thunk = stmt->thunk_statement() != NULL;
3704 Expression_statement* es = stmt->expression_statement();
3705 for (Find_eval_ordering::const_iterator p = find_eval_ordering.begin();
3706 p != find_eval_ordering.end();
3707 ++p)
3708 {
3709 Expression** pexpr = *p;
3710
3711 // The last expression in a thunk will be the call passed to go
3712 // or defer, which we must not evaluate early.
3713 if (is_thunk && p + 1 == find_eval_ordering.end())
3714 break;
3715
3716 Location loc = (*pexpr)->location();
3717 Statement* s;
3718 if ((*pexpr)->call_expression() == NULL
3719 || (*pexpr)->call_expression()->result_count() < 2)
3720 {
3721 Temporary_statement* ts = Statement::make_temporary(NULL, *pexpr,
3722 loc);
3723 s = ts;
3724 *pexpr = Expression::make_temporary_reference(ts, loc);
3725 }
3726 else
3727 {
3728 // A call expression which returns multiple results needs to
3729 // be handled specially. We can't create a temporary
3730 // because there is no type to give it. Any actual uses of
3731 // the values will be done via Call_result_expressions.
3732 //
3733 // Since a given call expression can be shared by multiple
3734 // Call_result_expressions, avoid hoisting the call the
3735 // second time we see it here. In addition, don't try to
3736 // hoist the top-level multi-return call in the statement,
3737 // since doing this would result a tree with more than one copy
3738 // of the call.
3739 if (this->remember_expression(*pexpr))
3740 s = NULL;
3741 else if (es != NULL && *pexpr == es->expr())
3742 s = NULL;
3743 else
3744 s = Statement::make_statement(*pexpr, true);
3745 }
3746
3747 if (s != NULL)
3748 {
3749 block->insert_statement_before(*pindex, s);
3750 ++*pindex;
3751 }
3752 }
3753
3754 if (init != orig_init)
3755 vds->var()->var_value()->set_init(init);
3756
3757 return TRAVERSE_CONTINUE;
3758 }
3759
3760 // Implement the order of evaluation rules for the initializer of a
3761 // global variable.
3762
3763 int
3764 Order_eval::variable(Named_object* no)
3765 {
3766 if (no->is_result_variable())
3767 return TRAVERSE_CONTINUE;
3768 Variable* var = no->var_value();
3769 Expression* init = var->init();
3770 if (!var->is_global() || init == NULL)
3771 return TRAVERSE_CONTINUE;
3772
3773 Find_eval_ordering find_eval_ordering;
3774 Expression::traverse(&init, &find_eval_ordering);
3775
3776 if (find_eval_ordering.size() <= 1)
3777 {
3778 // If there is only one expression with a side-effect, we can
3779 // leave it in place.
3780 return TRAVERSE_SKIP_COMPONENTS;
3781 }
3782
3783 Expression* orig_init = init;
3784
3785 for (Find_eval_ordering::const_iterator p = find_eval_ordering.begin();
3786 p != find_eval_ordering.end();
3787 ++p)
3788 {
3789 Expression** pexpr = *p;
3790 Location loc = (*pexpr)->location();
3791 Statement* s;
3792 if ((*pexpr)->call_expression() == NULL
3793 || (*pexpr)->call_expression()->result_count() < 2)
3794 {
3795 Temporary_statement* ts = Statement::make_temporary(NULL, *pexpr,
3796 loc);
3797 s = ts;
3798 *pexpr = Expression::make_temporary_reference(ts, loc);
3799 }
3800 else
3801 {
3802 // A call expression which returns multiple results needs to
3803 // be handled specially.
3804 s = Statement::make_statement(*pexpr, true);
3805 }
3806 var->add_preinit_statement(this->gogo_, s);
3807 }
3808
3809 if (init != orig_init)
3810 var->set_init(init);
3811
3812 return TRAVERSE_SKIP_COMPONENTS;
3813 }
3814
3815 // Use temporary variables to implement the order of evaluation rules.
3816
3817 void
3818 Gogo::order_evaluations()
3819 {
3820 Order_eval order_eval(this);
3821 this->traverse(&order_eval);
3822 }
3823
3824 // Traversal to flatten parse tree after order of evaluation rules are applied.
3825
3826 class Flatten : public Traverse
3827 {
3828 public:
3829 Flatten(Gogo* gogo, Named_object* function)
3830 : Traverse(traverse_variables
3831 | traverse_functions
3832 | traverse_statements
3833 | traverse_expressions),
3834 gogo_(gogo), function_(function), inserter_()
3835 { }
3836
3837 void
3838 set_inserter(const Statement_inserter* inserter)
3839 { this->inserter_ = *inserter; }
3840
3841 int
3842 variable(Named_object*);
3843
3844 int
3845 function(Named_object*);
3846
3847 int
3848 statement(Block*, size_t* pindex, Statement*);
3849
3850 int
3851 expression(Expression**);
3852
3853 private:
3854 // General IR.
3855 Gogo* gogo_;
3856 // The function we are traversing.
3857 Named_object* function_;
3858 // Current statement inserter for use by expressions.
3859 Statement_inserter inserter_;
3860 };
3861
3862 // Flatten variables.
3863
3864 int
3865 Flatten::variable(Named_object* no)
3866 {
3867 if (!no->is_variable())
3868 return TRAVERSE_CONTINUE;
3869
3870 if (no->is_variable() && no->var_value()->is_global())
3871 {
3872 // Global variables can have loops in their initialization
3873 // expressions. This is handled in flatten_init_expression.
3874 no->var_value()->flatten_init_expression(this->gogo_, this->function_,
3875 &this->inserter_);
3876 return TRAVERSE_CONTINUE;
3877 }
3878
3879 if (!no->var_value()->is_parameter()
3880 && !no->var_value()->is_receiver()
3881 && !no->var_value()->is_closure()
3882 && no->var_value()->is_non_escaping_address_taken()
3883 && !no->var_value()->is_in_heap()
3884 && no->var_value()->toplevel_decl() == NULL)
3885 {
3886 // Local variable that has address taken but not escape.
3887 // It needs to be live beyond its lexical scope. So we
3888 // create a top-level declaration for it.
3889 // No need to do it if it is already in the top level.
3890 Block* top_block = function_->func_value()->block();
3891 if (top_block->bindings()->lookup_local(no->name()) != no)
3892 {
3893 Variable* var = no->var_value();
3894 Temporary_statement* ts =
3895 Statement::make_temporary(var->type(), NULL, var->location());
3896 ts->set_is_address_taken();
3897 top_block->add_statement_at_front(ts);
3898 var->set_toplevel_decl(ts);
3899 }
3900 }
3901
3902 go_assert(!no->var_value()->has_pre_init());
3903
3904 return TRAVERSE_SKIP_COMPONENTS;
3905 }
3906
3907 // Flatten the body of a function. Record the function while flattening it,
3908 // so that we can pass it down when flattening an expression.
3909
3910 int
3911 Flatten::function(Named_object* no)
3912 {
3913 go_assert(this->function_ == NULL);
3914 this->function_ = no;
3915 int t = no->func_value()->traverse(this);
3916 this->function_ = NULL;
3917
3918 if (t == TRAVERSE_EXIT)
3919 return t;
3920 return TRAVERSE_SKIP_COMPONENTS;
3921 }
3922
3923 // Flatten statement parse trees.
3924
3925 int
3926 Flatten::statement(Block* block, size_t* pindex, Statement* sorig)
3927 {
3928 // Because we explicitly traverse the statement's contents
3929 // ourselves, we want to skip block statements here. There is
3930 // nothing to flatten in a block statement.
3931 if (sorig->is_block_statement())
3932 return TRAVERSE_CONTINUE;
3933
3934 Statement_inserter hold_inserter(this->inserter_);
3935 this->inserter_ = Statement_inserter(block, pindex);
3936
3937 // Flatten the expressions first.
3938 int t = sorig->traverse_contents(this);
3939 if (t == TRAVERSE_EXIT)
3940 {
3941 this->inserter_ = hold_inserter;
3942 return t;
3943 }
3944
3945 // Keep flattening until nothing changes.
3946 Statement* s = sorig;
3947 while (true)
3948 {
3949 Statement* snew = s->flatten(this->gogo_, this->function_, block,
3950 &this->inserter_);
3951 if (snew == s)
3952 break;
3953 s = snew;
3954 t = s->traverse_contents(this);
3955 if (t == TRAVERSE_EXIT)
3956 {
3957 this->inserter_ = hold_inserter;
3958 return t;
3959 }
3960 }
3961
3962 if (s != sorig)
3963 block->replace_statement(*pindex, s);
3964
3965 this->inserter_ = hold_inserter;
3966 return TRAVERSE_SKIP_COMPONENTS;
3967 }
3968
3969 // Flatten expression parse trees.
3970
3971 int
3972 Flatten::expression(Expression** pexpr)
3973 {
3974 // Keep flattening until nothing changes.
3975 while (true)
3976 {
3977 Expression* e = *pexpr;
3978 if (e->traverse_subexpressions(this) == TRAVERSE_EXIT)
3979 return TRAVERSE_EXIT;
3980
3981 Expression* enew = e->flatten(this->gogo_, this->function_,
3982 &this->inserter_);
3983 if (enew == e)
3984 break;
3985 *pexpr = enew;
3986 }
3987 return TRAVERSE_SKIP_COMPONENTS;
3988 }
3989
3990 // Flatten a block.
3991
3992 void
3993 Gogo::flatten_block(Named_object* function, Block* block)
3994 {
3995 Flatten flatten(this, function);
3996 block->traverse(&flatten);
3997 }
3998
3999 // Flatten an expression. INSERTER may be NULL, in which case the
4000 // expression had better not need to create any temporaries.
4001
4002 void
4003 Gogo::flatten_expression(Named_object* function, Statement_inserter* inserter,
4004 Expression** pexpr)
4005 {
4006 Flatten flatten(this, function);
4007 if (inserter != NULL)
4008 flatten.set_inserter(inserter);
4009 flatten.expression(pexpr);
4010 }
4011
4012 void
4013 Gogo::flatten()
4014 {
4015 Flatten flatten(this, NULL);
4016 this->traverse(&flatten);
4017 }
4018
4019 // Traversal to convert calls to the predeclared recover function to
4020 // pass in an argument indicating whether it can recover from a panic
4021 // or not.
4022
4023 class Convert_recover : public Traverse
4024 {
4025 public:
4026 Convert_recover(Named_object* arg)
4027 : Traverse(traverse_expressions),
4028 arg_(arg)
4029 { }
4030
4031 protected:
4032 int
4033 expression(Expression**);
4034
4035 private:
4036 // The argument to pass to the function.
4037 Named_object* arg_;
4038 };
4039
4040 // Convert calls to recover.
4041
4042 int
4043 Convert_recover::expression(Expression** pp)
4044 {
4045 Call_expression* ce = (*pp)->call_expression();
4046 if (ce != NULL && ce->is_recover_call())
4047 ce->set_recover_arg(Expression::make_var_reference(this->arg_,
4048 ce->location()));
4049 return TRAVERSE_CONTINUE;
4050 }
4051
4052 // Traversal for build_recover_thunks.
4053
4054 class Build_recover_thunks : public Traverse
4055 {
4056 public:
4057 Build_recover_thunks(Gogo* gogo)
4058 : Traverse(traverse_functions),
4059 gogo_(gogo)
4060 { }
4061
4062 int
4063 function(Named_object*);
4064
4065 private:
4066 Expression*
4067 can_recover_arg(Location);
4068
4069 // General IR.
4070 Gogo* gogo_;
4071 };
4072
4073 // If this function calls recover, turn it into a thunk.
4074
4075 int
4076 Build_recover_thunks::function(Named_object* orig_no)
4077 {
4078 Function* orig_func = orig_no->func_value();
4079 if (!orig_func->calls_recover()
4080 || orig_func->is_recover_thunk()
4081 || orig_func->has_recover_thunk())
4082 return TRAVERSE_CONTINUE;
4083
4084 Gogo* gogo = this->gogo_;
4085 Location location = orig_func->location();
4086
4087 static int count;
4088 char buf[50];
4089
4090 Function_type* orig_fntype = orig_func->type();
4091 Typed_identifier_list* new_params = new Typed_identifier_list();
4092 std::string receiver_name;
4093 if (orig_fntype->is_method())
4094 {
4095 const Typed_identifier* receiver = orig_fntype->receiver();
4096 snprintf(buf, sizeof buf, "rt.%u", count);
4097 ++count;
4098 receiver_name = buf;
4099 new_params->push_back(Typed_identifier(receiver_name, receiver->type(),
4100 receiver->location()));
4101 }
4102 const Typed_identifier_list* orig_params = orig_fntype->parameters();
4103 if (orig_params != NULL && !orig_params->empty())
4104 {
4105 for (Typed_identifier_list::const_iterator p = orig_params->begin();
4106 p != orig_params->end();
4107 ++p)
4108 {
4109 snprintf(buf, sizeof buf, "pt.%u", count);
4110 ++count;
4111 new_params->push_back(Typed_identifier(buf, p->type(),
4112 p->location()));
4113 }
4114 }
4115 snprintf(buf, sizeof buf, "pr.%u", count);
4116 ++count;
4117 std::string can_recover_name = buf;
4118 new_params->push_back(Typed_identifier(can_recover_name,
4119 Type::lookup_bool_type(),
4120 orig_fntype->location()));
4121
4122 const Typed_identifier_list* orig_results = orig_fntype->results();
4123 Typed_identifier_list* new_results;
4124 if (orig_results == NULL || orig_results->empty())
4125 new_results = NULL;
4126 else
4127 {
4128 new_results = new Typed_identifier_list();
4129 for (Typed_identifier_list::const_iterator p = orig_results->begin();
4130 p != orig_results->end();
4131 ++p)
4132 new_results->push_back(Typed_identifier("", p->type(), p->location()));
4133 }
4134
4135 Function_type *new_fntype = Type::make_function_type(NULL, new_params,
4136 new_results,
4137 orig_fntype->location());
4138 if (orig_fntype->is_varargs())
4139 new_fntype->set_is_varargs();
4140
4141 Type* rtype = NULL;
4142 if (orig_fntype->is_method())
4143 rtype = orig_fntype->receiver()->type();
4144 std::string name(gogo->recover_thunk_name(orig_no->name(), rtype));
4145 Named_object *new_no = gogo->start_function(name, new_fntype, false,
4146 location);
4147 Function *new_func = new_no->func_value();
4148 if (orig_func->enclosing() != NULL)
4149 new_func->set_enclosing(orig_func->enclosing());
4150
4151 // We build the code for the original function attached to the new
4152 // function, and then swap the original and new function bodies.
4153 // This means that existing references to the original function will
4154 // then refer to the new function. That makes this code a little
4155 // confusing, in that the reference to NEW_NO really refers to the
4156 // other function, not the one we are building.
4157
4158 Expression* closure = NULL;
4159 if (orig_func->needs_closure())
4160 {
4161 // For the new function we are creating, declare a new parameter
4162 // variable NEW_CLOSURE_NO and set it to be the closure variable
4163 // of the function. This will be set to the closure value
4164 // passed in by the caller. Then pass a reference to this
4165 // variable as the closure value when calling the original
4166 // function. In other words, simply pass the closure value
4167 // through the thunk we are creating.
4168 Named_object* orig_closure_no = orig_func->closure_var();
4169 Variable* orig_closure_var = orig_closure_no->var_value();
4170 Variable* new_var = new Variable(orig_closure_var->type(), NULL, false,
4171 false, false, location);
4172 new_var->set_is_closure();
4173 snprintf(buf, sizeof buf, "closure.%u", count);
4174 ++count;
4175 Named_object* new_closure_no = Named_object::make_variable(buf, NULL,
4176 new_var);
4177 new_func->set_closure_var(new_closure_no);
4178 closure = Expression::make_var_reference(new_closure_no, location);
4179 }
4180
4181 Expression* fn = Expression::make_func_reference(new_no, closure, location);
4182
4183 Expression_list* args = new Expression_list();
4184 if (new_params != NULL)
4185 {
4186 // Note that we skip the last parameter, which is the boolean
4187 // indicating whether recover can succed.
4188 for (Typed_identifier_list::const_iterator p = new_params->begin();
4189 p + 1 != new_params->end();
4190 ++p)
4191 {
4192 Named_object* p_no = gogo->lookup(p->name(), NULL);
4193 go_assert(p_no != NULL
4194 && p_no->is_variable()
4195 && p_no->var_value()->is_parameter());
4196 args->push_back(Expression::make_var_reference(p_no, location));
4197 }
4198 }
4199 args->push_back(this->can_recover_arg(location));
4200
4201 gogo->start_block(location);
4202
4203 Call_expression* call = Expression::make_call(fn, args, false, location);
4204
4205 // Any varargs call has already been lowered.
4206 call->set_varargs_are_lowered();
4207
4208 Statement* s = Statement::make_return_from_call(call, location);
4209 s->determine_types();
4210 gogo->add_statement(s);
4211
4212 Block* b = gogo->finish_block(location);
4213
4214 gogo->add_block(b, location);
4215
4216 // Lower the call in case it returns multiple results.
4217 gogo->lower_block(new_no, b);
4218
4219 gogo->finish_function(location);
4220
4221 // Swap the function bodies and types.
4222 new_func->swap_for_recover(orig_func);
4223 orig_func->set_is_recover_thunk();
4224 new_func->set_calls_recover();
4225 new_func->set_has_recover_thunk();
4226
4227 Bindings* orig_bindings = orig_func->block()->bindings();
4228 Bindings* new_bindings = new_func->block()->bindings();
4229 if (orig_fntype->is_method())
4230 {
4231 // We changed the receiver to be a regular parameter. We have
4232 // to update the binding accordingly in both functions.
4233 Named_object* orig_rec_no = orig_bindings->lookup_local(receiver_name);
4234 go_assert(orig_rec_no != NULL
4235 && orig_rec_no->is_variable()
4236 && !orig_rec_no->var_value()->is_receiver());
4237 orig_rec_no->var_value()->set_is_receiver();
4238
4239 std::string new_receiver_name(orig_fntype->receiver()->name());
4240 if (new_receiver_name.empty())
4241 {
4242 // Find the receiver. It was named "r.NNN" in
4243 // Gogo::start_function.
4244 for (Bindings::const_definitions_iterator p =
4245 new_bindings->begin_definitions();
4246 p != new_bindings->end_definitions();
4247 ++p)
4248 {
4249 const std::string& pname((*p)->name());
4250 if (pname[0] == 'r' && pname[1] == '.')
4251 {
4252 new_receiver_name = pname;
4253 break;
4254 }
4255 }
4256 go_assert(!new_receiver_name.empty());
4257 }
4258 Named_object* new_rec_no = new_bindings->lookup_local(new_receiver_name);
4259 if (new_rec_no == NULL)
4260 go_assert(saw_errors());
4261 else
4262 {
4263 go_assert(new_rec_no->is_variable()
4264 && new_rec_no->var_value()->is_receiver());
4265 new_rec_no->var_value()->set_is_not_receiver();
4266 }
4267 }
4268
4269 // Because we flipped blocks but not types, the can_recover
4270 // parameter appears in the (now) old bindings as a parameter.
4271 // Change it to a local variable, whereupon it will be discarded.
4272 Named_object* can_recover_no = orig_bindings->lookup_local(can_recover_name);
4273 go_assert(can_recover_no != NULL
4274 && can_recover_no->is_variable()
4275 && can_recover_no->var_value()->is_parameter());
4276 orig_bindings->remove_binding(can_recover_no);
4277
4278 // Add the can_recover argument to the (now) new bindings, and
4279 // attach it to any recover statements.
4280 Variable* can_recover_var = new Variable(Type::lookup_bool_type(), NULL,
4281 false, true, false, location);
4282 can_recover_no = new_bindings->add_variable(can_recover_name, NULL,
4283 can_recover_var);
4284 Convert_recover convert_recover(can_recover_no);
4285 new_func->traverse(&convert_recover);
4286
4287 // Update the function pointers in any named results.
4288 new_func->update_result_variables();
4289 orig_func->update_result_variables();
4290
4291 return TRAVERSE_CONTINUE;
4292 }
4293
4294 // Return the expression to pass for the .can_recover parameter to the
4295 // new function. This indicates whether a call to recover may return
4296 // non-nil. The expression is runtime.canrecover(__builtin_return_address()).
4297
4298 Expression*
4299 Build_recover_thunks::can_recover_arg(Location location)
4300 {
4301 static Named_object* builtin_return_address;
4302 if (builtin_return_address == NULL)
4303 builtin_return_address =
4304 Gogo::declare_builtin_rf_address("__builtin_return_address");
4305
4306 static Named_object* can_recover;
4307 if (can_recover == NULL)
4308 {
4309 const Location bloc = Linemap::predeclared_location();
4310 Typed_identifier_list* param_types = new Typed_identifier_list();
4311 Type* voidptr_type = Type::make_pointer_type(Type::make_void_type());
4312 param_types->push_back(Typed_identifier("a", voidptr_type, bloc));
4313 Type* boolean_type = Type::lookup_bool_type();
4314 Typed_identifier_list* results = new Typed_identifier_list();
4315 results->push_back(Typed_identifier("", boolean_type, bloc));
4316 Function_type* fntype = Type::make_function_type(NULL, param_types,
4317 results, bloc);
4318 can_recover =
4319 Named_object::make_function_declaration("runtime_canrecover",
4320 NULL, fntype, bloc);
4321 can_recover->func_declaration_value()->set_asm_name("runtime.canrecover");
4322 }
4323
4324 Expression* fn = Expression::make_func_reference(builtin_return_address,
4325 NULL, location);
4326
4327 Expression* zexpr = Expression::make_integer_ul(0, NULL, location);
4328 Expression_list *args = new Expression_list();
4329 args->push_back(zexpr);
4330
4331 Expression* call = Expression::make_call(fn, args, false, location);
4332
4333 args = new Expression_list();
4334 args->push_back(call);
4335
4336 fn = Expression::make_func_reference(can_recover, NULL, location);
4337 return Expression::make_call(fn, args, false, location);
4338 }
4339
4340 // Build thunks for functions which call recover. We build a new
4341 // function with an extra parameter, which is whether a call to
4342 // recover can succeed. We then move the body of this function to
4343 // that one. We then turn this function into a thunk which calls the
4344 // new one, passing the value of runtime.canrecover(__builtin_return_address()).
4345 // The function will be marked as not splitting the stack. This will
4346 // cooperate with the implementation of defer to make recover do the
4347 // right thing.
4348
4349 void
4350 Gogo::build_recover_thunks()
4351 {
4352 Build_recover_thunks build_recover_thunks(this);
4353 this->traverse(&build_recover_thunks);
4354 }
4355
4356 // Return a declaration for __builtin_return_address or
4357 // __builtin_frame_address.
4358
4359 Named_object*
4360 Gogo::declare_builtin_rf_address(const char* name)
4361 {
4362 const Location bloc = Linemap::predeclared_location();
4363
4364 Typed_identifier_list* param_types = new Typed_identifier_list();
4365 Type* uint32_type = Type::lookup_integer_type("uint32");
4366 param_types->push_back(Typed_identifier("l", uint32_type, bloc));
4367
4368 Typed_identifier_list* return_types = new Typed_identifier_list();
4369 Type* voidptr_type = Type::make_pointer_type(Type::make_void_type());
4370 return_types->push_back(Typed_identifier("", voidptr_type, bloc));
4371
4372 Function_type* fntype = Type::make_function_type(NULL, param_types,
4373 return_types, bloc);
4374 Named_object* ret = Named_object::make_function_declaration(name, NULL,
4375 fntype, bloc);
4376 ret->func_declaration_value()->set_asm_name(name);
4377 return ret;
4378 }
4379
4380 // Build a call to the runtime error function.
4381
4382 Expression*
4383 Gogo::runtime_error(int code, Location location)
4384 {
4385 Type* int32_type = Type::lookup_integer_type("int32");
4386 Expression* code_expr = Expression::make_integer_ul(code, int32_type,
4387 location);
4388 return Runtime::make_call(Runtime::RUNTIME_ERROR, location, 1, code_expr);
4389 }
4390
4391 // Look for named types to see whether we need to create an interface
4392 // method table.
4393
4394 class Build_method_tables : public Traverse
4395 {
4396 public:
4397 Build_method_tables(Gogo* gogo,
4398 const std::vector<Interface_type*>& interfaces)
4399 : Traverse(traverse_types),
4400 gogo_(gogo), interfaces_(interfaces)
4401 { }
4402
4403 int
4404 type(Type*);
4405
4406 private:
4407 // The IR.
4408 Gogo* gogo_;
4409 // A list of locally defined interfaces which have hidden methods.
4410 const std::vector<Interface_type*>& interfaces_;
4411 };
4412
4413 // Build all required interface method tables for types. We need to
4414 // ensure that we have an interface method table for every interface
4415 // which has a hidden method, for every named type which implements
4416 // that interface. Normally we can just build interface method tables
4417 // as we need them. However, in some cases we can require an
4418 // interface method table for an interface defined in a different
4419 // package for a type defined in that package. If that interface and
4420 // type both use a hidden method, that is OK. However, we will not be
4421 // able to build that interface method table when we need it, because
4422 // the type's hidden method will be static. So we have to build it
4423 // here, and just refer it from other packages as needed.
4424
4425 void
4426 Gogo::build_interface_method_tables()
4427 {
4428 if (saw_errors())
4429 return;
4430
4431 std::vector<Interface_type*> hidden_interfaces;
4432 hidden_interfaces.reserve(this->interface_types_.size());
4433 for (std::vector<Interface_type*>::const_iterator pi =
4434 this->interface_types_.begin();
4435 pi != this->interface_types_.end();
4436 ++pi)
4437 {
4438 const Typed_identifier_list* methods = (*pi)->methods();
4439 if (methods == NULL)
4440 continue;
4441 for (Typed_identifier_list::const_iterator pm = methods->begin();
4442 pm != methods->end();
4443 ++pm)
4444 {
4445 if (Gogo::is_hidden_name(pm->name()))
4446 {
4447 hidden_interfaces.push_back(*pi);
4448 break;
4449 }
4450 }
4451 }
4452
4453 if (!hidden_interfaces.empty())
4454 {
4455 // Now traverse the tree looking for all named types.
4456 Build_method_tables bmt(this, hidden_interfaces);
4457 this->traverse(&bmt);
4458 }
4459
4460 // We no longer need the list of interfaces.
4461
4462 this->interface_types_.clear();
4463 }
4464
4465 // This is called for each type. For a named type, for each of the
4466 // interfaces with hidden methods that it implements, create the
4467 // method table.
4468
4469 int
4470 Build_method_tables::type(Type* type)
4471 {
4472 Named_type* nt = type->named_type();
4473 Struct_type* st = type->struct_type();
4474 if (nt != NULL || st != NULL)
4475 {
4476 Translate_context context(this->gogo_, NULL, NULL, NULL);
4477 for (std::vector<Interface_type*>::const_iterator p =
4478 this->interfaces_.begin();
4479 p != this->interfaces_.end();
4480 ++p)
4481 {
4482 // We ask whether a pointer to the named type implements the
4483 // interface, because a pointer can implement more methods
4484 // than a value.
4485 if (nt != NULL)
4486 {
4487 if ((*p)->implements_interface(Type::make_pointer_type(nt),
4488 NULL))
4489 {
4490 nt->interface_method_table(*p, false)->get_backend(&context);
4491 nt->interface_method_table(*p, true)->get_backend(&context);
4492 }
4493 }
4494 else
4495 {
4496 if ((*p)->implements_interface(Type::make_pointer_type(st),
4497 NULL))
4498 {
4499 st->interface_method_table(*p, false)->get_backend(&context);
4500 st->interface_method_table(*p, true)->get_backend(&context);
4501 }
4502 }
4503 }
4504 }
4505 return TRAVERSE_CONTINUE;
4506 }
4507
4508 // Return an expression which allocates memory to hold values of type TYPE.
4509
4510 Expression*
4511 Gogo::allocate_memory(Type* type, Location location)
4512 {
4513 Expression* td = Expression::make_type_descriptor(type, location);
4514 return Runtime::make_call(Runtime::NEW, location, 1, td);
4515 }
4516
4517 // Traversal class used to check for return statements.
4518
4519 class Check_return_statements_traverse : public Traverse
4520 {
4521 public:
4522 Check_return_statements_traverse()
4523 : Traverse(traverse_functions)
4524 { }
4525
4526 int
4527 function(Named_object*);
4528 };
4529
4530 // Check that a function has a return statement if it needs one.
4531
4532 int
4533 Check_return_statements_traverse::function(Named_object* no)
4534 {
4535 Function* func = no->func_value();
4536 const Function_type* fntype = func->type();
4537 const Typed_identifier_list* results = fntype->results();
4538
4539 // We only need a return statement if there is a return value.
4540 if (results == NULL || results->empty())
4541 return TRAVERSE_CONTINUE;
4542
4543 if (func->block()->may_fall_through())
4544 go_error_at(func->block()->end_location(),
4545 "missing return at end of function");
4546
4547 return TRAVERSE_CONTINUE;
4548 }
4549
4550 // Check return statements.
4551
4552 void
4553 Gogo::check_return_statements()
4554 {
4555 Check_return_statements_traverse traverse;
4556 this->traverse(&traverse);
4557 }
4558
4559 // Export identifiers as requested.
4560
4561 void
4562 Gogo::do_exports()
4563 {
4564 // For now we always stream to a section. Later we may want to
4565 // support streaming to a separate file.
4566 Stream_to_section stream(this->backend());
4567
4568 // Write out either the prefix or pkgpath depending on how we were
4569 // invoked.
4570 std::string prefix;
4571 std::string pkgpath;
4572 if (this->pkgpath_from_option_)
4573 pkgpath = this->pkgpath_;
4574 else if (this->prefix_from_option_)
4575 prefix = this->prefix_;
4576 else if (this->is_main_package())
4577 pkgpath = "main";
4578 else
4579 prefix = "go";
4580
4581 Export exp(&stream);
4582 exp.register_builtin_types(this);
4583 exp.export_globals(this->package_name(),
4584 prefix,
4585 pkgpath,
4586 this->packages_,
4587 this->imports_,
4588 (this->need_init_fn_ && !this->is_main_package()
4589 ? this->get_init_fn_name()
4590 : ""),
4591 this->imported_init_fns_,
4592 this->package_->bindings());
4593
4594 if (!this->c_header_.empty() && !saw_errors())
4595 this->write_c_header();
4596 }
4597
4598 // Write the top level named struct types in C format to a C header
4599 // file. This is used when building the runtime package, to share
4600 // struct definitions between C and Go.
4601
4602 void
4603 Gogo::write_c_header()
4604 {
4605 std::ofstream out;
4606 out.open(this->c_header_.c_str());
4607 if (out.fail())
4608 {
4609 go_error_at(Linemap::unknown_location(),
4610 "cannot open %s: %m", this->c_header_.c_str());
4611 return;
4612 }
4613
4614 std::list<Named_object*> types;
4615 Bindings* top = this->package_->bindings();
4616 for (Bindings::const_definitions_iterator p = top->begin_definitions();
4617 p != top->end_definitions();
4618 ++p)
4619 {
4620 Named_object* no = *p;
4621
4622 // Skip names that start with underscore followed by something
4623 // other than an uppercase letter, as when compiling the runtime
4624 // package they are mostly types defined by mkrsysinfo.sh based
4625 // on the C system header files. We don't need to translate
4626 // types to C and back to Go. But do accept the special cases
4627 // _defer and _panic.
4628 std::string name = Gogo::unpack_hidden_name(no->name());
4629 if (name[0] == '_'
4630 && (name[1] < 'A' || name[1] > 'Z')
4631 && (name != "_defer" && name != "_panic"))
4632 continue;
4633
4634 if (no->is_type() && no->type_value()->struct_type() != NULL)
4635 types.push_back(no);
4636 if (no->is_const() && no->const_value()->type()->integer_type() != NULL)
4637 {
4638 Numeric_constant nc;
4639 unsigned long val;
4640 if (no->const_value()->expr()->numeric_constant_value(&nc)
4641 && nc.to_unsigned_long(&val) == Numeric_constant::NC_UL_VALID)
4642 {
4643 out << "#define " << no->message_name() << ' ' << val
4644 << std::endl;
4645 }
4646 }
4647 }
4648
4649 std::vector<const Named_object*> written;
4650 int loop = 0;
4651 while (!types.empty())
4652 {
4653 Named_object* no = types.front();
4654 types.pop_front();
4655
4656 std::vector<const Named_object*> requires;
4657 std::vector<const Named_object*> declare;
4658 if (!no->type_value()->struct_type()->can_write_to_c_header(&requires,
4659 &declare))
4660 continue;
4661
4662 bool ok = true;
4663 for (std::vector<const Named_object*>::const_iterator pr
4664 = requires.begin();
4665 pr != requires.end() && ok;
4666 ++pr)
4667 {
4668 for (std::list<Named_object*>::const_iterator pt = types.begin();
4669 pt != types.end() && ok;
4670 ++pt)
4671 if (*pr == *pt)
4672 ok = false;
4673 }
4674 if (!ok)
4675 {
4676 ++loop;
4677 if (loop > 10000)
4678 {
4679 // This should be impossible since the code parsed and
4680 // type checked.
4681 go_unreachable();
4682 }
4683
4684 types.push_back(no);
4685 continue;
4686 }
4687
4688 for (std::vector<const Named_object*>::const_iterator pd
4689 = declare.begin();
4690 pd != declare.end();
4691 ++pd)
4692 {
4693 if (*pd == no)
4694 continue;
4695
4696 std::vector<const Named_object*> drequires;
4697 std::vector<const Named_object*> ddeclare;
4698 if (!(*pd)->type_value()->struct_type()->
4699 can_write_to_c_header(&drequires, &ddeclare))
4700 continue;
4701
4702 bool done = false;
4703 for (std::vector<const Named_object*>::const_iterator pw
4704 = written.begin();
4705 pw != written.end();
4706 ++pw)
4707 {
4708 if (*pw == *pd)
4709 {
4710 done = true;
4711 break;
4712 }
4713 }
4714 if (!done)
4715 {
4716 out << std::endl;
4717 out << "struct " << (*pd)->message_name() << ";" << std::endl;
4718 written.push_back(*pd);
4719 }
4720 }
4721
4722 out << std::endl;
4723 out << "struct " << no->message_name() << " {" << std::endl;
4724 no->type_value()->struct_type()->write_to_c_header(out);
4725 out << "};" << std::endl;
4726 written.push_back(no);
4727 }
4728
4729 out.close();
4730 if (out.fail())
4731 go_error_at(Linemap::unknown_location(),
4732 "error writing to %s: %m", this->c_header_.c_str());
4733 }
4734
4735 // Find the blocks in order to convert named types defined in blocks.
4736
4737 class Convert_named_types : public Traverse
4738 {
4739 public:
4740 Convert_named_types(Gogo* gogo)
4741 : Traverse(traverse_blocks),
4742 gogo_(gogo)
4743 { }
4744
4745 protected:
4746 int
4747 block(Block* block);
4748
4749 private:
4750 Gogo* gogo_;
4751 };
4752
4753 int
4754 Convert_named_types::block(Block* block)
4755 {
4756 this->gogo_->convert_named_types_in_bindings(block->bindings());
4757 return TRAVERSE_CONTINUE;
4758 }
4759
4760 // Convert all named types to the backend representation. Since named
4761 // types can refer to other types, this needs to be done in the right
4762 // sequence, which is handled by Named_type::convert. Here we arrange
4763 // to call that for each named type.
4764
4765 void
4766 Gogo::convert_named_types()
4767 {
4768 this->convert_named_types_in_bindings(this->globals_);
4769 for (Packages::iterator p = this->packages_.begin();
4770 p != this->packages_.end();
4771 ++p)
4772 {
4773 Package* package = p->second;
4774 this->convert_named_types_in_bindings(package->bindings());
4775 }
4776
4777 Convert_named_types cnt(this);
4778 this->traverse(&cnt);
4779
4780 // Make all the builtin named types used for type descriptors, and
4781 // then convert them. They will only be written out if they are
4782 // needed.
4783 Type::make_type_descriptor_type();
4784 Type::make_type_descriptor_ptr_type();
4785 Function_type::make_function_type_descriptor_type();
4786 Pointer_type::make_pointer_type_descriptor_type();
4787 Struct_type::make_struct_type_descriptor_type();
4788 Array_type::make_array_type_descriptor_type();
4789 Array_type::make_slice_type_descriptor_type();
4790 Map_type::make_map_type_descriptor_type();
4791 Channel_type::make_chan_type_descriptor_type();
4792 Interface_type::make_interface_type_descriptor_type();
4793 Expression::make_func_descriptor_type();
4794 Type::convert_builtin_named_types(this);
4795
4796 Runtime::convert_types(this);
4797
4798 this->named_types_are_converted_ = true;
4799
4800 Type::finish_pointer_types(this);
4801 }
4802
4803 // Convert all names types in a set of bindings.
4804
4805 void
4806 Gogo::convert_named_types_in_bindings(Bindings* bindings)
4807 {
4808 for (Bindings::const_definitions_iterator p = bindings->begin_definitions();
4809 p != bindings->end_definitions();
4810 ++p)
4811 {
4812 if ((*p)->is_type())
4813 (*p)->type_value()->convert(this);
4814 }
4815 }
4816
4817 // Class Function.
4818
4819 Function::Function(Function_type* type, Named_object* enclosing, Block* block,
4820 Location location)
4821 : type_(type), enclosing_(enclosing), results_(NULL),
4822 closure_var_(NULL), block_(block), location_(location), labels_(),
4823 local_type_count_(0), descriptor_(NULL), fndecl_(NULL), defer_stack_(NULL),
4824 pragmas_(0), is_sink_(false), results_are_named_(false),
4825 is_unnamed_type_stub_method_(false), calls_recover_(false),
4826 is_recover_thunk_(false), has_recover_thunk_(false),
4827 calls_defer_retaddr_(false), is_type_specific_function_(false),
4828 in_unique_section_(false)
4829 {
4830 }
4831
4832 // Create the named result variables.
4833
4834 void
4835 Function::create_result_variables(Gogo* gogo)
4836 {
4837 const Typed_identifier_list* results = this->type_->results();
4838 if (results == NULL || results->empty())
4839 return;
4840
4841 if (!results->front().name().empty())
4842 this->results_are_named_ = true;
4843
4844 this->results_ = new Results();
4845 this->results_->reserve(results->size());
4846
4847 Block* block = this->block_;
4848 int index = 0;
4849 for (Typed_identifier_list::const_iterator p = results->begin();
4850 p != results->end();
4851 ++p, ++index)
4852 {
4853 std::string name = p->name();
4854 if (name.empty() || Gogo::is_sink_name(name))
4855 {
4856 static int result_counter;
4857 char buf[100];
4858 snprintf(buf, sizeof buf, "$ret%d", result_counter);
4859 ++result_counter;
4860 name = gogo->pack_hidden_name(buf, false);
4861 }
4862 Result_variable* result = new Result_variable(p->type(), this, index,
4863 p->location());
4864 Named_object* no = block->bindings()->add_result_variable(name, result);
4865 if (no->is_result_variable())
4866 this->results_->push_back(no);
4867 else
4868 {
4869 static int dummy_result_count;
4870 char buf[100];
4871 snprintf(buf, sizeof buf, "$dret%d", dummy_result_count);
4872 ++dummy_result_count;
4873 name = gogo->pack_hidden_name(buf, false);
4874 no = block->bindings()->add_result_variable(name, result);
4875 go_assert(no->is_result_variable());
4876 this->results_->push_back(no);
4877 }
4878 }
4879 }
4880
4881 // Update the named result variables when cloning a function which
4882 // calls recover.
4883
4884 void
4885 Function::update_result_variables()
4886 {
4887 if (this->results_ == NULL)
4888 return;
4889
4890 for (Results::iterator p = this->results_->begin();
4891 p != this->results_->end();
4892 ++p)
4893 (*p)->result_var_value()->set_function(this);
4894 }
4895
4896 // Whether this method should not be included in the type descriptor.
4897
4898 bool
4899 Function::nointerface() const
4900 {
4901 go_assert(this->is_method());
4902 return (this->pragmas_ & GOPRAGMA_NOINTERFACE) != 0;
4903 }
4904
4905 // Record that this method should not be included in the type
4906 // descriptor.
4907
4908 void
4909 Function::set_nointerface()
4910 {
4911 this->pragmas_ |= GOPRAGMA_NOINTERFACE;
4912 }
4913
4914 // Return the closure variable, creating it if necessary.
4915
4916 Named_object*
4917 Function::closure_var()
4918 {
4919 if (this->closure_var_ == NULL)
4920 {
4921 go_assert(this->descriptor_ == NULL);
4922 // We don't know the type of the variable yet. We add fields as
4923 // we find them.
4924 Location loc = this->type_->location();
4925 Struct_field_list* sfl = new Struct_field_list;
4926 Struct_type* struct_type = Type::make_struct_type(sfl, loc);
4927 struct_type->set_is_struct_incomparable();
4928 Variable* var = new Variable(Type::make_pointer_type(struct_type),
4929 NULL, false, false, false, loc);
4930 var->set_is_used();
4931 var->set_is_closure();
4932 this->closure_var_ = Named_object::make_variable("$closure", NULL, var);
4933 // Note that the new variable is not in any binding contour.
4934 }
4935 return this->closure_var_;
4936 }
4937
4938 // Set the type of the closure variable.
4939
4940 void
4941 Function::set_closure_type()
4942 {
4943 if (this->closure_var_ == NULL)
4944 return;
4945 Named_object* closure = this->closure_var_;
4946 Struct_type* st = closure->var_value()->type()->deref()->struct_type();
4947
4948 // The first field of a closure is always a pointer to the function
4949 // code.
4950 Type* voidptr_type = Type::make_pointer_type(Type::make_void_type());
4951 st->push_field(Struct_field(Typed_identifier(".$f", voidptr_type,
4952 this->location_)));
4953
4954 unsigned int index = 1;
4955 for (Closure_fields::const_iterator p = this->closure_fields_.begin();
4956 p != this->closure_fields_.end();
4957 ++p, ++index)
4958 {
4959 Named_object* no = p->first;
4960 char buf[20];
4961 snprintf(buf, sizeof buf, "%u", index);
4962 std::string n = no->name() + buf;
4963 Type* var_type;
4964 if (no->is_variable())
4965 var_type = no->var_value()->type();
4966 else
4967 var_type = no->result_var_value()->type();
4968 Type* field_type = Type::make_pointer_type(var_type);
4969 st->push_field(Struct_field(Typed_identifier(n, field_type, p->second)));
4970 }
4971 }
4972
4973 // Return whether this function is a method.
4974
4975 bool
4976 Function::is_method() const
4977 {
4978 return this->type_->is_method();
4979 }
4980
4981 // Add a label definition.
4982
4983 Label*
4984 Function::add_label_definition(Gogo* gogo, const std::string& label_name,
4985 Location location)
4986 {
4987 Label* lnull = NULL;
4988 std::pair<Labels::iterator, bool> ins =
4989 this->labels_.insert(std::make_pair(label_name, lnull));
4990 Label* label;
4991 if (label_name == "_")
4992 {
4993 label = Label::create_dummy_label();
4994 if (ins.second)
4995 ins.first->second = label;
4996 }
4997 else if (ins.second)
4998 {
4999 // This is a new label.
5000 label = new Label(label_name);
5001 ins.first->second = label;
5002 }
5003 else
5004 {
5005 // The label was already in the hash table.
5006 label = ins.first->second;
5007 if (label->is_defined())
5008 {
5009 go_error_at(location, "label %qs already defined",
5010 Gogo::message_name(label_name).c_str());
5011 go_inform(label->location(), "previous definition of %qs was here",
5012 Gogo::message_name(label_name).c_str());
5013 return new Label(label_name);
5014 }
5015 }
5016
5017 label->define(location, gogo->bindings_snapshot(location));
5018
5019 // Issue any errors appropriate for any previous goto's to this
5020 // label.
5021 const std::vector<Bindings_snapshot*>& refs(label->refs());
5022 for (std::vector<Bindings_snapshot*>::const_iterator p = refs.begin();
5023 p != refs.end();
5024 ++p)
5025 (*p)->check_goto_to(gogo->current_block());
5026 label->clear_refs();
5027
5028 return label;
5029 }
5030
5031 // Add a reference to a label.
5032
5033 Label*
5034 Function::add_label_reference(Gogo* gogo, const std::string& label_name,
5035 Location location, bool issue_goto_errors)
5036 {
5037 Label* lnull = NULL;
5038 std::pair<Labels::iterator, bool> ins =
5039 this->labels_.insert(std::make_pair(label_name, lnull));
5040 Label* label;
5041 if (!ins.second)
5042 {
5043 // The label was already in the hash table.
5044 label = ins.first->second;
5045 }
5046 else
5047 {
5048 go_assert(ins.first->second == NULL);
5049 label = new Label(label_name);
5050 ins.first->second = label;
5051 }
5052
5053 label->set_is_used();
5054
5055 if (issue_goto_errors)
5056 {
5057 Bindings_snapshot* snapshot = label->snapshot();
5058 if (snapshot != NULL)
5059 snapshot->check_goto_from(gogo->current_block(), location);
5060 else
5061 label->add_snapshot_ref(gogo->bindings_snapshot(location));
5062 }
5063
5064 return label;
5065 }
5066
5067 // Warn about labels that are defined but not used.
5068
5069 void
5070 Function::check_labels() const
5071 {
5072 for (Labels::const_iterator p = this->labels_.begin();
5073 p != this->labels_.end();
5074 p++)
5075 {
5076 Label* label = p->second;
5077 if (!label->is_used())
5078 go_error_at(label->location(), "label %qs defined and not used",
5079 Gogo::message_name(label->name()).c_str());
5080 }
5081 }
5082
5083 // Swap one function with another. This is used when building the
5084 // thunk we use to call a function which calls recover. It may not
5085 // work for any other case.
5086
5087 void
5088 Function::swap_for_recover(Function *x)
5089 {
5090 go_assert(this->enclosing_ == x->enclosing_);
5091 std::swap(this->results_, x->results_);
5092 std::swap(this->closure_var_, x->closure_var_);
5093 std::swap(this->block_, x->block_);
5094 go_assert(this->location_ == x->location_);
5095 go_assert(this->fndecl_ == NULL && x->fndecl_ == NULL);
5096 go_assert(this->defer_stack_ == NULL && x->defer_stack_ == NULL);
5097 }
5098
5099 // Traverse the tree.
5100
5101 int
5102 Function::traverse(Traverse* traverse)
5103 {
5104 unsigned int traverse_mask = traverse->traverse_mask();
5105
5106 if ((traverse_mask
5107 & (Traverse::traverse_types | Traverse::traverse_expressions))
5108 != 0)
5109 {
5110 if (Type::traverse(this->type_, traverse) == TRAVERSE_EXIT)
5111 return TRAVERSE_EXIT;
5112 }
5113
5114 // FIXME: We should check traverse_functions here if nested
5115 // functions are stored in block bindings.
5116 if (this->block_ != NULL
5117 && (traverse_mask
5118 & (Traverse::traverse_variables
5119 | Traverse::traverse_constants
5120 | Traverse::traverse_blocks
5121 | Traverse::traverse_statements
5122 | Traverse::traverse_expressions
5123 | Traverse::traverse_types)) != 0)
5124 {
5125 if (this->block_->traverse(traverse) == TRAVERSE_EXIT)
5126 return TRAVERSE_EXIT;
5127 }
5128
5129 return TRAVERSE_CONTINUE;
5130 }
5131
5132 // Work out types for unspecified variables and constants.
5133
5134 void
5135 Function::determine_types()
5136 {
5137 if (this->block_ != NULL)
5138 this->block_->determine_types();
5139 }
5140
5141 // Return the function descriptor, the value you get when you refer to
5142 // the function in Go code without calling it.
5143
5144 Expression*
5145 Function::descriptor(Gogo*, Named_object* no)
5146 {
5147 go_assert(!this->is_method());
5148 go_assert(this->closure_var_ == NULL);
5149 if (this->descriptor_ == NULL)
5150 this->descriptor_ = Expression::make_func_descriptor(no);
5151 return this->descriptor_;
5152 }
5153
5154 // Get a pointer to the variable representing the defer stack for this
5155 // function, making it if necessary. The value of the variable is set
5156 // by the runtime routines to true if the function is returning,
5157 // rather than panicing through. A pointer to this variable is used
5158 // as a marker for the functions on the defer stack associated with
5159 // this function. A function-specific variable permits inlining a
5160 // function which uses defer.
5161
5162 Expression*
5163 Function::defer_stack(Location location)
5164 {
5165 if (this->defer_stack_ == NULL)
5166 {
5167 Type* t = Type::lookup_bool_type();
5168 Expression* n = Expression::make_boolean(false, location);
5169 this->defer_stack_ = Statement::make_temporary(t, n, location);
5170 this->defer_stack_->set_is_address_taken();
5171 }
5172 Expression* ref = Expression::make_temporary_reference(this->defer_stack_,
5173 location);
5174 return Expression::make_unary(OPERATOR_AND, ref, location);
5175 }
5176
5177 // Export the function.
5178
5179 void
5180 Function::export_func(Export* exp, const std::string& name) const
5181 {
5182 Function::export_func_with_type(exp, name, this->type_);
5183 }
5184
5185 // Export a function with a type.
5186
5187 void
5188 Function::export_func_with_type(Export* exp, const std::string& name,
5189 const Function_type* fntype)
5190 {
5191 exp->write_c_string("func ");
5192
5193 if (fntype->is_method())
5194 {
5195 exp->write_c_string("(");
5196 const Typed_identifier* receiver = fntype->receiver();
5197 exp->write_name(receiver->name());
5198 exp->write_escape(receiver->note());
5199 exp->write_c_string(" ");
5200 exp->write_type(receiver->type());
5201 exp->write_c_string(") ");
5202 }
5203
5204 exp->write_string(name);
5205
5206 exp->write_c_string(" (");
5207 const Typed_identifier_list* parameters = fntype->parameters();
5208 if (parameters != NULL)
5209 {
5210 size_t i = 0;
5211 bool is_varargs = fntype->is_varargs();
5212 bool first = true;
5213 for (Typed_identifier_list::const_iterator p = parameters->begin();
5214 p != parameters->end();
5215 ++p, ++i)
5216 {
5217 if (first)
5218 first = false;
5219 else
5220 exp->write_c_string(", ");
5221 exp->write_name(p->name());
5222 exp->write_escape(p->note());
5223 exp->write_c_string(" ");
5224 if (!is_varargs || p + 1 != parameters->end())
5225 exp->write_type(p->type());
5226 else
5227 {
5228 exp->write_c_string("...");
5229 exp->write_type(p->type()->array_type()->element_type());
5230 }
5231 }
5232 }
5233 exp->write_c_string(")");
5234
5235 const Typed_identifier_list* results = fntype->results();
5236 if (results != NULL)
5237 {
5238 if (results->size() == 1 && results->begin()->name().empty())
5239 {
5240 exp->write_c_string(" ");
5241 exp->write_type(results->begin()->type());
5242 }
5243 else
5244 {
5245 exp->write_c_string(" (");
5246 bool first = true;
5247 for (Typed_identifier_list::const_iterator p = results->begin();
5248 p != results->end();
5249 ++p)
5250 {
5251 if (first)
5252 first = false;
5253 else
5254 exp->write_c_string(", ");
5255 exp->write_name(p->name());
5256 exp->write_escape(p->note());
5257 exp->write_c_string(" ");
5258 exp->write_type(p->type());
5259 }
5260 exp->write_c_string(")");
5261 }
5262 }
5263 exp->write_c_string(";\n");
5264 }
5265
5266 // Import a function.
5267
5268 void
5269 Function::import_func(Import* imp, std::string* pname,
5270 Typed_identifier** preceiver,
5271 Typed_identifier_list** pparameters,
5272 Typed_identifier_list** presults,
5273 bool* is_varargs)
5274 {
5275 imp->require_c_string("func ");
5276
5277 *preceiver = NULL;
5278 if (imp->peek_char() == '(')
5279 {
5280 imp->require_c_string("(");
5281 std::string name = imp->read_name();
5282 std::string escape_note = imp->read_escape();
5283 imp->require_c_string(" ");
5284 Type* rtype = imp->read_type();
5285 *preceiver = new Typed_identifier(name, rtype, imp->location());
5286 (*preceiver)->set_note(escape_note);
5287 imp->require_c_string(") ");
5288 }
5289
5290 *pname = imp->read_identifier();
5291
5292 Typed_identifier_list* parameters;
5293 *is_varargs = false;
5294 imp->require_c_string(" (");
5295 if (imp->peek_char() == ')')
5296 parameters = NULL;
5297 else
5298 {
5299 parameters = new Typed_identifier_list();
5300 while (true)
5301 {
5302 std::string name = imp->read_name();
5303 std::string escape_note = imp->read_escape();
5304 imp->require_c_string(" ");
5305
5306 if (imp->match_c_string("..."))
5307 {
5308 imp->advance(3);
5309 *is_varargs = true;
5310 }
5311
5312 Type* ptype = imp->read_type();
5313 if (*is_varargs)
5314 ptype = Type::make_array_type(ptype, NULL);
5315 Typed_identifier t = Typed_identifier(name, ptype, imp->location());
5316 t.set_note(escape_note);
5317 parameters->push_back(t);
5318 if (imp->peek_char() != ',')
5319 break;
5320 go_assert(!*is_varargs);
5321 imp->require_c_string(", ");
5322 }
5323 }
5324 imp->require_c_string(")");
5325 *pparameters = parameters;
5326
5327 Typed_identifier_list* results;
5328 if (imp->peek_char() != ' ')
5329 results = NULL;
5330 else
5331 {
5332 results = new Typed_identifier_list();
5333 imp->require_c_string(" ");
5334 if (imp->peek_char() != '(')
5335 {
5336 Type* rtype = imp->read_type();
5337 results->push_back(Typed_identifier("", rtype, imp->location()));
5338 }
5339 else
5340 {
5341 imp->require_c_string("(");
5342 while (true)
5343 {
5344 std::string name = imp->read_name();
5345 std::string note = imp->read_escape();
5346 imp->require_c_string(" ");
5347 Type* rtype = imp->read_type();
5348 Typed_identifier t = Typed_identifier(name, rtype,
5349 imp->location());
5350 t.set_note(note);
5351 results->push_back(t);
5352 if (imp->peek_char() != ',')
5353 break;
5354 imp->require_c_string(", ");
5355 }
5356 imp->require_c_string(")");
5357 }
5358 }
5359 imp->require_c_string(";\n");
5360 *presults = results;
5361 }
5362
5363 // Get the backend representation.
5364
5365 Bfunction*
5366 Function::get_or_make_decl(Gogo* gogo, Named_object* no)
5367 {
5368 if (this->fndecl_ == NULL)
5369 {
5370 bool is_visible = false;
5371 bool is_init_fn = false;
5372 Type* rtype = NULL;
5373 if (no->package() != NULL)
5374 ;
5375 else if (this->enclosing_ != NULL || Gogo::is_thunk(no))
5376 ;
5377 else if (Gogo::unpack_hidden_name(no->name()) == "init"
5378 && !this->type_->is_method())
5379 ;
5380 else if (no->name() == gogo->get_init_fn_name())
5381 {
5382 is_visible = true;
5383 is_init_fn = true;
5384 }
5385 else if (Gogo::unpack_hidden_name(no->name()) == "main"
5386 && gogo->is_main_package())
5387 is_visible = true;
5388 // Methods have to be public even if they are hidden because
5389 // they can be pulled into type descriptors when using
5390 // anonymous fields.
5391 else if (!Gogo::is_hidden_name(no->name())
5392 || this->type_->is_method())
5393 {
5394 if (!this->is_unnamed_type_stub_method_)
5395 is_visible = true;
5396 if (this->type_->is_method())
5397 rtype = this->type_->receiver()->type();
5398 }
5399
5400 std::string asm_name;
5401 if (!this->asm_name_.empty())
5402 {
5403 asm_name = this->asm_name_;
5404
5405 // If an assembler name is explicitly specified, there must
5406 // be some reason to refer to the symbol from a different
5407 // object file.
5408 is_visible = true;
5409 }
5410 else if (is_init_fn)
5411 {
5412 // These names appear in the export data and are used
5413 // directly in the assembler code. If we change this here
5414 // we need to change Gogo::init_imports.
5415 asm_name = no->name();
5416 }
5417 else
5418 asm_name = gogo->function_asm_name(no->name(), NULL, rtype);
5419
5420 // If a function calls the predeclared recover function, we
5421 // can't inline it, because recover behaves differently in a
5422 // function passed directly to defer. If this is a recover
5423 // thunk that we built to test whether a function can be
5424 // recovered, we can't inline it, because that will mess up
5425 // our return address comparison.
5426 bool is_inlinable = !(this->calls_recover_ || this->is_recover_thunk_);
5427
5428 // If a function calls __go_set_defer_retaddr, then mark it as
5429 // uninlinable. This prevents the GCC backend from splitting
5430 // the function; splitting the function is a bad idea because we
5431 // want the return address label to be in the same function as
5432 // the call.
5433 if (this->calls_defer_retaddr_)
5434 is_inlinable = false;
5435
5436 // Check the //go:noinline compiler directive.
5437 if ((this->pragmas_ & GOPRAGMA_NOINLINE) != 0)
5438 is_inlinable = false;
5439
5440 // If this is a thunk created to call a function which calls
5441 // the predeclared recover function, we need to disable
5442 // stack splitting for the thunk.
5443 bool disable_split_stack = this->is_recover_thunk_;
5444
5445 // Check the //go:nosplit compiler directive.
5446 if ((this->pragmas_ & GOPRAGMA_NOSPLIT) != 0)
5447 disable_split_stack = true;
5448
5449 // This should go into a unique section if that has been
5450 // requested elsewhere, or if this is a nointerface function.
5451 // We want to put a nointerface function into a unique section
5452 // because there is a good chance that the linker garbage
5453 // collection can discard it.
5454 bool in_unique_section = (this->in_unique_section_
5455 || (this->is_method() && this->nointerface()));
5456
5457 Btype* functype = this->type_->get_backend_fntype(gogo);
5458 this->fndecl_ =
5459 gogo->backend()->function(functype, no->get_id(gogo), asm_name,
5460 is_visible, false, is_inlinable,
5461 disable_split_stack, false,
5462 in_unique_section, this->location());
5463 }
5464 return this->fndecl_;
5465 }
5466
5467 // Get the backend representation.
5468
5469 Bfunction*
5470 Function_declaration::get_or_make_decl(Gogo* gogo, Named_object* no)
5471 {
5472 if (this->fndecl_ == NULL)
5473 {
5474 bool does_not_return = false;
5475
5476 // Let Go code use an asm declaration to pick up a builtin
5477 // function.
5478 if (!this->asm_name_.empty())
5479 {
5480 Bfunction* builtin_decl =
5481 gogo->backend()->lookup_builtin(this->asm_name_);
5482 if (builtin_decl != NULL)
5483 {
5484 this->fndecl_ = builtin_decl;
5485 return this->fndecl_;
5486 }
5487
5488 if (this->asm_name_ == "runtime.gopanic"
5489 || this->asm_name_ == "__go_runtime_error")
5490 does_not_return = true;
5491 }
5492
5493 std::string asm_name;
5494 if (this->asm_name_.empty())
5495 {
5496 Type* rtype = NULL;
5497 if (this->fntype_->is_method())
5498 rtype = this->fntype_->receiver()->type();
5499 asm_name = gogo->function_asm_name(no->name(), no->package(), rtype);
5500 }
5501 else if (go_id_needs_encoding(no->get_id(gogo)))
5502 asm_name = go_encode_id(no->get_id(gogo));
5503
5504 Btype* functype = this->fntype_->get_backend_fntype(gogo);
5505 this->fndecl_ =
5506 gogo->backend()->function(functype, no->get_id(gogo), asm_name,
5507 true, true, true, false, does_not_return,
5508 false, this->location());
5509 }
5510
5511 return this->fndecl_;
5512 }
5513
5514 // Build the descriptor for a function declaration. This won't
5515 // necessarily happen if the package has just a declaration for the
5516 // function and no other reference to it, but we may still need the
5517 // descriptor for references from other packages.
5518 void
5519 Function_declaration::build_backend_descriptor(Gogo* gogo)
5520 {
5521 if (this->descriptor_ != NULL)
5522 {
5523 Translate_context context(gogo, NULL, NULL, NULL);
5524 this->descriptor_->get_backend(&context);
5525 }
5526 }
5527
5528 // Check that the types used in this declaration's signature are defined.
5529 // Reports errors for any undefined type.
5530
5531 void
5532 Function_declaration::check_types() const
5533 {
5534 // Calling Type::base will give errors for any undefined types.
5535 Function_type* fntype = this->type();
5536 if (fntype->receiver() != NULL)
5537 fntype->receiver()->type()->base();
5538 if (fntype->parameters() != NULL)
5539 {
5540 const Typed_identifier_list* params = fntype->parameters();
5541 for (Typed_identifier_list::const_iterator p = params->begin();
5542 p != params->end();
5543 ++p)
5544 p->type()->base();
5545 }
5546 }
5547
5548 // Return the function's decl after it has been built.
5549
5550 Bfunction*
5551 Function::get_decl() const
5552 {
5553 go_assert(this->fndecl_ != NULL);
5554 return this->fndecl_;
5555 }
5556
5557 // Build the backend representation for the function code.
5558
5559 void
5560 Function::build(Gogo* gogo, Named_object* named_function)
5561 {
5562 Translate_context context(gogo, named_function, NULL, NULL);
5563
5564 // A list of parameter variables for this function.
5565 std::vector<Bvariable*> param_vars;
5566
5567 // Variables that need to be declared for this function and their
5568 // initial values.
5569 std::vector<Bvariable*> vars;
5570 std::vector<Bexpression*> var_inits;
5571 for (Bindings::const_definitions_iterator p =
5572 this->block_->bindings()->begin_definitions();
5573 p != this->block_->bindings()->end_definitions();
5574 ++p)
5575 {
5576 Location loc = (*p)->location();
5577 if ((*p)->is_variable() && (*p)->var_value()->is_parameter())
5578 {
5579 Bvariable* bvar = (*p)->get_backend_variable(gogo, named_function);
5580 Bvariable* parm_bvar = bvar;
5581
5582 // We always pass the receiver to a method as a pointer. If
5583 // the receiver is declared as a non-pointer type, then we
5584 // copy the value into a local variable.
5585 if ((*p)->var_value()->is_receiver()
5586 && (*p)->var_value()->type()->points_to() == NULL)
5587 {
5588 std::string name = (*p)->name() + ".pointer";
5589 Type* var_type = (*p)->var_value()->type();
5590 Variable* parm_var =
5591 new Variable(Type::make_pointer_type(var_type), NULL, false,
5592 true, false, loc);
5593 Named_object* parm_no =
5594 Named_object::make_variable(name, NULL, parm_var);
5595 parm_bvar = parm_no->get_backend_variable(gogo, named_function);
5596
5597 vars.push_back(bvar);
5598 Expression* parm_ref =
5599 Expression::make_var_reference(parm_no, loc);
5600 parm_ref =
5601 Expression::make_dereference(parm_ref,
5602 Expression::NIL_CHECK_DEFAULT,
5603 loc);
5604 if ((*p)->var_value()->is_in_heap())
5605 parm_ref = Expression::make_heap_expression(parm_ref, loc);
5606 var_inits.push_back(parm_ref->get_backend(&context));
5607 }
5608 else if ((*p)->var_value()->is_in_heap())
5609 {
5610 // If we take the address of a parameter, then we need
5611 // to copy it into the heap.
5612 std::string parm_name = (*p)->name() + ".param";
5613 Variable* parm_var = new Variable((*p)->var_value()->type(), NULL,
5614 false, true, false, loc);
5615 Named_object* parm_no =
5616 Named_object::make_variable(parm_name, NULL, parm_var);
5617 parm_bvar = parm_no->get_backend_variable(gogo, named_function);
5618
5619 vars.push_back(bvar);
5620 Expression* var_ref =
5621 Expression::make_var_reference(parm_no, loc);
5622 var_ref = Expression::make_heap_expression(var_ref, loc);
5623 var_inits.push_back(var_ref->get_backend(&context));
5624 }
5625 param_vars.push_back(parm_bvar);
5626 }
5627 else if ((*p)->is_result_variable())
5628 {
5629 Bvariable* bvar = (*p)->get_backend_variable(gogo, named_function);
5630
5631 Type* type = (*p)->result_var_value()->type();
5632 Bexpression* init;
5633 if (!(*p)->result_var_value()->is_in_heap())
5634 {
5635 Btype* btype = type->get_backend(gogo);
5636 init = gogo->backend()->zero_expression(btype);
5637 }
5638 else
5639 init = Expression::make_allocation(type,
5640 loc)->get_backend(&context);
5641
5642 vars.push_back(bvar);
5643 var_inits.push_back(init);
5644 }
5645 }
5646 if (!gogo->backend()->function_set_parameters(this->fndecl_, param_vars))
5647 {
5648 go_assert(saw_errors());
5649 return;
5650 }
5651
5652 // If we need a closure variable, make sure to create it.
5653 // It gets installed in the function as a side effect of creation.
5654 if (this->closure_var_ != NULL)
5655 {
5656 go_assert(this->closure_var_->var_value()->is_closure());
5657 this->closure_var_->get_backend_variable(gogo, named_function);
5658 }
5659
5660 if (this->block_ != NULL)
5661 {
5662 // Declare variables if necessary.
5663 Bblock* var_decls = NULL;
5664
5665 Bstatement* defer_init = NULL;
5666 if (!vars.empty() || this->defer_stack_ != NULL)
5667 {
5668 var_decls =
5669 gogo->backend()->block(this->fndecl_, NULL, vars,
5670 this->block_->start_location(),
5671 this->block_->end_location());
5672
5673 if (this->defer_stack_ != NULL)
5674 {
5675 Translate_context dcontext(gogo, named_function, this->block_,
5676 var_decls);
5677 defer_init = this->defer_stack_->get_backend(&dcontext);
5678 }
5679 }
5680
5681 // Build the backend representation for all the statements in the
5682 // function.
5683 Translate_context context(gogo, named_function, NULL, NULL);
5684 Bblock* code_block = this->block_->get_backend(&context);
5685
5686 // Initialize variables if necessary.
5687 std::vector<Bstatement*> init;
5688 go_assert(vars.size() == var_inits.size());
5689 for (size_t i = 0; i < vars.size(); ++i)
5690 {
5691 Bstatement* init_stmt =
5692 gogo->backend()->init_statement(this->fndecl_, vars[i],
5693 var_inits[i]);
5694 init.push_back(init_stmt);
5695 }
5696 if (defer_init != NULL)
5697 init.push_back(defer_init);
5698 Bstatement* var_init = gogo->backend()->statement_list(init);
5699
5700 // Initialize all variables before executing this code block.
5701 Bstatement* code_stmt = gogo->backend()->block_statement(code_block);
5702 code_stmt = gogo->backend()->compound_statement(var_init, code_stmt);
5703
5704 // If we have a defer stack, initialize it at the start of a
5705 // function.
5706 Bstatement* except = NULL;
5707 Bstatement* fini = NULL;
5708 if (defer_init != NULL)
5709 {
5710 // Clean up the defer stack when we leave the function.
5711 this->build_defer_wrapper(gogo, named_function, &except, &fini);
5712
5713 // Wrap the code for this function in an exception handler to handle
5714 // defer calls.
5715 code_stmt =
5716 gogo->backend()->exception_handler_statement(code_stmt,
5717 except, fini,
5718 this->location_);
5719 }
5720
5721 // Stick the code into the block we built for the receiver, if
5722 // we built one.
5723 if (var_decls != NULL)
5724 {
5725 std::vector<Bstatement*> code_stmt_list(1, code_stmt);
5726 gogo->backend()->block_add_statements(var_decls, code_stmt_list);
5727 code_stmt = gogo->backend()->block_statement(var_decls);
5728 }
5729
5730 if (!gogo->backend()->function_set_body(this->fndecl_, code_stmt))
5731 {
5732 go_assert(saw_errors());
5733 return;
5734 }
5735 }
5736
5737 // If we created a descriptor for the function, make sure we emit it.
5738 if (this->descriptor_ != NULL)
5739 {
5740 Translate_context context(gogo, NULL, NULL, NULL);
5741 this->descriptor_->get_backend(&context);
5742 }
5743 }
5744
5745 // Build the wrappers around function code needed if the function has
5746 // any defer statements. This sets *EXCEPT to an exception handler
5747 // and *FINI to a finally handler.
5748
5749 void
5750 Function::build_defer_wrapper(Gogo* gogo, Named_object* named_function,
5751 Bstatement** except, Bstatement** fini)
5752 {
5753 Location end_loc = this->block_->end_location();
5754
5755 // Add an exception handler. This is used if a panic occurs. Its
5756 // purpose is to stop the stack unwinding if a deferred function
5757 // calls recover. There are more details in
5758 // libgo/runtime/go-unwind.c.
5759
5760 std::vector<Bstatement*> stmts;
5761 Expression* call = Runtime::make_call(Runtime::CHECKDEFER, end_loc, 1,
5762 this->defer_stack(end_loc));
5763 Translate_context context(gogo, named_function, NULL, NULL);
5764 Bexpression* defer = call->get_backend(&context);
5765 stmts.push_back(gogo->backend()->expression_statement(this->fndecl_, defer));
5766
5767 Bstatement* ret_bstmt = this->return_value(gogo, named_function, end_loc);
5768 if (ret_bstmt != NULL)
5769 stmts.push_back(ret_bstmt);
5770
5771 go_assert(*except == NULL);
5772 *except = gogo->backend()->statement_list(stmts);
5773
5774 call = Runtime::make_call(Runtime::CHECKDEFER, end_loc, 1,
5775 this->defer_stack(end_loc));
5776 defer = call->get_backend(&context);
5777
5778 call = Runtime::make_call(Runtime::DEFERRETURN, end_loc, 1,
5779 this->defer_stack(end_loc));
5780 Bexpression* undefer = call->get_backend(&context);
5781 Bstatement* function_defer =
5782 gogo->backend()->function_defer_statement(this->fndecl_, undefer, defer,
5783 end_loc);
5784 stmts = std::vector<Bstatement*>(1, function_defer);
5785 if (this->type_->results() != NULL
5786 && !this->type_->results()->empty()
5787 && !this->type_->results()->front().name().empty())
5788 {
5789 // If the result variables are named, and we are returning from
5790 // this function rather than panicing through it, we need to
5791 // return them again, because they might have been changed by a
5792 // defer function. The runtime routines set the defer_stack
5793 // variable to true if we are returning from this function.
5794
5795 ret_bstmt = this->return_value(gogo, named_function, end_loc);
5796 Bexpression* nil = Expression::make_nil(end_loc)->get_backend(&context);
5797 Bexpression* ret =
5798 gogo->backend()->compound_expression(ret_bstmt, nil, end_loc);
5799 Expression* ref =
5800 Expression::make_temporary_reference(this->defer_stack_, end_loc);
5801 Bexpression* bref = ref->get_backend(&context);
5802 ret = gogo->backend()->conditional_expression(this->fndecl_,
5803 NULL, bref, ret, NULL,
5804 end_loc);
5805 stmts.push_back(gogo->backend()->expression_statement(this->fndecl_, ret));
5806 }
5807
5808 go_assert(*fini == NULL);
5809 *fini = gogo->backend()->statement_list(stmts);
5810 }
5811
5812 // Return the statement that assigns values to this function's result struct.
5813
5814 Bstatement*
5815 Function::return_value(Gogo* gogo, Named_object* named_function,
5816 Location location) const
5817 {
5818 const Typed_identifier_list* results = this->type_->results();
5819 if (results == NULL || results->empty())
5820 return NULL;
5821
5822 go_assert(this->results_ != NULL);
5823 if (this->results_->size() != results->size())
5824 {
5825 go_assert(saw_errors());
5826 return gogo->backend()->error_statement();
5827 }
5828
5829 std::vector<Bexpression*> vals(results->size());
5830 for (size_t i = 0; i < vals.size(); ++i)
5831 {
5832 Named_object* no = (*this->results_)[i];
5833 Bvariable* bvar = no->get_backend_variable(gogo, named_function);
5834 Bexpression* val = gogo->backend()->var_expression(bvar, location);
5835 if (no->result_var_value()->is_in_heap())
5836 {
5837 Btype* bt = no->result_var_value()->type()->get_backend(gogo);
5838 val = gogo->backend()->indirect_expression(bt, val, true, location);
5839 }
5840 vals[i] = val;
5841 }
5842 return gogo->backend()->return_statement(this->fndecl_, vals, location);
5843 }
5844
5845 // Class Block.
5846
5847 Block::Block(Block* enclosing, Location location)
5848 : enclosing_(enclosing), statements_(),
5849 bindings_(new Bindings(enclosing == NULL
5850 ? NULL
5851 : enclosing->bindings())),
5852 start_location_(location),
5853 end_location_(Linemap::unknown_location())
5854 {
5855 }
5856
5857 // Add a statement to a block.
5858
5859 void
5860 Block::add_statement(Statement* statement)
5861 {
5862 this->statements_.push_back(statement);
5863 }
5864
5865 // Add a statement to the front of a block. This is slow but is only
5866 // used for reference counts of parameters.
5867
5868 void
5869 Block::add_statement_at_front(Statement* statement)
5870 {
5871 this->statements_.insert(this->statements_.begin(), statement);
5872 }
5873
5874 // Replace a statement in a block.
5875
5876 void
5877 Block::replace_statement(size_t index, Statement* s)
5878 {
5879 go_assert(index < this->statements_.size());
5880 this->statements_[index] = s;
5881 }
5882
5883 // Add a statement before another statement.
5884
5885 void
5886 Block::insert_statement_before(size_t index, Statement* s)
5887 {
5888 go_assert(index < this->statements_.size());
5889 this->statements_.insert(this->statements_.begin() + index, s);
5890 }
5891
5892 // Add a statement after another statement.
5893
5894 void
5895 Block::insert_statement_after(size_t index, Statement* s)
5896 {
5897 go_assert(index < this->statements_.size());
5898 this->statements_.insert(this->statements_.begin() + index + 1, s);
5899 }
5900
5901 // Traverse the tree.
5902
5903 int
5904 Block::traverse(Traverse* traverse)
5905 {
5906 unsigned int traverse_mask = traverse->traverse_mask();
5907
5908 if ((traverse_mask & Traverse::traverse_blocks) != 0)
5909 {
5910 int t = traverse->block(this);
5911 if (t == TRAVERSE_EXIT)
5912 return TRAVERSE_EXIT;
5913 else if (t == TRAVERSE_SKIP_COMPONENTS)
5914 return TRAVERSE_CONTINUE;
5915 }
5916
5917 if ((traverse_mask
5918 & (Traverse::traverse_variables
5919 | Traverse::traverse_constants
5920 | Traverse::traverse_expressions
5921 | Traverse::traverse_types)) != 0)
5922 {
5923 const unsigned int e_or_t = (Traverse::traverse_expressions
5924 | Traverse::traverse_types);
5925 const unsigned int e_or_t_or_s = (e_or_t
5926 | Traverse::traverse_statements);
5927 for (Bindings::const_definitions_iterator pb =
5928 this->bindings_->begin_definitions();
5929 pb != this->bindings_->end_definitions();
5930 ++pb)
5931 {
5932 int t = TRAVERSE_CONTINUE;
5933 switch ((*pb)->classification())
5934 {
5935 case Named_object::NAMED_OBJECT_CONST:
5936 if ((traverse_mask & Traverse::traverse_constants) != 0)
5937 t = traverse->constant(*pb, false);
5938 if (t == TRAVERSE_CONTINUE
5939 && (traverse_mask & e_or_t) != 0)
5940 {
5941 Type* tc = (*pb)->const_value()->type();
5942 if (tc != NULL
5943 && Type::traverse(tc, traverse) == TRAVERSE_EXIT)
5944 return TRAVERSE_EXIT;
5945 t = (*pb)->const_value()->traverse_expression(traverse);
5946 }
5947 break;
5948
5949 case Named_object::NAMED_OBJECT_VAR:
5950 case Named_object::NAMED_OBJECT_RESULT_VAR:
5951 if ((traverse_mask & Traverse::traverse_variables) != 0)
5952 t = traverse->variable(*pb);
5953 if (t == TRAVERSE_CONTINUE
5954 && (traverse_mask & e_or_t) != 0)
5955 {
5956 if ((*pb)->is_result_variable()
5957 || (*pb)->var_value()->has_type())
5958 {
5959 Type* tv = ((*pb)->is_variable()
5960 ? (*pb)->var_value()->type()
5961 : (*pb)->result_var_value()->type());
5962 if (tv != NULL
5963 && Type::traverse(tv, traverse) == TRAVERSE_EXIT)
5964 return TRAVERSE_EXIT;
5965 }
5966 }
5967 if (t == TRAVERSE_CONTINUE
5968 && (traverse_mask & e_or_t_or_s) != 0
5969 && (*pb)->is_variable())
5970 t = (*pb)->var_value()->traverse_expression(traverse,
5971 traverse_mask);
5972 break;
5973
5974 case Named_object::NAMED_OBJECT_FUNC:
5975 case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
5976 go_unreachable();
5977
5978 case Named_object::NAMED_OBJECT_TYPE:
5979 if ((traverse_mask & e_or_t) != 0)
5980 t = Type::traverse((*pb)->type_value(), traverse);
5981 break;
5982
5983 case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
5984 case Named_object::NAMED_OBJECT_UNKNOWN:
5985 case Named_object::NAMED_OBJECT_ERRONEOUS:
5986 break;
5987
5988 case Named_object::NAMED_OBJECT_PACKAGE:
5989 case Named_object::NAMED_OBJECT_SINK:
5990 go_unreachable();
5991
5992 default:
5993 go_unreachable();
5994 }
5995
5996 if (t == TRAVERSE_EXIT)
5997 return TRAVERSE_EXIT;
5998 }
5999 }
6000
6001 // No point in checking traverse_mask here--if we got here we always
6002 // want to walk the statements. The traversal can insert new
6003 // statements before or after the current statement. Inserting
6004 // statements before the current statement requires updating I via
6005 // the pointer; those statements will not be traversed. Any new
6006 // statements inserted after the current statement will be traversed
6007 // in their turn.
6008 for (size_t i = 0; i < this->statements_.size(); ++i)
6009 {
6010 if (this->statements_[i]->traverse(this, &i, traverse) == TRAVERSE_EXIT)
6011 return TRAVERSE_EXIT;
6012 }
6013
6014 return TRAVERSE_CONTINUE;
6015 }
6016
6017 // Work out types for unspecified variables and constants.
6018
6019 void
6020 Block::determine_types()
6021 {
6022 for (Bindings::const_definitions_iterator pb =
6023 this->bindings_->begin_definitions();
6024 pb != this->bindings_->end_definitions();
6025 ++pb)
6026 {
6027 if ((*pb)->is_variable())
6028 (*pb)->var_value()->determine_type();
6029 else if ((*pb)->is_const())
6030 (*pb)->const_value()->determine_type();
6031 }
6032
6033 for (std::vector<Statement*>::const_iterator ps = this->statements_.begin();
6034 ps != this->statements_.end();
6035 ++ps)
6036 (*ps)->determine_types();
6037 }
6038
6039 // Return true if the statements in this block may fall through.
6040
6041 bool
6042 Block::may_fall_through() const
6043 {
6044 if (this->statements_.empty())
6045 return true;
6046 return this->statements_.back()->may_fall_through();
6047 }
6048
6049 // Convert a block to the backend representation.
6050
6051 Bblock*
6052 Block::get_backend(Translate_context* context)
6053 {
6054 Gogo* gogo = context->gogo();
6055 Named_object* function = context->function();
6056 std::vector<Bvariable*> vars;
6057 vars.reserve(this->bindings_->size_definitions());
6058 for (Bindings::const_definitions_iterator pv =
6059 this->bindings_->begin_definitions();
6060 pv != this->bindings_->end_definitions();
6061 ++pv)
6062 {
6063 if ((*pv)->is_variable() && !(*pv)->var_value()->is_parameter())
6064 vars.push_back((*pv)->get_backend_variable(gogo, function));
6065 }
6066
6067 go_assert(function != NULL);
6068 Bfunction* bfunction =
6069 function->func_value()->get_or_make_decl(gogo, function);
6070 Bblock* ret = context->backend()->block(bfunction, context->bblock(),
6071 vars, this->start_location_,
6072 this->end_location_);
6073
6074 Translate_context subcontext(gogo, function, this, ret);
6075 std::vector<Bstatement*> bstatements;
6076 bstatements.reserve(this->statements_.size());
6077 for (std::vector<Statement*>::const_iterator p = this->statements_.begin();
6078 p != this->statements_.end();
6079 ++p)
6080 bstatements.push_back((*p)->get_backend(&subcontext));
6081
6082 context->backend()->block_add_statements(ret, bstatements);
6083
6084 return ret;
6085 }
6086
6087 // Class Bindings_snapshot.
6088
6089 Bindings_snapshot::Bindings_snapshot(const Block* b, Location location)
6090 : block_(b), counts_(), location_(location)
6091 {
6092 while (b != NULL)
6093 {
6094 this->counts_.push_back(b->bindings()->size_definitions());
6095 b = b->enclosing();
6096 }
6097 }
6098
6099 // Report errors appropriate for a goto from B to this.
6100
6101 void
6102 Bindings_snapshot::check_goto_from(const Block* b, Location loc)
6103 {
6104 size_t dummy;
6105 if (!this->check_goto_block(loc, b, this->block_, &dummy))
6106 return;
6107 this->check_goto_defs(loc, this->block_,
6108 this->block_->bindings()->size_definitions(),
6109 this->counts_[0]);
6110 }
6111
6112 // Report errors appropriate for a goto from this to B.
6113
6114 void
6115 Bindings_snapshot::check_goto_to(const Block* b)
6116 {
6117 size_t index;
6118 if (!this->check_goto_block(this->location_, this->block_, b, &index))
6119 return;
6120 this->check_goto_defs(this->location_, b, this->counts_[index],
6121 b->bindings()->size_definitions());
6122 }
6123
6124 // Report errors appropriate for a goto at LOC from BFROM to BTO.
6125 // Return true if all is well, false if we reported an error. If this
6126 // returns true, it sets *PINDEX to the number of blocks BTO is above
6127 // BFROM.
6128
6129 bool
6130 Bindings_snapshot::check_goto_block(Location loc, const Block* bfrom,
6131 const Block* bto, size_t* pindex)
6132 {
6133 // It is an error if BTO is not either BFROM or above BFROM.
6134 size_t index = 0;
6135 for (const Block* pb = bfrom; pb != bto; pb = pb->enclosing(), ++index)
6136 {
6137 if (pb == NULL)
6138 {
6139 go_error_at(loc, "goto jumps into block");
6140 go_inform(bto->start_location(), "goto target block starts here");
6141 return false;
6142 }
6143 }
6144 *pindex = index;
6145 return true;
6146 }
6147
6148 // Report errors appropriate for a goto at LOC ending at BLOCK, where
6149 // CFROM is the number of names defined at the point of the goto and
6150 // CTO is the number of names defined at the point of the label.
6151
6152 void
6153 Bindings_snapshot::check_goto_defs(Location loc, const Block* block,
6154 size_t cfrom, size_t cto)
6155 {
6156 if (cfrom < cto)
6157 {
6158 Bindings::const_definitions_iterator p =
6159 block->bindings()->begin_definitions();
6160 for (size_t i = 0; i < cfrom; ++i)
6161 {
6162 go_assert(p != block->bindings()->end_definitions());
6163 ++p;
6164 }
6165 go_assert(p != block->bindings()->end_definitions());
6166
6167 std::string n = (*p)->message_name();
6168 go_error_at(loc, "goto jumps over declaration of %qs", n.c_str());
6169 go_inform((*p)->location(), "%qs defined here", n.c_str());
6170 }
6171 }
6172
6173 // Class Function_declaration.
6174
6175 // Return the function descriptor.
6176
6177 Expression*
6178 Function_declaration::descriptor(Gogo*, Named_object* no)
6179 {
6180 go_assert(!this->fntype_->is_method());
6181 if (this->descriptor_ == NULL)
6182 this->descriptor_ = Expression::make_func_descriptor(no);
6183 return this->descriptor_;
6184 }
6185
6186 // Class Variable.
6187
6188 Variable::Variable(Type* type, Expression* init, bool is_global,
6189 bool is_parameter, bool is_receiver,
6190 Location location)
6191 : type_(type), init_(init), preinit_(NULL), location_(location),
6192 backend_(NULL), is_global_(is_global), is_parameter_(is_parameter),
6193 is_closure_(false), is_receiver_(is_receiver),
6194 is_varargs_parameter_(false), is_used_(false),
6195 is_address_taken_(false), is_non_escaping_address_taken_(false),
6196 seen_(false), init_is_lowered_(false), init_is_flattened_(false),
6197 type_from_init_tuple_(false), type_from_range_index_(false),
6198 type_from_range_value_(false), type_from_chan_element_(false),
6199 is_type_switch_var_(false), determined_type_(false),
6200 in_unique_section_(false), escapes_(true),
6201 toplevel_decl_(NULL)
6202 {
6203 go_assert(type != NULL || init != NULL);
6204 go_assert(!is_parameter || init == NULL);
6205 }
6206
6207 // Traverse the initializer expression.
6208
6209 int
6210 Variable::traverse_expression(Traverse* traverse, unsigned int traverse_mask)
6211 {
6212 if (this->preinit_ != NULL)
6213 {
6214 if (this->preinit_->traverse(traverse) == TRAVERSE_EXIT)
6215 return TRAVERSE_EXIT;
6216 }
6217 if (this->init_ != NULL
6218 && ((traverse_mask
6219 & (Traverse::traverse_expressions | Traverse::traverse_types))
6220 != 0))
6221 {
6222 if (Expression::traverse(&this->init_, traverse) == TRAVERSE_EXIT)
6223 return TRAVERSE_EXIT;
6224 }
6225 return TRAVERSE_CONTINUE;
6226 }
6227
6228 // Lower the initialization expression after parsing is complete.
6229
6230 void
6231 Variable::lower_init_expression(Gogo* gogo, Named_object* function,
6232 Statement_inserter* inserter)
6233 {
6234 Named_object* dep = gogo->var_depends_on(this);
6235 if (dep != NULL && dep->is_variable())
6236 dep->var_value()->lower_init_expression(gogo, function, inserter);
6237
6238 if (this->init_ != NULL && !this->init_is_lowered_)
6239 {
6240 if (this->seen_)
6241 {
6242 // We will give an error elsewhere, this is just to prevent
6243 // an infinite loop.
6244 return;
6245 }
6246 this->seen_ = true;
6247
6248 Statement_inserter global_inserter;
6249 if (this->is_global_)
6250 {
6251 global_inserter = Statement_inserter(gogo, this);
6252 inserter = &global_inserter;
6253 }
6254
6255 gogo->lower_expression(function, inserter, &this->init_);
6256
6257 this->seen_ = false;
6258
6259 this->init_is_lowered_ = true;
6260 }
6261 }
6262
6263 // Flatten the initialization expression after ordering evaluations.
6264
6265 void
6266 Variable::flatten_init_expression(Gogo* gogo, Named_object* function,
6267 Statement_inserter* inserter)
6268 {
6269 Named_object* dep = gogo->var_depends_on(this);
6270 if (dep != NULL && dep->is_variable())
6271 dep->var_value()->flatten_init_expression(gogo, function, inserter);
6272
6273 if (this->init_ != NULL && !this->init_is_flattened_)
6274 {
6275 if (this->seen_)
6276 {
6277 // We will give an error elsewhere, this is just to prevent
6278 // an infinite loop.
6279 return;
6280 }
6281 this->seen_ = true;
6282
6283 Statement_inserter global_inserter;
6284 if (this->is_global_)
6285 {
6286 global_inserter = Statement_inserter(gogo, this);
6287 inserter = &global_inserter;
6288 }
6289
6290 gogo->flatten_expression(function, inserter, &this->init_);
6291
6292 // If an interface conversion is needed, we need a temporary
6293 // variable.
6294 if (this->type_ != NULL
6295 && !Type::are_identical(this->type_, this->init_->type(), false,
6296 NULL)
6297 && this->init_->type()->interface_type() != NULL
6298 && !this->init_->is_variable())
6299 {
6300 Temporary_statement* temp =
6301 Statement::make_temporary(NULL, this->init_, this->location_);
6302 inserter->insert(temp);
6303 this->init_ = Expression::make_temporary_reference(temp,
6304 this->location_);
6305 }
6306
6307 this->seen_ = false;
6308 this->init_is_flattened_ = true;
6309 }
6310 }
6311
6312 // Get the preinit block.
6313
6314 Block*
6315 Variable::preinit_block(Gogo* gogo)
6316 {
6317 go_assert(this->is_global_);
6318 if (this->preinit_ == NULL)
6319 this->preinit_ = new Block(NULL, this->location());
6320
6321 // If a global variable has a preinitialization statement, then we
6322 // need to have an initialization function.
6323 gogo->set_need_init_fn();
6324
6325 return this->preinit_;
6326 }
6327
6328 // Add a statement to be run before the initialization expression.
6329
6330 void
6331 Variable::add_preinit_statement(Gogo* gogo, Statement* s)
6332 {
6333 Block* b = this->preinit_block(gogo);
6334 b->add_statement(s);
6335 b->set_end_location(s->location());
6336 }
6337
6338 // Whether this variable has a type.
6339
6340 bool
6341 Variable::has_type() const
6342 {
6343 if (this->type_ == NULL)
6344 return false;
6345
6346 // A variable created in a type switch case nil does not actually
6347 // have a type yet. It will be changed to use the initializer's
6348 // type in determine_type.
6349 if (this->is_type_switch_var_
6350 && this->type_->is_nil_constant_as_type())
6351 return false;
6352
6353 return true;
6354 }
6355
6356 // In an assignment which sets a variable to a tuple of EXPR, return
6357 // the type of the first element of the tuple.
6358
6359 Type*
6360 Variable::type_from_tuple(Expression* expr, bool report_error) const
6361 {
6362 if (expr->map_index_expression() != NULL)
6363 {
6364 Map_type* mt = expr->map_index_expression()->get_map_type();
6365 if (mt == NULL)
6366 return Type::make_error_type();
6367 return mt->val_type();
6368 }
6369 else if (expr->receive_expression() != NULL)
6370 {
6371 Expression* channel = expr->receive_expression()->channel();
6372 Type* channel_type = channel->type();
6373 if (channel_type->channel_type() == NULL)
6374 return Type::make_error_type();
6375 return channel_type->channel_type()->element_type();
6376 }
6377 else
6378 {
6379 if (report_error)
6380 go_error_at(this->location(), "invalid tuple definition");
6381 return Type::make_error_type();
6382 }
6383 }
6384
6385 // Given EXPR used in a range clause, return either the index type or
6386 // the value type of the range, depending upon GET_INDEX_TYPE.
6387
6388 Type*
6389 Variable::type_from_range(Expression* expr, bool get_index_type,
6390 bool report_error) const
6391 {
6392 Type* t = expr->type();
6393 if (t->array_type() != NULL
6394 || (t->points_to() != NULL
6395 && t->points_to()->array_type() != NULL
6396 && !t->points_to()->is_slice_type()))
6397 {
6398 if (get_index_type)
6399 return Type::lookup_integer_type("int");
6400 else
6401 return t->deref()->array_type()->element_type();
6402 }
6403 else if (t->is_string_type())
6404 {
6405 if (get_index_type)
6406 return Type::lookup_integer_type("int");
6407 else
6408 return Type::lookup_integer_type("int32");
6409 }
6410 else if (t->map_type() != NULL)
6411 {
6412 if (get_index_type)
6413 return t->map_type()->key_type();
6414 else
6415 return t->map_type()->val_type();
6416 }
6417 else if (t->channel_type() != NULL)
6418 {
6419 if (get_index_type)
6420 return t->channel_type()->element_type();
6421 else
6422 {
6423 if (report_error)
6424 go_error_at(this->location(),
6425 ("invalid definition of value variable "
6426 "for channel range"));
6427 return Type::make_error_type();
6428 }
6429 }
6430 else
6431 {
6432 if (report_error)
6433 go_error_at(this->location(), "invalid type for range clause");
6434 return Type::make_error_type();
6435 }
6436 }
6437
6438 // EXPR should be a channel. Return the channel's element type.
6439
6440 Type*
6441 Variable::type_from_chan_element(Expression* expr, bool report_error) const
6442 {
6443 Type* t = expr->type();
6444 if (t->channel_type() != NULL)
6445 return t->channel_type()->element_type();
6446 else
6447 {
6448 if (report_error)
6449 go_error_at(this->location(), "expected channel");
6450 return Type::make_error_type();
6451 }
6452 }
6453
6454 // Return the type of the Variable. This may be called before
6455 // Variable::determine_type is called, which means that we may need to
6456 // get the type from the initializer. FIXME: If we combine lowering
6457 // with type determination, then this should be unnecessary.
6458
6459 Type*
6460 Variable::type()
6461 {
6462 // A variable in a type switch with a nil case will have the wrong
6463 // type here. This gets fixed up in determine_type, below.
6464 Type* type = this->type_;
6465 Expression* init = this->init_;
6466 if (this->is_type_switch_var_
6467 && type != NULL
6468 && this->type_->is_nil_constant_as_type())
6469 {
6470 Type_guard_expression* tge = this->init_->type_guard_expression();
6471 go_assert(tge != NULL);
6472 init = tge->expr();
6473 type = NULL;
6474 }
6475
6476 if (this->seen_)
6477 {
6478 if (this->type_ == NULL || !this->type_->is_error_type())
6479 {
6480 go_error_at(this->location_, "variable initializer refers to itself");
6481 this->type_ = Type::make_error_type();
6482 }
6483 return this->type_;
6484 }
6485
6486 this->seen_ = true;
6487
6488 if (type != NULL)
6489 ;
6490 else if (this->type_from_init_tuple_)
6491 type = this->type_from_tuple(init, false);
6492 else if (this->type_from_range_index_ || this->type_from_range_value_)
6493 type = this->type_from_range(init, this->type_from_range_index_, false);
6494 else if (this->type_from_chan_element_)
6495 type = this->type_from_chan_element(init, false);
6496 else
6497 {
6498 go_assert(init != NULL);
6499 type = init->type();
6500 go_assert(type != NULL);
6501
6502 // Variables should not have abstract types.
6503 if (type->is_abstract())
6504 type = type->make_non_abstract_type();
6505
6506 if (type->is_void_type())
6507 type = Type::make_error_type();
6508 }
6509
6510 this->seen_ = false;
6511
6512 return type;
6513 }
6514
6515 // Fetch the type from a const pointer, in which case it should have
6516 // been set already.
6517
6518 Type*
6519 Variable::type() const
6520 {
6521 go_assert(this->type_ != NULL);
6522 return this->type_;
6523 }
6524
6525 // Set the type if necessary.
6526
6527 void
6528 Variable::determine_type()
6529 {
6530 if (this->determined_type_)
6531 return;
6532 this->determined_type_ = true;
6533
6534 if (this->preinit_ != NULL)
6535 this->preinit_->determine_types();
6536
6537 // A variable in a type switch with a nil case will have the wrong
6538 // type here. It will have an initializer which is a type guard.
6539 // We want to initialize it to the value without the type guard, and
6540 // use the type of that value as well.
6541 if (this->is_type_switch_var_
6542 && this->type_ != NULL
6543 && this->type_->is_nil_constant_as_type())
6544 {
6545 Type_guard_expression* tge = this->init_->type_guard_expression();
6546 go_assert(tge != NULL);
6547 this->type_ = NULL;
6548 this->init_ = tge->expr();
6549 }
6550
6551 if (this->init_ == NULL)
6552 go_assert(this->type_ != NULL && !this->type_->is_abstract());
6553 else if (this->type_from_init_tuple_)
6554 {
6555 Expression *init = this->init_;
6556 init->determine_type_no_context();
6557 this->type_ = this->type_from_tuple(init, true);
6558 this->init_ = NULL;
6559 }
6560 else if (this->type_from_range_index_ || this->type_from_range_value_)
6561 {
6562 Expression* init = this->init_;
6563 init->determine_type_no_context();
6564 this->type_ = this->type_from_range(init, this->type_from_range_index_,
6565 true);
6566 this->init_ = NULL;
6567 }
6568 else if (this->type_from_chan_element_)
6569 {
6570 Expression* init = this->init_;
6571 init->determine_type_no_context();
6572 this->type_ = this->type_from_chan_element(init, true);
6573 this->init_ = NULL;
6574 }
6575 else
6576 {
6577 Type_context context(this->type_, false);
6578 this->init_->determine_type(&context);
6579 if (this->type_ == NULL)
6580 {
6581 Type* type = this->init_->type();
6582 go_assert(type != NULL);
6583 if (type->is_abstract())
6584 type = type->make_non_abstract_type();
6585
6586 if (type->is_void_type())
6587 {
6588 go_error_at(this->location_, "variable has no type");
6589 type = Type::make_error_type();
6590 }
6591 else if (type->is_nil_type())
6592 {
6593 go_error_at(this->location_, "variable defined to nil type");
6594 type = Type::make_error_type();
6595 }
6596 else if (type->is_call_multiple_result_type())
6597 {
6598 go_error_at(this->location_,
6599 "single variable set to multiple-value function call");
6600 type = Type::make_error_type();
6601 }
6602
6603 this->type_ = type;
6604 }
6605 }
6606 }
6607
6608 // Get the initial value of a variable. This does not
6609 // consider whether the variable is in the heap--it returns the
6610 // initial value as though it were always stored in the stack.
6611
6612 Bexpression*
6613 Variable::get_init(Gogo* gogo, Named_object* function)
6614 {
6615 go_assert(this->preinit_ == NULL);
6616 Location loc = this->location();
6617 if (this->init_ == NULL)
6618 {
6619 go_assert(!this->is_parameter_);
6620 if (this->is_global_ || this->is_in_heap())
6621 return NULL;
6622 Btype* btype = this->type()->get_backend(gogo);
6623 return gogo->backend()->zero_expression(btype);
6624 }
6625 else
6626 {
6627 Translate_context context(gogo, function, NULL, NULL);
6628 Expression* init = Expression::make_cast(this->type(), this->init_, loc);
6629 return init->get_backend(&context);
6630 }
6631 }
6632
6633 // Get the initial value of a variable when a block is required.
6634 // VAR_DECL is the decl to set; it may be NULL for a sink variable.
6635
6636 Bstatement*
6637 Variable::get_init_block(Gogo* gogo, Named_object* function,
6638 Bvariable* var_decl)
6639 {
6640 go_assert(this->preinit_ != NULL);
6641
6642 // We want to add the variable assignment to the end of the preinit
6643 // block.
6644
6645 Translate_context context(gogo, function, NULL, NULL);
6646 Bblock* bblock = this->preinit_->get_backend(&context);
6647 Bfunction* bfunction =
6648 function->func_value()->get_or_make_decl(gogo, function);
6649
6650 // It's possible to have pre-init statements without an initializer
6651 // if the pre-init statements set the variable.
6652 Bstatement* decl_init = NULL;
6653 if (this->init_ != NULL)
6654 {
6655 if (var_decl == NULL)
6656 {
6657 Bexpression* init_bexpr = this->init_->get_backend(&context);
6658 decl_init = gogo->backend()->expression_statement(bfunction,
6659 init_bexpr);
6660 }
6661 else
6662 {
6663 Location loc = this->location();
6664 Expression* val_expr =
6665 Expression::make_cast(this->type(), this->init_, loc);
6666 Bexpression* val = val_expr->get_backend(&context);
6667 Bexpression* var_ref =
6668 gogo->backend()->var_expression(var_decl, loc);
6669 decl_init = gogo->backend()->assignment_statement(bfunction, var_ref,
6670 val, loc);
6671 }
6672 }
6673 Bstatement* block_stmt = gogo->backend()->block_statement(bblock);
6674 if (decl_init != NULL)
6675 block_stmt = gogo->backend()->compound_statement(block_stmt, decl_init);
6676 return block_stmt;
6677 }
6678
6679 // Export the variable
6680
6681 void
6682 Variable::export_var(Export* exp, const std::string& name) const
6683 {
6684 go_assert(this->is_global_);
6685 exp->write_c_string("var ");
6686 exp->write_string(name);
6687 exp->write_c_string(" ");
6688 exp->write_type(this->type());
6689 exp->write_c_string(";\n");
6690 }
6691
6692 // Import a variable.
6693
6694 void
6695 Variable::import_var(Import* imp, std::string* pname, Type** ptype)
6696 {
6697 imp->require_c_string("var ");
6698 *pname = imp->read_identifier();
6699 imp->require_c_string(" ");
6700 *ptype = imp->read_type();
6701 imp->require_c_string(";\n");
6702 }
6703
6704 // Convert a variable to the backend representation.
6705
6706 Bvariable*
6707 Variable::get_backend_variable(Gogo* gogo, Named_object* function,
6708 const Package* package, const std::string& name)
6709 {
6710 if (this->backend_ == NULL)
6711 {
6712 Backend* backend = gogo->backend();
6713 Type* type = this->type_;
6714 if (type->is_error_type()
6715 || (type->is_undefined()
6716 && (!this->is_global_ || package == NULL)))
6717 this->backend_ = backend->error_variable();
6718 else
6719 {
6720 bool is_parameter = this->is_parameter_;
6721 if (this->is_receiver_ && type->points_to() == NULL)
6722 is_parameter = false;
6723 if (this->is_in_heap())
6724 {
6725 is_parameter = false;
6726 type = Type::make_pointer_type(type);
6727 }
6728
6729 const std::string n = Gogo::unpack_hidden_name(name);
6730 Btype* btype = type->get_backend(gogo);
6731
6732 Bvariable* bvar;
6733 if (Map_type::is_zero_value(this))
6734 bvar = Map_type::backend_zero_value(gogo);
6735 else if (this->is_global_)
6736 {
6737 std::string var_name(package != NULL
6738 ? package->package_name()
6739 : gogo->package_name());
6740 var_name.push_back('.');
6741 var_name.append(n);
6742
6743 std::string asm_name(gogo->global_var_asm_name(name, package));
6744
6745 bool is_hidden = Gogo::is_hidden_name(name);
6746 // Hack to export runtime.writeBarrier. FIXME.
6747 // This is because go:linkname doesn't work on variables.
6748 if (gogo->compiling_runtime()
6749 && var_name == "runtime.writeBarrier")
6750 is_hidden = false;
6751
6752 bvar = backend->global_variable(var_name,
6753 asm_name,
6754 btype,
6755 package != NULL,
6756 is_hidden,
6757 this->in_unique_section_,
6758 this->location_);
6759 }
6760 else if (function == NULL)
6761 {
6762 go_assert(saw_errors());
6763 bvar = backend->error_variable();
6764 }
6765 else
6766 {
6767 Bfunction* bfunction = function->func_value()->get_decl();
6768 bool is_address_taken = (this->is_non_escaping_address_taken_
6769 && !this->is_in_heap());
6770 if (this->is_closure())
6771 bvar = backend->static_chain_variable(bfunction, n, btype,
6772 this->location_);
6773 else if (is_parameter)
6774 bvar = backend->parameter_variable(bfunction, n, btype,
6775 is_address_taken,
6776 this->location_);
6777 else
6778 {
6779 Bvariable* bvar_decl = NULL;
6780 if (this->toplevel_decl_ != NULL)
6781 {
6782 Translate_context context(gogo, NULL, NULL, NULL);
6783 bvar_decl = this->toplevel_decl_->temporary_statement()
6784 ->get_backend_variable(&context);
6785 }
6786 bvar = backend->local_variable(bfunction, n, btype,
6787 bvar_decl,
6788 is_address_taken,
6789 this->location_);
6790 }
6791 }
6792 this->backend_ = bvar;
6793 }
6794 }
6795 return this->backend_;
6796 }
6797
6798 // Class Result_variable.
6799
6800 // Convert a result variable to the backend representation.
6801
6802 Bvariable*
6803 Result_variable::get_backend_variable(Gogo* gogo, Named_object* function,
6804 const std::string& name)
6805 {
6806 if (this->backend_ == NULL)
6807 {
6808 Backend* backend = gogo->backend();
6809 Type* type = this->type_;
6810 if (type->is_error())
6811 this->backend_ = backend->error_variable();
6812 else
6813 {
6814 if (this->is_in_heap())
6815 type = Type::make_pointer_type(type);
6816 Btype* btype = type->get_backend(gogo);
6817 Bfunction* bfunction = function->func_value()->get_decl();
6818 std::string n = Gogo::unpack_hidden_name(name);
6819 bool is_address_taken = (this->is_non_escaping_address_taken_
6820 && !this->is_in_heap());
6821 this->backend_ = backend->local_variable(bfunction, n, btype,
6822 NULL, is_address_taken,
6823 this->location_);
6824 }
6825 }
6826 return this->backend_;
6827 }
6828
6829 // Class Named_constant.
6830
6831 // Traverse the initializer expression.
6832
6833 int
6834 Named_constant::traverse_expression(Traverse* traverse)
6835 {
6836 return Expression::traverse(&this->expr_, traverse);
6837 }
6838
6839 // Determine the type of the constant.
6840
6841 void
6842 Named_constant::determine_type()
6843 {
6844 if (this->type_ != NULL)
6845 {
6846 Type_context context(this->type_, false);
6847 this->expr_->determine_type(&context);
6848 }
6849 else
6850 {
6851 // A constant may have an abstract type.
6852 Type_context context(NULL, true);
6853 this->expr_->determine_type(&context);
6854 this->type_ = this->expr_->type();
6855 go_assert(this->type_ != NULL);
6856 }
6857 }
6858
6859 // Indicate that we found and reported an error for this constant.
6860
6861 void
6862 Named_constant::set_error()
6863 {
6864 this->type_ = Type::make_error_type();
6865 this->expr_ = Expression::make_error(this->location_);
6866 }
6867
6868 // Export a constant.
6869
6870 void
6871 Named_constant::export_const(Export* exp, const std::string& name) const
6872 {
6873 exp->write_c_string("const ");
6874 exp->write_string(name);
6875 exp->write_c_string(" ");
6876 if (!this->type_->is_abstract())
6877 {
6878 exp->write_type(this->type_);
6879 exp->write_c_string(" ");
6880 }
6881 exp->write_c_string("= ");
6882 this->expr()->export_expression(exp);
6883 exp->write_c_string(";\n");
6884 }
6885
6886 // Import a constant.
6887
6888 void
6889 Named_constant::import_const(Import* imp, std::string* pname, Type** ptype,
6890 Expression** pexpr)
6891 {
6892 imp->require_c_string("const ");
6893 *pname = imp->read_identifier();
6894 imp->require_c_string(" ");
6895 if (imp->peek_char() == '=')
6896 *ptype = NULL;
6897 else
6898 {
6899 *ptype = imp->read_type();
6900 imp->require_c_string(" ");
6901 }
6902 imp->require_c_string("= ");
6903 *pexpr = Expression::import_expression(imp);
6904 imp->require_c_string(";\n");
6905 }
6906
6907 // Get the backend representation.
6908
6909 Bexpression*
6910 Named_constant::get_backend(Gogo* gogo, Named_object* const_no)
6911 {
6912 if (this->bconst_ == NULL)
6913 {
6914 Translate_context subcontext(gogo, NULL, NULL, NULL);
6915 Type* type = this->type();
6916 Location loc = this->location();
6917
6918 Expression* const_ref = Expression::make_const_reference(const_no, loc);
6919 Bexpression* const_decl = const_ref->get_backend(&subcontext);
6920 if (type != NULL && type->is_numeric_type())
6921 {
6922 Btype* btype = type->get_backend(gogo);
6923 std::string name = const_no->get_id(gogo);
6924 const_decl =
6925 gogo->backend()->named_constant_expression(btype, name,
6926 const_decl, loc);
6927 }
6928 this->bconst_ = const_decl;
6929 }
6930 return this->bconst_;
6931 }
6932
6933 // Add a method.
6934
6935 Named_object*
6936 Type_declaration::add_method(const std::string& name, Function* function)
6937 {
6938 Named_object* ret = Named_object::make_function(name, NULL, function);
6939 this->methods_.push_back(ret);
6940 return ret;
6941 }
6942
6943 // Add a method declaration.
6944
6945 Named_object*
6946 Type_declaration::add_method_declaration(const std::string& name,
6947 Package* package,
6948 Function_type* type,
6949 Location location)
6950 {
6951 Named_object* ret = Named_object::make_function_declaration(name, package,
6952 type, location);
6953 this->methods_.push_back(ret);
6954 return ret;
6955 }
6956
6957 // Return whether any methods are defined.
6958
6959 bool
6960 Type_declaration::has_methods() const
6961 {
6962 return !this->methods_.empty();
6963 }
6964
6965 // Define methods for the real type.
6966
6967 void
6968 Type_declaration::define_methods(Named_type* nt)
6969 {
6970 if (this->methods_.empty())
6971 return;
6972
6973 while (nt->is_alias())
6974 {
6975 Type *t = nt->real_type()->forwarded();
6976 if (t->named_type() != NULL)
6977 nt = t->named_type();
6978 else if (t->forward_declaration_type() != NULL)
6979 {
6980 Named_object* no = t->forward_declaration_type()->named_object();
6981 Type_declaration* td = no->type_declaration_value();
6982 td->methods_.insert(td->methods_.end(), this->methods_.begin(),
6983 this->methods_.end());
6984 this->methods_.clear();
6985 return;
6986 }
6987 else
6988 {
6989 for (std::vector<Named_object*>::const_iterator p =
6990 this->methods_.begin();
6991 p != this->methods_.end();
6992 ++p)
6993 go_error_at((*p)->location(),
6994 ("invalid receiver type "
6995 "(receiver must be a named type"));
6996 return;
6997 }
6998 }
6999
7000 for (std::vector<Named_object*>::const_iterator p = this->methods_.begin();
7001 p != this->methods_.end();
7002 ++p)
7003 {
7004 if (!(*p)->func_value()->is_sink())
7005 nt->add_existing_method(*p);
7006 }
7007 }
7008
7009 // We are using the type. Return true if we should issue a warning.
7010
7011 bool
7012 Type_declaration::using_type()
7013 {
7014 bool ret = !this->issued_warning_;
7015 this->issued_warning_ = true;
7016 return ret;
7017 }
7018
7019 // Class Unknown_name.
7020
7021 // Set the real named object.
7022
7023 void
7024 Unknown_name::set_real_named_object(Named_object* no)
7025 {
7026 go_assert(this->real_named_object_ == NULL);
7027 go_assert(!no->is_unknown());
7028 this->real_named_object_ = no;
7029 }
7030
7031 // Class Named_object.
7032
7033 Named_object::Named_object(const std::string& name,
7034 const Package* package,
7035 Classification classification)
7036 : name_(name), package_(package), classification_(classification),
7037 is_redefinition_(false)
7038 {
7039 if (Gogo::is_sink_name(name))
7040 go_assert(classification == NAMED_OBJECT_SINK);
7041 }
7042
7043 // Make an unknown name. This is used by the parser. The name must
7044 // be resolved later. Unknown names are only added in the current
7045 // package.
7046
7047 Named_object*
7048 Named_object::make_unknown_name(const std::string& name,
7049 Location location)
7050 {
7051 Named_object* named_object = new Named_object(name, NULL,
7052 NAMED_OBJECT_UNKNOWN);
7053 Unknown_name* value = new Unknown_name(location);
7054 named_object->u_.unknown_value = value;
7055 return named_object;
7056 }
7057
7058 // Make a constant.
7059
7060 Named_object*
7061 Named_object::make_constant(const Typed_identifier& tid,
7062 const Package* package, Expression* expr,
7063 int iota_value)
7064 {
7065 Named_object* named_object = new Named_object(tid.name(), package,
7066 NAMED_OBJECT_CONST);
7067 Named_constant* named_constant = new Named_constant(tid.type(), expr,
7068 iota_value,
7069 tid.location());
7070 named_object->u_.const_value = named_constant;
7071 return named_object;
7072 }
7073
7074 // Make a named type.
7075
7076 Named_object*
7077 Named_object::make_type(const std::string& name, const Package* package,
7078 Type* type, Location location)
7079 {
7080 Named_object* named_object = new Named_object(name, package,
7081 NAMED_OBJECT_TYPE);
7082 Named_type* named_type = Type::make_named_type(named_object, type, location);
7083 named_object->u_.type_value = named_type;
7084 return named_object;
7085 }
7086
7087 // Make a type declaration.
7088
7089 Named_object*
7090 Named_object::make_type_declaration(const std::string& name,
7091 const Package* package,
7092 Location location)
7093 {
7094 Named_object* named_object = new Named_object(name, package,
7095 NAMED_OBJECT_TYPE_DECLARATION);
7096 Type_declaration* type_declaration = new Type_declaration(location);
7097 named_object->u_.type_declaration = type_declaration;
7098 return named_object;
7099 }
7100
7101 // Make a variable.
7102
7103 Named_object*
7104 Named_object::make_variable(const std::string& name, const Package* package,
7105 Variable* variable)
7106 {
7107 Named_object* named_object = new Named_object(name, package,
7108 NAMED_OBJECT_VAR);
7109 named_object->u_.var_value = variable;
7110 return named_object;
7111 }
7112
7113 // Make a result variable.
7114
7115 Named_object*
7116 Named_object::make_result_variable(const std::string& name,
7117 Result_variable* result)
7118 {
7119 Named_object* named_object = new Named_object(name, NULL,
7120 NAMED_OBJECT_RESULT_VAR);
7121 named_object->u_.result_var_value = result;
7122 return named_object;
7123 }
7124
7125 // Make a sink. This is used for the special blank identifier _.
7126
7127 Named_object*
7128 Named_object::make_sink()
7129 {
7130 return new Named_object("_", NULL, NAMED_OBJECT_SINK);
7131 }
7132
7133 // Make a named function.
7134
7135 Named_object*
7136 Named_object::make_function(const std::string& name, const Package* package,
7137 Function* function)
7138 {
7139 Named_object* named_object = new Named_object(name, package,
7140 NAMED_OBJECT_FUNC);
7141 named_object->u_.func_value = function;
7142 return named_object;
7143 }
7144
7145 // Make a function declaration.
7146
7147 Named_object*
7148 Named_object::make_function_declaration(const std::string& name,
7149 const Package* package,
7150 Function_type* fntype,
7151 Location location)
7152 {
7153 Named_object* named_object = new Named_object(name, package,
7154 NAMED_OBJECT_FUNC_DECLARATION);
7155 Function_declaration *func_decl = new Function_declaration(fntype, location);
7156 named_object->u_.func_declaration_value = func_decl;
7157 return named_object;
7158 }
7159
7160 // Make a package.
7161
7162 Named_object*
7163 Named_object::make_package(const std::string& alias, Package* package)
7164 {
7165 Named_object* named_object = new Named_object(alias, NULL,
7166 NAMED_OBJECT_PACKAGE);
7167 named_object->u_.package_value = package;
7168 return named_object;
7169 }
7170
7171 // Return the name to use in an error message.
7172
7173 std::string
7174 Named_object::message_name() const
7175 {
7176 if (this->package_ == NULL)
7177 return Gogo::message_name(this->name_);
7178 std::string ret;
7179 if (this->package_->has_package_name())
7180 ret = this->package_->package_name();
7181 else
7182 ret = this->package_->pkgpath();
7183 ret = Gogo::message_name(ret);
7184 ret += '.';
7185 ret += Gogo::message_name(this->name_);
7186 return ret;
7187 }
7188
7189 // Set the type when a declaration is defined.
7190
7191 void
7192 Named_object::set_type_value(Named_type* named_type)
7193 {
7194 go_assert(this->classification_ == NAMED_OBJECT_TYPE_DECLARATION);
7195 Type_declaration* td = this->u_.type_declaration;
7196 td->define_methods(named_type);
7197 unsigned int index;
7198 Named_object* in_function = td->in_function(&index);
7199 if (in_function != NULL)
7200 named_type->set_in_function(in_function, index);
7201 delete td;
7202 this->classification_ = NAMED_OBJECT_TYPE;
7203 this->u_.type_value = named_type;
7204 }
7205
7206 // Define a function which was previously declared.
7207
7208 void
7209 Named_object::set_function_value(Function* function)
7210 {
7211 go_assert(this->classification_ == NAMED_OBJECT_FUNC_DECLARATION);
7212 if (this->func_declaration_value()->has_descriptor())
7213 {
7214 Expression* descriptor =
7215 this->func_declaration_value()->descriptor(NULL, NULL);
7216 function->set_descriptor(descriptor);
7217 }
7218 this->classification_ = NAMED_OBJECT_FUNC;
7219 // FIXME: We should free the old value.
7220 this->u_.func_value = function;
7221 }
7222
7223 // Declare an unknown object as a type declaration.
7224
7225 void
7226 Named_object::declare_as_type()
7227 {
7228 go_assert(this->classification_ == NAMED_OBJECT_UNKNOWN);
7229 Unknown_name* unk = this->u_.unknown_value;
7230 this->classification_ = NAMED_OBJECT_TYPE_DECLARATION;
7231 this->u_.type_declaration = new Type_declaration(unk->location());
7232 delete unk;
7233 }
7234
7235 // Return the location of a named object.
7236
7237 Location
7238 Named_object::location() const
7239 {
7240 switch (this->classification_)
7241 {
7242 default:
7243 case NAMED_OBJECT_UNINITIALIZED:
7244 go_unreachable();
7245
7246 case NAMED_OBJECT_ERRONEOUS:
7247 return Linemap::unknown_location();
7248
7249 case NAMED_OBJECT_UNKNOWN:
7250 return this->unknown_value()->location();
7251
7252 case NAMED_OBJECT_CONST:
7253 return this->const_value()->location();
7254
7255 case NAMED_OBJECT_TYPE:
7256 return this->type_value()->location();
7257
7258 case NAMED_OBJECT_TYPE_DECLARATION:
7259 return this->type_declaration_value()->location();
7260
7261 case NAMED_OBJECT_VAR:
7262 return this->var_value()->location();
7263
7264 case NAMED_OBJECT_RESULT_VAR:
7265 return this->result_var_value()->location();
7266
7267 case NAMED_OBJECT_SINK:
7268 go_unreachable();
7269
7270 case NAMED_OBJECT_FUNC:
7271 return this->func_value()->location();
7272
7273 case NAMED_OBJECT_FUNC_DECLARATION:
7274 return this->func_declaration_value()->location();
7275
7276 case NAMED_OBJECT_PACKAGE:
7277 return this->package_value()->location();
7278 }
7279 }
7280
7281 // Export a named object.
7282
7283 void
7284 Named_object::export_named_object(Export* exp) const
7285 {
7286 switch (this->classification_)
7287 {
7288 default:
7289 case NAMED_OBJECT_UNINITIALIZED:
7290 case NAMED_OBJECT_UNKNOWN:
7291 go_unreachable();
7292
7293 case NAMED_OBJECT_ERRONEOUS:
7294 break;
7295
7296 case NAMED_OBJECT_CONST:
7297 this->const_value()->export_const(exp, this->name_);
7298 break;
7299
7300 case NAMED_OBJECT_TYPE:
7301 this->type_value()->export_named_type(exp, this->name_);
7302 break;
7303
7304 case NAMED_OBJECT_TYPE_DECLARATION:
7305 go_error_at(this->type_declaration_value()->location(),
7306 "attempt to export %<%s%> which was declared but not defined",
7307 this->message_name().c_str());
7308 break;
7309
7310 case NAMED_OBJECT_FUNC_DECLARATION:
7311 this->func_declaration_value()->export_func(exp, this->name_);
7312 break;
7313
7314 case NAMED_OBJECT_VAR:
7315 this->var_value()->export_var(exp, this->name_);
7316 break;
7317
7318 case NAMED_OBJECT_RESULT_VAR:
7319 case NAMED_OBJECT_SINK:
7320 go_unreachable();
7321
7322 case NAMED_OBJECT_FUNC:
7323 this->func_value()->export_func(exp, this->name_);
7324 break;
7325 }
7326 }
7327
7328 // Convert a variable to the backend representation.
7329
7330 Bvariable*
7331 Named_object::get_backend_variable(Gogo* gogo, Named_object* function)
7332 {
7333 if (this->classification_ == NAMED_OBJECT_VAR)
7334 return this->var_value()->get_backend_variable(gogo, function,
7335 this->package_, this->name_);
7336 else if (this->classification_ == NAMED_OBJECT_RESULT_VAR)
7337 return this->result_var_value()->get_backend_variable(gogo, function,
7338 this->name_);
7339 else
7340 go_unreachable();
7341 }
7342
7343 // Return the external identifier for this object.
7344
7345 std::string
7346 Named_object::get_id(Gogo* gogo)
7347 {
7348 go_assert(!this->is_variable()
7349 && !this->is_result_variable()
7350 && !this->is_type());
7351 std::string decl_name;
7352 if (this->is_function_declaration()
7353 && !this->func_declaration_value()->asm_name().empty())
7354 decl_name = this->func_declaration_value()->asm_name();
7355 else
7356 {
7357 std::string package_name;
7358 if (this->package_ == NULL)
7359 package_name = gogo->package_name();
7360 else
7361 package_name = this->package_->package_name();
7362
7363 // Note that this will be misleading if this is an unexported
7364 // method generated for an embedded imported type. In that case
7365 // the unexported method should have the package name of the
7366 // package from which it is imported, but we are going to give
7367 // it our package name. Fixing this would require knowing the
7368 // package name, but we only know the package path. It might be
7369 // better to use package paths here anyhow. This doesn't affect
7370 // the assembler code, because we always set that name in
7371 // Function::get_or_make_decl anyhow. FIXME.
7372
7373 decl_name = package_name + '.' + Gogo::unpack_hidden_name(this->name_);
7374
7375 Function_type* fntype;
7376 if (this->is_function())
7377 fntype = this->func_value()->type();
7378 else if (this->is_function_declaration())
7379 fntype = this->func_declaration_value()->type();
7380 else
7381 fntype = NULL;
7382 if (fntype != NULL && fntype->is_method())
7383 {
7384 decl_name.push_back('.');
7385 decl_name.append(fntype->receiver()->type()->mangled_name(gogo));
7386 }
7387 }
7388 return decl_name;
7389 }
7390
7391 // Get the backend representation for this named object.
7392
7393 void
7394 Named_object::get_backend(Gogo* gogo, std::vector<Bexpression*>& const_decls,
7395 std::vector<Btype*>& type_decls,
7396 std::vector<Bfunction*>& func_decls)
7397 {
7398 // If this is a definition, avoid trying to get the backend
7399 // representation, as that can crash.
7400 if (this->is_redefinition_)
7401 {
7402 go_assert(saw_errors());
7403 return;
7404 }
7405
7406 switch (this->classification_)
7407 {
7408 case NAMED_OBJECT_CONST:
7409 if (!Gogo::is_erroneous_name(this->name_))
7410 const_decls.push_back(this->u_.const_value->get_backend(gogo, this));
7411 break;
7412
7413 case NAMED_OBJECT_TYPE:
7414 {
7415 Named_type* named_type = this->u_.type_value;
7416 if (!Gogo::is_erroneous_name(this->name_))
7417 type_decls.push_back(named_type->get_backend(gogo));
7418
7419 // We need to produce a type descriptor for every named
7420 // type, and for a pointer to every named type, since
7421 // other files or packages might refer to them. We need
7422 // to do this even for hidden types, because they might
7423 // still be returned by some function. Simply calling the
7424 // type_descriptor method is enough to create the type
7425 // descriptor, even though we don't do anything with it.
7426 if (this->package_ == NULL && !saw_errors())
7427 {
7428 named_type->
7429 type_descriptor_pointer(gogo, Linemap::predeclared_location());
7430 named_type->gc_symbol_pointer(gogo);
7431 Type* pn = Type::make_pointer_type(named_type);
7432 pn->type_descriptor_pointer(gogo, Linemap::predeclared_location());
7433 pn->gc_symbol_pointer(gogo);
7434 }
7435 }
7436 break;
7437
7438 case NAMED_OBJECT_TYPE_DECLARATION:
7439 go_error_at(Linemap::unknown_location(),
7440 "reference to undefined type %qs",
7441 this->message_name().c_str());
7442 return;
7443
7444 case NAMED_OBJECT_VAR:
7445 case NAMED_OBJECT_RESULT_VAR:
7446 case NAMED_OBJECT_SINK:
7447 go_unreachable();
7448
7449 case NAMED_OBJECT_FUNC:
7450 {
7451 Function* func = this->u_.func_value;
7452 if (!Gogo::is_erroneous_name(this->name_))
7453 func_decls.push_back(func->get_or_make_decl(gogo, this));
7454
7455 if (func->block() != NULL)
7456 func->build(gogo, this);
7457 }
7458 break;
7459
7460 case NAMED_OBJECT_ERRONEOUS:
7461 break;
7462
7463 default:
7464 go_unreachable();
7465 }
7466 }
7467
7468 // Class Bindings.
7469
7470 Bindings::Bindings(Bindings* enclosing)
7471 : enclosing_(enclosing), named_objects_(), bindings_()
7472 {
7473 }
7474
7475 // Clear imports.
7476
7477 void
7478 Bindings::clear_file_scope(Gogo* gogo)
7479 {
7480 Contour::iterator p = this->bindings_.begin();
7481 while (p != this->bindings_.end())
7482 {
7483 bool keep;
7484 if (p->second->package() != NULL)
7485 keep = false;
7486 else if (p->second->is_package())
7487 keep = false;
7488 else if (p->second->is_function()
7489 && !p->second->func_value()->type()->is_method()
7490 && Gogo::unpack_hidden_name(p->second->name()) == "init")
7491 keep = false;
7492 else
7493 keep = true;
7494
7495 if (keep)
7496 ++p;
7497 else
7498 {
7499 gogo->add_file_block_name(p->second->name(), p->second->location());
7500 p = this->bindings_.erase(p);
7501 }
7502 }
7503 }
7504
7505 // Look up a symbol.
7506
7507 Named_object*
7508 Bindings::lookup(const std::string& name) const
7509 {
7510 Contour::const_iterator p = this->bindings_.find(name);
7511 if (p != this->bindings_.end())
7512 return p->second->resolve();
7513 else if (this->enclosing_ != NULL)
7514 return this->enclosing_->lookup(name);
7515 else
7516 return NULL;
7517 }
7518
7519 // Look up a symbol locally.
7520
7521 Named_object*
7522 Bindings::lookup_local(const std::string& name) const
7523 {
7524 Contour::const_iterator p = this->bindings_.find(name);
7525 if (p == this->bindings_.end())
7526 return NULL;
7527 return p->second;
7528 }
7529
7530 // Remove an object from a set of bindings. This is used for a
7531 // special case in thunks for functions which call recover.
7532
7533 void
7534 Bindings::remove_binding(Named_object* no)
7535 {
7536 Contour::iterator pb = this->bindings_.find(no->name());
7537 go_assert(pb != this->bindings_.end());
7538 this->bindings_.erase(pb);
7539 for (std::vector<Named_object*>::iterator pn = this->named_objects_.begin();
7540 pn != this->named_objects_.end();
7541 ++pn)
7542 {
7543 if (*pn == no)
7544 {
7545 this->named_objects_.erase(pn);
7546 return;
7547 }
7548 }
7549 go_unreachable();
7550 }
7551
7552 // Add a method to the list of objects. This is not added to the
7553 // lookup table. This is so that we have a single list of objects
7554 // declared at the top level, which we walk through when it's time to
7555 // convert to trees.
7556
7557 void
7558 Bindings::add_method(Named_object* method)
7559 {
7560 this->named_objects_.push_back(method);
7561 }
7562
7563 // Add a generic Named_object to a Contour.
7564
7565 Named_object*
7566 Bindings::add_named_object_to_contour(Contour* contour,
7567 Named_object* named_object)
7568 {
7569 go_assert(named_object == named_object->resolve());
7570 const std::string& name(named_object->name());
7571 go_assert(!Gogo::is_sink_name(name));
7572
7573 std::pair<Contour::iterator, bool> ins =
7574 contour->insert(std::make_pair(name, named_object));
7575 if (!ins.second)
7576 {
7577 // The name was already there.
7578 if (named_object->package() != NULL
7579 && ins.first->second->package() == named_object->package()
7580 && (ins.first->second->classification()
7581 == named_object->classification()))
7582 {
7583 // This is a second import of the same object.
7584 return ins.first->second;
7585 }
7586 ins.first->second = this->new_definition(ins.first->second,
7587 named_object);
7588 return ins.first->second;
7589 }
7590 else
7591 {
7592 // Don't push declarations on the list. We push them on when
7593 // and if we find the definitions. That way we genericize the
7594 // functions in order.
7595 if (!named_object->is_type_declaration()
7596 && !named_object->is_function_declaration()
7597 && !named_object->is_unknown())
7598 this->named_objects_.push_back(named_object);
7599 return named_object;
7600 }
7601 }
7602
7603 // We had an existing named object OLD_OBJECT, and we've seen a new
7604 // one NEW_OBJECT with the same name. FIXME: This does not free the
7605 // new object when we don't need it.
7606
7607 Named_object*
7608 Bindings::new_definition(Named_object* old_object, Named_object* new_object)
7609 {
7610 if (new_object->is_erroneous() && !old_object->is_erroneous())
7611 return new_object;
7612
7613 std::string reason;
7614 switch (old_object->classification())
7615 {
7616 default:
7617 case Named_object::NAMED_OBJECT_UNINITIALIZED:
7618 go_unreachable();
7619
7620 case Named_object::NAMED_OBJECT_ERRONEOUS:
7621 return old_object;
7622
7623 case Named_object::NAMED_OBJECT_UNKNOWN:
7624 {
7625 Named_object* real = old_object->unknown_value()->real_named_object();
7626 if (real != NULL)
7627 return this->new_definition(real, new_object);
7628 go_assert(!new_object->is_unknown());
7629 old_object->unknown_value()->set_real_named_object(new_object);
7630 if (!new_object->is_type_declaration()
7631 && !new_object->is_function_declaration())
7632 this->named_objects_.push_back(new_object);
7633 return new_object;
7634 }
7635
7636 case Named_object::NAMED_OBJECT_CONST:
7637 break;
7638
7639 case Named_object::NAMED_OBJECT_TYPE:
7640 if (new_object->is_type_declaration())
7641 return old_object;
7642 break;
7643
7644 case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
7645 if (new_object->is_type_declaration())
7646 return old_object;
7647 if (new_object->is_type())
7648 {
7649 old_object->set_type_value(new_object->type_value());
7650 new_object->type_value()->set_named_object(old_object);
7651 this->named_objects_.push_back(old_object);
7652 return old_object;
7653 }
7654 break;
7655
7656 case Named_object::NAMED_OBJECT_VAR:
7657 case Named_object::NAMED_OBJECT_RESULT_VAR:
7658 // We have already given an error in the parser for cases where
7659 // one parameter or result variable redeclares another one.
7660 if ((new_object->is_variable()
7661 && new_object->var_value()->is_parameter())
7662 || new_object->is_result_variable())
7663 return old_object;
7664 break;
7665
7666 case Named_object::NAMED_OBJECT_SINK:
7667 go_unreachable();
7668
7669 case Named_object::NAMED_OBJECT_FUNC:
7670 if (new_object->is_function_declaration())
7671 {
7672 if (!new_object->func_declaration_value()->asm_name().empty())
7673 go_error_at(Linemap::unknown_location(),
7674 ("sorry, not implemented: "
7675 "__asm__ for function definitions"));
7676 Function_type* old_type = old_object->func_value()->type();
7677 Function_type* new_type =
7678 new_object->func_declaration_value()->type();
7679 if (old_type->is_valid_redeclaration(new_type, &reason))
7680 return old_object;
7681 }
7682 break;
7683
7684 case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
7685 {
7686 if (new_object->is_function())
7687 {
7688 Function_type* old_type =
7689 old_object->func_declaration_value()->type();
7690 Function_type* new_type = new_object->func_value()->type();
7691 if (old_type->is_valid_redeclaration(new_type, &reason))
7692 {
7693 if (!old_object->func_declaration_value()->asm_name().empty())
7694 go_error_at(Linemap::unknown_location(),
7695 ("sorry, not implemented: "
7696 "__asm__ for function definitions"));
7697 old_object->set_function_value(new_object->func_value());
7698 this->named_objects_.push_back(old_object);
7699 return old_object;
7700 }
7701 }
7702 }
7703 break;
7704
7705 case Named_object::NAMED_OBJECT_PACKAGE:
7706 break;
7707 }
7708
7709 std::string n = old_object->message_name();
7710 if (reason.empty())
7711 go_error_at(new_object->location(), "redefinition of %qs", n.c_str());
7712 else
7713 go_error_at(new_object->location(), "redefinition of %qs: %s", n.c_str(),
7714 reason.c_str());
7715 old_object->set_is_redefinition();
7716 new_object->set_is_redefinition();
7717
7718 go_inform(old_object->location(), "previous definition of %qs was here",
7719 n.c_str());
7720
7721 return old_object;
7722 }
7723
7724 // Add a named type.
7725
7726 Named_object*
7727 Bindings::add_named_type(Named_type* named_type)
7728 {
7729 return this->add_named_object(named_type->named_object());
7730 }
7731
7732 // Add a function.
7733
7734 Named_object*
7735 Bindings::add_function(const std::string& name, const Package* package,
7736 Function* function)
7737 {
7738 return this->add_named_object(Named_object::make_function(name, package,
7739 function));
7740 }
7741
7742 // Add a function declaration.
7743
7744 Named_object*
7745 Bindings::add_function_declaration(const std::string& name,
7746 const Package* package,
7747 Function_type* type,
7748 Location location)
7749 {
7750 Named_object* no = Named_object::make_function_declaration(name, package,
7751 type, location);
7752 return this->add_named_object(no);
7753 }
7754
7755 // Define a type which was previously declared.
7756
7757 void
7758 Bindings::define_type(Named_object* no, Named_type* type)
7759 {
7760 no->set_type_value(type);
7761 this->named_objects_.push_back(no);
7762 }
7763
7764 // Mark all local variables as used. This is used for some types of
7765 // parse error.
7766
7767 void
7768 Bindings::mark_locals_used()
7769 {
7770 for (std::vector<Named_object*>::iterator p = this->named_objects_.begin();
7771 p != this->named_objects_.end();
7772 ++p)
7773 if ((*p)->is_variable())
7774 (*p)->var_value()->set_is_used();
7775 }
7776
7777 // Traverse bindings.
7778
7779 int
7780 Bindings::traverse(Traverse* traverse, bool is_global)
7781 {
7782 unsigned int traverse_mask = traverse->traverse_mask();
7783
7784 // We don't use an iterator because we permit the traversal to add
7785 // new global objects.
7786 const unsigned int e_or_t = (Traverse::traverse_expressions
7787 | Traverse::traverse_types);
7788 const unsigned int e_or_t_or_s = (e_or_t
7789 | Traverse::traverse_statements);
7790 for (size_t i = 0; i < this->named_objects_.size(); ++i)
7791 {
7792 Named_object* p = this->named_objects_[i];
7793 int t = TRAVERSE_CONTINUE;
7794 switch (p->classification())
7795 {
7796 case Named_object::NAMED_OBJECT_CONST:
7797 if ((traverse_mask & Traverse::traverse_constants) != 0)
7798 t = traverse->constant(p, is_global);
7799 if (t == TRAVERSE_CONTINUE
7800 && (traverse_mask & e_or_t) != 0)
7801 {
7802 Type* tc = p->const_value()->type();
7803 if (tc != NULL
7804 && Type::traverse(tc, traverse) == TRAVERSE_EXIT)
7805 return TRAVERSE_EXIT;
7806 t = p->const_value()->traverse_expression(traverse);
7807 }
7808 break;
7809
7810 case Named_object::NAMED_OBJECT_VAR:
7811 case Named_object::NAMED_OBJECT_RESULT_VAR:
7812 if ((traverse_mask & Traverse::traverse_variables) != 0)
7813 t = traverse->variable(p);
7814 if (t == TRAVERSE_CONTINUE
7815 && (traverse_mask & e_or_t) != 0)
7816 {
7817 if (p->is_result_variable()
7818 || p->var_value()->has_type())
7819 {
7820 Type* tv = (p->is_variable()
7821 ? p->var_value()->type()
7822 : p->result_var_value()->type());
7823 if (tv != NULL
7824 && Type::traverse(tv, traverse) == TRAVERSE_EXIT)
7825 return TRAVERSE_EXIT;
7826 }
7827 }
7828 if (t == TRAVERSE_CONTINUE
7829 && (traverse_mask & e_or_t_or_s) != 0
7830 && p->is_variable())
7831 t = p->var_value()->traverse_expression(traverse, traverse_mask);
7832 break;
7833
7834 case Named_object::NAMED_OBJECT_FUNC:
7835 if ((traverse_mask & Traverse::traverse_functions) != 0)
7836 t = traverse->function(p);
7837
7838 if (t == TRAVERSE_CONTINUE
7839 && (traverse_mask
7840 & (Traverse::traverse_variables
7841 | Traverse::traverse_constants
7842 | Traverse::traverse_functions
7843 | Traverse::traverse_blocks
7844 | Traverse::traverse_statements
7845 | Traverse::traverse_expressions
7846 | Traverse::traverse_types)) != 0)
7847 t = p->func_value()->traverse(traverse);
7848 break;
7849
7850 case Named_object::NAMED_OBJECT_PACKAGE:
7851 // These are traversed in Gogo::traverse.
7852 go_assert(is_global);
7853 break;
7854
7855 case Named_object::NAMED_OBJECT_TYPE:
7856 if ((traverse_mask & e_or_t) != 0)
7857 t = Type::traverse(p->type_value(), traverse);
7858 break;
7859
7860 case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
7861 case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
7862 case Named_object::NAMED_OBJECT_UNKNOWN:
7863 case Named_object::NAMED_OBJECT_ERRONEOUS:
7864 break;
7865
7866 case Named_object::NAMED_OBJECT_SINK:
7867 default:
7868 go_unreachable();
7869 }
7870
7871 if (t == TRAVERSE_EXIT)
7872 return TRAVERSE_EXIT;
7873 }
7874
7875 // If we need to traverse types, check the function declarations,
7876 // which have types. Also check any methods of a type declaration.
7877 if ((traverse_mask & e_or_t) != 0)
7878 {
7879 for (Bindings::const_declarations_iterator p =
7880 this->begin_declarations();
7881 p != this->end_declarations();
7882 ++p)
7883 {
7884 if (p->second->is_function_declaration())
7885 {
7886 if (Type::traverse(p->second->func_declaration_value()->type(),
7887 traverse)
7888 == TRAVERSE_EXIT)
7889 return TRAVERSE_EXIT;
7890 }
7891 else if (p->second->is_type_declaration())
7892 {
7893 const std::vector<Named_object*>* methods =
7894 p->second->type_declaration_value()->methods();
7895 for (std::vector<Named_object*>::const_iterator pm =
7896 methods->begin();
7897 pm != methods->end();
7898 pm++)
7899 {
7900 Named_object* no = *pm;
7901 Type *t;
7902 if (no->is_function())
7903 t = no->func_value()->type();
7904 else if (no->is_function_declaration())
7905 t = no->func_declaration_value()->type();
7906 else
7907 continue;
7908 if (Type::traverse(t, traverse) == TRAVERSE_EXIT)
7909 return TRAVERSE_EXIT;
7910 }
7911 }
7912 }
7913 }
7914
7915 // Traverse function declarations when needed.
7916 if ((traverse_mask & Traverse::traverse_func_declarations) != 0)
7917 {
7918 for (Bindings::const_declarations_iterator p = this->begin_declarations();
7919 p != this->end_declarations();
7920 ++p)
7921 {
7922 if (p->second->is_function_declaration())
7923 {
7924 if (traverse->function_declaration(p->second) == TRAVERSE_EXIT)
7925 return TRAVERSE_EXIT;
7926 }
7927 }
7928 }
7929
7930 return TRAVERSE_CONTINUE;
7931 }
7932
7933 // Class Label.
7934
7935 // Clear any references to this label.
7936
7937 void
7938 Label::clear_refs()
7939 {
7940 for (std::vector<Bindings_snapshot*>::iterator p = this->refs_.begin();
7941 p != this->refs_.end();
7942 ++p)
7943 delete *p;
7944 this->refs_.clear();
7945 }
7946
7947 // Get the backend representation for a label.
7948
7949 Blabel*
7950 Label::get_backend_label(Translate_context* context)
7951 {
7952 if (this->blabel_ == NULL)
7953 {
7954 Function* function = context->function()->func_value();
7955 Bfunction* bfunction = function->get_decl();
7956 this->blabel_ = context->backend()->label(bfunction, this->name_,
7957 this->location_);
7958 }
7959 return this->blabel_;
7960 }
7961
7962 // Return an expression for the address of this label.
7963
7964 Bexpression*
7965 Label::get_addr(Translate_context* context, Location location)
7966 {
7967 Blabel* label = this->get_backend_label(context);
7968 return context->backend()->label_address(label, location);
7969 }
7970
7971 // Return the dummy label that represents any instance of the blank label.
7972
7973 Label*
7974 Label::create_dummy_label()
7975 {
7976 static Label* dummy_label;
7977 if (dummy_label == NULL)
7978 {
7979 dummy_label = new Label("_");
7980 dummy_label->set_is_used();
7981 }
7982 return dummy_label;
7983 }
7984
7985 // Class Unnamed_label.
7986
7987 // Get the backend representation for an unnamed label.
7988
7989 Blabel*
7990 Unnamed_label::get_blabel(Translate_context* context)
7991 {
7992 if (this->blabel_ == NULL)
7993 {
7994 Function* function = context->function()->func_value();
7995 Bfunction* bfunction = function->get_decl();
7996 this->blabel_ = context->backend()->label(bfunction, "",
7997 this->location_);
7998 }
7999 return this->blabel_;
8000 }
8001
8002 // Return a statement which defines this unnamed label.
8003
8004 Bstatement*
8005 Unnamed_label::get_definition(Translate_context* context)
8006 {
8007 Blabel* blabel = this->get_blabel(context);
8008 return context->backend()->label_definition_statement(blabel);
8009 }
8010
8011 // Return a goto statement to this unnamed label.
8012
8013 Bstatement*
8014 Unnamed_label::get_goto(Translate_context* context, Location location)
8015 {
8016 Blabel* blabel = this->get_blabel(context);
8017 return context->backend()->goto_statement(blabel, location);
8018 }
8019
8020 // Class Package.
8021
8022 Package::Package(const std::string& pkgpath,
8023 const std::string& pkgpath_symbol, Location location)
8024 : pkgpath_(pkgpath), pkgpath_symbol_(pkgpath_symbol),
8025 package_name_(), bindings_(new Bindings(NULL)),
8026 location_(location)
8027 {
8028 go_assert(!pkgpath.empty());
8029 }
8030
8031 // Set the package name.
8032
8033 void
8034 Package::set_package_name(const std::string& package_name, Location location)
8035 {
8036 go_assert(!package_name.empty());
8037 if (this->package_name_.empty())
8038 this->package_name_ = package_name;
8039 else if (this->package_name_ != package_name)
8040 go_error_at(location,
8041 ("saw two different packages with "
8042 "the same package path %s: %s, %s"),
8043 this->pkgpath_.c_str(), this->package_name_.c_str(),
8044 package_name.c_str());
8045 }
8046
8047 // Return the pkgpath symbol, which is a prefix for symbols defined in
8048 // this package.
8049
8050 std::string
8051 Package::pkgpath_symbol() const
8052 {
8053 if (this->pkgpath_symbol_.empty())
8054 return Gogo::pkgpath_for_symbol(this->pkgpath_);
8055 return this->pkgpath_symbol_;
8056 }
8057
8058 // Set the package path symbol.
8059
8060 void
8061 Package::set_pkgpath_symbol(const std::string& pkgpath_symbol)
8062 {
8063 go_assert(!pkgpath_symbol.empty());
8064 if (this->pkgpath_symbol_.empty())
8065 this->pkgpath_symbol_ = pkgpath_symbol;
8066 else
8067 go_assert(this->pkgpath_symbol_ == pkgpath_symbol);
8068 }
8069
8070 // Note that symbol from this package was and qualified by ALIAS.
8071
8072 void
8073 Package::note_usage(const std::string& alias) const
8074 {
8075 Aliases::const_iterator p = this->aliases_.find(alias);
8076 go_assert(p != this->aliases_.end());
8077 p->second->note_usage();
8078 }
8079
8080 // Forget a given usage. If forgetting this usage means this package becomes
8081 // unused, report that error.
8082
8083 void
8084 Package::forget_usage(Expression* usage) const
8085 {
8086 if (this->fake_uses_.empty())
8087 return;
8088
8089 std::set<Expression*>::iterator p = this->fake_uses_.find(usage);
8090 go_assert(p != this->fake_uses_.end());
8091 this->fake_uses_.erase(p);
8092
8093 if (this->fake_uses_.empty())
8094 go_error_at(this->location(), "imported and not used: %s",
8095 Gogo::message_name(this->package_name()).c_str());
8096 }
8097
8098 // Clear the used field for the next file. If the only usages of this package
8099 // are possibly fake, keep the fake usages for lowering.
8100
8101 void
8102 Package::clear_used()
8103 {
8104 std::string dot_alias = "." + this->package_name();
8105 Aliases::const_iterator p = this->aliases_.find(dot_alias);
8106 if (p != this->aliases_.end() && p->second->used() > this->fake_uses_.size())
8107 this->fake_uses_.clear();
8108
8109 this->aliases_.clear();
8110 }
8111
8112 Package_alias*
8113 Package::add_alias(const std::string& alias, Location location)
8114 {
8115 Aliases::const_iterator p = this->aliases_.find(alias);
8116 if (p == this->aliases_.end())
8117 {
8118 std::pair<Aliases::iterator, bool> ret;
8119 ret = this->aliases_.insert(std::make_pair(alias,
8120 new Package_alias(location)));
8121 p = ret.first;
8122 }
8123 return p->second;
8124 }
8125
8126 // Determine types of constants. Everything else in a package
8127 // (variables, function declarations) should already have a fixed
8128 // type. Constants may have abstract types.
8129
8130 void
8131 Package::determine_types()
8132 {
8133 Bindings* bindings = this->bindings_;
8134 for (Bindings::const_definitions_iterator p = bindings->begin_definitions();
8135 p != bindings->end_definitions();
8136 ++p)
8137 {
8138 if ((*p)->is_const())
8139 (*p)->const_value()->determine_type();
8140 }
8141 }
8142
8143 // Class Traverse.
8144
8145 // Destructor.
8146
8147 Traverse::~Traverse()
8148 {
8149 if (this->types_seen_ != NULL)
8150 delete this->types_seen_;
8151 if (this->expressions_seen_ != NULL)
8152 delete this->expressions_seen_;
8153 }
8154
8155 // Record that we are looking at a type, and return true if we have
8156 // already seen it.
8157
8158 bool
8159 Traverse::remember_type(const Type* type)
8160 {
8161 if (type->is_error_type())
8162 return true;
8163 go_assert((this->traverse_mask() & traverse_types) != 0
8164 || (this->traverse_mask() & traverse_expressions) != 0);
8165 // We mostly only have to remember named types. But it turns out
8166 // that an interface type can refer to itself without using a name
8167 // by relying on interface inheritance, as in
8168 // type I interface { F() interface{I} }
8169 if (type->classification() != Type::TYPE_NAMED
8170 && type->classification() != Type::TYPE_INTERFACE)
8171 return false;
8172 if (this->types_seen_ == NULL)
8173 this->types_seen_ = new Types_seen();
8174 std::pair<Types_seen::iterator, bool> ins = this->types_seen_->insert(type);
8175 return !ins.second;
8176 }
8177
8178 // Record that we are looking at an expression, and return true if we
8179 // have already seen it. NB: this routine used to assert if the traverse
8180 // mask did not include expressions/types -- this is no longer the case,
8181 // since it can be useful to remember specific expressions during
8182 // walks that only cover statements.
8183
8184 bool
8185 Traverse::remember_expression(const Expression* expression)
8186 {
8187 if (this->expressions_seen_ == NULL)
8188 this->expressions_seen_ = new Expressions_seen();
8189 std::pair<Expressions_seen::iterator, bool> ins =
8190 this->expressions_seen_->insert(expression);
8191 return !ins.second;
8192 }
8193
8194 // The default versions of these functions should never be called: the
8195 // traversal mask indicates which functions may be called.
8196
8197 int
8198 Traverse::variable(Named_object*)
8199 {
8200 go_unreachable();
8201 }
8202
8203 int
8204 Traverse::constant(Named_object*, bool)
8205 {
8206 go_unreachable();
8207 }
8208
8209 int
8210 Traverse::function(Named_object*)
8211 {
8212 go_unreachable();
8213 }
8214
8215 int
8216 Traverse::block(Block*)
8217 {
8218 go_unreachable();
8219 }
8220
8221 int
8222 Traverse::statement(Block*, size_t*, Statement*)
8223 {
8224 go_unreachable();
8225 }
8226
8227 int
8228 Traverse::expression(Expression**)
8229 {
8230 go_unreachable();
8231 }
8232
8233 int
8234 Traverse::type(Type*)
8235 {
8236 go_unreachable();
8237 }
8238
8239 int
8240 Traverse::function_declaration(Named_object*)
8241 {
8242 go_unreachable();
8243 }
8244
8245 // Class Statement_inserter.
8246
8247 void
8248 Statement_inserter::insert(Statement* s)
8249 {
8250 if (this->block_ != NULL)
8251 {
8252 go_assert(this->pindex_ != NULL);
8253 this->block_->insert_statement_before(*this->pindex_, s);
8254 ++*this->pindex_;
8255 }
8256 else if (this->var_ != NULL)
8257 this->var_->add_preinit_statement(this->gogo_, s);
8258 else
8259 go_assert(saw_errors());
8260 }