// 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. #include #include #include "../gc/go.h" #include "../6l/6.out.h" #ifndef EXTERN #define EXTERN extern #endif typedef struct Prog Prog; typedef struct Addr Addr; struct Addr { vlong offset; double dval; Prog* branch; char sval[NSNAME]; Sym* sym; uchar type; uchar index; uchar etype; uchar scale; /* doubles as width in DATA op */ }; #define A ((Addr*)0) struct Prog { short as; // opcode ulong loc; // pc offset in this func ulong lineno; // source line that generated this Addr from; // src address Addr to; // dst address Prog* link; // next instruction in this func }; #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* name; Sym* sym; ulong hash; long offset; Sig* link; }; typedef struct Case Case; struct Case { Prog* sprog; Node* scase; Case* slink; }; #define C ((Case*)0) typedef struct Pool Pool; struct Pool { String* sval; Pool* link; }; EXTERN Prog* continpc; EXTERN Prog* breakpc; EXTERN Prog* pc; EXTERN Prog* firstpc; EXTERN Plist* plist; EXTERN Plist* plast; EXTERN Pool* poolist; EXTERN Pool* poolast; EXTERN Biobuf* bout; EXTERN long dynloc; EXTERN uchar reg[D_NONE]; EXTERN ushort txt[NTYPE*NTYPE]; EXTERN long maxround; EXTERN long widthptr; EXTERN Sym* symstringo; // string objects EXTERN long stringo; // size of string objects EXTERN long pcloc; // instruction counter EXTERN String emptystring; extern char* anames[]; EXTERN Hist* hist; EXTERN Prog zprog; /* * gen.c */ void compile(Node*); void proglist(void); void gen(Node*); void swgen(Node*); Node* lookdot(Node*, Node*, int); void inarggen(void); void agen_inter(Node*, Node*); void cgen_as(Node*, Node*, int); void cgen_asop(Node*); void cgen_ret(Node*); void cgen_call(Node*, int); void cgen_callmeth(Node*, int); void cgen_callinter(Node*, Node*, int); void cgen_proc(Node*); void cgen_callret(Node*, Node*); void cgen_div(int, Node*, Node*, Node*); void cgen_shift(int, Node*, Node*, Node*); void genpanic(void); int needconvert(Type*, Type*); void genconv(Type*, Type*); void allocparams(void); /* * cgen */ void cgen(Node*, Node*); void agen(Node*, Node*); void igen(Node*, Node*, Node*); vlong fieldoffset(Type*, Node*); void bgen(Node*, int, Prog*); void sgen(Node*, Node*, ulong); void gmove(Node*, Node*); Prog* gins(int, Node*, Node*); int samaddr(Node*, Node*); void naddr(Node*, Addr*); /* * gsubr.c */ void clearp(Prog*); void proglist(void); Prog* gbranch(int, Type*); void patch(Prog*, Prog*); Prog* prog(int); void gaddoffset(Node*); void gconv(int, int); int conv2pt(Type*); void belexinit(int); vlong convvtox(vlong, int); int brcom(int); int brrev(int); void fnparam(Type*, int, int); Sig* lsort(Sig*, int(*)(Sig*, Sig*)); Prog* gop(int, Node*, Node*, Node*); void setconst(Addr*, vlong); void setaddr(Addr*, Node*); int optoas(int, Type*); void ginit(void); void gclean(void); void regalloc(Node*, Type*, Node*); void regfree(Node*); void regsalloc(Node*, Type*); // replace w tmpvar void regret(Node*, Type*); Node* nodarg(Type*, int); void nodreg(Node*, Type*, int); void nodindreg(Node*, Type*, int); void nodconst(Node*, Type*, vlong); Sym* signame(Type*); void nodtypesig(Node*, Type*); void gconreg(int, vlong, int); void buildtxt(void); void stringpool(Node*); void tempname(Node*, Type*); Plist* newplist(void); int isfat(Type*); void setmaxarg(Type*); /* * list.c */ int Aconv(Fmt*); int Dconv(Fmt*); int Pconv(Fmt*); int Rconv(Fmt*); int Yconv(Fmt*); void listinit(void); /* * obj */ void zname(Biobuf*, Sym*, int); void zaddr(Biobuf*, Addr*, int); void ieeedtod(Ieee*, double); void dumpstrings(void); void dumpsignatures(void); void outhist(Biobuf*); /* * align */ void dowidth(Type*); ulong rnd(ulong, ulong);