| /* go-type.h -- basic information for a Go type. |
| |
| Copyright 2009 The Go Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style |
| license that can be found in the LICENSE file. */ |
| |
| #ifndef LIBGO_GO_TYPE_H |
| #define LIBGO_GO_TYPE_H |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include "array.h" |
| |
| struct String; |
| |
| /* Many of the types in this file must match the data structures |
| generated by the compiler, and must also match the Go types which |
| appear in go/runtime/type.go and go/reflect/type.go. */ |
| |
| /* Type kinds. These are used to get the type descriptor to use for |
| the type itself, when using unsafe.Typeof or unsafe.Reflect. The |
| values here must match the values generated by the compiler (the |
| RUNTIME_TYPE_KIND_xxx values in gcc/go/types.h). These are macros |
| rather than an enum to make it easy to change values in the future |
| and hard to get confused about it. |
| |
| These correspond to the kind values used by the gc compiler. */ |
| |
| #define GO_BOOL 1 |
| #define GO_INT 2 |
| #define GO_INT8 3 |
| #define GO_INT16 4 |
| #define GO_INT32 5 |
| #define GO_INT64 6 |
| #define GO_UINT 7 |
| #define GO_UINT8 8 |
| #define GO_UINT16 9 |
| #define GO_UINT32 10 |
| #define GO_UINT64 11 |
| #define GO_UINTPTR 12 |
| #define GO_FLOAT32 13 |
| #define GO_FLOAT64 14 |
| #define GO_COMPLEX64 15 |
| #define GO_COMPLEX128 16 |
| #define GO_ARRAY 17 |
| #define GO_CHAN 18 |
| #define GO_FUNC 19 |
| #define GO_INTERFACE 20 |
| #define GO_MAP 21 |
| #define GO_PTR 22 |
| #define GO_SLICE 23 |
| #define GO_STRING 24 |
| #define GO_STRUCT 25 |
| #define GO_UNSAFE_POINTER 26 |
| |
| #define GO_DIRECT_IFACE (1 << 5) |
| #define GO_GC_PROG (1 << 6) |
| #define GO_NO_POINTERS (1 << 7) |
| |
| #define GO_CODE_MASK 0x1f |
| |
| /* For each Go type the compiler constructs one of these structures. |
| This is used for type reflection, interfaces, maps, and reference |
| counting. */ |
| |
| struct __go_type_descriptor |
| { |
| /* The size in bytes of a value of this type. Note that all types |
| in Go have a fixed size. */ |
| uintptr_t __size; |
| |
| /* The size of the memory prefix of a value of this type that holds |
| all pointers. */ |
| uintptr_t __ptrdata; |
| |
| /* The type's hash code. */ |
| uint32_t __hash; |
| |
| /* The type code for this type, one of the type kind values above. |
| This is used by unsafe.Reflect and unsafe.Typeof to determine the |
| type descriptor to return for this type itself. It is also used |
| by reflect.toType when mapping to a reflect Type structure. */ |
| unsigned char __code; |
| |
| /* The alignment in bytes of a variable with this type. */ |
| unsigned char __align; |
| |
| /* The alignment in bytes of a struct field with this type. */ |
| unsigned char __field_align; |
| |
| /* This function takes a pointer to a value of this type, and the |
| size of this type, and returns a hash code. We pass the size |
| explicitly becaues it means that we can share a single instance |
| of this function for various different types. */ |
| const FuncVal *__hashfn; |
| |
| /* This function takes two pointers to values of this type, and the |
| size of this type, and returns whether the values are equal. */ |
| const FuncVal *__equalfn; |
| |
| /* The garbage collection data. */ |
| const byte *__gcdata; |
| |
| /* A string describing this type. This is only used for |
| debugging. */ |
| const struct String *__reflection; |
| |
| /* A pointer to fields which are only used for some types. */ |
| const struct __go_uncommon_type *__uncommon; |
| |
| /* The descriptor for the type which is a pointer to this type. |
| This may be NULL. */ |
| const struct __go_type_descriptor *__pointer_to_this; |
| }; |
| |
| /* The information we store for each method of a type. */ |
| |
| struct __go_method |
| { |
| /* The name of the method. */ |
| const struct String *__name; |
| |
| /* This is NULL for an exported method, or the name of the package |
| where it lives. */ |
| const struct String *__pkg_path; |
| |
| /* The type of the method, without the receiver. This will be a |
| function type. */ |
| const struct __go_type_descriptor *__mtype; |
| |
| /* The type of the method, with the receiver. This will be a |
| function type. */ |
| const struct __go_type_descriptor *__type; |
| |
| /* A pointer to the code which implements the method. This is |
| really a function pointer. */ |
| const void *__function; |
| }; |
| |
| /* Additional information that we keep for named types and for types |
| with methods. */ |
| |
| struct __go_uncommon_type |
| { |
| /* The name of the type. */ |
| const struct String *__name; |
| |
| /* The type's package. This is NULL for builtin types. */ |
| const struct String *__pkg_path; |
| |
| /* The type's methods. This is an array of struct __go_method. */ |
| struct __go_open_array __methods; |
| }; |
| |
| /* The type descriptor for a fixed array type. */ |
| |
| struct __go_array_type |
| { |
| /* Starts like all type descriptors. */ |
| struct __go_type_descriptor __common; |
| |
| /* The element type. */ |
| struct __go_type_descriptor *__element_type; |
| |
| /* The type of a slice of the same element type. */ |
| struct __go_type_descriptor *__slice_type; |
| |
| /* The length of the array. */ |
| uintptr_t __len; |
| }; |
| |
| /* The type descriptor for a slice. */ |
| |
| struct __go_slice_type |
| { |
| /* Starts like all other type descriptors. */ |
| struct __go_type_descriptor __common; |
| |
| /* The element type. */ |
| struct __go_type_descriptor *__element_type; |
| }; |
| |
| /* The direction of a channel. */ |
| #define CHANNEL_RECV_DIR 1 |
| #define CHANNEL_SEND_DIR 2 |
| #define CHANNEL_BOTH_DIR (CHANNEL_RECV_DIR | CHANNEL_SEND_DIR) |
| |
| /* The type descriptor for a channel. */ |
| |
| struct __go_channel_type |
| { |
| /* Starts like all other type descriptors. */ |
| struct __go_type_descriptor __common; |
| |
| /* The element type. */ |
| const struct __go_type_descriptor *__element_type; |
| |
| /* The direction. */ |
| uintptr_t __dir; |
| }; |
| |
| /* The type descriptor for a function. */ |
| |
| struct __go_func_type |
| { |
| /* Starts like all other type descriptors. */ |
| struct __go_type_descriptor __common; |
| |
| /* Whether this is a varargs function. If this is true, there will |
| be at least one parameter. For "..." the last parameter type is |
| "interface{}". For "... T" the last parameter type is "[]T". */ |
| _Bool __dotdotdot; |
| |
| /* The input parameter types. This is an array of pointers to |
| struct __go_type_descriptor. */ |
| struct __go_open_array __in; |
| |
| /* The output parameter types. This is an array of pointers to |
| struct __go_type_descriptor. */ |
| struct __go_open_array __out; |
| }; |
| |
| /* A method on an interface type. */ |
| |
| struct __go_interface_method |
| { |
| /* The name of the method. */ |
| const struct String *__name; |
| |
| /* This is NULL for an exported method, or the name of the package |
| where it lives. */ |
| const struct String *__pkg_path; |
| |
| /* The real type of the method. */ |
| struct __go_type_descriptor *__type; |
| }; |
| |
| /* An interface type. */ |
| |
| struct __go_interface_type |
| { |
| /* Starts like all other type descriptors. */ |
| struct __go_type_descriptor __common; |
| |
| /* Array of __go_interface_method . The methods are sorted in the |
| same order that they appear in the definition of the |
| interface. */ |
| struct __go_open_array __methods; |
| }; |
| |
| /* A map type. */ |
| |
| struct __go_map_type |
| { |
| /* Starts like all other type descriptors. */ |
| struct __go_type_descriptor __common; |
| |
| /* The map key type. */ |
| const struct __go_type_descriptor *__key_type; |
| |
| /* The map value type. */ |
| const struct __go_type_descriptor *__val_type; |
| |
| /* The map bucket type. */ |
| const struct __go_type_descriptor *__bucket_type; |
| |
| /* The map header type. */ |
| const struct __go_type_descriptor *__hmap_type; |
| |
| /* The size of the key slot. */ |
| uint8_t __key_size; |
| |
| /* Whether to store a pointer to key rather than the key itself. */ |
| uint8_t __indirect_key; |
| |
| /* The size of the value slot. */ |
| uint8_t __value_size; |
| |
| /* Whether to store a pointer to value rather than the value itself. */ |
| uint8_t __indirect_value; |
| |
| /* The size of a bucket. */ |
| uint16_t __bucket_size; |
| |
| /* Whether the key type is reflexive--whether k==k for all keys. */ |
| _Bool __reflexive_key; |
| |
| /* Whether we should update the key when overwriting an entry. */ |
| _Bool __need_key_update; |
| }; |
| |
| /* A pointer type. */ |
| |
| struct __go_ptr_type |
| { |
| /* Starts like all other type descriptors. */ |
| struct __go_type_descriptor __common; |
| |
| /* The type to which this points. */ |
| const struct __go_type_descriptor *__element_type; |
| }; |
| |
| /* A field in a structure. */ |
| |
| struct __go_struct_field |
| { |
| /* The name of the field--NULL for an anonymous field. */ |
| const struct String *__name; |
| |
| /* This is NULL for an exported method, or the name of the package |
| where it lives. */ |
| const struct String *__pkg_path; |
| |
| /* The type of the field. */ |
| const struct __go_type_descriptor *__type; |
| |
| /* The field tag, or NULL. */ |
| const struct String *__tag; |
| |
| /* The offset of the field in the struct. */ |
| uintptr_t __offset; |
| }; |
| |
| /* A struct type. */ |
| |
| struct __go_struct_type |
| { |
| /* Starts like all other type descriptors. */ |
| struct __go_type_descriptor __common; |
| |
| /* An array of struct __go_struct_field. */ |
| struct __go_open_array __fields; |
| }; |
| |
| /* Whether a type descriptor is a pointer. */ |
| |
| static inline _Bool |
| __go_is_pointer_type (const struct __go_type_descriptor *td) |
| { |
| return ((td->__code & GO_CODE_MASK) == GO_PTR |
| || (td->__code & GO_CODE_MASK) == GO_UNSAFE_POINTER); |
| } |
| |
| /* Call a type hash function, given the __hashfn value. */ |
| |
| static inline uintptr_t |
| __go_call_hashfn (const FuncVal *hashfn, const void *p, uintptr_t seed, |
| uintptr_t size) |
| { |
| uintptr_t (*h) (const void *, uintptr_t, uintptr_t) = (void *) hashfn->fn; |
| return __builtin_call_with_static_chain (h (p, seed, size), hashfn); |
| } |
| |
| /* Call a type equality function, given the __equalfn value. */ |
| |
| static inline _Bool |
| __go_call_equalfn (const FuncVal *equalfn, const void *p1, const void *p2, |
| uintptr_t size) |
| { |
| _Bool (*e) (const void *, const void *, uintptr_t) = (void *) equalfn->fn; |
| return __builtin_call_with_static_chain (e (p1, p2, size), equalfn); |
| } |
| |
| extern _Bool |
| __go_type_descriptors_equal(const struct __go_type_descriptor*, |
| const struct __go_type_descriptor*); |
| |
| #endif /* !defined(LIBGO_GO_TYPE_H) */ |