mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-13 23:10:26 -08:00
126 lines
2.8 KiB
C
126 lines
2.8 KiB
C
/* $HopeName: MMQA_harness!testlib:exfmt.h(trunk.3) $
|
|
exfmt.h
|
|
A format for the awl and amc pools, which will work without
|
|
register roots. To use it, you must take precautions. You must
|
|
register exfmt_root as a root, and unless you register the
|
|
registers and stack, you must register it as ambiguous (or
|
|
it might change before you can write the address of a newly
|
|
allocated object into another root). When you call getref or
|
|
setref, you must make sure that the objects concerned are
|
|
referenced ambiguously somewhere (this guarantees that they
|
|
won't move -- I asked richard and drj).
|
|
|
|
*/
|
|
|
|
#ifndef exfmt_h
|
|
#define exfmt_h
|
|
|
|
#include "testlib.h"
|
|
|
|
extern int formatcomments;
|
|
extern int checkcomments;
|
|
extern int countcomments;
|
|
extern int alloccomments;
|
|
extern int fixcomments;
|
|
extern int deathcomments;
|
|
extern int skipcomments;
|
|
extern int splurgeassoc; /* write to associated objects (but don't change) */
|
|
|
|
extern mps_addr_t exfmt_root;
|
|
|
|
/* the counters are visible so that I can check whether things
|
|
get moved etc
|
|
*/
|
|
|
|
enum {
|
|
SCANCALL_COUNT,
|
|
SCANOBJ_COUNT, /* = read objects scanned */
|
|
SCANPAD_COUNT, /* = pads scanned */
|
|
SCANHEART_COUNT, /* = hearts scanned */
|
|
COPY_COUNT,
|
|
SKIP_COUNT,
|
|
FWD_COUNT,
|
|
ISFWD_COUNT,
|
|
RESERVE_COUNT,
|
|
ALLOC_COUNT,
|
|
DYING_REFERENCE_COUNT,
|
|
PAD_COUNT /* must come last or array sizes will be too small */
|
|
};
|
|
|
|
extern int counters[PAD_COUNT+1];
|
|
extern int prevcounters[PAD_COUNT+1];
|
|
extern int maxcounters[PAD_COUNT+1];
|
|
|
|
long int maxcopy;
|
|
int freeze;
|
|
|
|
/* the object format is visible so tests that want to
|
|
can hack around with it
|
|
*/
|
|
|
|
#define MAXSIZE 10000
|
|
|
|
enum {MCpad=(int) 0x1, MCheart=(int) 0x2, MCdata=(int) 0x0};
|
|
|
|
enum {MCerrorid=(int) 0xE6606};
|
|
|
|
/* n.b. MCerrorid < 0x1000000 so it won't clash with id of
|
|
any ordinary object
|
|
*/
|
|
|
|
typedef union mycell mycell;
|
|
|
|
typedef mps_word_t tag;
|
|
|
|
struct pad {tag tag;};
|
|
|
|
struct heart {tag tag; mps_addr_t obj; size_t size;};
|
|
|
|
struct data
|
|
{
|
|
tag tag;
|
|
mycell *assoc;
|
|
size_t size;
|
|
long int id;
|
|
long int copycount;
|
|
long int numrefs;
|
|
int checkedflag;
|
|
int countflag;
|
|
struct refitem {mycell *addr; long int id;} ref[MAXSIZE];
|
|
};
|
|
|
|
union mycell
|
|
{
|
|
tag tag;
|
|
struct pad pad;
|
|
struct heart heart;
|
|
struct data data;
|
|
};
|
|
|
|
extern struct mps_fmt_A_s fmtA;
|
|
|
|
mycell *allocone(mps_ap_t ap, int size, int countflag);
|
|
mycell *allocdumb(mps_ap_t ap, size_t bytes, int countflag);
|
|
|
|
mps_addr_t getdata(mycell *obj);
|
|
void setref(mycell *obj, int n, mycell *to);
|
|
mycell *getref(mycell *obj, int n);
|
|
|
|
long int getid(mycell *obj);
|
|
long int getcopycount(mycell *obj);
|
|
long int getsize(mycell *obj);
|
|
|
|
void checkfrom(mycell *obj);
|
|
|
|
#define RC resetcounters()
|
|
#define UC updatecounters()
|
|
#define DC displaycounters()
|
|
#define DMC displaymaxcounters()
|
|
|
|
void resetcounters(void);
|
|
void updatecounters(void);
|
|
void displaycounters(void);
|
|
void displaymaxcounters(void);
|
|
|
|
#endif
|
|
|