/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 2003-2011 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Phong Vo <[email protected]> *17* *18***********************************************************************/19#ifndef _VCDHDR_H20#define _VCDHDR_H 12122#include "vchdr.h"23#include "vcdelta.h"2425#define COPYMIN (4) /* min size for a COPY */2627/* assumed max sizes for various instruction types. The current Vcdiff28implementation only allows add+copy and copy+add instructions.29*/30#define VCD_ADDMAX 256 /* absolute max for a single ADD */31#define VCD_COPYMAX 256 /* absolute max for a single COPY */32#define VCD_ADDCOPY 16 /* absolute max for a merged ADD */33#define VCD_COPYADD 16 /* absolute max for a merged COPY */3435typedef struct _vcdiff_s Vcdiff_t;3637typedef struct _vcdcache_s Vcdcache_t;38typedef struct _vcdsave_s Vcdsave_t;3940typedef struct _vcdsize_s Vcdsize_t;41typedef struct _vcdindex_s Vcdindex_t;4243/* Tables used to compute merged ADD+COPY and COPY+ADD instructions. */44struct _vcdsize_s45{ ssize_t add; /* max single ADD size */46ssize_t copy[VCD_ADDR]; /* max single COPY size */47ssize_t add1[VCD_ADDR]; /* max ADD size in A+C */48ssize_t copy2[VCD_ADDR]; /* max COPY size in A+C */49ssize_t copy1[VCD_ADDR]; /* max COPY size in C+A */50ssize_t add2[VCD_ADDR]; /* max ADD size in C+A */51};52struct _vcdindex_s53{ Vcchar_t add[VCD_ADDMAX];54Vcchar_t copy[VCD_ADDR][VCD_COPYMAX];55Vcchar_t addcopy[VCD_ADDCOPY][VCD_ADDR][VCD_COPYADD];56Vcchar_t copyadd[VCD_ADDR][VCD_COPYADD][VCD_ADDCOPY];57};5859/* address caches to code COPY addresses */60struct _vcdcache_s61{ ssize_t s_near; /* size of near cache */62ssize_t* c_near; /* near address cache */63ssize_t n; /* index in near cache */64ssize_t s_same; /* size of same cache */65ssize_t* c_same; /* exact match cache */66};6768/* to store a saved instruction */69struct _vcdsave_s70{ ssize_t dtsz; /* size of ADD or COPY */71ssize_t addr; /* the address to code */72ssize_t mode; /* address encoding mode */73};7475/* the Vcdiff/undiff handle */76struct _vcdiff_s77{ Vclzparse_t vcpa;7879Vcdcache_t* cache; /* address caches */80Vcdtable_t* table; /* code table for compression */81Vcdsave_t* save; /* saved instruction */8283Vcdsize_t* size;84Vcdindex_t* index;8586Vcio_t* data; /* unmatched data */87Vcio_t* inst; /* instruction data */88Vcio_t* addr; /* COPY address data */8990unsigned int flags; /* control flags */91};9293#define VCDINIT(vcd) \94( (vcd)->cache = NIL(Vcdcache_t*), \95(vcd)->table = NIL(Vcdtable_t*), \96(vcd)->save = NIL(Vcdsave_t*), \97(vcd)->size = NIL(Vcdsize_t*), \98(vcd)->index = NIL(Vcdindex_t*), \99(vcd)->data = NIL(Vcio_t*), \100(vcd)->inst = NIL(Vcio_t*), \101(vcd)->addr = NIL(Vcio_t*) \102)103104_BEGIN_EXTERNS_ /* private functions */105extern Vcdsize_t _Vcdsize;106extern Vcdindex_t _Vcdindex;107extern Vcdtable_t* _Vcdtbl;108109extern Vcdcache_t* vcdkaopen _ARG_((ssize_t, ssize_t));110extern void vcdkaclear _ARG_((Vcdcache_t*));111extern void vcdkaclose _ARG_((Vcdcache_t*));112extern ssize_t vcdkasetaddr _ARG_((Vcdcache_t*, ssize_t, ssize_t, ssize_t*));113extern ssize_t vcdkagetaddr _ARG_((Vcdcache_t*, Vcio_t*, ssize_t, ssize_t));114115extern Vcdtable_t* vcdbmtable();116extern int vcdbmputinst _ARG_((Vclzparse_t*, ssize_t, ssize_t, ssize_t, ssize_t, int));117118extern void _vcdtblinit _ARG_((void));119_END_EXTERNS_120121#endif /*_VDELHDR_H*/122123124