enum { Rgetputfield = 0x1 << 16, Rgetputstatic = 0x2 << 16, Rinvokeinterface = 0x3 << 16, Rinvokespecial = 0x4 << 16, Rinvokestatic = 0x5 << 16, Rinvokevirtual = 0x6 << 16, Rstaticmp = 0x8 << 16, Rspecialmp = 0x10 << 16, PSRC = 0x1 << 2, /* patch source operand */ PDST = 0x2 << 2, /* destination */ PMID = 0x3 << 2, /* middle */ PIMM = 0x0, /* patch immediate operand */ PSIND = 0x1, /* single indirect offset */ PDIND1 = 0x2, /* 1st offset of double indirect */ PDIND2 = 0x3, /* 2nd offset */ SAVEINST = 1, /* save Inst* for patching */ LTCODE = 0x1, /* load-time resolution code */ RTCODE = 0x2, /* run-time resolution code */ RTCALL = 0x4 /* call rtload() */}; /* special fields */#define RCLASS "@Class"#define RADT "@adt"#define RJEX "@jex"#define RMP "@mp"#define RNP "@np"#define ROBJ "@obj"#define RSYS "@sys" /* special class name */#define RLOADER "@Loader" typedef struct Ipatch Ipatch;typedef struct Freloc Freloc;typedef struct Creloc Creloc;typedef struct RTReloc RTReloc;typedef struct RTClass RTClass; struct Ipatch { int n; /* no. of significant elts. in pinfo & i */ int max; /* number of elements pinfo & i can hold */ int *pinfo; /* operand patch directives */ Inst **i; /* instructions to patch (runtime relocation) */}; /* * Load-time relocation. */ struct Freloc { char *field; /* field name */ char *sig; /* Java type signature */ uint flags; /* access flags */ Ipatch *ipatch; /* instruction patch information */ Freloc *next;}; struct Creloc { char *classname; Freloc *fr; Freloc *tail; int n; /* number of elements in 'fr' */}; /* * Run-time relocation. */ struct RTReloc { char *field; /* field name */ char *sig; /* Java type signature */ uint flags; /* access flags */ Ipatch *ipatch; /* instruction patch information */ RTReloc *next;}; struct RTClass { char *classname; RTReloc *rtr; RTReloc *tail; int n; /* number of elements in 'rtr' */ int off; /* Module Data offset */}; /* datarloc.c */extern void addDreloc(Inst*, int, int);extern void asmDreloc(int);extern void disDreloc(int);extern void addIpatch(Ipatch*, Inst*, int, int, int);extern void setIpatchtid(void);extern void asmIpatch(int, Ipatch*);extern void disIpatch(int, Ipatch*); /* ltreloc.c */extern void thisCreloc(void);extern Creloc *getCreloc(char*);extern Freloc *getFreloc(Creloc*, char*, char*, uint);extern void LTIpatch(Freloc*, Inst*, int, int);extern int LTrelocsize(void);extern void LTrelocdesc(uchar*);extern int asmCreloc(int);extern int disCreloc(int);extern int asmthisCreloc(int);extern int disthisCreloc(int);extern int doclinitinits; /* rtreloc.c */extern RTClass *getRTClass(char*);extern RTReloc *getRTReloc(RTClass*, char*, char*, uint);extern void RTIpatch(RTReloc*, Inst*, int, int);extern void RTfixoff(int);extern void doRTpatch(void);extern int RTrelocsize(void);extern void RTrelocdesc(uchar*, int);extern int asmRTClass(int);extern int disRTClass(int);
enum {
Rgetputfield = 0x1 << 16,
Rgetputstatic = 0x2 << 16,
Rinvokeinterface = 0x3 << 16,
Rinvokespecial = 0x4 << 16,
Rinvokestatic = 0x5 << 16,
Rinvokevirtual = 0x6 << 16,
Rstaticmp = 0x8 << 16,
Rspecialmp = 0x10 << 16,
PSRC = 0x1 << 2, /* patch source operand */
PDST = 0x2 << 2, /* destination */
PMID = 0x3 << 2, /* middle */
PIMM = 0x0, /* patch immediate operand */
PSIND = 0x1, /* single indirect offset */
PDIND1 = 0x2, /* 1st offset of double indirect */
PDIND2 = 0x3, /* 2nd offset */
SAVEINST = 1, /* save Inst* for patching */
LTCODE = 0x1, /* load-time resolution code */
RTCODE = 0x2, /* run-time resolution code */
RTCALL = 0x4 /* call rtload() */
};
/* special fields */
#define RCLASS "@Class"
#define RADT "@adt"
#define RJEX "@jex"
#define RMP "@mp"
#define RNP "@np"
#define ROBJ "@obj"
#define RSYS "@sys"
/* special class name */
#define RLOADER "@Loader"
typedef struct Ipatch Ipatch;
typedef struct Freloc Freloc;
typedef struct Creloc Creloc;
typedef struct RTReloc RTReloc;
typedef struct RTClass RTClass;
struct Ipatch {
int n; /* no. of significant elts. in pinfo & i */
int max; /* number of elements pinfo & i can hold */
int *pinfo; /* operand patch directives */
Inst **i; /* instructions to patch (runtime relocation) */
};
/*
* Load-time relocation.
*/
struct Freloc {
char *field; /* field name */
char *sig; /* Java type signature */
uint flags; /* access flags */
Ipatch *ipatch; /* instruction patch information */
Freloc *next;
};
struct Creloc {
char *classname;
Freloc *fr;
Freloc *tail;
int n; /* number of elements in 'fr' */
};
/*
* Run-time relocation.
*/
struct RTReloc {
char *field; /* field name */
char *sig; /* Java type signature */
uint flags; /* access flags */
Ipatch *ipatch; /* instruction patch information */
RTReloc *next;
};
struct RTClass {
char *classname;
RTReloc *rtr;
RTReloc *tail;
int n; /* number of elements in 'rtr' */
int off; /* Module Data offset */
};
/* datarloc.c */
extern void addDreloc(Inst*, int, int);
extern void asmDreloc(int);
extern void disDreloc(int);
extern void addIpatch(Ipatch*, Inst*, int, int, int);
extern void setIpatchtid(void);
extern void asmIpatch(int, Ipatch*);
extern void disIpatch(int, Ipatch*);
/* ltreloc.c */
extern void thisCreloc(void);
extern Creloc *getCreloc(char*);
extern Freloc *getFreloc(Creloc*, char*, char*, uint);
extern void LTIpatch(Freloc*, Inst*, int, int);
extern int LTrelocsize(void);
extern void LTrelocdesc(uchar*);
extern int asmCreloc(int);
extern int disCreloc(int);
extern int asmthisCreloc(int);
extern int disthisCreloc(int);
extern int doclinitinits;
/* rtreloc.c */
extern RTClass *getRTClass(char*);
extern RTReloc *getRTReloc(RTClass*, char*, char*, uint);
extern void RTIpatch(RTReloc*, Inst*, int, int);
extern void RTfixoff(int);
extern void doRTpatch(void);
extern int RTrelocsize(void);
extern void RTrelocdesc(uchar*, int);
extern int asmRTClass(int);
extern int disRTClass(int);