xref: /csrg-svn/old/dbx/asm.c (revision 9658)
1*9658Slinton /* Copyright (c) 1982 Regents of the University of California */
2*9658Slinton 
3*9658Slinton static char sccsid[] = "@(#)@(#)asm.c 1.1 12/15/82";
4*9658Slinton 
5*9658Slinton /*
6*9658Slinton  * Assembly language dependent symbol routines.
7*9658Slinton  */
8*9658Slinton 
9*9658Slinton #include "defs.h"
10*9658Slinton #include "symbols.h"
11*9658Slinton #include "asm.h"
12*9658Slinton #include "languages.h"
13*9658Slinton #include "tree.h"
14*9658Slinton #include "eval.h"
15*9658Slinton #include "operators.h"
16*9658Slinton #include "mappings.h"
17*9658Slinton #include "process.h"
18*9658Slinton #include "runtime.h"
19*9658Slinton #include "machine.h"
20*9658Slinton 
21*9658Slinton #define isdouble(range) ( \
22*9658Slinton     range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \
23*9658Slinton )
24*9658Slinton 
25*9658Slinton /*
26*9658Slinton  * Initialize assembly language information.
27*9658Slinton  */
28*9658Slinton 
29*9658Slinton public asm_init()
30*9658Slinton {
31*9658Slinton     Language lang;
32*9658Slinton 
33*9658Slinton     lang = language_define("assembler", ".s");
34*9658Slinton     language_setop(lang, L_PRINTDECL, asm_printdecl);
35*9658Slinton     language_setop(lang, L_PRINTVAL, asm_printval);
36*9658Slinton     language_setop(lang, L_TYPEMATCH, asm_typematch);
37*9658Slinton }
38*9658Slinton 
39*9658Slinton /*
40*9658Slinton  * Test if two types are compatible.
41*9658Slinton  */
42*9658Slinton 
43*9658Slinton public Boolean asm_typematch(type1, type2)
44*9658Slinton Symbol type1, type2;
45*9658Slinton {
46*9658Slinton     Boolean b;
47*9658Slinton 
48*9658Slinton     b = false;
49*9658Slinton     return b;
50*9658Slinton }
51*9658Slinton 
52*9658Slinton public asm_printdecl(s)
53*9658Slinton Symbol s;
54*9658Slinton {
55*9658Slinton     switch (s->class) {
56*9658Slinton 	case VAR:
57*9658Slinton 	case REF:
58*9658Slinton 	    printf("&%s = 0x%x", symname(s), s->symvalue.offset);
59*9658Slinton 	    break;
60*9658Slinton 
61*9658Slinton 	case PROC:
62*9658Slinton 	case FUNC:
63*9658Slinton 	    printf("%s (0x%x):", symname(s), codeloc(s));
64*9658Slinton 	    break;
65*9658Slinton 
66*9658Slinton 	default:
67*9658Slinton 	    error("class %s in c_printdecl", classname(s));
68*9658Slinton     }
69*9658Slinton     putchar('\n');
70*9658Slinton }
71*9658Slinton 
72*9658Slinton /*
73*9658Slinton  * Print out the value on the top of the expression stack
74*9658Slinton  * in the format for the type of the given symbol.
75*9658Slinton  */
76*9658Slinton 
77*9658Slinton public asm_printval(s)
78*9658Slinton register Symbol s;
79*9658Slinton {
80*9658Slinton     register Symbol t;
81*9658Slinton     register Integer len;
82*9658Slinton 
83*9658Slinton     switch (s->class) {
84*9658Slinton 	case ARRAY:
85*9658Slinton 	    t = rtype(s->type);
86*9658Slinton 	    if (t->class == RANGE and istypename(t->type, "$char")) {
87*9658Slinton 		len = size(s);
88*9658Slinton 		sp -= len;
89*9658Slinton 		printf("\"%.*s\"", len, sp);
90*9658Slinton 	    } else {
91*9658Slinton 		printarray(s);
92*9658Slinton 	    }
93*9658Slinton 	    break;
94*9658Slinton 
95*9658Slinton 	default:
96*9658Slinton 	    printf("0x%x", pop(Integer));
97*9658Slinton 	    break;
98*9658Slinton     }
99*9658Slinton }
100