1 /* go-type.h -- basic information for a Go type.
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. */
7 #ifndef LIBGO_GO_TYPE_H
8 #define LIBGO_GO_TYPE_H
17 /* Many of the types in this file must match the data structures
18 generated by the compiler, and must also match the Go types which
19 appear in go/runtime/type.go and go/reflect/type.go. */
21 /* Type kinds. These are used to get the type descriptor to use for
22 the type itself, when using unsafe.Typeof or unsafe.Reflect. The
23 values here must match the values generated by the compiler (the
24 RUNTIME_TYPE_KIND_xxx values in gcc/go/types.h). These are macros
25 rather than an enum to make it easy to change values in the future
26 and hard to get confused about it.
28 These correspond to the kind values used by the gc compiler. */
44 #define GO_COMPLEX64 15
45 #define GO_COMPLEX128 16
49 #define GO_INTERFACE 20
55 #define GO_UNSAFE_POINTER 26
57 #define GO_DIRECT_IFACE (1 << 5)
58 #define GO_GC_PROG (1 << 6)
59 #define GO_NO_POINTERS (1 << 7)
61 #define GO_CODE_MASK 0x1f
63 /* For each Go type the compiler constructs one of these structures.
64 This is used for type reflection, interfaces, maps, and reference
67 struct __go_type_descriptor
69 /* The size in bytes of a value of this type. Note that all types
70 in Go have a fixed size. */
73 /* The size of the memory prefix of a value of this type that holds
77 /* The type's hash code. */
80 /* The type code for this type, one of the type kind values above.
81 This is used by unsafe.Reflect and unsafe.Typeof to determine the
82 type descriptor to return for this type itself. It is also used
83 by reflect.toType when mapping to a reflect Type structure. */
86 /* The alignment in bytes of a variable with this type. */
87 unsigned char __align
;
89 /* The alignment in bytes of a struct field with this type. */
90 unsigned char __field_align
;
92 /* This function takes a pointer to a value of this type, and the
93 size of this type, and returns a hash code. We pass the size
94 explicitly becaues it means that we can share a single instance
95 of this function for various different types. */
96 const FuncVal
*__hashfn
;
98 /* This function takes two pointers to values of this type, and the
99 size of this type, and returns whether the values are equal. */
100 const FuncVal
*__equalfn
;
102 /* The garbage collection data. */
103 const byte
*__gcdata
;
105 /* A string describing this type. This is only used for
107 const struct String
*__reflection
;
109 /* A pointer to fields which are only used for some types. */
110 const struct __go_uncommon_type
*__uncommon
;
112 /* The descriptor for the type which is a pointer to this type.
114 const struct __go_type_descriptor
*__pointer_to_this
;
117 /* The information we store for each method of a type. */
121 /* The name of the method. */
122 const struct String
*__name
;
124 /* This is NULL for an exported method, or the name of the package
126 const struct String
*__pkg_path
;
128 /* The type of the method, without the receiver. This will be a
130 const struct __go_type_descriptor
*__mtype
;
132 /* The type of the method, with the receiver. This will be a
134 const struct __go_type_descriptor
*__type
;
136 /* A pointer to the code which implements the method. This is
137 really a function pointer. */
138 const void *__function
;
141 /* Additional information that we keep for named types and for types
144 struct __go_uncommon_type
146 /* The name of the type. */
147 const struct String
*__name
;
149 /* The type's package. This is NULL for builtin types. */
150 const struct String
*__pkg_path
;
152 /* The type's methods. This is an array of struct __go_method. */
153 struct __go_open_array __methods
;
156 /* The type descriptor for a fixed array type. */
158 struct __go_array_type
160 /* Starts like all type descriptors. */
161 struct __go_type_descriptor __common
;
163 /* The element type. */
164 struct __go_type_descriptor
*__element_type
;
166 /* The type of a slice of the same element type. */
167 struct __go_type_descriptor
*__slice_type
;
169 /* The length of the array. */
173 /* The type descriptor for a slice. */
175 struct __go_slice_type
177 /* Starts like all other type descriptors. */
178 struct __go_type_descriptor __common
;
180 /* The element type. */
181 struct __go_type_descriptor
*__element_type
;
184 /* The direction of a channel. */
185 #define CHANNEL_RECV_DIR 1
186 #define CHANNEL_SEND_DIR 2
187 #define CHANNEL_BOTH_DIR (CHANNEL_RECV_DIR | CHANNEL_SEND_DIR)
189 /* The type descriptor for a channel. */
191 struct __go_channel_type
193 /* Starts like all other type descriptors. */
194 struct __go_type_descriptor __common
;
196 /* The element type. */
197 const struct __go_type_descriptor
*__element_type
;
203 /* The type descriptor for a function. */
205 struct __go_func_type
207 /* Starts like all other type descriptors. */
208 struct __go_type_descriptor __common
;
210 /* Whether this is a varargs function. If this is true, there will
211 be at least one parameter. For "..." the last parameter type is
212 "interface{}". For "... T" the last parameter type is "[]T". */
215 /* The input parameter types. This is an array of pointers to
216 struct __go_type_descriptor. */
217 struct __go_open_array __in
;
219 /* The output parameter types. This is an array of pointers to
220 struct __go_type_descriptor. */
221 struct __go_open_array __out
;
224 /* A method on an interface type. */
226 struct __go_interface_method
228 /* The name of the method. */
229 const struct String
*__name
;
231 /* This is NULL for an exported method, or the name of the package
233 const struct String
*__pkg_path
;
235 /* The real type of the method. */
236 struct __go_type_descriptor
*__type
;
239 /* An interface type. */
241 struct __go_interface_type
243 /* Starts like all other type descriptors. */
244 struct __go_type_descriptor __common
;
246 /* Array of __go_interface_method . The methods are sorted in the
247 same order that they appear in the definition of the
249 struct __go_open_array __methods
;
256 /* Starts like all other type descriptors. */
257 struct __go_type_descriptor __common
;
259 /* The map key type. */
260 const struct __go_type_descriptor
*__key_type
;
262 /* The map value type. */
263 const struct __go_type_descriptor
*__val_type
;
265 /* The map bucket type. */
266 const struct __go_type_descriptor
*__bucket_type
;
268 /* The map header type. */
269 const struct __go_type_descriptor
*__hmap_type
;
271 /* The size of the key slot. */
274 /* Whether to store a pointer to key rather than the key itself. */
275 uint8_t __indirect_key
;
277 /* The size of the value slot. */
278 uint8_t __value_size
;
280 /* Whether to store a pointer to value rather than the value itself. */
281 uint8_t __indirect_value
;
283 /* The size of a bucket. */
284 uint16_t __bucket_size
;
286 /* Whether the key type is reflexive--whether k==k for all keys. */
287 _Bool __reflexive_key
;
289 /* Whether we should update the key when overwriting an entry. */
290 _Bool __need_key_update
;
293 /* A pointer type. */
297 /* Starts like all other type descriptors. */
298 struct __go_type_descriptor __common
;
300 /* The type to which this points. */
301 const struct __go_type_descriptor
*__element_type
;
304 /* A field in a structure. */
306 struct __go_struct_field
308 /* The name of the field--NULL for an anonymous field. */
309 const struct String
*__name
;
311 /* This is NULL for an exported method, or the name of the package
313 const struct String
*__pkg_path
;
315 /* The type of the field. */
316 const struct __go_type_descriptor
*__type
;
318 /* The field tag, or NULL. */
319 const struct String
*__tag
;
321 /* The offset of the field in the struct. */
327 struct __go_struct_type
329 /* Starts like all other type descriptors. */
330 struct __go_type_descriptor __common
;
332 /* An array of struct __go_struct_field. */
333 struct __go_open_array __fields
;
336 /* Whether a type descriptor is a pointer. */
339 __go_is_pointer_type (const struct __go_type_descriptor
*td
)
341 return ((td
->__code
& GO_CODE_MASK
) == GO_PTR
342 || (td
->__code
& GO_CODE_MASK
) == GO_UNSAFE_POINTER
);
345 /* Call a type hash function, given the __hashfn value. */
347 static inline uintptr_t
348 __go_call_hashfn (const FuncVal
*hashfn
, const void *p
, uintptr_t seed
,
351 uintptr_t (*h
) (const void *, uintptr_t, uintptr_t) = (void *) hashfn
->fn
;
352 return __builtin_call_with_static_chain (h (p
, seed
, size
), hashfn
);
355 /* Call a type equality function, given the __equalfn value. */
358 __go_call_equalfn (const FuncVal
*equalfn
, const void *p1
, const void *p2
,
361 _Bool (*e
) (const void *, const void *, uintptr_t) = (void *) equalfn
->fn
;
362 return __builtin_call_with_static_chain (e (p1
, p2
, size
), equalfn
);
366 __go_type_descriptors_equal(const struct __go_type_descriptor
*,
367 const struct __go_type_descriptor
*);
369 #endif /* !defined(LIBGO_GO_TYPE_H) */