1 /* Id: flocal.c,v 1.1 2014/09/16 10:47:35 ragge Exp */
2 /* $NetBSD: flocal.c,v 1.1.1.1 2016/02/09 20:28:37 plunky Exp $ */
3 /*
4 * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * Redistributions of source code and documentation must retain the above
11 * copyright notice, this list of conditions and the following disclaimer.
12 * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditionsand the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed or owned by Caldera
18 * International, Inc.
19 * Neither the name of Caldera International, Inc. nor the names of other
20 * contributors may be used to endorse or promote products derived from
21 * this software without specific prior written permission.
22 *
23 * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
24 * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 * DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE
28 * FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OFLIABILITY, WHETHER IN CONTRACT,
32 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
33 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36 #include <stdio.h>
37
38 #include "defines.h"
39 #include "defs.h"
40
41 void
prchars(int * s)42 prchars(int *s)
43 {
44 printf("\t.byte 0%o,0%o\n", s[0], s[1]);
45 }
46
47 void
setloc(int l)48 setloc(int l)
49 {
50 static int lastloc = -1;
51 static char *loctbl[] =
52 { "text", "data", "data", "data", "bss" };
53 if (l == lastloc)
54 return;
55 printf("\t.%s\n", loctbl[l]);
56 lastloc = l;
57 }
58
59 #ifdef FCOM
60
61
62 /*
63 8086 - SPECIFIC PRINTING ROUTINES
64 */
65
66 /*
67 * Called just before return from a subroutine.
68 */
69 void
goret(int type)70 goret(int type)
71 {
72 }
73
74 /*
75 * Print out a label.
76 */
77 void
prlabel(int k)78 prlabel(int k)
79 {
80 printf(LABFMT ":\n", k);
81 }
82
83 /*
84 * Print naming for location.
85 * name[0] is location type.
86 */
87 void
prnloc(char * name)88 prnloc(char *name)
89 {
90 if (*name == '0')
91 setloc(DATA);
92 else
93 fatal("unhandled prnloc %c", *name);
94 printf("%s:\n", name+1);
95 }
96
97 /*
98 * Print integer constant.
99 */
100 void
prconi(FILE * fp,int type,ftnint n)101 prconi(FILE *fp, int type, ftnint n)
102 {
103 fprintf(fp, "\t%s\t%ld\n", (type==TYSHORT ? ".word" : ".long"), n);
104 }
105
106 /*
107 * Print address constant, given as a label number.
108 */
109 void
prcona(ftnint a)110 prcona(ftnint a)
111 {
112 printf("\t.long\t" LABFMT "\n", (int)a);
113 }
114
115 /*
116 * Print out a floating constant.
117 */
118 void
prconr(FILE * fp,int type,double x)119 prconr(FILE *fp, int type, double x)
120 {
121 fprintf(fp, "\t%s\t0f%e\n", (type==TYREAL ? ".float" : ".double"), x);
122 }
123
124 void
preven(int k)125 preven(int k)
126 {
127 if (k > 1)
128 printf("\t.align\t%d\n", k);
129 }
130
131 /*
132 * Convert a tag and offset into the symtab table to a string.
133 * An external string is never longer than XL bytes.
134 */
135 char *
memname(int stg,int mem)136 memname(int stg, int mem)
137 {
138 #define MLEN (XL + 10)
139 char *s = malloc(MLEN);
140
141 switch(stg) {
142 case STGCOMMON:
143 case STGEXT:
144 snprintf(s, MLEN, "%s", varstr(XL, extsymtab[mem].extname));
145 break;
146
147 case STGBSS:
148 case STGINIT:
149 snprintf(s, MLEN, "v.%d", mem);
150 break;
151
152 case STGCONST:
153 snprintf(s, MLEN, ".L%d", mem);
154 break;
155
156 case STGEQUIV:
157 snprintf(s, MLEN, "q.%d", mem);
158 break;
159
160 default:
161 fatal1("memname: invalid vstg %d", stg);
162 }
163 return(s);
164 }
165
166 void
prlocvar(char * s,ftnint len)167 prlocvar(char *s, ftnint len)
168 {
169 printf("%s:\t.blkb\t%ld\n", s, len);
170 }
171
172
173 void
prext(char * name,ftnint leng,int init)174 prext(char *name, ftnint leng, int init)
175 {
176 if(leng == 0)
177 printf("\t.globl\t%s\n", name);
178 else
179 printf("%s:\t.blkb %ld\n", name, leng);
180 }
181
182 void
prendproc(void)183 prendproc(void)
184 {
185 }
186
187 void
prtail(void)188 prtail(void)
189 {
190 }
191
192 void
prolog(struct entrypoint * ep,struct bigblock * argvec)193 prolog(struct entrypoint *ep, struct bigblock *argvec)
194 {
195 /* Ignore for now. ENTRY is not supported */
196 }
197
198 void
prdbginfo(void)199 prdbginfo(void)
200 {
201 }
202
203 static void
fcheck(NODE * p,void * arg)204 fcheck(NODE *p, void *arg)
205 {
206 NODE *r, *l;
207
208 switch (p->n_op) {
209 case CALL: /* fix arguments */
210 for (r = p->n_right; r->n_op == CM; r = r->n_left) {
211 r->n_right = mkunode(FUNARG, r->n_right, 0,
212 r->n_right->n_type);
213 }
214 l = talloc();
215 *l = *r;
216 r->n_op = FUNARG;
217 r->n_left = l;
218 r->n_type = l->n_type;
219 break;
220 }
221 }
222
223 /*
224 * Called just before the tree is written out to pass2.
225 */
226 void p2tree(NODE *p);
227 void
p2tree(NODE * p)228 p2tree(NODE *p)
229 {
230 walkf(p, fcheck, 0);
231 }
232 #endif /* FCOM */
233