Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20071112190327

Diff

Diff from 1.2 to:

Annotations

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

Annotated File View

ragge
1.2
1 /*      $Id: code.c,v 1.2 2007/11/12 19:03:28 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 /*
43  * define the current location as the name p->sname
44  * never called for text segment.
45  */
46 void
47 defnam(struct symtab *p)
48 {
49         char *c = p->sname;
50
51 #ifdef GCC_COMPAT
52         c = gcc_findname(p);
53 #endif
54         if (p->sclass == EXTDEF)
55                 printf("        .globl %s\n"c);
56         printf("%s:\n"c);
57 }
58
59
60 /*
61  * code for the end of a function
62  * deals with struct return here
63  */
64 void
65 efcode()
66 {
67         NODE *p, *q;
68         int sz;
69
70         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
71                 return;
72 cerror("efcode");
73         /* address of return struct is in eax */
74         /* create a call to memcpy() */
75         /* will get the result in eax */
76         p = block(REGNILNILCHAR+PTR0MKSUE(CHAR+PTR));
77 //      p->n_rval = EAX;
78         q = block(OREGNILNILCHAR+PTR0MKSUE(CHAR+PTR));
79 //      q->n_rval = EBP;
80         q->n_lval = 8/* return buffer offset */
81         p = block(CMqpINT0MKSUE(INT));
82         sz = (tsize(STRTYcftnsp->sdfcftnsp->ssue)+SZCHAR-1)/SZCHAR;
83         p = block(CMpbcon(sz), INT0MKSUE(INT));
84         p->n_right->n_name = "";
85         p = block(CALLbcon(0), pCHAR+PTR0MKSUE(CHAR+PTR));
86         p->n_left->n_name = "memcpy";
87         p = clocal(p);
88         send_passt(IP_NODEp);
89 }
90
91 /*
92  * code for the beginning of a function; a is an array of
93  * indices in symtab for the arguments; n is the number
94  */
95 void
96 bfcode(struct symtab **aint n)
97 {
98         int i;
99
100         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
101                 return;
102 cerror("bfcode");
103         /* Function returns struct, adjust arg offset */
104         for (i = 0i < ni++)
105                 a[i]->soffset += SZPOINT(INT);
106 }
107
108
109 /*
110  * by now, the automatics and register variables are allocated
111  */
112 void
113 bccode()
114 {
115         SETOFF(autooffSZINT);
116 }
117
118 /* called just before final exit */
119 /* flag is 1 if errors, 0 if none */
120 void
121 ejobcode(int flag )
122 {
123 }
124
125 void
126 bjobcode()
127 {
128 }
129
130 /*
131  * Print character t at position i in one string, until t == -1.
132  * Locctr & label is already defined.
133  */
134 void
135 bycode(int tint i)
136 {
137         static  int     lastoctal = 0;
138
139         /* put byte i+1 in a string */
140
141         if (t < 0) {
142                 if (i != 0)
143                         puts("\"");
144         } else {
145                 if (i == 0)
146                         printf("\t.ascii \"");
147                 if (t == '\\' || t == '"') {
148                         lastoctal = 0;
149                         putchar('\\');
150                         putchar(t);
151                 } else if (t < 040 || t >= 0177) {
152                         lastoctal++;
153                         printf("\\%o",t);
154                 } else if (lastoctal && '0' <= t && t <= '9') {
155                         lastoctal = 0;
156                         printf("\"\n\t.ascii \"%c"t);
157                 } else {        
158                         lastoctal = 0;
159                         putchar(t);
160                 }
161         }
162 }
163
164 /*
165  * n integer words of zeros
166  */
167 void
168 zecode(int n)
169 {
170         printf("        .zero %d\n"n * (SZINT/SZCHAR));
171         inoff += n * SZINT;
172 }
173
174 /*
175  * return the alignment of field of type t
176  */
177 int
178 fldal(unsigned int t)
179 {
180         uerror("illegal field type");
181         return(ALINT);
182 }
183
184 /* fix up type of field p */
185 void
186 fldty(struct symtab *p)
187 {
188 }
189
190 /* p points to an array of structures, each consisting
191  * of a constant value and a label.
192  * The first is >=0 if there is a default label;
193  * its value is the label number
194  * The entries p[1] to p[n] are the nontrivial cases
195  * XXX - fix genswitch.
196  */
197 void
198 genswitch(int numstruct swents **pint n)
199 {
200         NODE *r;
201         int i;
202
203         /* simple switch code */
204         for (i = 1i <= n; ++i) {
205                 /* already in 1 */
206                 r = tempnode(numINT0MKSUE(INT));
207                 r = buildtree(NErbcon(p[i]->sval));
208                 cbranch(buildtree(NOTrNIL), bcon(p[i]->slab));
209         }
210         if (p[0]->slab > 0)
211                 branch(p[0]->slab);
212 }
ragge
1.2
213 /*
214  * Called with a function call with arguments as argument.
215  * This is done early in buildtree() and only done once.
216  */
217 NODE *
218 funcode(NODE *p)
219 {
220         return p;
221 }
FishEye: Open Source License registered to PCC.
Atlassian FishEye, CVS analysis. (Version:1.6.3 Build:build-336 2008-11-04) - Administration - Page generated 2014-12-18 17:25 +0100