| // 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, PSTOREZI, |
| 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); |