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