blob: 13383141add2dd03ab974dc0d2edaf18191bd70d [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#ifndef EXTERN
#define EXTERN extern
#endif
typedef struct Prog Prog;
typedef struct Addr Addr;
struct Addr
{
int type;
Node* node;
Prog* branch;
};
enum
{
AXXX = 0,
ANONE,
ANODE,
ABRANCH,
};
struct Prog
{
int op; // opcode
int pt;
int pt1;
int param;
long lineno; // source line
long loc; // program counter for print
int mark;
Addr addr; // operand
Prog* link;
};
#define P ((Prog*)0)
typedef struct Plist Plist;
struct Plist
{
Node* name;
Dcl* locals;
Prog* firstpc;
int recur;
Plist* link;
};
typedef struct Sig Sig;
struct Sig
{
char* fun;
ulong hash;
int offset;
Sig* link;
};
enum
{
PTxxx,
PTINT8 = TINT8,
PTUINT8 = TUINT8,
PTINT16 = TINT16,
PTUINT16 = TUINT16,
PTINT32 = TINT32,
PTUINT32 = TUINT32,
PTINT64 = TINT64,
PTUINT64 = TUINT64,
PTFLOAT32 = TFLOAT32,
PTFLOAT64 = TFLOAT64,
PTFLOAT80 = TFLOAT80,
PTBOOL = TBOOL,
PTPTR = TPTR,
PTSTRUCT = TSTRUCT,
PTINTER = TINTER,
PTARRAY = TARRAY,
PTSTRING = TSTRING,
PTCHAN = TCHAN,
PTMAP = TMAP,
PTNIL = NTYPE,
PTADDR,
PTERROR,
NPTYPE,
};
enum
{
PXXX = 0,
PERROR, PPANIC, PPRINT, PGOTO, PGOTOX,
PCMP, PTEST, PNEW, PLEN,
PCALL1, PCALL2, PCALLI2, PCALLM2, PCALLF2, PCALL3, PRETURN,
PBEQ, PBNE,
PBLT, PBLE, PBGE, PBGT,
PBTRUE, PBFALSE,
PLOAD, PLOADI,
PSTORE, PSTOREI,
PSTOREZ, PSTOREZIP,
PCONV, PADDR, PADDO, PINDEX, PINDEXZ,
PSLICE,
PADD, PSUB, PMUL, PDIV, PLSH, PRSH, PMOD,
PAND, POR, PXOR, PCAT,
PMINUS, PCOM,
PEND,
};
typedef struct Case Case;
struct Case
{
Prog* sprog;
Node* scase;
Case* slink;
};
#define C ((Case*)0)
EXTERN Prog* continpc;
EXTERN Prog* breakpc;
EXTERN Prog* pc;
EXTERN Prog* firstpc;
EXTERN Plist* plist;
EXTERN Plist* plast;
EXTERN Biobuf* bout;
EXTERN long dynloc;
/*
* gen.c
*/
void compile(Node*);
void proglist(void);
void gen(Node*);
void cgen(Node*);
void agen(Node*);
void bgen(Node*, int, Prog*);
void swgen(Node*);
Node* lookdot(Node*, Node*, int);
int usesptr(Node*);
void inarggen(void);
void cgen_as(Node*, Node*, int, int);
void cgen_asop(Node*, Node*, int);
void cgen_ret(Node*);
void cgen_call(Node*, int);
void cgen_callret(Node*, Node*);
void genprint(Node*);
int needconvert(Node*, Node*);
void genconv(Node*, Node*);
void genindex(Node*);
/*
* gsubr.c
*/
int Aconv(Fmt*);
int Pconv(Fmt*);
void proglist(void);
Prog* gbranch(int, Node*);
void patch(Prog*, Prog*);
Prog* prog(int);
Node* tempname(Node*);
Prog* gopcode(int, int, Node*);
Prog* gopcodet(int, Node*, Node*);
void gaddoffset(Node*);
void gconv(int, int);
int conv2pt(Node*);
void belexinit(int);
vlong convvtox(vlong, int);
int brcom(int);
int brrev(int);
void fnparam(Node*, int, int);
Sig* lsort(Sig*, int(*)(Sig*, Sig*));
/*
* obj.c
*/
void dumpobj(void);
void litrl(Prog*);
void obj(Prog*);
void follow(Prog*);
Prog* gotochain(Prog*);
int Xconv(Fmt*);
int Rconv(Fmt*);
int Qconv(Fmt*);
int Dconv(Fmt*);
int Cconv(Fmt*);
void dumpexterns(void);
void dumpfunct(Plist*);
void dumpsignatures(void);
void doframe(Dcl*, char*);
void docall1(Prog*);
void docall2(Prog*);
void docalli2(Prog*);
void docallm2(Prog*);
void docallf2(Prog*);
void docall3(Prog*);
void doconv(Prog*);
char* getfmt(int);
void dumpmethods(void);