Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20160627114706

Diff

Diff from 1.13 to:

Annotations

Annotate by Age | Author | Mixed | None
/fisheye/browse/pcc/pcc/arch/nova/code.c

Annotated File View

ragge
1.13
1 /*      $Id: code.c,v 1.13 2016/06/27 11:47:06 ragge Exp $      */
ragge
1.1
2 /*
3  * Copyright (c) 2006 Anders Magnusson (ragge@ludd.luth.se).
4  * 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  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29
30 # include "pass1.h"
31
ragge
1.12
32 #ifdef LANG_CXX
33 #define P1ND NODE
34 #define p1alloc talloc
35 #define p1nfree nfree
36 #define p1fwalk fwalk
37 #define p1tcopy ccopy
38 #endif
39
ragge
1.1
40 /*
41  * cause the alignment to become a multiple of n
42  * never called for text segment.
43  */
44 void
45 defalign(int n)
46 {
47         /* alignment are always correct */
48 }
49
50 /*
ragge
1.10
51  * Print out assembler segment name.
52  */
53 void
54 setseg(int segchar *name)
55 {
ragge
1.13
56 #ifndef os_none
ragge
1.10
57         switch (seg) {
58         case PROGname = ".text"break;
59         case DATA:
60         case LDATAname = ".data"break;
61         case STRNG:
ragge
1.12
62         case RDATAname = ".rodata"break;
ragge
1.10
63         case UDATAbreak;
64         default:
65                 cerror((char *)__func__);
66         }
ragge
1.13
67 #else
68         name = ".NREL";
69 #endif
ragge
1.10
70         printf("\t%s\n"name);
71 }
72
73 /*
74  * Define everything needed to print out some data (or text).
75  * This means segment, alignment, visibility, etc.
ragge
1.1
76  */
77 void
ragge
1.10
78 defloc(struct symtab *sp)
ragge
1.1
79 {
ragge
1.10
80         char *name;
ragge
1.1
81
ragge
1.12
82         name = getexname(sp);
ragge
1.10
83
ragge
1.11
84         if (ISFTN(sp->stype))
85                 return;
ragge
1.10
86         if (sp->sclass == EXTDEF)
87                 printf("\t.globl %s\n"name);
88         if (sp->slevel == 0)
89                 printf("%s:\n"name);
90         else
91                 printf(LABFMT ":\n"sp->soffset);
92 }
93
94 /* make a common declaration for id, if reasonable */
95 void
96 defzero(struct symtab *sp)
97 {
98         int offal;
99         char *name;
100
ragge
1.12
101         name = getexname(sp);
ragge
1.10
102         off = tsize(sp->stypesp->sdfsp->sap);
103         SETOFF(off,SZCHAR);
104         off /= SZCHAR;
105         al = talign(sp->stypesp->sap)/SZCHAR;
106
107         if (sp->sclass == STATIC) {
108                 if (sp->slevel == 0) {
109                         printf("\t.local %s\n"name);
110                 } else
111                         printf("\t.local " LABFMT "\n"sp->soffset);
112         }
113         if (sp->slevel == 0) {
114                 printf("\t.comm %s,0%o,%d\n"nameoffal);
115         } else
116                 printf("\t.comm " LABFMT ",0%o,%d\n"sp->soffsetoffal);
ragge
1.1
117 }
118
119
ragge
1.11
120 //static int ac3temp;
ragge
1.1
121 /*
122  * code for the end of a function
123  * deals with struct return here
124  */
125 void
plunky
1.9
126 efcode(void)
ragge
1.1
127 {
ragge
1.12
128         P1ND *p, *q;
ragge
1.10
129 //      int sz;
ragge
1.1
130
ragge
1.11
131 #if 0
132         /* restore ac3 */
133         p = block(REG00INT00);
134         regno(p) = 3;
135         q = tempnode(ac3tempINT00);
136         ecomp(buildtree(ASSIGNpq));
137 #endif
138
139
ragge
1.1
140         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
141                 return;
142 cerror("efcode");
143         /* address of return struct is in eax */
144         /* create a call to memcpy() */
145         /* will get the result in eax */
ragge
1.12
146         p = block(REGNULLNULLCHAR+PTR00);
ragge
1.1
147 //      p->n_rval = EAX;
ragge
1.12
148         q = block(OREGNULLNULLCHAR+PTR00);
ragge
1.1
149 //      q->n_rval = EBP;
ragge
1.12
150         slval(q8); /* return buffer offset */
ragge
1.6
151         p = block(CMqpINT00);
ragge
1.10
152 //      sz = (tsize(STRTY, cftnsp->sdf, cftnsp->ssue)+SZCHAR-1)/SZCHAR;
153 //      p = block(CM, p, bcon(sz), INT, 0, 0);
ragge
1.1
154         p->n_right->n_name = "";
ragge
1.6
155         p = block(CALLbcon(0), pCHAR+PTR00);
ragge
1.1
156         p->n_left->n_name = "memcpy";
157         p = clocal(p);
158         send_passt(IP_NODEp);
159 }
160
161 /*
162  * code for the beginning of a function; a is an array of
163  * indices in symtab for the arguments; n is the number
164  */
165 void
166 bfcode(struct symtab **aint n)
167 {
ragge
1.12
168 //      P1ND *p, *q;
ragge
1.1
169         int i;
170
ragge
1.11
171         for (i = 0i < ni++) {
172                 if (a[i]->stype == CHAR)
173                         a[i]->stype = INT;
174                 if (a[i]->stype == UCHAR)
175                         a[i]->stype = UNSIGNED;
176         }
177
ragge
1.1
178         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
179                 return;
180 cerror("bfcode");
181         /* Function returns struct, adjust arg offset */
182         for (i = 0i < ni++)
183                 a[i]->soffset += SZPOINT(INT);
184 }
185
186
187 /* called just before final exit */
188 /* flag is 1 if errors, 0 if none */
189 void
plunky
1.9
190 ejobcode(int flag)
ragge
1.1
191 {
ragge
1.12
192 #ifdef os_none
193         printf("\t.END\n");
194 #endif
ragge
1.1
195 }
196
197 void
plunky
1.9
198 bjobcode(void)
ragge
1.1
199 {
ragge
1.12
200 #ifdef os_none
201         printf("\t.TITL foo\n");
202         printf("\t.TXTM 1\n");  /* big endian */
203         printf("\t.NREL\n");    /* relocatable */
204         printf("\t.EXTU\n");    /* undefined syms are external */
205 #endif
ragge
1.1
206 }
207
208 /* fix up type of field p */
209 void
210 fldty(struct symtab *p)
211 {
212 }
213
stefan
1.3
214 /*
ragge
1.1
215  * XXX - fix genswitch.
216  */
stefan
1.3
217 int
218 mygenswitch(int numTWORD typestruct swents **pint n)
ragge
1.1
219 {
stefan
1.3
220         return 0;
ragge
1.1
221 }
ragge
1.13
222
223 static int xoff;
224
225 static void
226 fnummer(P1ND *p)
227 {
228         if (p->n_op != FUNARG)
229                 return;
230         p->n_rval = xoff;
231         xoff += tsize(p->n_typep->n_dfp->n_ap)/SZSHORT;
232 }
233
ragge
1.2
234 /*
235  * Called with a function call with arguments as argument.
236  * This is done early in buildtree() and only done once.
237  */
ragge
1.12
238 P1ND *
239 funcode(P1ND *p)
ragge
1.2
240 {
ragge
1.12
241         P1ND *r, *l;
ragge
1.11
242
243         /* Fix function call arguments. On nova, just add funarg */
244         for (r = p->n_rightr->n_op == CMr = r->n_left) {
ragge
1.13
245                 if (r->n_right->n_op != STARG) {
ragge
1.12
246                         r->n_right = block(FUNARGr->n_rightNULL,
ragge
1.11
247                             r->n_right->n_typer->n_right->n_df,
248                             r->n_right->n_ap);
ragge
1.13
249                 }
ragge
1.11
250         }
251         if (r->n_op != STARG) {
ragge
1.12
252                 l = p1alloc();
ragge
1.11
253                 *l = *r;
254                 r->n_op = FUNARG;
255                 r->n_left = l;
256                 r->n_type = l->n_type;
257         }
258
ragge
1.13
259         xoff = 1;
260         p1listf(p->n_rightfnummer);
ragge
1.2
261         return p;
262 }
ragge
1.10
263
264 /*
265  * Return return as given by a.
266  */
ragge
1.12
267 P1ND *
268 builtin_return_address(const struct bitable *btP1ND *a)
ragge
1.10
269 {
270         cerror((char *)__func__);
271         return 0;
272 }
273
274 /*
275  * Return frame as given by a.
276  */
ragge
1.12
277 P1ND *
278 builtin_frame_address(const struct bitable *btP1ND *a)
ragge
1.10
279 {
280         cerror((char *)__func__);
281         return 0;
282 }
283
284 /*
285  * Return "canonical frame address".
286  */
ragge
1.12
287 P1ND *
288 builtin_cfa(const struct bitable *btP1ND *a)
ragge
1.10
289 {
290         cerror((char *)__func__);
291         return 0;
292 }
293
FishEye: Open Source License registered to PCC.
Your maintenance has expired. You can renew your license at http://www.atlassian.com/fisheye/renew
Atlassian FishEye, CVS analysis. (Version:1.6.3 Build:build-336 2008-11-04) - Administration - Page generated 2016-09-26 15:59 +0200