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