Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:plunky:20120422210740

Diff

Diff from 1.6 to:

Annotations

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

Annotated File View

plunky
1.6
1 /*      $Id: code.c,v 1.6 2012/04/22 21:07:40 plunky Exp $      */
ragge
1.1
2 /*
3  * Copyright (c) 2003 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 int lastloc = -1;
33
34 /*
35  * Define everything needed to print out some data (or text).
36  * This means segment, alignment, visibility, etc.
37  */
38 void
39 defloc(struct symtab *sp)
40 {
41         static char *loctbl[] = { "text""data""data" };
42         TWORD t;
ragge
1.3
43         char *n;
ragge
1.1
44         int s;
45
46         if (sp == NULL) {
47                 lastloc = -1;
48                 return;
49         }
50         t = sp->stype;
51         s = ISFTN(t) ? PROG : ISCON(cqual(tsp->squal)) ? RDATA : DATA;
52         if (s != lastloc)
53                 printf("        .%s\n"loctbl[s]);
54         lastloc = s;
55         while (ISARY(t))
56                 t = DECREF(t);
ragge
1.3
57         n = sp->soname ? sp->soname : exname(sp->sname);
ragge
1.1
58         if (sp->sclass == EXTDEF)
ragge
1.3
59                 printf("        .globl %s\n"n);
ragge
1.2
60         if (ISFTN(sp->stype) || talign(sp->stypesp->ssue) > ALCHAR)
61                 printf(".even\n");
ragge
1.1
62         if (sp->slevel == 0) {
ragge
1.3
63                 printf("%s:\n"n);
ragge
1.1
64         } else {
65                 printf(LABFMT ":\n"sp->soffset);
66         }
67 }
68
69 /*
70  * code for the end of a function
71  * deals with struct return here
72  */
73 void
plunky
1.6
74 efcode(void)
ragge
1.1
75 {
76         NODE *p, *q;
77
78         if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
79                 return;
80         /* Create struct assignment */
81         q = block(OREGNILNILPTR+STRTY0cftnsp->ssue);
82         q->n_rval = R5;
83         q->n_lval = 8/* return buffer offset */
84         q = buildtree(UMULqNIL);
85         p = block(REGNILNILPTR+STRTY0cftnsp->ssue);
86         p = buildtree(UMULpNIL);
87         p = buildtree(ASSIGNqp);
88         ecomp(p);
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 **spint cnt)
97 {
98         struct symtab *sp2;
99         NODE *n;
100         int i;
101
102         if (cftnsp->stype == STRTY+FTN || cftnsp->stype == UNIONTY+FTN) {
103                 /* Function returns struct, adjust arg offset */
104                 for (i = 0i < cnti++) 
105                         sp[i]->soffset += SZPOINT(INT);
106         }
107
108         if (xtemps == 0)
109                 return;
110
111         /* put arguments in temporaries */
112         for (i = 0i < cnti++) {
113                 if (sp[i]->stype == STRTY || sp[i]->stype == UNIONTY ||
114                     cisreg(sp[i]->stype) == 0)
115                         continue;
116                 sp2 = sp[i];
117                 n = tempnode(0sp[i]->stypesp[i]->sdfsp[i]->ssue);
118                 n = buildtree(ASSIGNnnametree(sp2));
119                 sp[i]->soffset = regno(n->n_left);
120                 sp[i]->sflags |= STNODE;
121                 ecomp(n);
122         }
123 }
124
125
126 /* called just before final exit */
127 /* flag is 1 if errors, 0 if none */
128 void
plunky
1.6
129 ejobcode(int flag)
ragge
1.1
130 {
131 }
132
133 void
plunky
1.6
134 bjobcode(void)
ragge
1.1
135 {
136 }
137
138 /*
139  * Called with a function call with arguments as argument.
140  * This is done early in buildtree() and only done once.
141  * Returns p.
142  */
143 NODE *
144 funcode(NODE *p)
145 {
146         NODE *r, *l;
147
148         /* Fix function call arguments. On x86, just add funarg */
149         for (r = p->n_rightr->n_op == CMr = r->n_left) {
150                 if (r->n_right->n_op != STARG)
151                         r->n_right = block(FUNARGr->n_rightNIL,
152                             r->n_right->n_typer->n_right->n_df,
153                             r->n_right->n_sue);
154         }
155         if (r->n_op != STARG) {
156                 l = talloc();
157                 *l = *r;
158                 r->n_op = FUNARG;
159                 r->n_left = l;
160                 r->n_type = l->n_type;
161         }
162         return p;
163 }
164
165 /* fix up type of field p */
166 void
167 fldty(struct symtab *p)
168 {
169 }
170
171 /*
172  * XXX - fix genswitch.
173  */
174 int
175 mygenswitch(int numTWORD typestruct swents **pint n)
176 {
177         return 0;
178 }
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-09-21 14:04 +0200