xref: /original-bsd/old/dbx/asm.c (revision c577960b)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)asm.c	5.2 (Berkeley) 01/11/88";
9 #endif not lint
10 
11 static char rcsid[] = "$Header: asm.c,v 1.2 87/03/25 19:24:09 donn Exp $";
12 
13 /*
14  * Assembly language dependent symbol routines.
15  */
16 
17 #include "defs.h"
18 #include "symbols.h"
19 #include "asm.h"
20 #include "languages.h"
21 #include "tree.h"
22 #include "eval.h"
23 #include "operators.h"
24 #include "mappings.h"
25 #include "process.h"
26 #include "runtime.h"
27 #include "machine.h"
28 
29 #define isdouble(range) ( \
30     range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \
31 )
32 
33 /*
34  * Initialize assembly language information.
35  */
36 
37 public asm_init()
38 {
39     Language lang;
40 
41     lang = language_define("assembler", ".s");
42     language_setop(lang, L_PRINTDECL, asm_printdecl);
43     language_setop(lang, L_PRINTVAL, asm_printval);
44     language_setop(lang, L_TYPEMATCH, asm_typematch);
45     language_setop(lang, L_BUILDAREF, asm_buildaref);
46     language_setop(lang, L_EVALAREF, asm_evalaref);
47     language_setop(lang, L_MODINIT, asm_modinit);
48     language_setop(lang, L_HASMODULES, asm_hasmodules);
49     language_setop(lang, L_PASSADDR, asm_passaddr);
50 }
51 
52 /*
53  * Test if two types are compatible.
54  */
55 
56 public Boolean asm_typematch(type1, type2)
57 Symbol type1, type2;
58 {
59     Boolean b;
60 
61     b = false;
62     return b;
63 }
64 
65 public asm_printdecl(s)
66 Symbol s;
67 {
68     switch (s->class) {
69 	case CONST:
70 	    printf("%s = %d", symname(s), s->symvalue.constval->value.lcon);
71 	    break;
72 
73 	case VAR:
74 	case REF:
75 	    printf("&%s = 0x%x", symname(s), s->symvalue.offset);
76 	    break;
77 
78 	case PROC:
79 	case FUNC:
80 	    printf("%s (0x%x):", symname(s), codeloc(s));
81 	    break;
82 
83 	case TYPE:
84 	    printf("%s", symname(s));
85 	    break;
86 
87 	case ARRAY:
88 	    printf("$string");
89 	    break;
90 
91 	default:
92 	    printf("[%s]", classname(s));
93 	    break;
94     }
95     putchar('\n');
96 }
97 
98 /*
99  * Print out the value on the top of the expression stack
100  * in the format for the type of the given symbol.
101  */
102 
103 public asm_printval(s)
104 register Symbol s;
105 {
106     register Symbol t;
107     register Integer len;
108 
109     switch (s->class) {
110 	case ARRAY:
111 	    t = rtype(s->type);
112 	    if (t->class == RANGE and istypename(t->type, "$char")) {
113 		len = size(s);
114 		sp -= len;
115 		printf("\"%.*s\"", len, sp);
116 	    } else {
117 		printarray(s);
118 	    }
119 	    break;
120 
121 	default:
122 	    printf("0x%x", pop(Integer));
123 	    break;
124     }
125 }
126 
127 /*
128  * Treat subscripting as indirection through pointer to integer.
129  */
130 
131 public Node asm_buildaref(a, slist)
132 Node a, slist;
133 {
134     Symbol t, eltype;
135     Node p, r;
136 
137     t = rtype(a->nodetype);
138     eltype = t->type;
139     p = slist->value.arg[0];
140     r = build(O_MUL, p, build(O_LCON, (long) size(eltype)));
141     r = build(O_ADD, build(O_RVAL, a), r);
142     r->nodetype = eltype;
143     return r;
144 }
145 
146 /*
147  * Evaluate a subscript index.  Assumes dimension is [0..n].
148  */
149 
150 public asm_evalaref(s, base, i)
151 Symbol s;
152 Address base;
153 long i;
154 {
155     Symbol t;
156 
157     t = rtype(s);
158     push(long, base + i * size(t->type));
159 }
160 
161 public asm_modinit (typetable)
162 Symbol typetable[];
163 {
164     /* nothing for right now */
165 }
166 
167 public boolean asm_hasmodules ()
168 {
169     return false;
170 }
171 
172 public boolean asm_passaddr (param, exprtype)
173 Symbol param, exprtype;
174 {
175     return false;
176 }
177