#include <u.h>
#include <libc.h>
#include <bio.h>
#include "../2c/2.out.h"
#ifndef EXTERN
#define EXTERN extern
#endif
#define P ((Prog*)0)
#define S ((Sym*)0)
#define TNAME (curtext?curtext->from.sym->name:noname)
#define CPUT(c)\
{ *cbp++ = c;\
if(--cbc <= 0)\
cflush(); }
typedef struct Adr Adr;
typedef struct Prog Prog;
typedef struct Sym Sym;
typedef struct Auto Auto;
typedef struct Optab Optab;
struct Adr
{
short type;
uchar field;
union
{
struct
{
long u0displace;
long u0offset;
} s0;
char u0scon[8];
Prog *u0cond; /* not used, but should be D_BRANCH */
Ieee u0ieee;
} u0;
union
{
Auto* u1autom;
Sym* u1sym;
} u1;
};
#define displace u0.s0.u0displace
#define offset u0.s0.u0offset
#define scon u0.u0scon
#define cond u0.u0cond
#define ieee u0.u0ieee
#define autom u1.u1autom
#define sym u1.u1sym
struct Prog
{
Adr from;
Adr to;
union
{
long u0stkoff;
Prog *u0forwd;
} u0;
Prog* link;
Prog* pcond; /* work on this */
long pc;
long line;
short as;
uchar mark; /* work on these */
uchar back;
};
#define stkoff u0.u0stkoff
#define forwd u0.u0forwd
struct Auto
{
Sym* asym;
Auto* link;
long aoffset;
short type;
};
struct Sym
{
char *name;
short type;
short version;
short become;
short frame;
long value;
Sym* link;
};
struct Optab
{
short as;
short fas;
short srcsp;
short dstsp;
ushort optype;
ushort opcode0;
ushort opcode1;
ushort opcode2;
ushort opcode3;
};
enum
{
STEXT = 1,
SDATA,
SBSS,
SDATA1,
SXREF,
SAUTO,
SPARAM,
SFILE,
NHASH = 10007,
NHUNK = 100000,
MINSIZ = 4,
STRINGSZ = 200,
MAXIO = 8192,
MAXHIST = 20, /* limit of path elements for history symbols */
A6OFFSET = 32766,
};
EXTERN union
{
struct
{
char obuf[MAXIO]; /* output buffer */
uchar ibuf[MAXIO]; /* input buffer */
} u;
char dbuf[1];
} buf;
#define cbuf u.obuf
#define xbuf u.ibuf
#pragma varargck type "A" int
#pragma varargck type "D" Adr*
#pragma varargck type "P" Prog*
#pragma varargck type "R" int
#pragma varargck type "S" char*
EXTERN long HEADR;
EXTERN long HEADTYPE;
EXTERN long INITDAT;
EXTERN long INITRND;
EXTERN long INITTEXT;
EXTERN char* INITENTRY; /* entry point */
EXTERN Biobuf bso;
EXTERN long bsssize;
EXTERN long casepc;
EXTERN int cbc;
EXTERN char* cbp;
EXTERN int cout;
EXTERN Auto* curauto;
EXTERN Auto* curhist;
EXTERN Prog* curp;
EXTERN Prog* curtext;
EXTERN Prog* datap;
EXTERN long datsize;
EXTERN char debug[128];
EXTERN Prog* etextp;
EXTERN Prog* firstp;
EXTERN Prog* prog_divsl;
EXTERN Prog* prog_divul;
EXTERN Prog* prog_mull;
EXTERN Prog* prog_ccr;
EXTERN char fnuxi8[8];
EXTERN char gnuxi8[8];
EXTERN Sym* hash[NHASH];
EXTERN Sym* histfrog[MAXHIST];
EXTERN int histfrogp;
EXTERN int histgen;
EXTERN char* library[50];
EXTERN char* libraryobj[50];
EXTERN int libraryp;
EXTERN int xrefresolv;
EXTERN char* hunk;
EXTERN char inuxi1[1];
EXTERN char inuxi2[2];
EXTERN char inuxi4[4];
EXTERN Prog* lastp;
EXTERN long lcsize;
EXTERN long relocsize;
EXTERN long ndata;
EXTERN int nerrors;
EXTERN long nhunk;
EXTERN long nsymbol;
EXTERN char* noname;
EXTERN short* op;
EXTERN char* outfile;
EXTERN long pc;
EXTERN char simple[I_MASK];
EXTERN char special[I_MASK];
EXTERN long spsize;
EXTERN Sym* symlist;
EXTERN long symsize;
EXTERN Prog* textp;
EXTERN long textsize;
EXTERN long thunk;
EXTERN int version;
EXTERN Prog zprg;
extern Optab optab[];
extern char mmsize[];
extern char* anames[];
int Aconv(Fmt*);
int Dconv(Fmt*);
int Pconv(Fmt*);
int Rconv(Fmt*);
int Sconv(Fmt*);
int Xconv(Fmt*);
void addhist(long, int);
int andsize(Prog*, Adr*);
void asmb(void);
int asmea(Prog*, Adr*);
void asmins(Prog*);
void asmlc(void);
void asmsp(void);
void asmsym(void);
void asmreloc(void);
long atolwhex(char*);
Prog* brchain(Prog*);
Prog* brloop(Prog*);
void cflush(void);
Prog* copyp(Prog*);
double cputime(void);
void datblk(long, long);
void diag(char*, ...);
void dodata(void);
void doprof1(void);
void doprof2(void);
void dostkoff(void);
long entryvalue(void);
void errorexit(void);
int find1(long, int);
int find2(long, int);
void follow(void);
void gethunk(void);
int gnuxi(Ieee*, int, int);
void histtoauto(void);
double ieeedtod(Ieee*);
long ieeedtof(Ieee*);
void initmuldiv1(void);
void initmuldiv2(void);
void ldobj(int, long, char*);
void loadlib(void);
void listinit(void);
Sym* lookup(char*, int);
void lput(long);
void main(int, char*[]);
void mkfwd(void);
void* mysbrk(ulong);
void nuxiinit(void);
void objfile(char*);
void patch(void);
Prog* prg(void);
Prog* nprg(Prog*);
int relinv(int);
long reuse(Prog*, Sym*);
long rnd(long, long);
void s16put(char*);
void span(void);
void undef(void);
void xdefine(char*, int, long);
void xfol(Prog*);
int zaddr(uchar*, Adr*, Sym*[]);
|