xref: /csrg-svn/old/dbx/asm.c (revision 18213)
19658Slinton /* Copyright (c) 1982 Regents of the University of California */
29658Slinton 
3*18213Slinton static	char sccsid[] = "@(#)asm.c	1.4 (Berkeley) 03/01/85";
49658Slinton 
5*18213Slinton static char rcsid[] = "$Header: asm.c,v 1.5 84/12/26 10:38:19 linton Exp $";
6*18213Slinton 
79658Slinton /*
89658Slinton  * Assembly language dependent symbol routines.
99658Slinton  */
109658Slinton 
119658Slinton #include "defs.h"
129658Slinton #include "symbols.h"
139658Slinton #include "asm.h"
149658Slinton #include "languages.h"
159658Slinton #include "tree.h"
169658Slinton #include "eval.h"
179658Slinton #include "operators.h"
189658Slinton #include "mappings.h"
199658Slinton #include "process.h"
209658Slinton #include "runtime.h"
219658Slinton #include "machine.h"
229658Slinton 
239658Slinton #define isdouble(range) ( \
249658Slinton     range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \
259658Slinton )
269658Slinton 
279658Slinton /*
289658Slinton  * Initialize assembly language information.
299658Slinton  */
309658Slinton 
319658Slinton public asm_init()
329658Slinton {
339658Slinton     Language lang;
349658Slinton 
359658Slinton     lang = language_define("assembler", ".s");
369658Slinton     language_setop(lang, L_PRINTDECL, asm_printdecl);
379658Slinton     language_setop(lang, L_PRINTVAL, asm_printval);
389658Slinton     language_setop(lang, L_TYPEMATCH, asm_typematch);
39*18213Slinton     language_setop(lang, L_BUILDAREF, asm_buildaref);
40*18213Slinton     language_setop(lang, L_EVALAREF, asm_evalaref);
4116606Ssam     language_setop(lang, L_HASMODULES, asm_hasmodules);
4216606Ssam     language_setop(lang, L_PASSADDR, asm_passaddr);
439658Slinton }
449658Slinton 
459658Slinton /*
469658Slinton  * Test if two types are compatible.
479658Slinton  */
489658Slinton 
499658Slinton public Boolean asm_typematch(type1, type2)
509658Slinton Symbol type1, type2;
519658Slinton {
529658Slinton     Boolean b;
539658Slinton 
549658Slinton     b = false;
559658Slinton     return b;
569658Slinton }
579658Slinton 
589658Slinton public asm_printdecl(s)
599658Slinton Symbol s;
609658Slinton {
619658Slinton     switch (s->class) {
62*18213Slinton 	case CONST:
63*18213Slinton 	    printf("%s = %d", symname(s), s->symvalue.constval->value.lcon);
64*18213Slinton 	    break;
65*18213Slinton 
669658Slinton 	case VAR:
679658Slinton 	case REF:
689658Slinton 	    printf("&%s = 0x%x", symname(s), s->symvalue.offset);
699658Slinton 	    break;
709658Slinton 
719658Slinton 	case PROC:
729658Slinton 	case FUNC:
739658Slinton 	    printf("%s (0x%x):", symname(s), codeloc(s));
749658Slinton 	    break;
759658Slinton 
76*18213Slinton 	case TYPE:
77*18213Slinton 	    printf("%s", symname(s));
78*18213Slinton 	    break;
79*18213Slinton 
80*18213Slinton 	case ARRAY:
81*18213Slinton 	    printf("$string");
82*18213Slinton 	    break;
83*18213Slinton 
849658Slinton 	default:
85*18213Slinton 	    printf("[%s]", classname(s));
86*18213Slinton 	    break;
879658Slinton     }
889658Slinton     putchar('\n');
899658Slinton }
909658Slinton 
919658Slinton /*
929658Slinton  * Print out the value on the top of the expression stack
939658Slinton  * in the format for the type of the given symbol.
949658Slinton  */
959658Slinton 
969658Slinton public asm_printval(s)
979658Slinton register Symbol s;
989658Slinton {
999658Slinton     register Symbol t;
1009658Slinton     register Integer len;
1019658Slinton 
1029658Slinton     switch (s->class) {
1039658Slinton 	case ARRAY:
1049658Slinton 	    t = rtype(s->type);
1059658Slinton 	    if (t->class == RANGE and istypename(t->type, "$char")) {
1069658Slinton 		len = size(s);
1079658Slinton 		sp -= len;
1089658Slinton 		printf("\"%.*s\"", len, sp);
1099658Slinton 	    } else {
1109658Slinton 		printarray(s);
1119658Slinton 	    }
1129658Slinton 	    break;
1139658Slinton 
1149658Slinton 	default:
1159658Slinton 	    printf("0x%x", pop(Integer));
1169658Slinton 	    break;
1179658Slinton     }
1189658Slinton }
11916606Ssam 
120*18213Slinton /*
121*18213Slinton  * Treat subscripting as indirection through pointer to integer.
122*18213Slinton  */
123*18213Slinton 
124*18213Slinton public Node asm_buildaref(a, slist)
125*18213Slinton Node a, slist;
126*18213Slinton {
127*18213Slinton     Symbol t, eltype;
128*18213Slinton     Node p, r;
129*18213Slinton 
130*18213Slinton     t = rtype(a->nodetype);
131*18213Slinton     eltype = t->type;
132*18213Slinton     p = slist->value.arg[0];
133*18213Slinton     r = build(O_MUL, p, build(O_LCON, (long) size(eltype)));
134*18213Slinton     r = build(O_ADD, build(O_RVAL, a), r);
135*18213Slinton     r->nodetype = eltype;
136*18213Slinton     return r;
137*18213Slinton }
138*18213Slinton 
139*18213Slinton /*
140*18213Slinton  * Evaluate a subscript index.  Assumes dimension is [0..n].
141*18213Slinton  */
142*18213Slinton 
143*18213Slinton public asm_evalaref(s, base, i)
144*18213Slinton Symbol s;
145*18213Slinton Address base;
146*18213Slinton long i;
147*18213Slinton {
148*18213Slinton     Symbol t;
149*18213Slinton 
150*18213Slinton     t = rtype(s);
151*18213Slinton     push(long, base + i * size(t->type));
152*18213Slinton }
153*18213Slinton 
15416606Ssam public boolean asm_hasmodules ()
15516606Ssam {
15616606Ssam     return false;
15716606Ssam }
15816606Ssam 
15916606Ssam public boolean asm_passaddr (param, exprtype)
16016606Ssam Symbol param, exprtype;
16116606Ssam {
16216606Ssam     return false;
16316606Ssam }
164