blob: ce5f6c86cd7fce3f3563ffcdfc10cf9300e29889 [file] [log] [blame]
Rob Pike0cafb9e2008-06-04 14:37:38 -07001// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5
6#include <u.h>
7#include <libc.h>
8
9#include "../gc/go.h"
10#include "../6l/6.out.h"
11
12#ifndef EXTERN
13#define EXTERN extern
14#endif
15
Rob Pike0cafb9e2008-06-04 14:37:38 -070016typedef struct Addr Addr;
17
18struct Addr
19{
20 vlong offset;
21 double dval;
22 Prog* branch;
23 char sval[NSNAME];
24
25 Sym* sym;
Ken Thompson4238b182009-05-23 15:34:29 -070026 int width;
Rob Pike0cafb9e2008-06-04 14:37:38 -070027 uchar type;
28 uchar index;
29 uchar etype;
30 uchar scale; /* doubles as width in DATA op */
31};
32#define A ((Addr*)0)
33
34struct Prog
35{
36 short as; // opcode
Russ Cox9aad9fe2008-08-03 17:25:15 -070037 uint32 loc; // pc offset in this func
38 uint32 lineno; // source line that generated this
Rob Pike0cafb9e2008-06-04 14:37:38 -070039 Addr from; // src address
40 Addr to; // dst address
41 Prog* link; // next instruction in this func
Ken Thompson2dd16a32008-11-18 19:24:37 -080042 void* reg; // pointer to containing Reg struct
Rob Pike0cafb9e2008-06-04 14:37:38 -070043};
Rob Pike0cafb9e2008-06-04 14:37:38 -070044
Rob Pike0cafb9e2008-06-04 14:37:38 -070045EXTERN Biobuf* bout;
Russ Cox9aad9fe2008-08-03 17:25:15 -070046EXTERN int32 dynloc;
Rob Pike0cafb9e2008-06-04 14:37:38 -070047EXTERN uchar reg[D_NONE];
Russ Cox9aad9fe2008-08-03 17:25:15 -070048EXTERN int32 pcloc; // instruction counter
Ken Thompson36570612009-04-09 18:16:21 -070049EXTERN Strlit emptystring;
Rob Pike0cafb9e2008-06-04 14:37:38 -070050extern char* anames[];
Ken Thompsonefec14b2008-06-13 18:16:23 -070051EXTERN Hist* hist;
52EXTERN Prog zprog;
Ken Thompson904d4042008-09-12 16:48:35 -070053EXTERN Node* curfn;
54EXTERN Node* newproc;
Ken Thompson1e1cc4e2009-01-27 12:03:53 -080055EXTERN Node* deferproc;
56EXTERN Node* deferreturn;
Ken Thompson904d4042008-09-12 16:48:35 -070057EXTERN Node* throwindex;
58EXTERN Node* throwreturn;
Rob Pike0cafb9e2008-06-04 14:37:38 -070059
60/*
61 * gen.c
62 */
63void compile(Node*);
64void proglist(void);
Ken Thompson48f6b512009-03-11 16:25:45 -070065void gen(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -070066Node* lookdot(Node*, Node*, int);
Russ Cox2d259c82009-01-05 17:32:23 -080067void cgen_as(Node*, Node*);
Ken Thompson1d31a252008-07-07 17:59:32 -070068void cgen_callmeth(Node*, int);
69void cgen_callinter(Node*, Node*, int);
Ken Thompson1e1cc4e2009-01-27 12:03:53 -080070void cgen_proc(Node*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -070071void cgen_callret(Node*, Node*);
Ken Thompsond83b9942008-06-06 20:43:29 -070072void cgen_div(int, Node*, Node*, Node*);
Ken Thompsondc78c642008-11-07 14:20:32 -080073void cgen_bmul(int, Node*, Node*, Node*);
Ken Thompsonf7753f12008-06-07 15:21:02 -070074void cgen_shift(int, Node*, Node*, Node*);
Russ Cox391425a2009-01-29 17:38:58 -080075void cgen_dcl(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -070076int needconvert(Type*, Type*);
77void genconv(Type*, Type*);
78void allocparams(void);
Ken Thompson33ee5272008-08-29 20:30:19 -070079void checklabels();
Russ Cox4a431982009-01-30 14:39:42 -080080void ginscall(Node*, int);
Ken Thompson52b0f772009-05-16 13:29:08 -070081int gen_as_init(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -070082
83/*
84 * cgen
85 */
Rob Pike0cafb9e2008-06-04 14:37:38 -070086void agen(Node*, Node*);
87void igen(Node*, Node*, Node*);
88vlong fieldoffset(Type*, Node*);
89void bgen(Node*, int, Prog*);
Ken Thompsonadaec0c2008-09-22 16:58:30 -070090void sgen(Node*, Node*, int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -070091void gmove(Node*, Node*);
92Prog* gins(int, Node*, Node*);
93int samaddr(Node*, Node*);
94void naddr(Node*, Addr*);
Russ Cox45f4e382008-10-03 16:23:02 -070095void cgen_aret(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -070096
97/*
98 * gsubr.c
99 */
100void clearp(Prog*);
101void proglist(void);
102Prog* gbranch(int, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700103Prog* prog(int);
104void gaddoffset(Node*);
105void gconv(int, int);
106int conv2pt(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700107vlong convvtox(vlong, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700108void fnparam(Type*, int, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700109Prog* gop(int, Node*, Node*, Node*);
110void setconst(Addr*, vlong);
111void setaddr(Addr*, Node*);
112int optoas(int, Type*);
113void ginit(void);
114void gclean(void);
115void regalloc(Node*, Type*, Node*);
116void regfree(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700117Node* nodarg(Type*, int);
118void nodreg(Node*, Type*, int);
119void nodindreg(Node*, Type*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700120void gconreg(int, vlong, int);
121void buildtxt(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700122Plist* newplist(void);
123int isfat(Type*);
Ken Thompson23fc0ac2008-12-14 17:06:06 -0800124void sudoclean(void);
Ken Thompsona5a87892009-05-03 15:17:03 -0700125int sudoaddable(int, Node*, Addr*);
Russ Cox4a431982009-01-30 14:39:42 -0800126void afunclit(Addr*);
Russ Cox83cd4ee2009-05-06 13:47:40 -0700127void datagostring(Strlit*, Addr*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700128
129/*
Ken Thompsonda49bfe2009-05-19 13:37:36 -0700130 * obj.c
131 */
132void datastring(char*, int, Addr*);
133
134/*
Rob Pike0cafb9e2008-06-04 14:37:38 -0700135 * list.c
136 */
137int Aconv(Fmt*);
138int Dconv(Fmt*);
139int Pconv(Fmt*);
140int Rconv(Fmt*);
141int Yconv(Fmt*);
142void listinit(void);
143
Rob Pike0cafb9e2008-06-04 14:37:38 -0700144void zaddr(Biobuf*, Addr*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700145