Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20140309093258

Diff

Diff from 1.10 to:

Annotations

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

Annotated File View

ragge
1.10
1 /*      $Id: code.c,v 1.10 2014/03/09 09:32:58 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
32 /*
33  * cause the alignment to become a multiple of n
34  * never called for text segment.
35  */
36 void
37 defalign(int n)
38 {
39         /* alignment are always correct */
40 }
41
42 /*
ragge
1.10
43  * Print out assembler segment name.
44  */
45 void
46 setseg(int segchar *name)
47 {
48         switch (seg) {
49         case PROGname = ".text"break;
50         case DATA:
51         case LDATAname = ".data"break;
52         case STRNG:
53         case RDATAname = ".section .rodata"break;
54         case UDATAbreak;
55         default:
56                 cerror((char *)__func__);
57         }
58         printf("\t%s\n"name);
59 }
60
61 /*
62  * Define everything needed to print out some data (or text).
63  * This means segment, alignment, visibility, etc.
ragge
1.1
64  */
65 void
ragge
1.10
66 defloc(struct symtab *sp)
ragge
1.1
67 {
ragge
1.10
68         char *name;
ragge
1.1
69
ragge
1.10
70         if ((name = sp->soname) == NULL)
71                 name = exname(sp->sname);
72
73         if (sp->sclass == EXTDEF)
74                 printf("\t.globl %s\n"name);
75         if (sp->slevel == 0)
76                 printf("%s:\n"name);
77         else
78                 printf(LABFMT ":\n"sp->soffset);
79 }
80
81 /* make a common declaration for id, if reasonable */
82 void
83 defzero(struct symtab *sp)
84 {
85         int offal;
86         char *name;
87
88         if ((name = sp->soname) == NULL)
89                 name = exname(sp->sname);
90         off = tsize(sp->stypesp->sdfsp->sap);
91         SETOFF(off,SZCHAR);
92         off /= SZCHAR;
93         al = talign(sp->stypesp->sap)/SZCHAR;
94
95         if (sp->sclass == STATIC) {
96                 if (sp->slevel == 0) {
97                         printf("\t.local %s\n"name);
98                 } else
99                         printf("\t.local " LABFMT "\n"sp->soffset);
100         }
101         if (sp->slevel == 0) {
102                 printf("\t.comm %s,0%o,%d\n"nameoffal);
103         } else
104                 printf("\t.comm " LABFMT ",0%o,%d\n"sp->soffsetoffal);
ragge
1.1
105 }
106
107
108 /*
109  * code for the end of a function
110  * deals with struct return here
111  */
112 void
plunky
1.9
113 efcode(void)
ragge
1.1
114 {
115         NODE *p, *q;
ragge
1.10
116 //      int sz;
ragge
1.1
117
118         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
119                 return;
120 cerror("efcode");
121         /* address of return struct is in eax */
122         /* create a call to memcpy() */
123         /* will get the result in eax */
ragge
1.6
124         p = block(REGNILNILCHAR+PTR00);
ragge
1.1
125 //      p->n_rval = EAX;
ragge
1.6
126         q = block(OREGNILNILCHAR+PTR00);
ragge
1.1
127 //      q->n_rval = EBP;
128         q->n_lval = 8/* return buffer offset */
ragge
1.6
129         p = block(CMqpINT00);
ragge
1.10
130 //      sz = (tsize(STRTY, cftnsp->sdf, cftnsp->ssue)+SZCHAR-1)/SZCHAR;
131 //      p = block(CM, p, bcon(sz), INT, 0, 0);
ragge
1.1
132         p->n_right->n_name = "";
ragge
1.6
133         p = block(CALLbcon(0), pCHAR+PTR00);
ragge
1.1
134         p->n_left->n_name = "memcpy";
135         p = clocal(p);
136         send_passt(IP_NODEp);
137 }
138
139 /*
140  * code for the beginning of a function; a is an array of
141  * indices in symtab for the arguments; n is the number
142  */
143 void
144 bfcode(struct symtab **aint n)
145 {
146         int i;
147
148         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
149                 return;
150 cerror("bfcode");
151         /* Function returns struct, adjust arg offset */
152         for (i = 0i < ni++)
153                 a[i]->soffset += SZPOINT(INT);
154 }
155
156
157 /* called just before final exit */
158 /* flag is 1 if errors, 0 if none */
159 void
plunky
1.9
160 ejobcode(int flag)
ragge
1.1
161 {
162 }
163
164 void
plunky
1.9
165 bjobcode(void)
ragge
1.1
166 {
167 }
168
ragge
1.10
169 #if 0
ragge
1.1
170 /*
171  * Print character t at position i in one string, until t == -1.
172  * Locctr & label is already defined.
173  */
174 void
175 bycode(int tint i)
176 {
177         static  int     lastoctal = 0;
178
179         /* put byte i+1 in a string */
180
181         if (t < 0) {
182                 if (i != 0)
183                         puts("\"");
184         } else {
185                 if (i == 0)
186                         printf("\t.ascii \"");
187                 if (t == '\\' || t == '"') {
188                         lastoctal = 0;
189                         putchar('\\');
190                         putchar(t);
191                 } else if (t < 040 || t >= 0177) {
192                         lastoctal++;
193                         printf("\\%o",t);
194                 } else if (lastoctal && '0' <= t && t <= '9') {
195                         lastoctal = 0;
196                         printf("\"\n\t.ascii \"%c"t);
197                 } else {        
198                         lastoctal = 0;
199                         putchar(t);
200                 }
201         }
202 }
ragge
1.10
203 #endif
ragge
1.1
204
205 /* fix up type of field p */
206 void
207 fldty(struct symtab *p)
208 {
209 }
210
stefan
1.3
211 /*
ragge
1.1
212  * XXX - fix genswitch.
213  */
stefan
1.3
214 int
215 mygenswitch(int numTWORD typestruct swents **pint n)
ragge
1.1
216 {
stefan
1.3
217         return 0;
ragge
1.1
218 }
ragge
1.2
219 /*
220  * Called with a function call with arguments as argument.
221  * This is done early in buildtree() and only done once.
222  */
223 NODE *
224 funcode(NODE *p)
225 {
226         return p;
227 }
ragge
1.10
228
229 /*
230  * Return return as given by a.
231  */
232 NODE *
233 builtin_return_address(const struct bitable *btNODE *a)
234 {
235         cerror((char *)__func__);
236         return 0;
237 }
238
239 /*
240  * Return frame as given by a.
241  */
242 NODE *
243 builtin_frame_address(const struct bitable *btNODE *a)
244 {
245         cerror((char *)__func__);
246         return 0;
247 }
248
249 /*
250  * Return "canonical frame address".
251  */
252 NODE *
253 builtin_cfa(const struct bitable *btNODE *a)
254 {
255         cerror((char *)__func__);
256         return 0;
257 }
258
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 2014-10-30 18:35 +0100