/* 
 * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
 * Copyright (c) 1991-1995 by Xerox Corporation.  All rights reserved.
 * Copyright (c) 1997 by Silicon Graphics.  All rights reserved.
 * Copyright (c) 1999 by Hewlett-Packard Company.  All rights reserved.
 *
 * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
 * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
 *
 * Permission is hereby granted to use or copy this program
 * for any purpose,  provided the above notices are retained on all copies.
 * Permission to modify the code and to distribute modified code is granted,
 * provided the above notices are retained, and a notice that the code was
 * modified is included with the above copyright notice.
 */

/*
 * This is mostly an internal header file.  Typical clients should
 * not use it.  Clients that define their own object kinds with
 * debugging allocators will probably want to include this, however.
 * No attempt is made to keep the namespace clean.  This should not be
 * included from header files that are frequently included by clients.
 */

#ifndef _DBG_MLC_H

#define _DBG_MLC_H

# define I_HIDE_POINTERS
# include "gc_priv.h"
# ifdef KEEP_BACK_PTRS
#   include "gc_backptr.h"
# endif

#ifndef HIDE_POINTER
  /* Gc.h was previously included, and hence the I_HIDE_POINTERS	*/
  /* definition had no effect.  Repeat the gc.h definitions here to	*/
  /* get them anyway.							*/
    typedef GC_word GC_hidden_pointer;
#   define HIDE_POINTER(p) (~(GC_hidden_pointer)(p))
#   define REVEAL_POINTER(p) ((GC_PTR)(HIDE_POINTER(p)))
#endif /* HIDE_POINTER */

# define START_FLAG ((word)0xfedcedcb)
# define END_FLAG ((word)0xbcdecdef)
	/* Stored both one past the end of user object, and one before	*/
	/* the end of the object as seen by the allocator.		*/

# if defined(KEEP_BACK_PTRS) || defined(PRINT_BLACK_LIST) \
     || defined(MAKE_BACK_GRAPH)
    /* Pointer "source"s that aren't real locations.	*/
    /* Used in oh_back_ptr fields and as "source"	*/
    /* argument to some marking functions.		*/
#	define NOT_MARKED (ptr_t)(0)
#	define MARKED_FOR_FINALIZATION (ptr_t)(2)
	    /* Object was marked because it is finalizable.	*/
#	define MARKED_FROM_REGISTER (ptr_t)(4)
	    /* Object was marked from a rgister.  Hence the	*/
	    /* source of the reference doesn't have an address.	*/
# endif /* KEEP_BACK_PTRS || PRINT_BLACK_LIST */

/* Object header */
typedef struct {
#   if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
	/* We potentially keep two different kinds of back 	*/
	/* pointers.  KEEP_BACK_PTRS stores a single back 	*/
	/* pointer in each reachable object to allow reporting	*/
	/* of why an object was retained.  MAKE_BACK_GRAPH	*/
	/* builds a graph containing the inverse of all 	*/
	/* "points-to" edges including those involving 		*/
	/* objects that have just become unreachable. This	*/
	/* allows detection of growing chains of unreachable	*/
	/* objects.  It may be possible to eventually combine	*/
	/* both, but for now we keep them separate.  Both	*/
	/* kinds of back pointers are hidden using the 		*/
	/* following macros.  In both cases, the plain version	*/
	/* is constrained to have an least significant bit of 1,*/
	/* to allow it to be distinguished from a free list 	*/
	/* link.  This means the plain version must have an	*/
	/* lsb of 0.						*/
	/* Note that blocks dropped by black-listing will	*/
	/* also have the lsb clear once debugging has		*/
	/* started.						*/
	/* We're careful never to overwrite a value with lsb 0.	*/
#       if ALIGNMENT == 1
	  /* Fudge back pointer to be even.  */
#	  define HIDE_BACK_PTR(p) HIDE_POINTER(~1 & (GC_word)(p))
#	else
#	  define HIDE_BACK_PTR(p) HIDE_POINTER(p)
#	endif
	
#       ifdef KEEP_BACK_PTRS
	  GC_hidden_pointer oh_back_ptr;
#	endif
#	ifdef MAKE_BACK_GRAPH
	  GC_hidden_pointer oh_bg_ptr;
#	endif
#	if defined(ALIGN_DOUBLE) && \
	    (defined(KEEP_BACK_PTRS) != defined(MAKE_BACK_GRAPH))
	  word oh_dummy;
#	endif
#   endif
    GC_CONST char * oh_string;	/* object descriptor string	*/
    word oh_int;		/* object descriptor integers	*/
#   ifdef NEED_CALLINFO
      struct callinfo oh_ci[NFRAMES];
#   endif
#   ifndef SHORT_DBG_HDRS
      word oh_sz;			/* Original malloc arg.		*/
      word oh_sf;			/* start flag */
#   endif /* SHORT_DBG_HDRS */
} oh;
/* The size of the above structure is assumed not to dealign things,	*/
/* and to be a multiple of the word length.				*/

#ifdef SHORT_DBG_HDRS
#   define DEBUG_BYTES (sizeof (oh))
#else
    /* Add space for END_FLAG, but use any extra space that was already	*/
    /* added to catch off-the-end pointers.				*/
#   define DEBUG_BYTES (sizeof (oh) + sizeof (word) - EXTRA_BYTES)
#endif
#define USR_PTR_FROM_BASE(p) ((ptr_t)(p) + sizeof(oh))

/* Round bytes to words without adding extra byte at end.	*/
#define SIMPLE_ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1) - 1)

#ifdef SAVE_CALL_CHAIN
#   define ADD_CALL_CHAIN(base, ra) GC_save_callers(((oh *)(base)) -> oh_ci)
#   define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci)
#else
# ifdef GC_ADD_CALLER
#   define ADD_CALL_CHAIN(base, ra) ((oh *)(base)) -> oh_ci[0].ci_pc = (ra)
#   define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci)
# else
#   define ADD_CALL_CHAIN(base, ra)
#   define PRINT_CALL_CHAIN(base)
# endif
#endif

# ifdef GC_ADD_CALLER
#   define OPT_RA ra,
# else
#   define OPT_RA
# endif


/* Check whether object with base pointer p has debugging info	*/ 
/* p is assumed to point to a legitimate object in our part	*/
/* of the heap.							*/
#ifdef SHORT_DBG_HDRS
# define GC_has_other_debug_info(p) TRUE
#else
  GC_bool GC_has_other_debug_info(/* p */);
#endif

#if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH)
# define GC_HAS_DEBUG_INFO(p) \
	((*((word *)p) & 1) && GC_has_other_debug_info(p))
#else
# define GC_HAS_DEBUG_INFO(p) GC_has_other_debug_info(p)
#endif

/* Store debugging info into p.  Return displaced pointer. */
/* Assumes we don't hold allocation lock.		   */
ptr_t GC_store_debug_info(/* p, sz, string, integer */);

#endif /* _DBG_MLC_H */
