/*! \file bin-file.h
 *
 * COPYRIGHT (c) 2019 The Fellowship of SML/NJ (http://www.smlnj.org)
 * All rights reserved.
 *
 * The layout is:
 *   header
 *   import PerIDs (16 bytes each)
 *   export PerIDs (16 bytes each)
 *   CM dependency information
 *   inlinable lambda expression
 *   reserved area 1 (typically empty)
 *   reserved area 2 (typically empty)
 *   code objects
 *     This section contains a sequence of code objects, each of
 *     which is lead by its size.  The individual sizes must sum up to
 *     codeSzB.
 *   pickled static environment
 */

#ifndef _BIN_FILE_
#define _BIN_FILE_

#ifndef _ML_BASE_
#include "ml-base.h"
#endif


/** Persistent IDs **/
#define PERID_LEN	16

typedef struct {	    /* a persistent ID (PerID) */
    Byte_t	bytes[PERID_LEN];
} pers_id_t;


typedef struct {	    /* The header of a .bin file; note that the fields */
			    /* are in big-endian representation. */
    Byte_t	magic[16];	/* magic number */
    Int32_t	importCnt;	/* the number of imported PerIDs. */
    Int32_t	exportCnt;	/* the number of exported PerIDs. */
    Int32_t	importSzB;	/* size of import tree area */
    Int32_t	cmInfoSzB;	/* the size of the CM dependency information area */
    Int32_t	lambdaSzB;	/* the size of inlinable lambda expressions */
    Int32_t	reserved;	/* reserved for future use */
    Int32_t	pad;	        /* padding for code segment alignment */
    Int32_t	codeSzB;	/* the number of bytes of code */
    Int32_t	envSzB;		/* the size of the environment */
} binfile_hdr_t;

#endif /* !_BIN_FILE_ */
