mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			370 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			370 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /* 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) */
 |