xref: /csrg-svn/old/dbx/asm.c (revision 9684)
19658Slinton /* Copyright (c) 1982 Regents of the University of California */
29658Slinton 
3*9684Slinton static char sccsid[] = "@(#)asm.c 1.2 12/15/82";
49658Slinton 
59658Slinton /*
69658Slinton  * Assembly language dependent symbol routines.
79658Slinton  */
89658Slinton 
99658Slinton #include "defs.h"
109658Slinton #include "symbols.h"
119658Slinton #include "asm.h"
129658Slinton #include "languages.h"
139658Slinton #include "tree.h"
149658Slinton #include "eval.h"
159658Slinton #include "operators.h"
169658Slinton #include "mappings.h"
179658Slinton #include "process.h"
189658Slinton #include "runtime.h"
199658Slinton #include "machine.h"
209658Slinton 
219658Slinton #define isdouble(range) ( \
229658Slinton     range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \
239658Slinton )
249658Slinton 
259658Slinton /*
269658Slinton  * Initialize assembly language information.
279658Slinton  */
289658Slinton 
299658Slinton public asm_init()
309658Slinton {
319658Slinton     Language lang;
329658Slinton 
339658Slinton     lang = language_define("assembler", ".s");
349658Slinton     language_setop(lang, L_PRINTDECL, asm_printdecl);
359658Slinton     language_setop(lang, L_PRINTVAL, asm_printval);
369658Slinton     language_setop(lang, L_TYPEMATCH, asm_typematch);
379658Slinton }
389658Slinton 
399658Slinton /*
409658Slinton  * Test if two types are compatible.
419658Slinton  */
429658Slinton 
439658Slinton public Boolean asm_typematch(type1, type2)
449658Slinton Symbol type1, type2;
459658Slinton {
469658Slinton     Boolean b;
479658Slinton 
489658Slinton     b = false;
499658Slinton     return b;
509658Slinton }
519658Slinton 
529658Slinton public asm_printdecl(s)
539658Slinton Symbol s;
549658Slinton {
559658Slinton     switch (s->class) {
569658Slinton 	case VAR:
579658Slinton 	case REF:
589658Slinton 	    printf("&%s = 0x%x", symname(s), s->symvalue.offset);
599658Slinton 	    break;
609658Slinton 
619658Slinton 	case PROC:
629658Slinton 	case FUNC:
639658Slinton 	    printf("%s (0x%x):", symname(s), codeloc(s));
649658Slinton 	    break;
659658Slinton 
669658Slinton 	default:
679658Slinton 	    error("class %s in c_printdecl", classname(s));
689658Slinton     }
699658Slinton     putchar('\n');
709658Slinton }
719658Slinton 
729658Slinton /*
739658Slinton  * Print out the value on the top of the expression stack
749658Slinton  * in the format for the type of the given symbol.
759658Slinton  */
769658Slinton 
779658Slinton public asm_printval(s)
789658Slinton register Symbol s;
799658Slinton {
809658Slinton     register Symbol t;
819658Slinton     register Integer len;
829658Slinton 
839658Slinton     switch (s->class) {
849658Slinton 	case ARRAY:
859658Slinton 	    t = rtype(s->type);
869658Slinton 	    if (t->class == RANGE and istypename(t->type, "$char")) {
879658Slinton 		len = size(s);
889658Slinton 		sp -= len;
899658Slinton 		printf("\"%.*s\"", len, sp);
909658Slinton 	    } else {
919658Slinton 		printarray(s);
929658Slinton 	    }
939658Slinton 	    break;
949658Slinton 
959658Slinton 	default:
969658Slinton 	    printf("0x%x", pop(Integer));
979658Slinton 	    break;
989658Slinton     }
999658Slinton }
100