/* 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_pointerequal_descriptor
  __asm__ (GOSYM_PREFIX "runtime.pointerequal..f");

const struct _type unsafe_Pointer =
{
  /* size */
  sizeof (void *),
  /* ptrdata */
  sizeof (void *),
  /* hash */
  78501163U,
  /* tflag */
  tflagRegularMemory,
  /* align */
  __alignof (void *),
  /* fieldAlign */
  offsetof (struct field_align, p) - 1,
  /* kind */
  kindUnsafePointer | kindDirectIface,
  /* equal */
  &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,
    /* tflag */
    tflagRegularMemory,
    /* align */
    __alignof (void *),
    /* fieldAlign */
    offsetof (struct field_align, p) - 1,
    /* kind */
    kindPtr | kindDirectIface,
    /* equalfn */
    &runtime_pointerequal_descriptor,
    /* gcdata */
    pointer_unsafe_Pointer_gc,
    /* _string */
    &preflection_string,
    /* uncommontype */
    NULL,
    /* ptrToThis */
    NULL
  },
  /* elem */
  &unsafe_Pointer
};
