123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* Copyright (c) 1982 Regents of the University of California */
- static char sccsid[] = "@(#)asm.c 1.2 12/15/82";
- /*
- * Assembly language dependent symbol routines.
- */
- #include "defs.h"
- #include "symbols.h"
- #include "asm.h"
- #include "languages.h"
- #include "tree.h"
- #include "eval.h"
- #include "operators.h"
- #include "mappings.h"
- #include "process.h"
- #include "runtime.h"
- #include "machine.h"
- #define isdouble(range) ( \
- range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \
- )
- /*
- * Initialize assembly language information.
- */
- public asm_init()
- {
- Language lang;
- lang = language_define("assembler", ".s");
- language_setop(lang, L_PRINTDECL, asm_printdecl);
- language_setop(lang, L_PRINTVAL, asm_printval);
- language_setop(lang, L_TYPEMATCH, asm_typematch);
- }
- /*
- * Test if two types are compatible.
- */
- public Boolean asm_typematch(type1, type2)
- Symbol type1, type2;
- {
- Boolean b;
- b = false;
- return b;
- }
- public asm_printdecl(s)
- Symbol s;
- {
- switch (s->class) {
- case VAR:
- case REF:
- printf("&%s = 0x%x", symname(s), s->symvalue.offset);
- break;
- case PROC:
- case FUNC:
- printf("%s (0x%x):", symname(s), codeloc(s));
- break;
- default:
- error("class %s in c_printdecl", classname(s));
- }
- putchar('\n');
- }
- /*
- * Print out the value on the top of the expression stack
- * in the format for the type of the given symbol.
- */
- public asm_printval(s)
- register Symbol s;
- {
- register Symbol t;
- register Integer len;
- switch (s->class) {
- case ARRAY:
- t = rtype(s->type);
- if (t->class == RANGE and istypename(t->type, "$char")) {
- len = size(s);
- sp -= len;
- printf("\"%.*s\"", len, sp);
- } else {
- printarray(s);
- }
- break;
- default:
- printf("0x%x", pop(Integer));
- break;
- }
- }
|