Line data Source code
1 : // types.h -- Go frontend types. -*- C++ -*-
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 : #ifndef GO_TYPES_H
8 : #define GO_TYPES_H
9 :
10 : #include <ostream>
11 :
12 : #include "go-linemap.h"
13 : #include "escape.h"
14 :
15 : class Gogo;
16 : class Package;
17 : class Variable;
18 : class Traverse;
19 : class Typed_identifier;
20 : class Typed_identifier_list;
21 : class Integer_type;
22 : class Float_type;
23 : class Complex_type;
24 : class String_type;
25 : class Function_type;
26 : class Backend_function_type;
27 : class Struct_field;
28 : class Struct_field_list;
29 : class Struct_type;
30 : class Pointer_type;
31 : class Array_type;
32 : class Map_type;
33 : class Channel_type;
34 : class Interface_type;
35 : class Named_type;
36 : class Forward_declaration_type;
37 : class Method;
38 : class Methods;
39 : class Type_hash_identical;
40 : class Type_identical;
41 : class Expression;
42 : class Expression_list;
43 : class Call_expression;
44 : class Field_reference_expression;
45 : class Bound_method_expression;
46 : class Bindings;
47 : class Named_object;
48 : class Function;
49 : class Translate_context;
50 : class Export;
51 : class Import;
52 : class Backend_name;
53 : class Btype;
54 : class Bexpression;
55 : class Bvariable;
56 :
57 : // Type codes used in type descriptors. These must match the values
58 : // in libgo/runtime/go-type.h. They also match the values in the gc
59 : // compiler in src/cmd/gc/reflect.c and src/pkg/runtime/type.go,
60 : // although this is not required.
61 :
62 : static const int RUNTIME_TYPE_KIND_BOOL = 1;
63 : static const int RUNTIME_TYPE_KIND_INT = 2;
64 : static const int RUNTIME_TYPE_KIND_INT8 = 3;
65 : static const int RUNTIME_TYPE_KIND_INT16 = 4;
66 : static const int RUNTIME_TYPE_KIND_INT32 = 5;
67 : static const int RUNTIME_TYPE_KIND_INT64 = 6;
68 : static const int RUNTIME_TYPE_KIND_UINT = 7;
69 : static const int RUNTIME_TYPE_KIND_UINT8 = 8;
70 : static const int RUNTIME_TYPE_KIND_UINT16 = 9;
71 : static const int RUNTIME_TYPE_KIND_UINT32 = 10;
72 : static const int RUNTIME_TYPE_KIND_UINT64 = 11;
73 : static const int RUNTIME_TYPE_KIND_UINTPTR = 12;
74 : static const int RUNTIME_TYPE_KIND_FLOAT32 = 13;
75 : static const int RUNTIME_TYPE_KIND_FLOAT64 = 14;
76 : static const int RUNTIME_TYPE_KIND_COMPLEX64 = 15;
77 : static const int RUNTIME_TYPE_KIND_COMPLEX128 = 16;
78 : static const int RUNTIME_TYPE_KIND_ARRAY = 17;
79 : static const int RUNTIME_TYPE_KIND_CHAN = 18;
80 : static const int RUNTIME_TYPE_KIND_FUNC = 19;
81 : static const int RUNTIME_TYPE_KIND_INTERFACE = 20;
82 : static const int RUNTIME_TYPE_KIND_MAP = 21;
83 : static const int RUNTIME_TYPE_KIND_PTR = 22;
84 : static const int RUNTIME_TYPE_KIND_SLICE = 23;
85 : static const int RUNTIME_TYPE_KIND_STRING = 24;
86 : static const int RUNTIME_TYPE_KIND_STRUCT = 25;
87 : static const int RUNTIME_TYPE_KIND_UNSAFE_POINTER = 26;
88 :
89 : static const int RUNTIME_TYPE_KIND_DIRECT_IFACE = (1 << 5);
90 : static const int RUNTIME_TYPE_KIND_GC_PROG = (1 << 6);
91 : static const int RUNTIME_TYPE_KIND_NO_POINTERS = (1 << 7);
92 :
93 : // To build the complete list of methods for a named type we need to
94 : // gather all methods from anonymous fields. Those methods may
95 : // require an arbitrary set of indirections and field offsets. There
96 : // is also the possibility of ambiguous methods, which we could ignore
97 : // except that we want to give a better error message for that case.
98 : // This is a base class. There are two types of methods: named
99 : // methods, and methods which are inherited from an anonymous field of
100 : // interface type.
101 :
102 : class Method
103 : {
104 : public:
105 : // For methods in anonymous types we need to know the sequence of
106 : // field references used to extract the pointer to pass to the
107 : // method. Since each method for a particular anonymous field will
108 : // have the sequence of field indexes, and since the indexes can be
109 : // shared going down the chain, we use a manually managed linked
110 : // list. The first entry in the list is the field index for the
111 : // last field, the one passed to the method.
112 :
113 : struct Field_indexes
114 : {
115 : const Field_indexes* next;
116 : unsigned int field_index;
117 : };
118 :
119 : virtual ~Method()
120 : { }
121 :
122 : // Get the list of field indexes.
123 : const Field_indexes*
124 22535 : field_indexes() const
125 22535 : { return this->field_indexes_; }
126 :
127 : // Get the depth.
128 : unsigned int
129 236284 : depth() const
130 236284 : { return this->depth_; }
131 :
132 : // Return whether this is a value method--a method which does not
133 : // require a pointer expression.
134 : bool
135 2126887 : is_value_method() const
136 2126887 : { return this->is_value_method_; }
137 :
138 : // Return whether we need a stub method--this is true if we can't
139 : // just pass the main object to the method.
140 : bool
141 2360938 : needs_stub_method() const
142 2360938 : { return this->needs_stub_method_; }
143 :
144 : // Return whether this is an ambiguous method name.
145 : bool
146 4684266 : is_ambiguous() const
147 4684266 : { return this->is_ambiguous_; }
148 :
149 : // Note that this method is ambiguous.
150 : void
151 1043 : set_is_ambiguous()
152 1043 : { this->is_ambiguous_ = true; }
153 :
154 : // Return the type of the method.
155 : Function_type*
156 8990439 : type() const
157 8990439 : { return this->do_type(); }
158 :
159 : // Return the location of the method receiver.
160 : Location
161 302971 : receiver_location() const
162 302971 : { return this->do_receiver_location(); }
163 :
164 : // Return an expression which binds this method to EXPR. This is
165 : // something which can be used with a function call.
166 : Expression*
167 : bind_method(Expression* expr, Location location) const;
168 :
169 : // Return the named object for this method. This may only be called
170 : // after methods are finalized.
171 : Named_object*
172 : named_object() const;
173 :
174 : // Get the stub object.
175 : Named_object*
176 42273 : stub_object() const
177 : {
178 42273 : go_assert(this->stub_ != NULL);
179 42273 : return this->stub_;
180 : }
181 :
182 : // Set the stub object.
183 : void
184 206394 : set_stub_object(Named_object* no)
185 : {
186 206394 : go_assert(this->stub_ == NULL);
187 206394 : this->stub_ = no;
188 206394 : }
189 :
190 : // Get the direct interface method stub object.
191 : Named_object*
192 3389 : iface_stub_object() const
193 : {
194 3389 : go_assert(this->iface_stub_ != NULL);
195 3389 : return this->iface_stub_;
196 : }
197 :
198 : // Set the direct interface method stub object.
199 : void
200 96577 : set_iface_stub_object(Named_object* no)
201 : {
202 96577 : go_assert(this->iface_stub_ == NULL);
203 96577 : this->iface_stub_ = no;
204 96577 : }
205 :
206 : // Return true if this method should not participate in any
207 : // interfaces.
208 : bool
209 1499639 : nointerface() const
210 1499639 : { return this->do_nointerface(); }
211 :
212 : protected:
213 : // These objects are only built by the child classes.
214 2062819 : Method(const Field_indexes* field_indexes, unsigned int depth,
215 : bool is_value_method, bool needs_stub_method)
216 2062819 : : field_indexes_(field_indexes), depth_(depth), stub_(NULL), iface_stub_(NULL),
217 2062819 : is_value_method_(is_value_method), needs_stub_method_(needs_stub_method),
218 2062819 : is_ambiguous_(false)
219 : { }
220 :
221 : // The named object for this method.
222 : virtual Named_object*
223 : do_named_object() const = 0;
224 :
225 : // The type of the method.
226 : virtual Function_type*
227 : do_type() const = 0;
228 :
229 : // Return the location of the method receiver.
230 : virtual Location
231 : do_receiver_location() const = 0;
232 :
233 : // Bind a method to an object.
234 : virtual Expression*
235 : do_bind_method(Expression* expr, Location location) const = 0;
236 :
237 : // Return whether this method should not participate in interfaces.
238 : virtual bool
239 : do_nointerface() const = 0;
240 :
241 : private:
242 : // The sequence of field indexes used for this method. If this is
243 : // NULL, then the method is defined for the current type.
244 : const Field_indexes* field_indexes_;
245 : // The depth at which this method was found.
246 : unsigned int depth_;
247 : // If a stub method is required, this is its object. This is only
248 : // set after stub methods are built in finalize_methods.
249 : Named_object* stub_;
250 : // Stub object for direct interface type. This is only set after
251 : // stub methods are built in finalize_methods.
252 : Named_object* iface_stub_;
253 : // Whether this is a value method--a method that does not require a
254 : // pointer.
255 : bool is_value_method_;
256 : // Whether a stub method is required.
257 : bool needs_stub_method_;
258 : // Whether this method is ambiguous.
259 : bool is_ambiguous_;
260 : };
261 :
262 : // A named method. This is what you get with a method declaration,
263 : // either directly on the type, or inherited from some anonymous
264 : // embedded field.
265 :
266 : class Named_method : public Method
267 : {
268 : public:
269 2060709 : Named_method(Named_object* named_object, const Field_indexes* field_indexes,
270 : unsigned int depth, bool is_value_method,
271 : bool needs_stub_method)
272 2060709 : : Method(field_indexes, depth, is_value_method, needs_stub_method),
273 2060709 : named_object_(named_object)
274 : { }
275 :
276 : protected:
277 : // Get the Named_object for the method.
278 : Named_object*
279 2507023 : do_named_object() const
280 2507023 : { return this->named_object_; }
281 :
282 : // The type of the method.
283 : Function_type*
284 : do_type() const;
285 :
286 : // Return the location of the method receiver.
287 : Location
288 : do_receiver_location() const;
289 :
290 : // Bind a method to an object.
291 : Expression*
292 : do_bind_method(Expression* expr, Location location) const;
293 :
294 : // Return whether this method should not participate in interfaces.
295 : bool
296 : do_nointerface() const;
297 :
298 : private:
299 : // The method itself. For a method which needs a stub, this starts
300 : // out as the underlying method, and is later replaced with the stub
301 : // method.
302 : Named_object* named_object_;
303 : };
304 :
305 : // An interface method. This is used when an interface appears as an
306 : // anonymous field in a named struct.
307 :
308 : class Interface_method : public Method
309 : {
310 : public:
311 2110 : Interface_method(const std::string& name, Location location,
312 : Function_type* fntype, const Field_indexes* field_indexes,
313 : unsigned int depth)
314 2110 : : Method(field_indexes, depth, true, true),
315 2110 : name_(name), location_(location), fntype_(fntype)
316 2110 : { }
317 :
318 : protected:
319 : // Get the Named_object for the method. This should never be
320 : // called, as we always create a stub.
321 : Named_object*
322 0 : do_named_object() const
323 0 : { go_unreachable(); }
324 :
325 : // The type of the method.
326 : Function_type*
327 7886 : do_type() const
328 7886 : { return this->fntype_; }
329 :
330 : // Return the location of the method receiver.
331 : Location
332 1850 : do_receiver_location() const
333 1850 : { return this->location_; }
334 :
335 : // Bind a method to an object.
336 : Expression*
337 : do_bind_method(Expression* expr, Location location) const;
338 :
339 : // Return whether this method should not participate in interfaces.
340 : bool
341 7517 : do_nointerface() const
342 7517 : { return false; }
343 :
344 : private:
345 : // The name of the interface method to call.
346 : std::string name_;
347 : // The location of the definition of the interface method.
348 : Location location_;
349 : // The type of the interface method.
350 : Function_type* fntype_;
351 : };
352 :
353 : // A mapping from method name to Method. This is a wrapper around a
354 : // hash table.
355 :
356 1313585 : class Methods
357 : {
358 : private:
359 : typedef Unordered_map(std::string, Method*) Method_map;
360 :
361 : public:
362 : typedef Method_map::const_iterator const_iterator;
363 :
364 1626333 : Methods()
365 1626333 : : methods_()
366 : { }
367 :
368 : // Insert a new method. Returns true if it was inserted, false if
369 : // it was overidden or ambiguous.
370 : bool
371 : insert(const std::string& name, Method* m);
372 :
373 : // The number of (unambiguous) methods.
374 : size_t
375 : count() const;
376 :
377 : // Iterate.
378 : const_iterator
379 1592652 : begin() const
380 1592652 : { return this->methods_.begin(); }
381 :
382 : const_iterator
383 16113072 : end() const
384 16113072 : { return this->methods_.end(); }
385 :
386 : // Lookup.
387 : const_iterator
388 4096356 : find(const std::string& name) const
389 4096356 : { return this->methods_.find(name); }
390 :
391 : bool
392 1470878 : empty() const
393 1470878 : { return this->methods_.empty(); }
394 :
395 : private:
396 : Method_map methods_;
397 : };
398 :
399 : // The base class for all types.
400 :
401 : class Type
402 : {
403 : public:
404 : // The types of types.
405 : enum Type_classification
406 : {
407 : TYPE_ERROR,
408 : TYPE_VOID,
409 : TYPE_BOOLEAN,
410 : TYPE_INTEGER,
411 : TYPE_FLOAT,
412 : TYPE_COMPLEX,
413 : TYPE_STRING,
414 : TYPE_SINK,
415 : TYPE_FUNCTION,
416 : TYPE_POINTER,
417 : TYPE_NIL,
418 : TYPE_CALL_MULTIPLE_RESULT,
419 : TYPE_STRUCT,
420 : TYPE_ARRAY,
421 : TYPE_MAP,
422 : TYPE_CHANNEL,
423 : TYPE_INTERFACE,
424 : TYPE_NAMED,
425 : TYPE_FORWARD
426 : };
427 :
428 : virtual ~Type();
429 :
430 : // Creators.
431 :
432 : static Type*
433 : make_error_type();
434 :
435 : static Type*
436 : make_void_type();
437 :
438 : // Get the unnamed bool type.
439 : static Type*
440 : make_boolean_type();
441 :
442 : // Get the named type "bool".
443 : static Named_type*
444 : lookup_bool_type();
445 :
446 : // Make the named type "bool".
447 : static Named_type*
448 : make_named_bool_type();
449 :
450 : // Make an abstract integer type.
451 : static Integer_type*
452 : make_abstract_integer_type();
453 :
454 : // Make an abstract type for a character constant.
455 : static Integer_type*
456 : make_abstract_character_type();
457 :
458 : // Make a named integer type with a specified size.
459 : // RUNTIME_TYPE_KIND is the code to use in reflection information,
460 : // to distinguish int and int32.
461 : static Named_type*
462 : make_integer_type(const char* name, bool is_unsigned, int bits,
463 : int runtime_type_kind);
464 :
465 : // Make a named integer type alias. This is used for byte and rune.
466 : static Named_type*
467 : make_integer_type_alias(const char* name, Named_type* real_type);
468 :
469 : // Look up a named integer type.
470 : static Named_type*
471 : lookup_integer_type(const char* name);
472 :
473 : // Make an abstract floating point type.
474 : static Float_type*
475 : make_abstract_float_type();
476 :
477 : // Make a named floating point type with a specific size.
478 : // RUNTIME_TYPE_KIND is the code to use in reflection information,
479 : // to distinguish float and float32.
480 : static Named_type*
481 : make_float_type(const char* name, int bits, int runtime_type_kind);
482 :
483 : // Look up a named float type.
484 : static Named_type*
485 : lookup_float_type(const char* name);
486 :
487 : // Make an abstract complex type.
488 : static Complex_type*
489 : make_abstract_complex_type();
490 :
491 : // Make a named complex type with a specific size.
492 : // RUNTIME_TYPE_KIND is the code to use in reflection information,
493 : // to distinguish complex and complex64.
494 : static Named_type*
495 : make_complex_type(const char* name, int bits, int runtime_type_kind);
496 :
497 : // Look up a named complex type.
498 : static Named_type*
499 : lookup_complex_type(const char* name);
500 :
501 : // Get the unnamed string type.
502 : static Type*
503 : make_string_type();
504 :
505 : // Get the named type "string".
506 : static Named_type*
507 : lookup_string_type();
508 :
509 : // Make the named type "string".
510 : static Named_type*
511 : make_named_string_type();
512 :
513 : static Type*
514 : make_sink_type();
515 :
516 : static Function_type*
517 : make_function_type(Typed_identifier* receiver,
518 : Typed_identifier_list* parameters,
519 : Typed_identifier_list* results,
520 : Location);
521 :
522 : static Backend_function_type*
523 : make_backend_function_type(Typed_identifier* receiver,
524 : Typed_identifier_list* parameters,
525 : Typed_identifier_list* results,
526 : Location);
527 :
528 : static Pointer_type*
529 : make_pointer_type(Type*);
530 :
531 : static void
532 : finish_pointer_types(Gogo* gogo);
533 :
534 : static Type*
535 : make_nil_type();
536 :
537 : static Type*
538 : make_call_multiple_result_type();
539 :
540 : static Struct_type*
541 : make_struct_type(Struct_field_list* fields, Location);
542 :
543 : static Array_type*
544 : make_array_type(Type* element_type, Expression* length);
545 :
546 : static Map_type*
547 : make_map_type(Type* key_type, Type* value_type, Location);
548 :
549 : static Channel_type*
550 : make_channel_type(bool send, bool receive, Type*);
551 :
552 : static Interface_type*
553 : make_interface_type(Typed_identifier_list* methods, Location);
554 :
555 : static Interface_type*
556 : make_empty_interface_type(Location);
557 :
558 : static Type*
559 : make_type_descriptor_type();
560 :
561 : static Type*
562 : make_type_descriptor_ptr_type();
563 :
564 : static Named_type*
565 : make_named_type(Named_object*, Type*, Location);
566 :
567 : static Type*
568 : make_forward_declaration(Named_object*);
569 :
570 : // Make a builtin struct type from a list of fields.
571 : static Struct_type*
572 : make_builtin_struct_type(int nfields, ...);
573 :
574 : // Make a builtin named type.
575 : static Named_type*
576 : make_builtin_named_type(const char* name, Type* type);
577 :
578 : // Return a string version of this type to use in an error message.
579 : std::string
580 : message_name() const;
581 :
582 : // Traverse a type.
583 : static int
584 : traverse(Type*, Traverse*);
585 :
586 : // Verify the type. This is called after parsing, and verifies that
587 : // types are complete and meet the language requirements. This
588 : // returns false if the type is invalid and we should not continue
589 : // traversing it.
590 : bool
591 12274892 : verify(Gogo* gogo)
592 10846425 : { return this->do_verify(gogo); }
593 :
594 : // Bit flags to pass to are_identical and friends.
595 :
596 : // Treat error types as their own distinct type. Sometimes we
597 : // ignore error types--treat them as identical to every other
598 : // type--to avoid cascading errors.
599 : static const int COMPARE_ERRORS = 1;
600 :
601 : // Compare struct field tags when comparing structs. We ignore
602 : // struct field tags for purposes of type conversion.
603 : static const int COMPARE_TAGS = 2;
604 :
605 : // Compare aliases: treat an alias to T as distinct from T.
606 : static const int COMPARE_ALIASES = 4;
607 :
608 : // When comparing interface types compare the interface embedding heirarchy,
609 : // if any, rather than only comparing method sets. Useful primarily when
610 : // exporting types.
611 : static const int COMPARE_EMBEDDED_INTERFACES = 8;
612 :
613 : // Return true if two types are identical. If this returns false,
614 : // and REASON is not NULL, it may set *REASON.
615 : static bool
616 : are_identical(const Type* lhs, const Type* rhs, int flags,
617 : std::string* reason);
618 :
619 : // Return true if two types are compatible for use in a binary
620 : // operation, other than a shift, comparison, or channel send. This
621 : // is an equivalence relation.
622 : static bool
623 : are_compatible_for_binop(const Type* t1, const Type* t2);
624 :
625 : // Return true if two types are compatible for use with the
626 : // comparison operator. IS_EQUALITY_OP is true if this is an
627 : // equality comparison, false if it is an ordered comparison. This
628 : // is an equivalence relation. If this returns false, and REASON is
629 : // not NULL, it sets *REASON.
630 : static bool
631 : are_compatible_for_comparison(bool is_equality_op, const Type *t1,
632 : const Type *t2, std::string* reason);
633 :
634 : // Return true if a type is comparable with itself. This is true of
635 : // most types, but false for, e.g., function types.
636 : bool
637 7470323 : is_comparable() const
638 7470323 : { return Type::are_compatible_for_comparison(true, this, this, NULL); }
639 :
640 : // Return true if a value with type RHS is assignable to a variable
641 : // with type LHS. This is not an equivalence relation. If this
642 : // returns false, and REASON is not NULL, it sets *REASON.
643 : static bool
644 : are_assignable(const Type* lhs, const Type* rhs, std::string* reason);
645 :
646 : // Return true if a value with type RHS may be converted to type
647 : // LHS. If this returns false, and REASON is not NULL, it sets
648 : // *REASON.
649 : static bool
650 : are_convertible(const Type* lhs, const Type* rhs, std::string* reason);
651 :
652 : // Return true if values of this type can be compared using an
653 : // identity function which gets nothing but a pointer to the value
654 : // and a size.
655 : bool
656 9968878 : compare_is_identity(Gogo* gogo)
657 6657384 : { return this->do_compare_is_identity(gogo); }
658 :
659 : // Return whether values of this type are reflexive: if a comparison
660 : // of a value with itself always returns true.
661 : bool
662 12661 : is_reflexive()
663 8627 : { return this->do_is_reflexive(); }
664 :
665 : // Return whether values of this, when used as a key in map,
666 : // requires the key to be updated when an assignment is made.
667 : bool
668 11893 : needs_key_update()
669 8336 : { return this->do_needs_key_update(); }
670 :
671 : // Return whether the hash function of this type might panic. This
672 : // is only called for types used as a key in a map type.
673 : bool
674 4127 : hash_might_panic()
675 4070 : { return this->do_hash_might_panic(); }
676 :
677 : // Whether the type is permitted in the heap.
678 : bool
679 79319830 : in_heap() const
680 34648335 : { return this->do_in_heap(); }
681 :
682 : // Return a hash code for this type for the method hash table.
683 : // Types which are equivalent according to are_identical will have
684 : // the same hash code.
685 : unsigned int
686 : hash_for_method(Gogo*, int) const;
687 :
688 : // Return the type classification.
689 : Type_classification
690 1288612797 : classification() const
691 1288612797 : { return this->classification_; }
692 :
693 : // Return the base type for this type. This looks through forward
694 : // declarations and names. Using this with a forward declaration
695 : // which has not been defined will return an error type.
696 : Type*
697 : base();
698 :
699 : const Type*
700 : base() const;
701 :
702 : // Return the type skipping defined forward declarations. If this
703 : // type is a forward declaration which has not been defined, it will
704 : // return the Forward_declaration_type. This differs from base() in
705 : // that it will return a Named_type, and for a
706 : // Forward_declaration_type which is not defined it will return that
707 : // type rather than an error type.
708 : Type*
709 : forwarded();
710 :
711 : const Type*
712 : forwarded() const;
713 :
714 : // Return the type skipping any alias definitions and any defined
715 : // forward declarations. This is like forwarded, but also
716 : // recursively expands alias definitions to the aliased type.
717 : Type*
718 : unalias();
719 :
720 : const Type*
721 : unalias() const;
722 :
723 : // Return true if this is a basic type: a type which is not composed
724 : // of other types, and is not void.
725 : bool
726 : is_basic_type() const;
727 :
728 : // Return true if this is an abstract type--an integer, floating
729 : // point, or complex type whose size has not been determined.
730 : bool
731 : is_abstract() const;
732 :
733 : // Return a non-abstract version of an abstract type.
734 : Type*
735 : make_non_abstract_type();
736 :
737 : // Return true if this type is or contains a pointer. This
738 : // determines whether the garbage collector needs to look at a value
739 : // of this type.
740 : bool
741 20711847 : has_pointer() const
742 14941746 : { return this->do_has_pointer(); }
743 :
744 : // Return true if this is the error type. This returns false for a
745 : // type which is not defined, as it is called by the parser before
746 : // all types are defined.
747 : bool
748 : is_error_type() const;
749 :
750 : // Return true if this is the error type or if the type is
751 : // undefined. If the type is undefined, this will give an error.
752 : // This should only be called after parsing is complete.
753 : bool
754 55559660 : is_error() const
755 55559660 : { return this->base()->is_error_type(); }
756 :
757 : // Return true if this is a void type.
758 : bool
759 45685354 : is_void_type() const
760 43937819 : { return this->classification_ == TYPE_VOID; }
761 :
762 : // If this is an integer type, return the Integer_type. Otherwise,
763 : // return NULL. This is a controlled dynamic_cast.
764 : Integer_type*
765 126095363 : integer_type()
766 133639978 : { return this->convert<Integer_type, TYPE_INTEGER>(); }
767 :
768 : const Integer_type*
769 16959690 : integer_type() const
770 23980317 : { return this->convert<const Integer_type, TYPE_INTEGER>(); }
771 :
772 : // If this is a floating point type, return the Float_type.
773 : // Otherwise, return NULL. This is a controlled dynamic_cast.
774 : Float_type*
775 104514183 : float_type()
776 108658937 : { return this->convert<Float_type, TYPE_FLOAT>(); }
777 :
778 : const Float_type*
779 6472265 : float_type() const
780 20718929 : { return this->convert<const Float_type, TYPE_FLOAT>(); }
781 :
782 : // If this is a complex type, return the Complex_type. Otherwise,
783 : // return NULL.
784 : Complex_type*
785 104121195 : complex_type()
786 108305490 : { return this->convert<Complex_type, TYPE_COMPLEX>(); }
787 :
788 : const Complex_type*
789 6334470 : complex_type() const
790 21108817 : { return this->convert<const Complex_type, TYPE_COMPLEX>(); }
791 :
792 : // Return whether this is a numeric type.
793 : bool
794 5886688 : is_numeric_type() const
795 : {
796 5886688 : Type_classification tc = this->base()->classification_;
797 5886688 : return tc == TYPE_INTEGER || tc == TYPE_FLOAT || tc == TYPE_COMPLEX;
798 : }
799 :
800 : // Return true if this is a boolean type.
801 : bool
802 16454780 : is_boolean_type() const
803 16076810 : { return this->base()->classification_ == TYPE_BOOLEAN; }
804 :
805 : // Return true if this is an abstract boolean type.
806 : bool
807 1120 : is_abstract_boolean_type() const
808 561 : { return this->classification_ == TYPE_BOOLEAN; }
809 :
810 : // Return true if this is a string type.
811 : bool
812 22935541 : is_string_type() const
813 20889619 : { return this->base()->classification_ == TYPE_STRING; }
814 :
815 : // Return true if this is an abstract string type.
816 : bool
817 25734 : is_abstract_string_type() const
818 25175 : { return this->classification_ == TYPE_STRING; }
819 :
820 : // Return true if this is the sink type. This is the type of the
821 : // blank identifier _.
822 : bool
823 66224890 : is_sink_type() const
824 41329585 : { return this->base()->classification_ == TYPE_SINK; }
825 :
826 : // If this is a function type, return it. Otherwise, return NULL.
827 : Function_type*
828 32072404 : function_type()
829 9698517 : { return this->convert<Function_type, TYPE_FUNCTION>(); }
830 :
831 : const Function_type*
832 31003766 : function_type() const
833 31648296 : { return this->convert<const Function_type, TYPE_FUNCTION>(); }
834 :
835 : // If this is a pointer type, return the type to which it points.
836 : // Otherwise, return NULL.
837 : Type*
838 : points_to() const;
839 :
840 : // If this is a pointer type, return the type to which it points.
841 : // Otherwise, return the type itself.
842 : Type*
843 4062034 : deref()
844 : {
845 6018628 : Type* pt = this->points_to();
846 4062034 : return pt != NULL ? pt : this;
847 : }
848 :
849 : const Type*
850 3312135 : deref() const
851 : {
852 3312135 : const Type* pt = this->points_to();
853 3312135 : return pt != NULL ? pt : this;
854 : }
855 :
856 : // Return true if this is the nil type. We don't use base() here,
857 : // because this can be called during parse, and there is no way to
858 : // name the nil type anyhow.
859 : bool
860 19558110 : is_nil_type() const
861 18475856 : { return this->classification_ == TYPE_NIL; }
862 :
863 : // Return true if this is the predeclared constant nil being used as
864 : // a type. This is what the parser produces for type switches which
865 : // use "case nil".
866 : bool
867 : is_nil_constant_as_type() const;
868 :
869 : // Return true if this is the return type of a function which
870 : // returns multiple values.
871 : bool
872 14730722 : is_call_multiple_result_type() const
873 14730722 : { return this->base()->classification_ == TYPE_CALL_MULTIPLE_RESULT; }
874 :
875 : // If this is a struct type, return it. Otherwise, return NULL.
876 : Struct_type*
877 53135728 : struct_type()
878 55301556 : { return this->convert<Struct_type, TYPE_STRUCT>(); }
879 :
880 : const Struct_type*
881 61013071 : struct_type() const
882 71943297 : { return this->convert<const Struct_type, TYPE_STRUCT>(); }
883 :
884 : // If this is an array type, return it. Otherwise, return NULL.
885 : Array_type*
886 21598110 : array_type()
887 24436479 : { return this->convert<Array_type, TYPE_ARRAY>(); }
888 :
889 : const Array_type*
890 105333276 : array_type() const
891 64926907 : { return this->convert<const Array_type, TYPE_ARRAY>(); }
892 :
893 : // Return whether if this is a slice type.
894 : bool
895 : is_slice_type() const;
896 :
897 : // If this is a map type, return it. Otherwise, return NULL.
898 : Map_type*
899 5324577 : map_type()
900 7468396 : { return this->convert<Map_type, TYPE_MAP>(); }
901 :
902 : const Map_type*
903 30040113 : map_type() const
904 30921092 : { return this->convert<const Map_type, TYPE_MAP>(); }
905 :
906 : // If this is a channel type, return it. Otherwise, return NULL.
907 : Channel_type*
908 4882596 : channel_type()
909 6980930 : { return this->convert<Channel_type, TYPE_CHANNEL>(); }
910 :
911 : const Channel_type*
912 7702429 : channel_type() const
913 21785830 : { return this->convert<const Channel_type, TYPE_CHANNEL>(); }
914 :
915 : // If this is an interface type, return it. Otherwise, return NULL.
916 : Interface_type*
917 32648751 : interface_type()
918 94519942 : { return this->convert<Interface_type, TYPE_INTERFACE>(); }
919 :
920 : const Interface_type*
921 7934963 : interface_type() const
922 21924400 : { return this->convert<const Interface_type, TYPE_INTERFACE>(); }
923 :
924 : // If this is a named type, return it. Otherwise, return NULL.
925 : Named_type*
926 : named_type();
927 :
928 : const Named_type*
929 : named_type() const;
930 :
931 : // If this is a forward declaration, return it. Otherwise, return
932 : // NULL.
933 : Forward_declaration_type*
934 270627826 : forward_declaration_type()
935 302012195 : { return this->convert_no_base<Forward_declaration_type, TYPE_FORWARD>(); }
936 :
937 : const Forward_declaration_type*
938 4398911216 : forward_declaration_type() const
939 : {
940 1302 : return this->convert_no_base<const Forward_declaration_type,
941 4395400325 : TYPE_FORWARD>();
942 : }
943 :
944 : // Return true if this type is not yet defined.
945 : bool
946 : is_undefined() const;
947 :
948 : // Return true if this is the unsafe.pointer type. We currently
949 : // represent that as pointer-to-void.
950 : bool
951 4523143 : is_unsafe_pointer_type() const
952 4523143 : { return this->points_to() != NULL && this->points_to()->is_void_type(); }
953 :
954 : // Return whether this type is stored directly in an interface's
955 : // data word.
956 : bool
957 : is_direct_iface_type() const;
958 :
959 : // Return a version of this type with any expressions copied, but
960 : // only if copying the expressions will affect the size of the type.
961 : // If there are no such expressions in the type (expressions can
962 : // only occur in array types), just return the same type. If any
963 : // expressions can not affect the size of the type, just return the
964 : // same type.
965 : Type*
966 : copy_expressions();
967 :
968 : // Look for field or method NAME for TYPE. Return an expression for
969 : // it, bound to EXPR.
970 : static Expression*
971 : bind_field_or_method(Gogo*, const Type* type, Expression* expr,
972 : const std::string& name, Location);
973 :
974 : // Return true if NAME is an unexported field or method of TYPE.
975 : static bool
976 : is_unexported_field_or_method(Gogo*, const Type*, const std::string&,
977 : std::vector<const Named_type*>*);
978 :
979 : // Convert the builtin named types.
980 : static void
981 : convert_builtin_named_types(Gogo*);
982 :
983 : // Return the backend representation of this type.
984 : Btype*
985 : get_backend(Gogo*);
986 :
987 : // Return a placeholder for the backend representation of the type.
988 : // This will return a type of the correct size, but for which some
989 : // of the fields may still need to be completed.
990 : Btype*
991 : get_backend_placeholder(Gogo*);
992 :
993 : // Finish the backend representation of a placeholder.
994 : void
995 : finish_backend(Gogo*, Btype*);
996 :
997 : // Build a type descriptor entry for this type. Return a pointer to
998 : // it. The location is the location which causes us to need the
999 : // entry.
1000 : Bexpression*
1001 : type_descriptor_pointer(Gogo* gogo, Location);
1002 :
1003 : // Build the Garbage Collection symbol for this type. Return a pointer to it.
1004 : Bexpression*
1005 : gc_symbol_pointer(Gogo* gogo);
1006 :
1007 : // Return whether this type needs a garbage collection program.
1008 : // Sets *PTRSIZE and *PTRDATA.
1009 : bool
1010 : needs_gcprog(Gogo*, int64_t* ptrsize, int64_t* ptrdata);
1011 :
1012 : // Return a ptrmask variable for this type.
1013 : Bvariable*
1014 : gc_ptrmask_var(Gogo*, int64_t ptrsize, int64_t ptrdata);
1015 :
1016 : // Return the type reflection string for this type.
1017 : std::string
1018 : reflection(Gogo*) const;
1019 :
1020 : // Add the backend name for the type to BNAME. This will add one or
1021 : // two name components. Identical types should have the same
1022 : // backend name.
1023 : void
1024 : backend_name(Gogo*, Backend_name* bname) const;
1025 :
1026 : // If the size of the type can be determined, set *PSIZE to the size
1027 : // in bytes and return true. Otherwise, return false. This queries
1028 : // the backend.
1029 : bool
1030 : backend_type_size(Gogo*, int64_t* psize);
1031 :
1032 : // If the alignment of the type can be determined, set *PALIGN to
1033 : // the alignment in bytes and return true. Otherwise, return false.
1034 : bool
1035 : backend_type_align(Gogo*, int64_t* palign);
1036 :
1037 : // If the alignment of a struct field of this type can be
1038 : // determined, set *PALIGN to the alignment in bytes and return
1039 : // true. Otherwise, return false.
1040 : bool
1041 : backend_type_field_align(Gogo*, int64_t* palign);
1042 :
1043 : // Determine the ptrdata size for the backend version of this type:
1044 : // the length of the prefix of the type that can contain a pointer
1045 : // value. If it can be determined, set *PPTRDATA to the value in
1046 : // bytes and return true. Otherwise, return false.
1047 : bool
1048 : backend_type_ptrdata(Gogo*, int64_t* pptrdata);
1049 :
1050 : // Determine the ptrdata size that we are going to set in the type
1051 : // descriptor. This is normally the same as backend_type_ptrdata,
1052 : // but differs if we use a gcprog for an array. The arguments and
1053 : // results are as for backend_type_ptrdata.
1054 : bool
1055 : descriptor_ptrdata(Gogo*, int64_t* pptrdata);
1056 :
1057 : // Whether the backend size is known.
1058 : bool
1059 : is_backend_type_size_known(Gogo*);
1060 :
1061 : // Return whether the type needs specially built type functions.
1062 : bool
1063 : needs_specific_type_functions(Gogo*);
1064 :
1065 : // Get the equality function for a type. Returns NULL if the type
1066 : // is not comparable.
1067 : Named_object*
1068 : equal_function(Gogo*, Named_type* name, Function_type* equal_fntype);
1069 :
1070 : // Get the hash function for a type. Returns NULL if the type is
1071 : // not comparable.
1072 : Named_object*
1073 : hash_function(Gogo*, Function_type* hash_fntype);
1074 :
1075 : // Write the equal function for a type.
1076 : void
1077 : write_equal_function(Gogo*, Named_type*, int64_t size,
1078 : const Backend_name*, Function_type* equal_fntype);
1079 :
1080 : // Write the hash function for a type.
1081 : void
1082 : write_hash_function(Gogo*, int64_t size, const Backend_name*,
1083 : Function_type* hash_fntype);
1084 :
1085 : // Return the alignment required by the memequalN function.
1086 : static int64_t memequal_align(Gogo*, int size);
1087 :
1088 : // Export the type.
1089 : void
1090 233155 : export_type(Export* exp) const
1091 233155 : { this->do_export(exp); }
1092 :
1093 : // Import a type.
1094 : static Type*
1095 : import_type(Import*);
1096 :
1097 : protected:
1098 : Type(Type_classification);
1099 :
1100 : // Functions implemented by the child class.
1101 :
1102 : // Message name.
1103 : virtual void
1104 : do_message_name(std::string*) const = 0;
1105 :
1106 : // Traverse the subtypes.
1107 : virtual int
1108 : do_traverse(Traverse*);
1109 :
1110 : // Verify the type.
1111 : virtual bool
1112 4406965 : do_verify(Gogo*)
1113 4406965 : { return true; }
1114 :
1115 : virtual bool
1116 2859963 : do_has_pointer() const
1117 2859963 : { return false; }
1118 :
1119 : virtual bool
1120 : do_compare_is_identity(Gogo*) = 0;
1121 :
1122 : virtual bool
1123 4043 : do_is_reflexive()
1124 4043 : { return true; }
1125 :
1126 : virtual bool
1127 1713 : do_needs_key_update()
1128 1713 : { return false; }
1129 :
1130 : virtual bool
1131 4056 : do_hash_might_panic()
1132 4056 : { return false; }
1133 :
1134 : virtual bool
1135 29702773 : do_in_heap() const
1136 29702773 : { return true; }
1137 :
1138 : virtual unsigned int
1139 : do_hash_for_method(Gogo*, int) const;
1140 :
1141 : virtual Btype*
1142 : do_get_backend(Gogo*) = 0;
1143 :
1144 : virtual Expression*
1145 : do_type_descriptor(Gogo*, Named_type* name) = 0;
1146 :
1147 : virtual void
1148 : do_reflection(Gogo*, std::string*) const = 0;
1149 :
1150 : virtual void
1151 : do_mangled_name(Gogo*, std::string*, bool*) const = 0;
1152 :
1153 : virtual void
1154 : do_export(Export*) const;
1155 :
1156 : // For children to call when they detect that they are in error.
1157 : void
1158 : set_is_error();
1159 :
1160 : // Return whether a method expects a pointer as the receiver.
1161 : static bool
1162 : method_expects_pointer(const Named_object*);
1163 :
1164 : // Finalize the methods for a type.
1165 : static void
1166 : finalize_methods(Gogo*, const Type*, Location, Methods**);
1167 :
1168 : // Return a method from a set of methods.
1169 : static Method*
1170 : method_function(const Methods*, const std::string& name,
1171 : bool* is_ambiguous);
1172 :
1173 : // A mapping from interfaces to the associated interface method
1174 : // tables for this type. This maps to a decl.
1175 : typedef Unordered_map_hash(Interface_type*, Expression*, Type_hash_identical,
1176 : Type_identical) Interface_method_tables;
1177 :
1178 : // Return a pointer to the interface method table for TYPE for the
1179 : // interface INTERFACE.
1180 : static Expression*
1181 : interface_method_table(Type* type,
1182 : Interface_type *interface, bool is_pointer,
1183 : Interface_method_tables** method_tables,
1184 : Interface_method_tables** pointer_tables);
1185 :
1186 : // Return a composite literal for the type descriptor entry for a
1187 : // type.
1188 : static Expression*
1189 : type_descriptor(Gogo*, Type*);
1190 :
1191 : // Return a composite literal for the type descriptor entry for
1192 : // TYPE, using NAME as the name of the type.
1193 : static Expression*
1194 : named_type_descriptor(Gogo*, Type* type, Named_type* name);
1195 :
1196 : // Return a composite literal for a plain type descriptor for this
1197 : // type with the given kind and name.
1198 : Expression*
1199 : plain_type_descriptor(Gogo*, int runtime_type_kind, Named_type* name);
1200 :
1201 : // Build a composite literal for the basic type descriptor.
1202 : Expression*
1203 : type_descriptor_constructor(Gogo*, int runtime_type_kind, Named_type*,
1204 : const Methods*, bool only_value_methods);
1205 :
1206 : // For the benefit of child class message name construction.
1207 : void
1208 89813 : append_message_name(const Type* type, std::string* ret) const
1209 89677 : { type->do_message_name(ret); }
1210 :
1211 : // For the benefit of child class reflection string generation.
1212 : void
1213 878844 : append_reflection(const Type* type, Gogo* gogo, std::string* ret) const
1214 571216 : { type->do_reflection(gogo, ret); }
1215 :
1216 : // For the benefit of child class mangling.
1217 : void
1218 9647869 : append_mangled_name(const Type* type, Gogo* gogo, std::string* ret,
1219 : bool *is_non_identifier) const
1220 7026586 : { type->do_mangled_name(gogo, ret, is_non_identifier); }
1221 :
1222 : // Return the backend representation for the underlying type of a
1223 : // named type.
1224 : static Btype*
1225 750407 : get_named_base_btype(Gogo* gogo, Type* base_type)
1226 750407 : { return base_type->get_btype_without_hash(gogo); }
1227 :
1228 : private:
1229 : // Convert to the desired type classification, or return NULL. This
1230 : // is a controlled dynamic_cast.
1231 : template<typename Type_class, Type_classification type_classification>
1232 : Type_class*
1233 484392907 : convert()
1234 : {
1235 476301885 : Type* base = this->base();
1236 484392907 : return (base->classification_ == type_classification
1237 484392907 : ? static_cast<Type_class*>(base)
1238 : : NULL);
1239 : }
1240 :
1241 : template<typename Type_class, Type_classification type_classification>
1242 : const Type_class*
1243 381465714 : convert() const
1244 : {
1245 381465023 : const Type* base = this->base();
1246 381465714 : return (base->classification_ == type_classification
1247 381465714 : ? static_cast<Type_class*>(base)
1248 : : NULL);
1249 : }
1250 :
1251 : template<typename Type_class, Type_classification type_classification>
1252 : Type_class*
1253 485193210 : convert_no_base()
1254 : {
1255 485193210 : return (this->classification_ == type_classification
1256 485193210 : ? static_cast<Type_class*>(this)
1257 : : NULL);
1258 : }
1259 :
1260 : template<typename Type_class, Type_classification type_classification>
1261 : const Type_class*
1262 5862952759 : convert_no_base() const
1263 : {
1264 5862952759 : return (this->classification_ == type_classification
1265 5838048031 : ? static_cast<Type_class*>(this)
1266 : : NULL);
1267 : }
1268 :
1269 : // Map unnamed types to type descriptor decls.
1270 : typedef Unordered_map_hash(const Type*, Bvariable*, Type_hash_identical,
1271 : Type_identical) Type_descriptor_vars;
1272 :
1273 : static Type_descriptor_vars type_descriptor_vars;
1274 :
1275 : // Build the type descriptor variable for this type.
1276 : void
1277 : make_type_descriptor_var(Gogo*);
1278 :
1279 : // Map unnamed types to type descriptor decls.
1280 : typedef Unordered_map_hash(const Type*, Bvariable*, Type_hash_identical,
1281 : Type_identical) GC_symbol_vars;
1282 :
1283 : static GC_symbol_vars gc_symbol_vars;
1284 :
1285 : // Map ptrmask symbol names to the ptrmask variable.
1286 : typedef Unordered_map(std::string, Bvariable*) GC_gcbits_vars;
1287 :
1288 : static GC_gcbits_vars gc_gcbits_vars;
1289 :
1290 : // Build the GC symbol for this type.
1291 : void
1292 : make_gc_symbol_var(Gogo*);
1293 :
1294 : // Return true if the type descriptor for this type should be
1295 : // defined in some other package. If NAME is not NULL, it is the
1296 : // name of this type. If this returns true it sets *PACKAGE to the
1297 : // package where the type descriptor is defined.
1298 : bool
1299 : type_descriptor_defined_elsewhere(Named_type* name, const Package** package);
1300 :
1301 : // Make a composite literal for the garbage collection program for
1302 : // this type.
1303 : Expression*
1304 : gcprog_constructor(Gogo*, int64_t ptrsize, int64_t ptrdata);
1305 :
1306 : // Build the hash function for a type that needs specific functions.
1307 : Named_object*
1308 : build_hash_function(Gogo*, int64_t size, Function_type* hash_fntype);
1309 :
1310 : // Build the equal function for a type that needs specific functions.
1311 : Named_object*
1312 : build_equal_function(Gogo*, Named_type*, int64_t size,
1313 : Function_type* equal_fntype);
1314 :
1315 : void
1316 : write_identity_hash(Gogo*, Named_object* function, int64_t size);
1317 :
1318 : void
1319 : write_identity_equal(Gogo*, Named_object* function, int64_t size);
1320 :
1321 : void
1322 : write_named_equal(Gogo*, Named_object* function, Named_type*);
1323 :
1324 : // Build a composite literal for the uncommon type information.
1325 : Expression*
1326 : uncommon_type_constructor(Gogo*, Type* uncommon_type,
1327 : Named_type*, const Methods*,
1328 : bool only_value_methods) const;
1329 :
1330 : // Build a composite literal for the methods.
1331 : Expression*
1332 : methods_constructor(Gogo*, Type* methods_type, const Methods*,
1333 : bool only_value_methods) const;
1334 :
1335 : // Build a composite literal for one method.
1336 : Expression*
1337 : method_constructor(Gogo*, Type* method_type, const std::string& name,
1338 : const Method*, bool only_value_methods) const;
1339 :
1340 : // Add all methods for TYPE to the list of methods for THIS.
1341 : static void
1342 : add_methods_for_type(const Type* type, const Method::Field_indexes*,
1343 : unsigned int depth, bool, bool,
1344 : std::vector<const Named_type*>*,
1345 : Methods*);
1346 :
1347 : static void
1348 : add_local_methods_for_type(const Named_type* type,
1349 : const Method::Field_indexes*,
1350 : unsigned int depth, bool, bool, Methods*);
1351 :
1352 : static void
1353 : add_embedded_methods_for_type(const Type* type,
1354 : const Method::Field_indexes*,
1355 : unsigned int depth, bool, bool,
1356 : std::vector<const Named_type*>*,
1357 : Methods*);
1358 :
1359 : static void
1360 : add_interface_methods_for_type(const Type* type,
1361 : const Method::Field_indexes*,
1362 : unsigned int depth, Methods*);
1363 :
1364 : // Build stub methods for a type.
1365 : static void
1366 : build_stub_methods(Gogo*, const Type* type, const Methods* methods,
1367 : Location);
1368 :
1369 : static void
1370 : build_one_stub_method(Gogo*, Method*, Named_object* stub,
1371 : const char* receiver_name, const Type* receiver_type,
1372 : const Typed_identifier_list*, bool is_varargs,
1373 : const Typed_identifier_list*, Location);
1374 :
1375 : // Build direct interface stub methods for a type.
1376 : static void
1377 : build_direct_iface_stub_methods(Gogo*, const Type*, Methods*, Location);
1378 :
1379 : static void
1380 : build_one_iface_stub_method(Gogo*, Method*, Named_object* stub, const char*,
1381 : const Typed_identifier_list*, bool,
1382 : const Typed_identifier_list*, Location);
1383 :
1384 : static void
1385 : add_return_from_results(Gogo*, Named_object* stub, Call_expression*,
1386 : const Typed_identifier_list*, Location);
1387 :
1388 : static Expression*
1389 : apply_field_indexes(Expression*, const Method::Field_indexes*,
1390 : Location, const Type**);
1391 :
1392 : // Look for a field or method named NAME in TYPE.
1393 : static bool
1394 : find_field_or_method(const Type* type, const std::string& name,
1395 : bool receiver_can_be_pointer,
1396 : std::vector<const Named_type*>*, int* level,
1397 : bool* is_method, bool* found_pointer_method,
1398 : std::string* ambig1, std::string* ambig2);
1399 :
1400 : // Helper function for is_direct_iface_type, to prevent infinite
1401 : // recursion.
1402 : bool
1403 : is_direct_iface_type_helper(Unordered_set(const Type*)*) const;
1404 :
1405 : // Get the backend representation for a type without looking in the
1406 : // hash table for identical types.
1407 : Btype*
1408 : get_btype_without_hash(Gogo*);
1409 :
1410 : // A backend type that may be a placeholder.
1411 : struct Type_btype_entry
1412 : {
1413 : Btype *btype;
1414 : bool is_placeholder;
1415 : };
1416 :
1417 : // A mapping from Type to Btype*, used to ensure that the backend
1418 : // representation of identical types is identical. This is only
1419 : // used for unnamed types.
1420 : typedef Unordered_map_hash(const Type*, Type_btype_entry,
1421 : Type_hash_identical, Type_identical) Type_btypes;
1422 :
1423 : static Type_btypes type_btypes;
1424 :
1425 : // A list of builtin named types.
1426 : static std::vector<Named_type*> named_builtin_types;
1427 :
1428 : // A map from types that need a specific hash or equality function
1429 : // to the hash or equality function.
1430 : typedef Unordered_map_hash(const Type*, Named_object*, Type_hash_identical,
1431 : Type_identical) Type_function;
1432 :
1433 : static Type_function type_hash_functions_table;
1434 : static Type_function type_equal_functions_table;
1435 :
1436 : // Cache for reusing existing pointer types; maps from pointed-to-type
1437 : // to pointer type.
1438 : typedef Unordered_map(Type*, Pointer_type*) Pointer_type_table;
1439 :
1440 : static Pointer_type_table pointer_types;
1441 :
1442 : // List of placeholder pointer types.
1443 : static std::vector<Type*> placeholder_pointers;
1444 :
1445 : // The type classification.
1446 : Type_classification classification_;
1447 : // The backend representation of the type, once it has been
1448 : // determined.
1449 : Btype* btype_;
1450 : // The type descriptor for this type. This starts out as NULL and
1451 : // is filled in as needed.
1452 : Bvariable* type_descriptor_var_;
1453 : // The GC symbol for this type. This starts out as NULL and
1454 : // is filled in as needed.
1455 : Bvariable* gc_symbol_var_;
1456 : };
1457 :
1458 : // Type hash table operations, treating aliases as identical to the
1459 : // types that they alias.
1460 :
1461 : class Type_hash_identical
1462 : {
1463 : public:
1464 : unsigned int
1465 4802206 : operator()(const Type* type) const
1466 : {
1467 4802206 : return type->hash_for_method(NULL,
1468 : Type::COMPARE_ERRORS | Type::COMPARE_TAGS);
1469 : }
1470 : };
1471 :
1472 : class Type_identical
1473 : {
1474 : public:
1475 : bool
1476 11773009 : operator()(const Type* t1, const Type* t2) const
1477 : {
1478 11773009 : return Type::are_identical(t1, t2,
1479 : Type::COMPARE_ERRORS | Type::COMPARE_TAGS,
1480 : NULL);
1481 : }
1482 : };
1483 :
1484 : // An identifier with a type.
1485 :
1486 21062275 : class Typed_identifier
1487 : {
1488 : public:
1489 17558684 : Typed_identifier(const std::string& name, Type* type,
1490 : Location location)
1491 34011605 : : name_(name), type_(type), location_(location), note_(NULL)
1492 : { }
1493 :
1494 : // Get the name.
1495 : const std::string&
1496 64469237 : name() const
1497 65038158 : { return this->name_; }
1498 :
1499 : // Get the type.
1500 : Type*
1501 675143823 : type() const
1502 240642211 : { return this->type_; }
1503 :
1504 : // Return the location where the name was seen. This is not always
1505 : // meaningful.
1506 : Location
1507 9831478 : location() const
1508 4941283 : { return this->location_; }
1509 :
1510 : // Set the type--sometimes we see the identifier before the type.
1511 : void
1512 356362 : set_type(Type* type)
1513 : {
1514 356362 : go_assert(this->type_ == NULL || type->is_error_type());
1515 356362 : this->type_ = type;
1516 356362 : }
1517 :
1518 : // Get the escape note.
1519 : std::string*
1520 1519024 : note() const
1521 1519024 : { return this->note_; }
1522 :
1523 : // Set the escape note.
1524 : void
1525 6418666 : set_note(const std::string& note)
1526 : {
1527 6418666 : if (this->note_ != NULL)
1528 9679 : go_assert(*this->note_ == note);
1529 : else
1530 12817974 : this->note_ = new std::string(note);
1531 6418666 : }
1532 :
1533 : private:
1534 : // Identifier name.
1535 : std::string name_;
1536 : // Type.
1537 : Type* type_;
1538 : // The location where the name was seen.
1539 : Location location_;
1540 : // Escape note for this typed identifier. Used when importing and exporting
1541 : // functions.
1542 : std::string* note_;
1543 : };
1544 :
1545 : // A list of Typed_identifiers.
1546 :
1547 681900 : class Typed_identifier_list
1548 : {
1549 : public:
1550 8056789 : Typed_identifier_list()
1551 8052143 : : entries_()
1552 84358 : { }
1553 :
1554 : // Whether the list is empty.
1555 : bool
1556 8755435 : empty() const
1557 8682484 : { return this->entries_.empty(); }
1558 :
1559 : // Return the number of entries in the list.
1560 : size_t
1561 7256461 : size() const
1562 9920142 : { return this->entries_.size(); }
1563 :
1564 : // Add an entry to the end of the list.
1565 : void
1566 11676389 : push_back(const Typed_identifier& td)
1567 11676389 : { this->entries_.push_back(td); }
1568 :
1569 : // Remove an entry from the end of the list.
1570 : void
1571 27401 : pop_back()
1572 27401 : { this->entries_.pop_back(); }
1573 :
1574 : // Set the type of entry I to TYPE.
1575 : void
1576 246947 : set_type(size_t i, Type* type)
1577 : {
1578 246947 : go_assert(i < this->entries_.size());
1579 246947 : this->entries_[i].set_type(type);
1580 246947 : }
1581 :
1582 : // Sort the entries by name.
1583 : void
1584 : sort_by_name();
1585 :
1586 : // Traverse types.
1587 : int
1588 : traverse(Traverse*) const;
1589 :
1590 : // Return the first and last elements.
1591 : Typed_identifier&
1592 22 : front()
1593 22 : { return this->entries_.front(); }
1594 :
1595 : const Typed_identifier&
1596 246818 : front() const
1597 246818 : { return this->entries_.front(); }
1598 :
1599 : Typed_identifier&
1600 27266 : back()
1601 27266 : { return this->entries_.back(); }
1602 :
1603 : const Typed_identifier&
1604 94685 : back() const
1605 94685 : { return this->entries_.back(); }
1606 :
1607 : Typed_identifier&
1608 72256 : at(size_t i)
1609 144512 : { return this->entries_.at(i); }
1610 :
1611 : const Typed_identifier&
1612 : at(size_t i) const
1613 : { return this->entries_.at(i); }
1614 :
1615 : void
1616 : set(size_t i, const Typed_identifier& t)
1617 : { this->entries_.at(i) = t; }
1618 :
1619 : void
1620 : resize(size_t c)
1621 : {
1622 : go_assert(c <= this->entries_.size());
1623 : this->entries_.resize(c, Typed_identifier("", NULL,
1624 : Linemap::unknown_location()));
1625 : }
1626 :
1627 : void
1628 124993 : reserve(size_t c)
1629 124993 : { this->entries_.reserve(c); }
1630 :
1631 : // Iterators.
1632 :
1633 : typedef std::vector<Typed_identifier>::iterator iterator;
1634 : typedef std::vector<Typed_identifier>::const_iterator const_iterator;
1635 :
1636 : iterator
1637 8174656 : begin()
1638 8174656 : { return this->entries_.begin(); }
1639 :
1640 : const_iterator
1641 138001885 : begin() const
1642 137570756 : { return this->entries_.begin(); }
1643 :
1644 : iterator
1645 22246206 : end()
1646 22240702 : { return this->entries_.end(); }
1647 :
1648 : const_iterator
1649 358129847 : end() const
1650 351339733 : { return this->entries_.end(); }
1651 :
1652 : // Return a copy of this list. This returns an independent copy of
1653 : // the vector, but does not copy the types.
1654 : Typed_identifier_list*
1655 : copy() const;
1656 :
1657 : private:
1658 : std::vector<Typed_identifier> entries_;
1659 : };
1660 :
1661 : // A type used to indicate a parsing error. This exists to simplify
1662 : // later error detection.
1663 :
1664 : class Error_type : public Type
1665 : {
1666 : public:
1667 237 : Error_type()
1668 237 : : Type(TYPE_ERROR)
1669 : { }
1670 :
1671 : protected:
1672 : void
1673 0 : do_message_name(std::string* ret) const
1674 0 : { ret->append("<ERROR>"); }
1675 :
1676 : bool
1677 0 : do_compare_is_identity(Gogo*)
1678 0 : { return false; }
1679 :
1680 : Btype*
1681 : do_get_backend(Gogo* gogo);
1682 :
1683 : Expression*
1684 : do_type_descriptor(Gogo*, Named_type*);
1685 :
1686 : void
1687 : do_reflection(Gogo*, std::string*) const;
1688 :
1689 : void
1690 : do_mangled_name(Gogo*, std::string*, bool*) const;
1691 : };
1692 :
1693 : // The void type.
1694 :
1695 : class Void_type : public Type
1696 : {
1697 : public:
1698 4646 : Void_type()
1699 4646 : : Type(TYPE_VOID)
1700 : { }
1701 :
1702 : protected:
1703 : void
1704 0 : do_message_name(std::string* ret) const
1705 0 : { ret->append("void"); }
1706 :
1707 : bool
1708 0 : do_compare_is_identity(Gogo*)
1709 0 : { return false; }
1710 :
1711 : Btype*
1712 : do_get_backend(Gogo* gogo);
1713 :
1714 : Expression*
1715 0 : do_type_descriptor(Gogo*, Named_type*)
1716 0 : { go_unreachable(); }
1717 :
1718 : void
1719 8296 : do_reflection(Gogo*, std::string*) const
1720 8296 : { }
1721 :
1722 : void
1723 : do_mangled_name(Gogo*, std::string*, bool*) const;
1724 : };
1725 :
1726 : // The boolean type.
1727 :
1728 : class Boolean_type : public Type
1729 : {
1730 : public:
1731 4646 : Boolean_type()
1732 4646 : : Type(TYPE_BOOLEAN)
1733 : { }
1734 :
1735 : protected:
1736 : void
1737 0 : do_message_name(std::string* ret) const
1738 0 : { ret->append("<untyped bool>"); }
1739 :
1740 : bool
1741 92458 : do_compare_is_identity(Gogo*)
1742 92458 : { return true; }
1743 :
1744 : Btype*
1745 : do_get_backend(Gogo* gogo);
1746 :
1747 : Expression*
1748 : do_type_descriptor(Gogo*, Named_type* name);
1749 :
1750 : // We should not be asked for the reflection string of a basic type.
1751 : void
1752 0 : do_reflection(Gogo*, std::string* ret) const
1753 0 : { ret->append("bool"); }
1754 :
1755 : void
1756 : do_mangled_name(Gogo*, std::string*, bool*) const;
1757 : };
1758 :
1759 : // The type of an integer.
1760 :
1761 : class Integer_type : public Type
1762 : {
1763 : public:
1764 : // Create a new integer type.
1765 : static Named_type*
1766 : create_integer_type(const char* name, bool is_unsigned, int bits,
1767 : int runtime_type_kind);
1768 :
1769 : // Look up an existing integer type.
1770 : static Named_type*
1771 : lookup_integer_type(const char* name);
1772 :
1773 : // Create an abstract integer type.
1774 : static Integer_type*
1775 : create_abstract_integer_type();
1776 :
1777 : // Create an abstract character type.
1778 : static Integer_type*
1779 : create_abstract_character_type();
1780 :
1781 : // Create an alias to an integer type.
1782 : static Named_type*
1783 : create_integer_type_alias(const char* name, Named_type* real_type);
1784 :
1785 : // Whether this is an abstract integer type.
1786 : bool
1787 5897705 : is_abstract() const
1788 5897705 : { return this->is_abstract_; }
1789 :
1790 : // Whether this is an unsigned type.
1791 : bool
1792 2660766 : is_unsigned() const
1793 2660766 : { return this->is_unsigned_; }
1794 :
1795 : // The number of bits.
1796 : int
1797 5032231 : bits() const
1798 5027585 : { return this->bits_; }
1799 :
1800 : // Whether this type is the same as T.
1801 : bool
1802 : is_identical(const Integer_type* t) const;
1803 :
1804 : // Whether this is the type "byte" or another name for "byte".
1805 : bool
1806 31073 : is_byte() const
1807 31073 : { return this->is_byte_; }
1808 :
1809 : // Mark this as the "byte" type.
1810 : void
1811 4646 : set_is_byte()
1812 4646 : { this->is_byte_ = true; }
1813 :
1814 : // Whether this is the type "rune" or another name for "rune".
1815 : bool
1816 449160 : is_rune() const
1817 449160 : { return this->is_rune_; }
1818 :
1819 : // Mark this as the "rune" type.
1820 : void
1821 6357 : set_is_rune()
1822 6357 : { this->is_rune_ = true; }
1823 :
1824 : protected:
1825 : void
1826 : do_message_name(std::string* ret) const;
1827 :
1828 : bool
1829 2320229 : do_compare_is_identity(Gogo*)
1830 2320229 : { return true; }
1831 :
1832 : unsigned int
1833 : do_hash_for_method(Gogo*, int) const;
1834 :
1835 : Btype*
1836 : do_get_backend(Gogo*);
1837 :
1838 : Expression*
1839 : do_type_descriptor(Gogo*, Named_type*);
1840 :
1841 : void
1842 : do_reflection(Gogo*, std::string*) const;
1843 :
1844 : void
1845 : do_mangled_name(Gogo*, std::string*, bool*) const;
1846 :
1847 : private:
1848 57463 : Integer_type(bool is_abstract, bool is_unsigned, int bits,
1849 : int runtime_type_kind)
1850 57463 : : Type(TYPE_INTEGER),
1851 57463 : is_abstract_(is_abstract), is_unsigned_(is_unsigned), is_byte_(false),
1852 57463 : is_rune_(false), bits_(bits), runtime_type_kind_(runtime_type_kind)
1853 : { }
1854 :
1855 : // Map names of integer types to the types themselves.
1856 : typedef std::map<std::string, Named_type*> Named_integer_types;
1857 : static Named_integer_types named_integer_types;
1858 :
1859 : // True if this is an abstract type.
1860 : bool is_abstract_;
1861 : // True if this is an unsigned type.
1862 : bool is_unsigned_;
1863 : // True if this is the byte type.
1864 : bool is_byte_;
1865 : // True if this is the rune type.
1866 : bool is_rune_;
1867 : // The number of bits.
1868 : int bits_;
1869 : // The runtime type code used in the type descriptor for this type.
1870 : int runtime_type_kind_;
1871 : };
1872 :
1873 : // The type of a floating point number.
1874 :
1875 : class Float_type : public Type
1876 : {
1877 : public:
1878 : // Create a new float type.
1879 : static Named_type*
1880 : create_float_type(const char* name, int bits, int runtime_type_kind);
1881 :
1882 : // Look up an existing float type.
1883 : static Named_type*
1884 : lookup_float_type(const char* name);
1885 :
1886 : // Create an abstract float type.
1887 : static Float_type*
1888 : create_abstract_float_type();
1889 :
1890 : // Whether this is an abstract float type.
1891 : bool
1892 182952 : is_abstract() const
1893 182952 : { return this->is_abstract_; }
1894 :
1895 : // The number of bits.
1896 : int
1897 142927 : bits() const
1898 142927 : { return this->bits_; }
1899 :
1900 : // Whether this type is the same as T.
1901 : bool
1902 : is_identical(const Float_type* t) const;
1903 :
1904 : protected:
1905 : void
1906 : do_message_name(std::string* ret) const;
1907 :
1908 : bool
1909 31164 : do_compare_is_identity(Gogo*)
1910 31164 : { return false; }
1911 :
1912 : bool
1913 31 : do_is_reflexive()
1914 31 : { return false; }
1915 :
1916 : // Distinction between +0 and -0 requires a key update.
1917 : bool
1918 31 : do_needs_key_update()
1919 31 : { return true; }
1920 :
1921 : unsigned int
1922 : do_hash_for_method(Gogo*, int) const;
1923 :
1924 : Btype*
1925 : do_get_backend(Gogo*);
1926 :
1927 : Expression*
1928 : do_type_descriptor(Gogo*, Named_type*);
1929 :
1930 : void
1931 : do_reflection(Gogo*, std::string*) const;
1932 :
1933 : void
1934 : do_mangled_name(Gogo*, std::string*, bool*) const;
1935 :
1936 : private:
1937 9771 : Float_type(bool is_abstract, int bits, int runtime_type_kind)
1938 9771 : : Type(TYPE_FLOAT),
1939 9771 : is_abstract_(is_abstract), bits_(bits),
1940 9771 : runtime_type_kind_(runtime_type_kind)
1941 : { }
1942 :
1943 : // Map names of float types to the types themselves.
1944 : typedef std::map<std::string, Named_type*> Named_float_types;
1945 : static Named_float_types named_float_types;
1946 :
1947 : // True if this is an abstract type.
1948 : bool is_abstract_;
1949 : // The number of bits in the floating point value.
1950 : int bits_;
1951 : // The runtime type code used in the type descriptor for this type.
1952 : int runtime_type_kind_;
1953 : };
1954 :
1955 : // The type of a complex number.
1956 :
1957 : class Complex_type : public Type
1958 : {
1959 : public:
1960 : // Create a new complex type.
1961 : static Named_type*
1962 : create_complex_type(const char* name, int bits, int runtime_type_kind);
1963 :
1964 : // Look up an existing complex type.
1965 : static Named_type*
1966 : lookup_complex_type(const char* name);
1967 :
1968 : // Create an abstract complex type.
1969 : static Complex_type*
1970 : create_abstract_complex_type();
1971 :
1972 : // Whether this is an abstract complex type.
1973 : bool
1974 23996 : is_abstract() const
1975 23996 : { return this->is_abstract_; }
1976 :
1977 : // The number of bits: 64 or 128.
1978 10808 : int bits() const
1979 10808 : { return this->bits_; }
1980 :
1981 : // Whether this type is the same as T.
1982 : bool
1983 : is_identical(const Complex_type* t) const;
1984 :
1985 : protected:
1986 : void
1987 : do_message_name(std::string*) const;
1988 :
1989 : bool
1990 11454 : do_compare_is_identity(Gogo*)
1991 11454 : { return false; }
1992 :
1993 : bool
1994 7 : do_is_reflexive()
1995 7 : { return false; }
1996 :
1997 : // Distinction between +0 and -0 requires a key update.
1998 : bool
1999 7 : do_needs_key_update()
2000 7 : { return true; }
2001 :
2002 : unsigned int
2003 : do_hash_for_method(Gogo*, int) const;
2004 :
2005 : Btype*
2006 : do_get_backend(Gogo*);
2007 :
2008 : Expression*
2009 : do_type_descriptor(Gogo*, Named_type*);
2010 :
2011 : void
2012 : do_reflection(Gogo*, std::string*) const;
2013 :
2014 : void
2015 : do_mangled_name(Gogo*, std::string*, bool*) const;
2016 :
2017 : private:
2018 9369 : Complex_type(bool is_abstract, int bits, int runtime_type_kind)
2019 9369 : : Type(TYPE_COMPLEX),
2020 9369 : is_abstract_(is_abstract), bits_(bits),
2021 9369 : runtime_type_kind_(runtime_type_kind)
2022 : { }
2023 :
2024 : // Map names of complex types to the types themselves.
2025 : typedef std::map<std::string, Named_type*> Named_complex_types;
2026 : static Named_complex_types named_complex_types;
2027 :
2028 : // True if this is an abstract type.
2029 : bool is_abstract_;
2030 : // The number of bits in the complex value--64 or 128.
2031 : int bits_;
2032 : // The runtime type code used in the type descriptor for this type.
2033 : int runtime_type_kind_;
2034 : };
2035 :
2036 : // The type of a string.
2037 :
2038 : class String_type : public Type
2039 : {
2040 : public:
2041 4646 : String_type()
2042 4646 : : Type(TYPE_STRING)
2043 : { }
2044 :
2045 : protected:
2046 : void
2047 32 : do_message_name(std::string* ret) const
2048 32 : { ret->append("<untyped string>"); }
2049 :
2050 : bool
2051 1268074 : do_has_pointer() const
2052 1268074 : { return true; }
2053 :
2054 : bool
2055 243690 : do_compare_is_identity(Gogo*)
2056 243690 : { return false; }
2057 :
2058 : // New string might have a smaller backing store.
2059 : bool
2060 2045 : do_needs_key_update()
2061 2045 : { return true; }
2062 :
2063 : Btype*
2064 : do_get_backend(Gogo*);
2065 :
2066 : Expression*
2067 : do_type_descriptor(Gogo*, Named_type*);
2068 :
2069 : void
2070 : do_reflection(Gogo*, std::string*) const;
2071 :
2072 : void
2073 : do_mangled_name(Gogo*, std::string*, bool*) const;
2074 :
2075 : private:
2076 : // The named string type.
2077 : static Named_type* string_type_;
2078 : };
2079 :
2080 : // The type of a function.
2081 :
2082 : class Function_type : public Type
2083 : {
2084 : public:
2085 7751675 : Function_type(Typed_identifier* receiver, Typed_identifier_list* parameters,
2086 : Typed_identifier_list* results, Location location)
2087 7751675 : : Type(TYPE_FUNCTION),
2088 7751675 : receiver_(receiver), parameters_(parameters), results_(results),
2089 7751675 : location_(location), is_varargs_(false), is_builtin_(false),
2090 7729919 : fnbtype_(NULL), is_tagged_(false)
2091 : { }
2092 :
2093 : // Get the receiver.
2094 : const Typed_identifier*
2095 6597456 : receiver() const
2096 6202113 : { return this->receiver_; }
2097 :
2098 : // Add an escape note for the receiver.
2099 : void
2100 56166 : add_receiver_note(int encoding)
2101 56166 : { this->receiver_->set_note(Escape_note::make_tag(encoding)); }
2102 :
2103 : // Get the return names and types.
2104 : const Typed_identifier_list*
2105 15138859 : results() const
2106 14638521 : { return this->results_; }
2107 :
2108 : // Get the parameter names and types.
2109 : const Typed_identifier_list*
2110 14188646 : parameters() const
2111 14095017 : { return this->parameters_; }
2112 :
2113 : // Add an escape note for the ith parameter.
2114 : void
2115 72256 : add_parameter_note(int index, int encoding)
2116 72256 : { this->parameters_->at(index).set_note(Escape_note::make_tag(encoding)); }
2117 :
2118 : // Whether this function has been tagged during escape analysis.
2119 : bool
2120 325465 : is_tagged() const
2121 325465 : { return this->is_tagged_; }
2122 :
2123 : // Mark this function as tagged after analyzing its escape.
2124 : void
2125 186612 : set_is_tagged()
2126 186612 : { this->is_tagged_ = true; }
2127 :
2128 : // Whether this is a varargs function.
2129 : bool
2130 12418753 : is_varargs() const
2131 12418753 : { return this->is_varargs_; }
2132 :
2133 : // Whether this is a builtin function.
2134 : bool
2135 7092257 : is_builtin() const
2136 7092257 : { return this->is_builtin_; }
2137 :
2138 : // The location where this type was defined.
2139 : Location
2140 1769909 : location() const
2141 1769909 : { return this->location_; }
2142 :
2143 : // Return whether this is a method type.
2144 : bool
2145 22469293 : is_method() const
2146 18546837 : { return this->receiver_ != NULL; }
2147 :
2148 : // Whether T is a valid redeclaration of this type. This is called
2149 : // when a function is declared more than once.
2150 : bool
2151 : is_valid_redeclaration(const Function_type* t, std::string*) const;
2152 :
2153 : // Whether this type is the same as T.
2154 : bool
2155 : is_identical(const Function_type* t, bool ignore_receiver, int flags,
2156 : std::string*) const;
2157 :
2158 : // Record that this is a varargs function.
2159 : void
2160 534755 : set_is_varargs()
2161 534755 : { this->is_varargs_ = true; }
2162 :
2163 : // Record that this is a builtin function.
2164 : void
2165 87805 : set_is_builtin()
2166 87805 : { this->is_builtin_ = true; }
2167 :
2168 : // Import a function type.
2169 : static Function_type*
2170 : do_import(Import*);
2171 :
2172 : // Return a copy of this type without a receiver. This is only
2173 : // valid for a method type.
2174 : Function_type*
2175 : copy_without_receiver() const;
2176 :
2177 : // Return a copy of this type with a receiver. This is used when an
2178 : // interface method is attached to a named or struct type.
2179 : Function_type*
2180 : copy_with_receiver(Type*) const;
2181 :
2182 : // Return a copy of this type with the receiver treated as the first
2183 : // parameter. If WANT_POINTER_RECEIVER is true, the receiver is
2184 : // forced to be a pointer.
2185 : Function_type*
2186 : copy_with_receiver_as_param(bool want_pointer_receiver) const;
2187 :
2188 : // Return a copy of this type ignoring any receiver and using dummy
2189 : // names for all parameters. This is used for thunks for method
2190 : // values.
2191 : Function_type*
2192 : copy_with_names() const;
2193 :
2194 : static Type*
2195 : make_function_type_descriptor_type();
2196 :
2197 : // Return the backend representation of this function type. This is used
2198 : // as the real type of a backend function declaration or defintion.
2199 : Btype*
2200 : get_backend_fntype(Gogo*);
2201 :
2202 : // Return whether this is a Backend_function_type.
2203 : virtual bool
2204 3461636 : is_backend_function_type() const
2205 3461636 : { return false; }
2206 :
2207 : // Append just the signature of the function type.
2208 : void
2209 : append_signature(std::string*) const;
2210 :
2211 : protected:
2212 : void
2213 : do_message_name(std::string*) const;
2214 :
2215 : int
2216 : do_traverse(Traverse*);
2217 :
2218 : // A function descriptor may be allocated on the heap.
2219 : bool
2220 861939 : do_has_pointer() const
2221 861939 : { return true; }
2222 :
2223 : bool
2224 96971 : do_compare_is_identity(Gogo*)
2225 96971 : { return false; }
2226 :
2227 : unsigned int
2228 : do_hash_for_method(Gogo*, int) const;
2229 :
2230 : Btype*
2231 : do_get_backend(Gogo*);
2232 :
2233 : Expression*
2234 : do_type_descriptor(Gogo*, Named_type*);
2235 :
2236 : void
2237 : do_reflection(Gogo*, std::string*) const;
2238 :
2239 : void
2240 : do_mangled_name(Gogo*, std::string*, bool*) const;
2241 :
2242 : void
2243 : do_export(Export*) const;
2244 :
2245 : private:
2246 : Expression*
2247 : type_descriptor_params(Type*, const Typed_identifier*,
2248 : const Typed_identifier_list*);
2249 :
2250 : // A mapping from a list of result types to a backend struct type.
2251 : class Results_hash
2252 : {
2253 : public:
2254 : unsigned int
2255 : operator()(const Typed_identifier_list*) const;
2256 : };
2257 :
2258 : class Results_equal
2259 : {
2260 : public:
2261 : bool
2262 : operator()(const Typed_identifier_list*,
2263 : const Typed_identifier_list*) const;
2264 : };
2265 :
2266 : typedef Unordered_map_hash(Typed_identifier_list*, Btype*,
2267 : Results_hash, Results_equal) Results_structs;
2268 :
2269 : static Results_structs results_structs;
2270 :
2271 : // The receiver name and type. This will be NULL for a normal
2272 : // function, non-NULL for a method.
2273 : Typed_identifier* receiver_;
2274 : // The parameter names and types.
2275 : Typed_identifier_list* parameters_;
2276 : // The result names and types. This will be NULL if no result was
2277 : // specified.
2278 : Typed_identifier_list* results_;
2279 : // The location where this type was defined. This exists solely to
2280 : // give a location for the fields of the struct if this function
2281 : // returns multiple values.
2282 : Location location_;
2283 : // Whether this function takes a variable number of arguments.
2284 : bool is_varargs_;
2285 : // Whether this is a special builtin function which can not simply
2286 : // be called. This is used for len, cap, etc.
2287 : bool is_builtin_;
2288 : // The backend representation of this type for backend function
2289 : // declarations and definitions.
2290 : Btype* fnbtype_;
2291 : // Whether this function has been analyzed by escape analysis. If this is
2292 : // TRUE, this function type's parameters contain a summary of the analysis.
2293 : bool is_tagged_;
2294 : };
2295 :
2296 : // The type of a function's backend representation.
2297 :
2298 : class Backend_function_type : public Function_type
2299 : {
2300 : public:
2301 21756 : Backend_function_type(Typed_identifier* receiver,
2302 : Typed_identifier_list* parameters,
2303 : Typed_identifier_list* results, Location location)
2304 21756 : : Function_type(receiver, parameters, results, location)
2305 : { }
2306 :
2307 : // Return whether this is a Backend_function_type. This overrides
2308 : // Function_type::is_backend_function_type.
2309 : bool
2310 23590 : is_backend_function_type() const
2311 23590 : { return true; }
2312 :
2313 : protected:
2314 : Btype*
2315 12275 : do_get_backend(Gogo* gogo)
2316 12275 : { return this->get_backend_fntype(gogo); }
2317 : };
2318 :
2319 : // The type of a pointer.
2320 :
2321 : class Pointer_type : public Type
2322 : {
2323 : public:
2324 1788259 : Pointer_type(Type* to_type)
2325 1788259 : : Type(TYPE_POINTER),
2326 1788259 : to_type_(to_type)
2327 : {}
2328 :
2329 : Type*
2330 76527961 : points_to() const
2331 76527961 : { return this->to_type_; }
2332 :
2333 : // Import a pointer type.
2334 : static Pointer_type*
2335 : do_import(Import*);
2336 :
2337 : static Type*
2338 : make_pointer_type_descriptor_type();
2339 :
2340 : protected:
2341 : void
2342 : do_message_name(std::string*) const;
2343 :
2344 : int
2345 : do_traverse(Traverse*);
2346 :
2347 : bool
2348 1428467 : do_verify(Gogo* gogo)
2349 1428467 : { return this->to_type_->verify(gogo); }
2350 :
2351 : // If this is a pointer to a type that can't be in the heap, then
2352 : // the garbage collector does not have to look at this, so pretend
2353 : // that this is not a pointer at all.
2354 : bool
2355 2393098 : do_has_pointer() const
2356 2393098 : { return this->to_type_->in_heap(); }
2357 :
2358 : bool
2359 651653 : do_compare_is_identity(Gogo*)
2360 651653 : { return true; }
2361 :
2362 : unsigned int
2363 : do_hash_for_method(Gogo*, int) const;
2364 :
2365 : Btype*
2366 : do_get_backend(Gogo*);
2367 :
2368 : Expression*
2369 : do_type_descriptor(Gogo*, Named_type*);
2370 :
2371 : void
2372 : do_reflection(Gogo*, std::string*) const;
2373 :
2374 : void
2375 : do_mangled_name(Gogo*, std::string*, bool*) const;
2376 :
2377 : void
2378 : do_export(Export*) const;
2379 :
2380 : private:
2381 : // The type to which this type points.
2382 : Type* to_type_;
2383 : };
2384 :
2385 : // The nil type. We use a special type for nil because it is not the
2386 : // same as any other type. In C term nil has type void*, but there is
2387 : // no such type in Go.
2388 :
2389 : class Nil_type : public Type
2390 : {
2391 : public:
2392 4646 : Nil_type()
2393 4646 : : Type(TYPE_NIL)
2394 : { }
2395 :
2396 : protected:
2397 : void
2398 5 : do_message_name(std::string* ret) const
2399 5 : { ret->append("<NIL>"); }
2400 :
2401 : bool
2402 0 : do_compare_is_identity(Gogo*)
2403 0 : { return false; }
2404 :
2405 : Btype*
2406 : do_get_backend(Gogo* gogo);
2407 :
2408 : Expression*
2409 0 : do_type_descriptor(Gogo*, Named_type*)
2410 0 : { go_unreachable(); }
2411 :
2412 : void
2413 0 : do_reflection(Gogo*, std::string*) const
2414 0 : { go_unreachable(); }
2415 :
2416 : void
2417 : do_mangled_name(Gogo*, std::string*, bool*) const;
2418 : };
2419 :
2420 : // The type of a field in a struct.
2421 :
2422 11343957 : class Struct_field
2423 : {
2424 : public:
2425 3623993 : explicit Struct_field(const Typed_identifier& typed_identifier)
2426 3623993 : : typed_identifier_(typed_identifier), tag_(NULL), is_imported_(false)
2427 : { }
2428 :
2429 : // The field name.
2430 : const std::string&
2431 : field_name() const;
2432 :
2433 : // Return whether this struct field is named NAME.
2434 : bool
2435 : is_field_name(const std::string& name) const;
2436 :
2437 : // Return whether this struct field is an unexported field named NAME.
2438 : bool
2439 : is_unexported_field_name(Gogo*, const std::string& name) const;
2440 :
2441 : // Return whether this struct field is an embedded built-in type.
2442 : bool
2443 : is_embedded_builtin(Gogo*) const;
2444 :
2445 : // The field type.
2446 : Type*
2447 424884324 : type() const
2448 414188764 : { return this->typed_identifier_.type(); }
2449 :
2450 : // The field location.
2451 : Location
2452 3564169 : location() const
2453 3564169 : { return this->typed_identifier_.location(); }
2454 :
2455 : // Whether the field has a tag.
2456 : bool
2457 6836736 : has_tag() const
2458 5875413 : { return this->tag_ != NULL; }
2459 :
2460 : // The tag.
2461 : const std::string&
2462 72951 : tag() const
2463 : {
2464 72951 : go_assert(this->tag_ != NULL);
2465 72951 : return *this->tag_;
2466 : }
2467 :
2468 : // Whether this is an anonymous field.
2469 : bool
2470 29053325 : is_anonymous() const
2471 26021925 : { return this->typed_identifier_.name().empty(); }
2472 :
2473 : // Set the tag. FIXME: This is never freed.
2474 : void
2475 11522 : set_tag(const std::string& tag)
2476 11522 : { this->tag_ = new std::string(tag); }
2477 :
2478 : // Record that this field is defined in an imported struct.
2479 : void
2480 2204384 : set_is_imported()
2481 2204384 : { this->is_imported_ = true; }
2482 :
2483 : // Set the type. This is only used in error cases.
2484 : void
2485 3 : set_type(Type* type)
2486 3 : { this->typed_identifier_.set_type(type); }
2487 :
2488 : private:
2489 : // The field name, type, and location.
2490 : Typed_identifier typed_identifier_;
2491 : // The field tag. This is NULL if the field has no tag.
2492 : std::string* tag_;
2493 : // Whether this field is defined in an imported struct.
2494 : bool is_imported_;
2495 : };
2496 :
2497 : // A list of struct fields.
2498 :
2499 0 : class Struct_field_list
2500 : {
2501 : public:
2502 737401 : Struct_field_list()
2503 737401 : : entries_()
2504 : { }
2505 :
2506 : // Whether the list is empty.
2507 : bool
2508 19442 : empty() const
2509 19442 : { return this->entries_.empty(); }
2510 :
2511 : // Return the number of entries.
2512 : size_t
2513 2860475 : size() const
2514 2095967 : { return this->entries_.size(); }
2515 :
2516 : // Add an entry to the end of the list.
2517 : void
2518 3623993 : push_back(const Struct_field& sf)
2519 3623993 : { this->entries_.push_back(sf); }
2520 :
2521 : // Index into the list.
2522 : const Struct_field&
2523 14231443 : at(size_t i) const
2524 28462886 : { return this->entries_.at(i); }
2525 :
2526 : // Last entry in list.
2527 : Struct_field&
2528 1762 : back()
2529 1762 : { return this->entries_.back(); }
2530 :
2531 : // Iterators.
2532 :
2533 : typedef std::vector<Struct_field>::iterator iterator;
2534 : typedef std::vector<Struct_field>::const_iterator const_iterator;
2535 :
2536 : iterator
2537 57877912 : begin()
2538 57877912 : { return this->entries_.begin(); }
2539 :
2540 : const_iterator
2541 25850462 : begin() const
2542 25850462 : { return this->entries_.begin(); }
2543 :
2544 : iterator
2545 370161624 : end()
2546 370070835 : { return this->entries_.end(); }
2547 :
2548 : const_iterator
2549 141213343 : end() const
2550 134429406 : { return this->entries_.end(); }
2551 :
2552 : private:
2553 : std::vector<Struct_field> entries_;
2554 : };
2555 :
2556 : // The type of a struct.
2557 :
2558 : class Struct_type : public Type
2559 : {
2560 : public:
2561 737398 : Struct_type(Struct_field_list* fields, Location location)
2562 737398 : : Type(TYPE_STRUCT),
2563 737398 : fields_(fields), location_(location), all_methods_(NULL),
2564 737398 : is_struct_incomparable_(false), has_padding_(false),
2565 737398 : is_results_struct_(false)
2566 : { }
2567 :
2568 : // Return the field NAME. This only looks at local fields, not at
2569 : // embedded types. If the field is found, and PINDEX is not NULL,
2570 : // this sets *PINDEX to the field index. If the field is not found,
2571 : // this returns NULL.
2572 : const Struct_field*
2573 : find_local_field(const std::string& name, unsigned int *pindex) const;
2574 :
2575 : // Return the field number INDEX.
2576 : const Struct_field*
2577 14231443 : field(unsigned int index) const
2578 14231443 : { return &this->fields_->at(index); }
2579 :
2580 : // Get the struct fields.
2581 : const Struct_field_list*
2582 20532662 : fields() const
2583 20546303 : { return this->fields_; }
2584 :
2585 : // Return the number of fields.
2586 : size_t
2587 1255849 : field_count() const
2588 1255849 : { return this->fields_->size(); }
2589 :
2590 : // Location of struct definition.
2591 : Location
2592 0 : location() const
2593 0 : { return this->location_; }
2594 :
2595 : // Push a new field onto the end of the struct. This is used when
2596 : // building a closure variable.
2597 : void
2598 38530 : push_field(const Struct_field& sf)
2599 38530 : { this->fields_->push_back(sf); }
2600 :
2601 : // Return an expression referring to field NAME in STRUCT_EXPR, or
2602 : // NULL if there is no field with that name.
2603 : Field_reference_expression*
2604 : field_reference(Expression* struct_expr, const std::string& name,
2605 : Location) const;
2606 :
2607 : // Return the total number of fields, including embedded fields.
2608 : // This is the number of values that can appear in a conversion to
2609 : // this type.
2610 : unsigned int
2611 : total_field_count() const;
2612 :
2613 : // Whether this type is identical with T.
2614 : bool
2615 : is_identical(const Struct_type* t, int) const;
2616 :
2617 : // Return whether NAME is a local field which is not exported. This
2618 : // is only used for better error reporting.
2619 : bool
2620 : is_unexported_local_field(Gogo*, const std::string& name) const;
2621 :
2622 : // If this is an unnamed struct, build the complete list of methods,
2623 : // including those from anonymous fields, and build methods stubs if
2624 : // needed.
2625 : void
2626 : finalize_methods(Gogo*);
2627 :
2628 : // Return whether this type has any methods. This should only be
2629 : // called after the finalize_methods pass.
2630 : bool
2631 3404422 : has_any_methods() const
2632 3404422 : { return this->all_methods_ != NULL; }
2633 :
2634 : // Return the methods for this type. This should only be called
2635 : // after the finalize_methods pass.
2636 : const Methods*
2637 47137 : methods() const
2638 47137 : { return this->all_methods_; }
2639 :
2640 : // Return the method to use for NAME. This returns NULL if there is
2641 : // no such method or if the method is ambiguous. When it returns
2642 : // NULL, this sets *IS_AMBIGUOUS if the method name is ambiguous.
2643 : Method*
2644 : method_function(const std::string& name, bool* is_ambiguous) const;
2645 :
2646 : // Return a pointer to the interface method table for this type for
2647 : // the interface INTERFACE. If IS_POINTER is true, set the type
2648 : // descriptor to a pointer to this type, otherwise set it to this
2649 : // type.
2650 : Expression*
2651 : interface_method_table(Interface_type* interface, bool is_pointer);
2652 :
2653 : // Traverse just the field types of a struct type.
2654 : int
2655 1381288 : traverse_field_types(Traverse* traverse)
2656 1381288 : { return this->do_traverse(traverse); }
2657 :
2658 : // If the offset of field INDEX in the backend implementation can be
2659 : // determined, set *POFFSET to the offset in bytes and return true.
2660 : // Otherwise, return false.
2661 : bool
2662 : backend_field_offset(Gogo*, unsigned int index, int64_t* poffset);
2663 :
2664 : // Finish the backend representation of all the fields.
2665 : void
2666 : finish_backend_fields(Gogo*);
2667 :
2668 : // Import a struct type.
2669 : static Struct_type*
2670 : do_import(Import*);
2671 :
2672 : static Type*
2673 : make_struct_type_descriptor_type();
2674 :
2675 : // Return whether this is a generated struct that is not comparable.
2676 : bool
2677 1516423 : is_struct_incomparable() const
2678 1516423 : { return this->is_struct_incomparable_; }
2679 :
2680 : // Record that this is a generated struct that is not comparable.
2681 : void
2682 336440 : set_is_struct_incomparable()
2683 236332 : { this->is_struct_incomparable_ = true; }
2684 :
2685 : // Return whether this struct's backend type has padding, due to
2686 : // trailing zero-sized field.
2687 : bool
2688 1306076 : has_padding() const
2689 1306076 : { return this->has_padding_; }
2690 :
2691 : // Record that this struct's backend type has padding.
2692 : void
2693 1213 : set_has_padding()
2694 1213 : { this->has_padding_ = true; }
2695 :
2696 : // Return whether this is a results struct created to hold the
2697 : // results of a function that returns multiple results.
2698 : bool
2699 1197 : is_results_struct() const
2700 1197 : { return this->is_results_struct_; }
2701 :
2702 : // Record that this is a results struct.
2703 : void
2704 128324 : set_is_results_struct()
2705 128324 : { this->is_results_struct_ = true; }
2706 :
2707 : // Write the hash function for this type.
2708 : void
2709 : write_hash_function(Gogo*, Named_object* function, Function_type*);
2710 :
2711 : // Write the equality function for this type.
2712 : void
2713 : write_equal_function(Gogo*, Named_object* function, Named_type*);
2714 :
2715 : // Whether we can write this type to a C header file, to implement
2716 : // -fgo-c-header.
2717 : bool
2718 : can_write_to_c_header(std::vector<const Named_object*>*,
2719 : std::vector<const Named_object*>*) const;
2720 :
2721 : // Write this type to a C header file, to implement -fgo-c-header.
2722 : void
2723 : write_to_c_header(std::ostream&) const;
2724 :
2725 : protected:
2726 : void
2727 : do_message_name(std::string*) const;
2728 :
2729 : int
2730 : do_traverse(Traverse*);
2731 :
2732 : bool
2733 : do_verify(Gogo*);
2734 :
2735 : bool
2736 : do_has_pointer() const;
2737 :
2738 : bool
2739 : do_compare_is_identity(Gogo*);
2740 :
2741 : bool
2742 : do_is_reflexive();
2743 :
2744 : bool
2745 : do_needs_key_update();
2746 :
2747 : bool
2748 : do_hash_might_panic();
2749 :
2750 : bool
2751 : do_in_heap() const;
2752 :
2753 : unsigned int
2754 : do_hash_for_method(Gogo*, int) const;
2755 :
2756 : Btype*
2757 : do_get_backend(Gogo*);
2758 :
2759 : Expression*
2760 : do_type_descriptor(Gogo*, Named_type*);
2761 :
2762 : void
2763 : do_reflection(Gogo*, std::string*) const;
2764 :
2765 : void
2766 : do_mangled_name(Gogo*, std::string*, bool*) const;
2767 :
2768 : void
2769 : do_export(Export*) const;
2770 :
2771 : private:
2772 : bool
2773 : can_write_type_to_c_header(const Type*,
2774 : std::vector<const Named_object*>*,
2775 : std::vector<const Named_object*>*) const;
2776 :
2777 : void
2778 : write_field_to_c_header(std::ostream&, const std::string&, const Type*) const;
2779 :
2780 : // Used to merge method sets of identical unnamed structs.
2781 : typedef Unordered_map_hash(Struct_type*, Struct_type*, Type_hash_identical,
2782 : Type_identical) Identical_structs;
2783 :
2784 : static Identical_structs identical_structs;
2785 :
2786 : // Used to manage method tables for identical unnamed structs.
2787 : typedef std::pair<Interface_method_tables*, Interface_method_tables*>
2788 : Struct_method_table_pair;
2789 :
2790 : typedef Unordered_map_hash(Struct_type*, Struct_method_table_pair*,
2791 : Type_hash_identical, Type_identical)
2792 : Struct_method_tables;
2793 :
2794 : static Struct_method_tables struct_method_tables;
2795 :
2796 : // Used to avoid infinite loops in field_reference_depth.
2797 : struct Saw_named_type
2798 : {
2799 : Saw_named_type* next;
2800 : Named_type* nt;
2801 : };
2802 :
2803 : Field_reference_expression*
2804 : field_reference_depth(Expression* struct_expr, const std::string& name,
2805 : Location, Saw_named_type*,
2806 : unsigned int* depth) const;
2807 :
2808 : // The fields of the struct.
2809 : Struct_field_list* fields_;
2810 : // The place where the struct was declared.
2811 : Location location_;
2812 : // If this struct is unnamed, a list of methods.
2813 : Methods* all_methods_;
2814 : // True if this is a generated struct that is not considered to be
2815 : // comparable.
2816 : bool is_struct_incomparable_;
2817 : // True if this struct's backend type has padding, due to trailing
2818 : // zero-sized field.
2819 : bool has_padding_;
2820 : // True if this is a results struct created to hold the results of a
2821 : // function that returns multiple results.
2822 : bool is_results_struct_;
2823 : };
2824 :
2825 : // The type of an array.
2826 :
2827 : class Array_type : public Type
2828 : {
2829 : public:
2830 1014774 : Array_type(Type* element_type, Expression* length)
2831 1014774 : : Type(TYPE_ARRAY),
2832 1014774 : element_type_(element_type), length_(length), blength_(NULL),
2833 1014774 : issued_length_error_(false), is_array_incomparable_(false)
2834 : { }
2835 :
2836 : // Return the element type.
2837 : Type*
2838 21959812 : element_type() const
2839 21499267 : { return this->element_type_; }
2840 :
2841 : // Return the length. This will return NULL for a slice.
2842 : Expression*
2843 27956674 : length() const
2844 27925379 : { return this->length_; }
2845 :
2846 : // Store the length as an int64_t into *PLEN. Return false if the
2847 : // length can not be determined. This will assert if called for a
2848 : // slice.
2849 : bool
2850 : int_length(int64_t* plen) const;
2851 :
2852 : // Whether this type is identical with T.
2853 : bool
2854 : is_identical(const Array_type* t, int) const;
2855 :
2856 : // Return an expression for the pointer to the values in an array.
2857 : Expression*
2858 : get_value_pointer(Gogo*, Expression* array) const;
2859 :
2860 : // Return an expression for the length of an array with this type.
2861 : Expression*
2862 : get_length(Gogo*, Expression* array) const;
2863 :
2864 : // Return an expression for the capacity of an array with this type.
2865 : Expression*
2866 : get_capacity(Gogo*, Expression* array) const;
2867 :
2868 : // Import an array type.
2869 : static Array_type*
2870 : do_import(Import*);
2871 :
2872 : // Return the backend representation of the element type.
2873 : Btype*
2874 : get_backend_element(Gogo*, bool use_placeholder);
2875 :
2876 : // Return the backend representation of the length.
2877 : Bexpression*
2878 : get_backend_length(Gogo*);
2879 :
2880 : // Finish the backend representation of the element type.
2881 : void
2882 : finish_backend_element(Gogo*);
2883 :
2884 : static Type*
2885 : make_array_type_descriptor_type();
2886 :
2887 : static Type*
2888 : make_slice_type_descriptor_type();
2889 :
2890 : // Return whether this is a generated array that is not comparable.
2891 : bool
2892 744275 : is_array_incomparable() const
2893 744275 : { return this->is_array_incomparable_; }
2894 :
2895 : // Record that this is a generated array that is not comparable.
2896 : void
2897 472766 : set_is_array_incomparable()
2898 29984 : { this->is_array_incomparable_ = true; }
2899 :
2900 : // Write the hash function for this type.
2901 : void
2902 : write_hash_function(Gogo*, Named_object* function, Function_type*);
2903 :
2904 : // Write the equality function for this type.
2905 : void
2906 : write_equal_function(Gogo*, Named_object* function, Named_type*);
2907 :
2908 : protected:
2909 : void
2910 : do_message_name(std::string*) const;
2911 :
2912 : int
2913 : do_traverse(Traverse* traverse);
2914 :
2915 : bool
2916 : do_verify(Gogo*);
2917 :
2918 : bool
2919 : do_has_pointer() const;
2920 :
2921 : bool
2922 : do_compare_is_identity(Gogo*);
2923 :
2924 : bool
2925 93 : do_is_reflexive()
2926 : {
2927 93 : return this->length_ != NULL && this->element_type_->is_reflexive();
2928 : }
2929 :
2930 : bool
2931 93 : do_needs_key_update()
2932 93 : { return this->element_type_->needs_key_update(); }
2933 :
2934 : bool
2935 53 : do_hash_might_panic()
2936 53 : { return this->length_ != NULL && this->element_type_->hash_might_panic(); }
2937 :
2938 : bool
2939 4459839 : do_in_heap() const
2940 4459839 : { return this->length_ == NULL || this->element_type_->in_heap(); }
2941 :
2942 : unsigned int
2943 : do_hash_for_method(Gogo*, int) const;
2944 :
2945 : Btype*
2946 : do_get_backend(Gogo*);
2947 :
2948 : Expression*
2949 : do_type_descriptor(Gogo*, Named_type*);
2950 :
2951 : void
2952 : do_reflection(Gogo*, std::string*) const;
2953 :
2954 : void
2955 : do_mangled_name(Gogo*, std::string*, bool*) const;
2956 :
2957 : void
2958 : do_export(Export*) const;
2959 :
2960 : private:
2961 : bool
2962 : verify_length(Gogo*);
2963 :
2964 : Expression*
2965 : array_type_descriptor(Gogo*, Named_type*);
2966 :
2967 : Expression*
2968 : slice_type_descriptor(Gogo*, Named_type*);
2969 :
2970 : // The type of elements of the array.
2971 : Type* element_type_;
2972 : // The number of elements. This may be NULL.
2973 : Expression* length_;
2974 : // The backend representation of the length.
2975 : // We only want to compute this once.
2976 : Bexpression* blength_;
2977 : // Whether or not an invalid length error has been issued for this type,
2978 : // to avoid knock-on errors.
2979 : mutable bool issued_length_error_;
2980 : // True if this is a generated array that is not considered to be
2981 : // comparable.
2982 : bool is_array_incomparable_;
2983 : };
2984 :
2985 : // The type of a map.
2986 :
2987 : class Map_type : public Type
2988 : {
2989 : public:
2990 32050 : Map_type(Type* key_type, Type* val_type, Location location)
2991 32050 : : Type(TYPE_MAP),
2992 32050 : key_type_(key_type), val_type_(val_type), hmap_type_(NULL),
2993 32050 : bucket_type_(NULL), hiter_type_(NULL), location_(location)
2994 : { }
2995 :
2996 : // Return the key type.
2997 : Type*
2998 196699 : key_type() const
2999 172956 : { return this->key_type_; }
3000 :
3001 : // Return the value type.
3002 : Type*
3003 194076 : val_type() const
3004 194070 : { return this->val_type_; }
3005 :
3006 : // Return the type used for an iteration over this map.
3007 : Type*
3008 : hiter_type(Gogo*);
3009 :
3010 : // If this map requires the "fat" functions, returns the pointer to
3011 : // pass as the zero value to those functions. Otherwise, in the
3012 : // normal case, returns NULL.
3013 : Expression*
3014 : fat_zero_value(Gogo*);
3015 :
3016 : // Map algorithm to use for this map type. We may use specialized
3017 : // fast map routines for certain key types.
3018 : enum Map_alg
3019 : {
3020 : // 32-bit key.
3021 : MAP_ALG_FAST32,
3022 : // 32-bit pointer key.
3023 : MAP_ALG_FAST32PTR,
3024 : // 64-bit key.
3025 : MAP_ALG_FAST64,
3026 : // 64-bit pointer key.
3027 : MAP_ALG_FAST64PTR,
3028 : // String key.
3029 : MAP_ALG_FASTSTR,
3030 : // Anything else.
3031 : MAP_ALG_SLOW,
3032 : };
3033 :
3034 : Map_alg
3035 : algorithm(Gogo*);
3036 :
3037 : // Return whether VAR is the map zero value.
3038 : static bool
3039 : is_zero_value(Variable* var);
3040 :
3041 : // Return the backend representation of the map zero value.
3042 : static Bvariable*
3043 : backend_zero_value(Gogo*);
3044 :
3045 : // Whether this type is identical with T.
3046 : bool
3047 : is_identical(const Map_type* t, int) const;
3048 :
3049 : // Import a map type.
3050 : static Map_type*
3051 : do_import(Import*);
3052 :
3053 : static Type*
3054 : make_map_type_descriptor_type();
3055 :
3056 : // This must be in sync with libgo/go/runtime/map.go.
3057 : static const int bucket_size = 8;
3058 :
3059 : protected:
3060 : void
3061 : do_message_name(std::string*) const;
3062 :
3063 : int
3064 : do_traverse(Traverse*);
3065 :
3066 : bool
3067 : do_verify(Gogo*);
3068 :
3069 : bool
3070 103157 : do_has_pointer() const
3071 103157 : { return true; }
3072 :
3073 : bool
3074 4718 : do_compare_is_identity(Gogo*)
3075 4718 : { return false; }
3076 :
3077 : bool
3078 0 : do_is_reflexive()
3079 : {
3080 0 : return this->key_type_->is_reflexive() && this->val_type_->is_reflexive();
3081 : }
3082 :
3083 : unsigned int
3084 : do_hash_for_method(Gogo*, int) const;
3085 :
3086 : Btype*
3087 : do_get_backend(Gogo*);
3088 :
3089 : Expression*
3090 : do_type_descriptor(Gogo*, Named_type*);
3091 :
3092 : void
3093 : do_reflection(Gogo*, std::string*) const;
3094 :
3095 : void
3096 : do_mangled_name(Gogo*, std::string*, bool*) const;
3097 :
3098 : void
3099 : do_export(Export*) const;
3100 :
3101 : private:
3102 : // These must be in sync with libgo/go/runtime/map.go.
3103 : static const int max_key_size = 128;
3104 : static const int max_val_size = 128;
3105 : static const int max_zero_size = 1024;
3106 :
3107 : // Maps with value types larger than max_zero_size require passing a
3108 : // zero value pointer to the map functions.
3109 :
3110 : // The zero value variable.
3111 : static Named_object* zero_value;
3112 :
3113 : // The current size of the zero value.
3114 : static int64_t zero_value_size;
3115 :
3116 : // The current alignment of the zero value.
3117 : static int64_t zero_value_align;
3118 :
3119 : Type*
3120 : bucket_type(Gogo*, int64_t, int64_t);
3121 :
3122 : Type*
3123 : hmap_type(Type*);
3124 :
3125 : // The key type.
3126 : Type* key_type_;
3127 : // The value type.
3128 : Type* val_type_;
3129 : // The hashmap type. At run time a map is represented as a pointer
3130 : // to this type.
3131 : Type* hmap_type_;
3132 : // The bucket type, the type used to hold keys and values at run time.
3133 : Type* bucket_type_;
3134 : // The iterator type.
3135 : Type* hiter_type_;
3136 : // Where the type was defined.
3137 : Location location_;
3138 : };
3139 :
3140 : // The type of a channel.
3141 :
3142 : class Channel_type : public Type
3143 : {
3144 : public:
3145 14400 : Channel_type(bool may_send, bool may_receive, Type* element_type)
3146 14400 : : Type(TYPE_CHANNEL),
3147 14400 : may_send_(may_send), may_receive_(may_receive),
3148 14400 : element_type_(element_type)
3149 14400 : { go_assert(may_send || may_receive); }
3150 :
3151 : // Whether this channel can send data.
3152 : bool
3153 5716 : may_send() const
3154 5716 : { return this->may_send_; }
3155 :
3156 : // Whether this channel can receive data.
3157 : bool
3158 8177 : may_receive() const
3159 8177 : { return this->may_receive_; }
3160 :
3161 : // The type of the values that may be sent on this channel. This is
3162 : // NULL if any type may be sent.
3163 : Type*
3164 60187 : element_type() const
3165 60187 : { return this->element_type_; }
3166 :
3167 : // Whether this type is identical with T.
3168 : bool
3169 : is_identical(const Channel_type* t, int) const;
3170 :
3171 : // Import a channel type.
3172 : static Channel_type*
3173 : do_import(Import*);
3174 :
3175 : static Type*
3176 : make_chan_type_descriptor_type();
3177 :
3178 : static Type*
3179 : select_case_type();
3180 :
3181 : protected:
3182 : void
3183 : do_message_name(std::string*) const;
3184 :
3185 : int
3186 4041482 : do_traverse(Traverse* traverse)
3187 4041482 : { return Type::traverse(this->element_type_, traverse); }
3188 :
3189 : bool
3190 : do_verify(Gogo*);
3191 :
3192 : bool
3193 55948 : do_has_pointer() const
3194 55948 : { return true; }
3195 :
3196 : bool
3197 10124 : do_compare_is_identity(Gogo*)
3198 10124 : { return true; }
3199 :
3200 : unsigned int
3201 : do_hash_for_method(Gogo*, int) const;
3202 :
3203 : Btype*
3204 : do_get_backend(Gogo*);
3205 :
3206 : Expression*
3207 : do_type_descriptor(Gogo*, Named_type*);
3208 :
3209 : void
3210 : do_reflection(Gogo*, std::string*) const;
3211 :
3212 : void
3213 : do_mangled_name(Gogo*, std::string*, bool*) const;
3214 :
3215 : void
3216 : do_export(Export*) const;
3217 :
3218 : private:
3219 : // Whether this channel can send data.
3220 : bool may_send_;
3221 : // Whether this channel can receive data.
3222 : bool may_receive_;
3223 : // The types of elements which may be sent on this channel. If this
3224 : // is NULL, it means that any type may be sent.
3225 : Type* element_type_;
3226 : };
3227 :
3228 : // An interface type.
3229 :
3230 : class Interface_type : public Type
3231 : {
3232 : public:
3233 123312 : Interface_type(Typed_identifier_list* methods, Location location)
3234 123312 : : Type(TYPE_INTERFACE),
3235 123312 : parse_methods_(methods), all_methods_(NULL), location_(location),
3236 123312 : package_(NULL), interface_btype_(NULL), bmethods_(NULL),
3237 123312 : assume_identical_(NULL), methods_are_finalized_(false),
3238 123312 : bmethods_is_placeholder_(false), seen_(false)
3239 123312 : { go_assert(methods == NULL || !methods->empty()); }
3240 :
3241 : // The location where the interface type was defined.
3242 : Location
3243 175480 : location() const
3244 175480 : { return this->location_; }
3245 :
3246 : // The package where the interface type was defined. Returns NULL
3247 : // for the package currently being compiled.
3248 : Package*
3249 65903 : package() const
3250 65903 : { return this->package_; }
3251 :
3252 : // Return whether this is an empty interface.
3253 : bool
3254 871308 : is_empty() const
3255 : {
3256 871308 : go_assert(this->methods_are_finalized_);
3257 871308 : return this->all_methods_ == NULL;
3258 : }
3259 :
3260 : // Return the list of locally defined methods. This will return NULL
3261 : // for an empty interface. Embedded interfaces will appear in this
3262 : // list as an entry with no name.
3263 : const Typed_identifier_list*
3264 19094 : local_methods() const
3265 19094 : { return this->parse_methods_; }
3266 :
3267 : // Return the list of all methods. This will return NULL for an
3268 : // empty interface.
3269 : const Typed_identifier_list*
3270 : methods() const;
3271 :
3272 : // Return the number of methods.
3273 : size_t
3274 : method_count() const;
3275 :
3276 : // Return the method NAME, or NULL.
3277 : const Typed_identifier*
3278 : find_method(const std::string& name) const;
3279 :
3280 : // Return the zero-based index of method NAME.
3281 : size_t
3282 : method_index(const std::string& name) const;
3283 :
3284 : // Finalize the methods. This sets all_methods_. This handles
3285 : // interface inheritance.
3286 : void
3287 : finalize_methods();
3288 :
3289 : // Return true if T implements this interface. If this returns
3290 : // false, and REASON is not NULL, it sets *REASON to the reason that
3291 : // it fails.
3292 : bool
3293 : implements_interface(const Type* t, std::string* reason) const;
3294 :
3295 : // Whether this type is identical with T. REASON is as in
3296 : // implements_interface.
3297 : bool
3298 : is_identical(const Interface_type* t, int) const;
3299 :
3300 : // Whether we can assign T to this type. is_identical is known to
3301 : // be false.
3302 : bool
3303 : is_compatible_for_assign(const Interface_type*, std::string* reason) const;
3304 :
3305 : // Return whether NAME is a method which is not exported. This is
3306 : // only used for better error reporting.
3307 : bool
3308 : is_unexported_method(Gogo*, const std::string& name) const;
3309 :
3310 : // Import an interface type.
3311 : static Interface_type*
3312 : do_import(Import*);
3313 :
3314 : // Make a struct for an empty interface type.
3315 : static Btype*
3316 : get_backend_empty_interface_type(Gogo*);
3317 :
3318 : // Get a pointer to the backend representation of the method table.
3319 : Btype*
3320 : get_backend_methods(Gogo*);
3321 :
3322 : // Return a placeholder for the backend representation of the
3323 : // pointer to the method table.
3324 : Btype*
3325 : get_backend_methods_placeholder(Gogo*);
3326 :
3327 : // Finish the backend representation of the method types.
3328 : void
3329 : finish_backend_methods(Gogo*);
3330 :
3331 : static Type*
3332 : make_interface_type_descriptor_type();
3333 :
3334 : // Return whether methods are finalized for this interface.
3335 : bool
3336 0 : methods_are_finalized() const
3337 0 : { return this->methods_are_finalized_; }
3338 :
3339 : protected:
3340 : void
3341 : do_message_name(std::string*) const;
3342 :
3343 : int
3344 : do_traverse(Traverse*);
3345 :
3346 : bool
3347 1223290 : do_has_pointer() const
3348 1223290 : { return true; }
3349 :
3350 : bool
3351 231882 : do_compare_is_identity(Gogo*)
3352 231882 : { return false; }
3353 :
3354 : // Not reflexive if it contains a float.
3355 : bool
3356 415 : do_is_reflexive()
3357 415 : { return false; }
3358 :
3359 : // Distinction between +0 and -0 requires a key update if it
3360 : // contains a float.
3361 : bool
3362 403 : do_needs_key_update()
3363 403 : { return true; }
3364 :
3365 : // Hashing an unhashable type stored in an interface might panic.
3366 : bool
3367 16 : do_hash_might_panic()
3368 16 : { return true; }
3369 :
3370 : unsigned int
3371 : do_hash_for_method(Gogo*, int) const;
3372 :
3373 : Btype*
3374 : do_get_backend(Gogo*);
3375 :
3376 : Expression*
3377 : do_type_descriptor(Gogo*, Named_type*);
3378 :
3379 : void
3380 : do_reflection(Gogo*, std::string*) const;
3381 :
3382 : void
3383 : do_mangled_name(Gogo*, std::string*, bool*) const;
3384 :
3385 : void
3386 : do_export(Export*) const;
3387 :
3388 : private:
3389 : // This type guards against infinite recursion when comparing
3390 : // interface types. We keep a list of interface types assumed to be
3391 : // identical during comparison. We just keep the list on the stack.
3392 : // This permits us to compare cases like
3393 : // type I1 interface { F() interface{I1} }
3394 : // type I2 interface { F() interface{I2} }
3395 : struct Assume_identical
3396 : {
3397 : Assume_identical* next;
3398 : const Interface_type* t1;
3399 : const Interface_type* t2;
3400 : };
3401 :
3402 : bool
3403 : assume_identical(const Interface_type*, const Interface_type*) const;
3404 :
3405 : struct Bmethods_map_entry
3406 : {
3407 : Btype *btype;
3408 : bool is_placeholder;
3409 : };
3410 :
3411 : // A mapping from Interface_type to the backend type of its bmethods_,
3412 : // used to ensure that the backend representation of identical types
3413 : // is identical.
3414 : typedef Unordered_map_hash(const Interface_type*, Bmethods_map_entry,
3415 : Type_hash_identical, Type_identical) Bmethods_map;
3416 :
3417 : static Bmethods_map bmethods_map;
3418 :
3419 : // The list of methods associated with the interface from the
3420 : // parser. This will be NULL for the empty interface. This may
3421 : // include unnamed interface types.
3422 : Typed_identifier_list* parse_methods_;
3423 : // The list of all methods associated with the interface. This
3424 : // expands any interface types listed in methods_. It is set by
3425 : // finalize_methods. This will be NULL for the empty interface.
3426 : Typed_identifier_list* all_methods_;
3427 : // The location where the interface was defined.
3428 : Location location_;
3429 : // The package where the interface was defined. This is NULL for
3430 : // the package being compiled.
3431 : Package* package_;
3432 : // The backend representation of this type during backend conversion.
3433 : Btype* interface_btype_;
3434 : // The backend representation of the pointer to the method table.
3435 : Btype* bmethods_;
3436 : // A list of interface types assumed to be identical during
3437 : // interface comparison.
3438 : mutable Assume_identical* assume_identical_;
3439 : // Whether the methods have been finalized.
3440 : bool methods_are_finalized_;
3441 : // Whether the bmethods_ field is a placeholder.
3442 : bool bmethods_is_placeholder_;
3443 : // Used to avoid endless recursion in do_mangled_name.
3444 : mutable bool seen_;
3445 : };
3446 :
3447 : // The value we keep for a named type. This lets us get the right
3448 : // name when we convert to backend. Note that we don't actually keep
3449 : // the name here; the name is in the Named_object which points to
3450 : // this. This object exists to hold a unique backend representation for
3451 : // the type.
3452 :
3453 : class Named_type : public Type
3454 : {
3455 : public:
3456 784552 : Named_type(Named_object* named_object, Type* type, Location location)
3457 784552 : : Type(TYPE_NAMED),
3458 784552 : named_object_(named_object), in_function_(NULL), in_function_index_(0),
3459 784552 : type_(type), local_methods_(NULL), all_methods_(NULL),
3460 784552 : interface_method_tables_(NULL), pointer_interface_method_tables_(NULL),
3461 784552 : location_(location), named_btype_(NULL), dependencies_(),
3462 784552 : is_alias_(false), is_visible_(true), is_error_(false), in_heap_(true),
3463 784552 : is_placeholder_(false), is_converted_(false), is_verified_(false),
3464 784552 : seen_(false), seen_in_compare_is_identity_(false),
3465 784552 : seen_in_get_backend_(false), seen_alias_(false)
3466 784552 : { }
3467 :
3468 : // Return the associated Named_object. This holds the actual name.
3469 : Named_object*
3470 3521834 : named_object()
3471 3521834 : { return this->named_object_; }
3472 :
3473 : const Named_object*
3474 12741833 : named_object() const
3475 12741833 : { return this->named_object_; }
3476 :
3477 : // Set the Named_object. This is used when we see a type
3478 : // declaration followed by a type.
3479 : void
3480 586329 : set_named_object(Named_object* no)
3481 586329 : { this->named_object_ = no; }
3482 :
3483 : // Whether this is an alias (type T1 = T2) rather than an ordinary
3484 : // named type (type T1 T2).
3485 : bool
3486 138417583 : is_alias() const
3487 138417583 : { return this->is_alias_; }
3488 :
3489 : // Record that this type is an alias.
3490 : void
3491 27425 : set_is_alias()
3492 27425 : { this->is_alias_ = true; }
3493 :
3494 : // Mark this type as not permitted in the heap.
3495 : void
3496 23481 : set_not_in_heap()
3497 23481 : { this->in_heap_ = false; }
3498 :
3499 : // Return the function in which this type is defined. This will
3500 : // return NULL for a type defined in global scope.
3501 : const Named_object*
3502 1034073 : in_function(unsigned int *pindex) const
3503 : {
3504 1034073 : *pindex = this->in_function_index_;
3505 1034067 : return this->in_function_;
3506 : }
3507 :
3508 : // Set the function in which this type is defined.
3509 : void
3510 1295 : set_in_function(Named_object* f, unsigned int index)
3511 : {
3512 1295 : this->in_function_ = f;
3513 1295 : this->in_function_index_ = index;
3514 0 : }
3515 :
3516 : // Return the name of the type.
3517 : const std::string&
3518 : name() const;
3519 :
3520 : // Return the underlying type.
3521 : Type*
3522 5781364 : real_type()
3523 5781357 : { return this->type_; }
3524 :
3525 : const Type*
3526 17872604 : real_type() const
3527 17872604 : { return this->type_; }
3528 :
3529 : // Return the location.
3530 : Location
3531 424151 : location() const
3532 424151 : { return this->location_; }
3533 :
3534 : // Whether this type is visible. This only matters when parsing.
3535 : bool
3536 287320 : is_visible() const
3537 287320 : { return this->is_visible_; }
3538 :
3539 : // Mark this type as visible.
3540 : void
3541 175509 : set_is_visible()
3542 175509 : { this->is_visible_ = true; }
3543 :
3544 : // Mark this type as invisible.
3545 : void
3546 589952 : clear_is_visible()
3547 589952 : { this->is_visible_ = false; }
3548 :
3549 : // Whether this is a builtin type.
3550 : bool
3551 8507788 : is_builtin() const
3552 8507788 : { return Linemap::is_predeclared_location(this->location_); }
3553 :
3554 : // Whether this named type is valid. A recursive named type is invalid.
3555 : bool
3556 514797445 : is_valid() const
3557 514797445 : { return !this->is_error_; }
3558 :
3559 : // Return the base type for this type.
3560 : Type*
3561 : named_base();
3562 :
3563 : const Type*
3564 : named_base() const;
3565 :
3566 : // Return whether this is an error type.
3567 : bool
3568 : is_named_error_type() const;
3569 :
3570 : // Return whether this type is comparable. If REASON is not NULL,
3571 : // set *REASON when returning false.
3572 : bool
3573 : named_type_is_comparable(std::string* reason) const;
3574 :
3575 : // Add a method to this type.
3576 : Named_object*
3577 : add_method(const std::string& name, Function*);
3578 :
3579 : // Add a method declaration to this type.
3580 : Named_object*
3581 : add_method_declaration(const std::string& name, Package* package,
3582 : Function_type* type, Location location);
3583 :
3584 : // Add an existing method--one defined before the type itself was
3585 : // defined--to a type.
3586 : void
3587 : add_existing_method(Named_object*);
3588 :
3589 : // Look up a local method.
3590 : Named_object*
3591 : find_local_method(const std::string& name) const;
3592 :
3593 : // Return the list of local methods.
3594 : const Bindings*
3595 : local_methods() const;
3596 :
3597 : // Build the complete list of methods, including those from
3598 : // anonymous fields, and build method stubs if needed.
3599 : void
3600 : finalize_methods(Gogo*);
3601 :
3602 : // Return whether this type has any methods. This should only be
3603 : // called after the finalize_methods pass.
3604 : bool
3605 : has_any_methods() const;
3606 :
3607 : // Return the methods for this type. This should only be called
3608 : // after the finalized_methods pass.
3609 : const Methods*
3610 : methods() const;
3611 :
3612 : // Return the method to use for NAME. This returns NULL if there is
3613 : // no such method or if the method is ambiguous. When it returns
3614 : // NULL, this sets *IS_AMBIGUOUS if the method name is ambiguous.
3615 : Method*
3616 : method_function(const std::string& name, bool *is_ambiguous) const;
3617 :
3618 : // Return whether NAME is a known field or method which is not
3619 : // exported. This is only used for better error reporting.
3620 : bool
3621 : is_unexported_local_method(Gogo*, const std::string& name) const;
3622 :
3623 : // Return a pointer to the interface method table for this type for
3624 : // the interface INTERFACE. If IS_POINTER is true, set the type
3625 : // descriptor to a pointer to this type, otherwise set it to this
3626 : // type.
3627 : Expression*
3628 : interface_method_table(Interface_type* interface, bool is_pointer);
3629 :
3630 : // Note that a type must be converted to the backend representation
3631 : // before we convert this type.
3632 : void
3633 295636 : add_dependency(Named_type* nt)
3634 295636 : { this->dependencies_.push_back(nt); }
3635 :
3636 : // Return true if the size and alignment of the backend
3637 : // representation of this type is known. This is always true after
3638 : // types have been converted, but may be false beforehand.
3639 : bool
3640 12585567 : is_named_backend_type_size_known() const
3641 12585567 : { return this->named_btype_ != NULL && !this->is_placeholder_; }
3642 :
3643 : // Add to the reflection string as for Type::append_reflection, but
3644 : // if USE_ALIAS use the alias name rather than the alias target.
3645 : void
3646 : append_reflection_type_name(Gogo*, bool use_alias, std::string*) const;
3647 :
3648 : // Append the symbol type name as for Type::append_mangled_name,
3649 : // but if USE_ALIAS use the alias name rather than the alias target.
3650 : void
3651 : append_symbol_type_name(Gogo*, bool use_alias, std::string*,
3652 : bool* is_non_identifier) const;
3653 :
3654 : // Import a named type.
3655 : static void
3656 : import_named_type(Import*, Named_type**);
3657 :
3658 : // Initial conversion to backend representation.
3659 : void
3660 : convert(Gogo*);
3661 :
3662 : protected:
3663 : void
3664 : do_message_name(std::string* ret) const;
3665 :
3666 : int
3667 111330738 : do_traverse(Traverse* traverse)
3668 111330738 : { return Type::traverse(this->type_, traverse); }
3669 :
3670 : bool
3671 : do_verify(Gogo*);
3672 :
3673 : bool
3674 : do_has_pointer() const;
3675 :
3676 : bool
3677 : do_compare_is_identity(Gogo*);
3678 :
3679 : bool
3680 : do_is_reflexive();
3681 :
3682 : bool
3683 : do_needs_key_update();
3684 :
3685 : bool
3686 : do_in_heap() const;
3687 :
3688 : unsigned int
3689 : do_hash_for_method(Gogo*, int) const;
3690 :
3691 : Btype*
3692 : do_get_backend(Gogo*);
3693 :
3694 : Expression*
3695 : do_type_descriptor(Gogo*, Named_type*);
3696 :
3697 : void
3698 : do_reflection(Gogo*, std::string*) const;
3699 :
3700 : void
3701 : do_mangled_name(Gogo*, std::string*, bool*) const;
3702 :
3703 : void
3704 : do_export(Export*) const;
3705 :
3706 : private:
3707 : // Create the placeholder during conversion.
3708 : void
3709 : create_placeholder(Gogo*);
3710 :
3711 : // A pointer back to the Named_object for this type.
3712 : Named_object* named_object_;
3713 : // If this type is defined in a function, a pointer back to the
3714 : // function in which it is defined.
3715 : Named_object* in_function_;
3716 : // The index of this type in IN_FUNCTION_.
3717 : unsigned int in_function_index_;
3718 : // The actual type.
3719 : Type* type_;
3720 : // The list of methods defined for this type. Any named type can
3721 : // have methods.
3722 : Bindings* local_methods_;
3723 : // The full list of methods for this type, including methods
3724 : // declared for anonymous fields.
3725 : Methods* all_methods_;
3726 : // A mapping from interfaces to the associated interface method
3727 : // tables for this type.
3728 : Interface_method_tables* interface_method_tables_;
3729 : // A mapping from interfaces to the associated interface method
3730 : // tables for pointers to this type.
3731 : Interface_method_tables* pointer_interface_method_tables_;
3732 : // The location where this type was defined.
3733 : Location location_;
3734 : // The backend representation of this type during backend
3735 : // conversion. This is used to avoid endless recursion when a named
3736 : // type refers to itself.
3737 : Btype* named_btype_;
3738 : // A list of types which must be converted to the backend
3739 : // representation before this type can be converted. This is for
3740 : // cases like
3741 : // type S1 { p *S2 }
3742 : // type S2 { s S1 }
3743 : // where we can't convert S2 to the backend representation unless we
3744 : // have converted S1.
3745 : std::vector<Named_type*> dependencies_;
3746 : // Whether this is an alias type.
3747 : bool is_alias_;
3748 : // Whether this type is visible. This is false if this type was
3749 : // created because it was referenced by an imported object, but the
3750 : // type itself was not exported. This will always be true for types
3751 : // created in the current package.
3752 : bool is_visible_;
3753 : // Whether this type is erroneous.
3754 : bool is_error_;
3755 : // Whether this type is permitted in the heap. This is true by
3756 : // default, false if there is a magic //go:notinheap comment.
3757 : bool in_heap_;
3758 : // Whether the current value of named_btype_ is a placeholder for
3759 : // which the final size of the type is not known.
3760 : bool is_placeholder_;
3761 : // Whether this type has been converted to the backend
3762 : // representation. Implies that is_placeholder_ is false.
3763 : bool is_converted_;
3764 : // Whether this type has been verified.
3765 : bool is_verified_;
3766 : // In a recursive operation such as has_pointer, this flag is used
3767 : // to prevent infinite recursion when a type refers to itself. This
3768 : // is mutable because it is always reset to false when the function
3769 : // exits.
3770 : mutable bool seen_;
3771 : // Like seen_, but used only by do_compare_is_identity.
3772 : bool seen_in_compare_is_identity_;
3773 : // Like seen_, but used only by do_get_backend.
3774 : bool seen_in_get_backend_;
3775 : // Like seen_, but used when resolving aliases.
3776 : mutable bool seen_alias_;
3777 : };
3778 :
3779 : // A forward declaration. This handles a type which has been declared
3780 : // but not defined.
3781 :
3782 : class Forward_declaration_type : public Type
3783 : {
3784 : public:
3785 : Forward_declaration_type(Named_object* named_object);
3786 :
3787 : // The named object associated with this type declaration. This
3788 : // will be resolved.
3789 : Named_object*
3790 : named_object();
3791 :
3792 : const Named_object*
3793 : named_object() const;
3794 :
3795 : // Return the name of the type.
3796 : const std::string&
3797 : name() const;
3798 :
3799 : // Return the type to which this points. Give an error if the type
3800 : // has not yet been defined.
3801 : Type*
3802 : real_type();
3803 :
3804 : const Type*
3805 : real_type() const;
3806 :
3807 : // Whether the base type has been defined.
3808 : bool
3809 : is_defined() const;
3810 :
3811 : // Add a method to this type.
3812 : Named_object*
3813 : add_method(const std::string& name, Function*);
3814 :
3815 : // Add a method declaration to this type.
3816 : Named_object*
3817 : add_method_declaration(const std::string& name, Package*, Function_type*,
3818 : Location);
3819 :
3820 : // Add an already created object as a method to this type.
3821 : void
3822 : add_existing_method(Named_object*);
3823 :
3824 : protected:
3825 : void
3826 : do_message_name(std::string*) const;
3827 :
3828 : int
3829 : do_traverse(Traverse* traverse);
3830 :
3831 : bool
3832 : do_verify(Gogo*);
3833 :
3834 : bool
3835 3107472 : do_has_pointer() const
3836 3107472 : { return this->real_type()->has_pointer(); }
3837 :
3838 : bool
3839 354511 : do_compare_is_identity(Gogo* gogo)
3840 354511 : { return this->real_type()->compare_is_identity(gogo); }
3841 :
3842 : bool
3843 3207 : do_is_reflexive()
3844 3207 : { return this->real_type()->is_reflexive(); }
3845 :
3846 : bool
3847 3027 : do_needs_key_update()
3848 3027 : { return this->real_type()->needs_key_update(); }
3849 :
3850 : bool
3851 7990444 : do_in_heap() const
3852 7990444 : { return this->real_type()->in_heap(); }
3853 :
3854 : unsigned int
3855 12 : do_hash_for_method(Gogo* gogo, int flags) const
3856 12 : { return this->real_type()->hash_for_method(gogo, flags); }
3857 :
3858 : Btype*
3859 : do_get_backend(Gogo* gogo);
3860 :
3861 : Expression*
3862 : do_type_descriptor(Gogo*, Named_type*);
3863 :
3864 : void
3865 : do_reflection(Gogo*, std::string*) const;
3866 :
3867 : void
3868 : do_mangled_name(Gogo*, std::string*, bool*) const;
3869 :
3870 : void
3871 : do_export(Export*) const;
3872 :
3873 : private:
3874 : // Issue a warning about a use of an undefined type.
3875 : void
3876 : warn() const;
3877 :
3878 : // The type declaration.
3879 : Named_object* named_object_;
3880 : // Whether we have issued a warning about this type.
3881 : mutable bool warned_;
3882 : };
3883 :
3884 : // The Type_context struct describes what we expect for the type of an
3885 : // expression.
3886 :
3887 : struct Type_context
3888 : {
3889 : // The exact type we expect, if known. This may be NULL.
3890 : Type* type;
3891 : // Whether an abstract type is permitted.
3892 : bool may_be_abstract;
3893 :
3894 : // Constructors.
3895 14896568 : Type_context()
3896 14896568 : : type(NULL), may_be_abstract(false)
3897 : { }
3898 :
3899 31706456 : Type_context(Type* a_type, bool a_may_be_abstract)
3900 31706456 : : type(a_type), may_be_abstract(a_may_be_abstract)
3901 : { }
3902 : };
3903 :
3904 : #endif // !defined(GO_TYPES_H)
|