/* go-unsafe-pointer.c -- unsafe.Pointer type descriptor for Go.

   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.  */

#include <stddef.h>

#include "runtime.h"

/* This file provides the type descriptor for the unsafe.Pointer type.
   The unsafe package is defined by the compiler itself, which means
   that there is no package to compile to define the type
   descriptor.  */

extern const struct _type unsafe_Pointer
  __asm__ (GOSYM_PREFIX "unsafe.Pointer..d");

extern const byte unsafe_Pointer_gc[]
  __asm__ (GOSYM_PREFIX "unsafe.Pointer..g");

/* Used to determine the field alignment.  */
struct field_align
{
  char c;
  void *p;
};

/* The reflection string.  */
#define REFLECTION "unsafe.Pointer"
static const String reflection_string =
{
  (const byte *) REFLECTION,
  sizeof REFLECTION - 1
};

const byte unsafe_Pointer_gc[] = { 1 };

extern const FuncVal runtime_pointerhash_descriptor
  __asm__ (GOSYM_PREFIX "runtime.pointerhash..f");
extern const FuncVal runtime_pointerequal_descriptor
  __asm__ (GOSYM_PREFIX "runtime.pointerequal..f");

const struct _type unsafe_Pointer =
{
  /* size */
  sizeof (void *),
  /* ptrdata */
  sizeof (void *),
  /* hash */
  78501163U,
  /* kind */
  kindUnsafePointer | kindDirectIface,
  /* align */
  __alignof (void *),
  /* fieldAlign */
  offsetof (struct field_align, p) - 1,
  /* _ */
  0,
  /* hashfn */
  &runtime_pointerhash_descriptor,
  /* equalfn */
  &runtime_pointerequal_descriptor,
  /* gcdata */
  unsafe_Pointer_gc,
  /* _string */
  &reflection_string,
  /* uncommontype */
  NULL,
  /* ptrToThis */
  NULL
};

/* We also need the type descriptor for the pointer to unsafe.Pointer,
   since any package which refers to that type descriptor will expect
   it to be defined elsewhere.  */

extern const struct ptrtype pointer_unsafe_Pointer
  __asm__ (GOSYM_PREFIX "type...1unsafe.Pointer");

/* The reflection string.  */
#define PREFLECTION "*unsafe.Pointer"
static const String preflection_string =
{
  (const byte *) PREFLECTION,
  sizeof PREFLECTION - 1,
};

extern const byte pointer_unsafe_Pointer_gc[]
  __asm__ (GOSYM_PREFIX "type...1unsafe.Pointer..g");

const byte pointer_unsafe_Pointer_gc[] = { 1 };

const struct ptrtype pointer_unsafe_Pointer =
{
  /* type */
  {
    /* size */
    sizeof (void *),
    /* ptrdata */
    sizeof (void *),
    /* hash */
    1256018616U,
    /* kind */
    kindPtr | kindDirectIface,
    /* align */
    __alignof (void *),
    /* fieldAlign */
    offsetof (struct field_align, p) - 1,
    /* _ */
    0,
    /*_hashfn */
    &runtime_pointerhash_descriptor,
    /* equalfn */
    &runtime_pointerequal_descriptor,
    /* gcdata */
    pointer_unsafe_Pointer_gc,
    /* _string */
    &preflection_string,
    /* uncommontype */
    NULL,
    /* ptrToThis */
    NULL
  },
  /* elem */
  &unsafe_Pointer
};
