|
|
1.1 root 1: /*
2: * Copyright (c) 1983 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)asm.c 5.4 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: /*
25: * Assembly language dependent symbol routines.
26: */
27:
28: #include "defs.h"
29: #include "symbols.h"
30: #include "asm.h"
31: #include "languages.h"
32: #include "tree.h"
33: #include "eval.h"
34: #include "operators.h"
35: #include "mappings.h"
36: #include "process.h"
37: #include "runtime.h"
38: #include "machine.h"
39:
40: #define isdouble(range) ( \
41: range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \
42: )
43:
44: /*
45: * Initialize assembly language information.
46: */
47:
48: public asm_init()
49: {
50: Language lang;
51:
52: lang = language_define("assembler", ".s");
53: language_setop(lang, L_PRINTDECL, asm_printdecl);
54: language_setop(lang, L_PRINTVAL, asm_printval);
55: language_setop(lang, L_TYPEMATCH, asm_typematch);
56: language_setop(lang, L_BUILDAREF, asm_buildaref);
57: language_setop(lang, L_EVALAREF, asm_evalaref);
58: language_setop(lang, L_MODINIT, asm_modinit);
59: language_setop(lang, L_HASMODULES, asm_hasmodules);
60: language_setop(lang, L_PASSADDR, asm_passaddr);
61: }
62:
63: /*
64: * Test if two types are compatible.
65: */
66:
67: public Boolean asm_typematch(type1, type2)
68: Symbol type1, type2;
69: {
70: Boolean b;
71:
72: b = false;
73: return b;
74: }
75:
76: public asm_printdecl(s)
77: Symbol s;
78: {
79: switch (s->class) {
80: case CONST:
81: printf("%s = %d", symname(s), s->symvalue.constval->value.lcon);
82: break;
83:
84: case VAR:
85: case REF:
86: printf("&%s = 0x%x", symname(s), s->symvalue.offset);
87: break;
88:
89: case PROC:
90: case FUNC:
91: printf("%s (0x%x):", symname(s), codeloc(s));
92: break;
93:
94: case TYPE:
95: printf("%s", symname(s));
96: break;
97:
98: case ARRAY:
99: printf("$string");
100: break;
101:
102: default:
103: printf("[%s]", classname(s));
104: break;
105: }
106: putchar('\n');
107: }
108:
109: /*
110: * Print out the value on the top of the expression stack
111: * in the format for the type of the given symbol.
112: */
113:
114: public asm_printval(s)
115: register Symbol s;
116: {
117: register Symbol t;
118: register Integer len;
119:
120: switch (s->class) {
121: case ARRAY:
122: t = rtype(s->type);
123: if (t->class == RANGE and istypename(t->type, "$char")) {
124: len = size(s);
125: sp -= len;
126: printf("\"%.*s\"", len, sp);
127: } else {
128: printarray(s);
129: }
130: break;
131:
132: default:
133: printf("0x%x", pop(Integer));
134: break;
135: }
136: }
137:
138: /*
139: * Treat subscripting as indirection through pointer to integer.
140: */
141:
142: public Node asm_buildaref(a, slist)
143: Node a, slist;
144: {
145: Symbol t, eltype;
146: Node p, r;
147:
148: t = rtype(a->nodetype);
149: eltype = t->type;
150: p = slist->value.arg[0];
151: r = build(O_MUL, p, build(O_LCON, (long) size(eltype)));
152: r = build(O_ADD, build(O_RVAL, a), r);
153: r->nodetype = eltype;
154: return r;
155: }
156:
157: /*
158: * Evaluate a subscript index. Assumes dimension is [0..n].
159: */
160:
161: public asm_evalaref(s, base, i)
162: Symbol s;
163: Address base;
164: long i;
165: {
166: Symbol t;
167:
168: t = rtype(s);
169: push(long, base + i * size(t->type));
170: }
171:
172: public asm_modinit (typetable)
173: Symbol typetable[];
174: {
175: /* nothing for right now */
176: }
177:
178: public boolean asm_hasmodules ()
179: {
180: return false;
181: }
182:
183: public boolean asm_passaddr (param, exprtype)
184: Symbol param, exprtype;
185: {
186: return false;
187: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.