xref: /csrg-svn/old/dbx/asm.c (revision 33308)
121598Sdist /*
221598Sdist  * Copyright (c) 1983 Regents of the University of California.
321598Sdist  * All rights reserved.  The Berkeley software License Agreement
421598Sdist  * specifies the terms and conditions for redistribution.
521598Sdist  */
69658Slinton 
721598Sdist #ifndef lint
8*33308Sdonn static char sccsid[] = "@(#)asm.c	5.2 (Berkeley) 01/11/88";
921598Sdist #endif not lint
109658Slinton 
11*33308Sdonn static char rcsid[] = "$Header: asm.c,v 1.2 87/03/25 19:24:09 donn Exp $";
1218213Slinton 
139658Slinton /*
149658Slinton  * Assembly language dependent symbol routines.
159658Slinton  */
169658Slinton 
179658Slinton #include "defs.h"
189658Slinton #include "symbols.h"
199658Slinton #include "asm.h"
209658Slinton #include "languages.h"
219658Slinton #include "tree.h"
229658Slinton #include "eval.h"
239658Slinton #include "operators.h"
249658Slinton #include "mappings.h"
259658Slinton #include "process.h"
269658Slinton #include "runtime.h"
279658Slinton #include "machine.h"
289658Slinton 
299658Slinton #define isdouble(range) ( \
309658Slinton     range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \
319658Slinton )
329658Slinton 
339658Slinton /*
349658Slinton  * Initialize assembly language information.
359658Slinton  */
369658Slinton 
379658Slinton public asm_init()
389658Slinton {
399658Slinton     Language lang;
409658Slinton 
419658Slinton     lang = language_define("assembler", ".s");
429658Slinton     language_setop(lang, L_PRINTDECL, asm_printdecl);
439658Slinton     language_setop(lang, L_PRINTVAL, asm_printval);
449658Slinton     language_setop(lang, L_TYPEMATCH, asm_typematch);
4518213Slinton     language_setop(lang, L_BUILDAREF, asm_buildaref);
4618213Slinton     language_setop(lang, L_EVALAREF, asm_evalaref);
47*33308Sdonn     language_setop(lang, L_MODINIT, asm_modinit);
4816606Ssam     language_setop(lang, L_HASMODULES, asm_hasmodules);
4916606Ssam     language_setop(lang, L_PASSADDR, asm_passaddr);
509658Slinton }
519658Slinton 
529658Slinton /*
539658Slinton  * Test if two types are compatible.
549658Slinton  */
559658Slinton 
569658Slinton public Boolean asm_typematch(type1, type2)
579658Slinton Symbol type1, type2;
589658Slinton {
599658Slinton     Boolean b;
609658Slinton 
619658Slinton     b = false;
629658Slinton     return b;
639658Slinton }
649658Slinton 
659658Slinton public asm_printdecl(s)
669658Slinton Symbol s;
679658Slinton {
689658Slinton     switch (s->class) {
6918213Slinton 	case CONST:
7018213Slinton 	    printf("%s = %d", symname(s), s->symvalue.constval->value.lcon);
7118213Slinton 	    break;
7218213Slinton 
739658Slinton 	case VAR:
749658Slinton 	case REF:
759658Slinton 	    printf("&%s = 0x%x", symname(s), s->symvalue.offset);
769658Slinton 	    break;
779658Slinton 
789658Slinton 	case PROC:
799658Slinton 	case FUNC:
809658Slinton 	    printf("%s (0x%x):", symname(s), codeloc(s));
819658Slinton 	    break;
829658Slinton 
8318213Slinton 	case TYPE:
8418213Slinton 	    printf("%s", symname(s));
8518213Slinton 	    break;
8618213Slinton 
8718213Slinton 	case ARRAY:
8818213Slinton 	    printf("$string");
8918213Slinton 	    break;
9018213Slinton 
919658Slinton 	default:
9218213Slinton 	    printf("[%s]", classname(s));
9318213Slinton 	    break;
949658Slinton     }
959658Slinton     putchar('\n');
969658Slinton }
979658Slinton 
989658Slinton /*
999658Slinton  * Print out the value on the top of the expression stack
1009658Slinton  * in the format for the type of the given symbol.
1019658Slinton  */
1029658Slinton 
1039658Slinton public asm_printval(s)
1049658Slinton register Symbol s;
1059658Slinton {
1069658Slinton     register Symbol t;
1079658Slinton     register Integer len;
1089658Slinton 
1099658Slinton     switch (s->class) {
1109658Slinton 	case ARRAY:
1119658Slinton 	    t = rtype(s->type);
1129658Slinton 	    if (t->class == RANGE and istypename(t->type, "$char")) {
1139658Slinton 		len = size(s);
1149658Slinton 		sp -= len;
1159658Slinton 		printf("\"%.*s\"", len, sp);
1169658Slinton 	    } else {
1179658Slinton 		printarray(s);
1189658Slinton 	    }
1199658Slinton 	    break;
1209658Slinton 
1219658Slinton 	default:
1229658Slinton 	    printf("0x%x", pop(Integer));
1239658Slinton 	    break;
1249658Slinton     }
1259658Slinton }
12616606Ssam 
12718213Slinton /*
12818213Slinton  * Treat subscripting as indirection through pointer to integer.
12918213Slinton  */
13018213Slinton 
13118213Slinton public Node asm_buildaref(a, slist)
13218213Slinton Node a, slist;
13318213Slinton {
13418213Slinton     Symbol t, eltype;
13518213Slinton     Node p, r;
13618213Slinton 
13718213Slinton     t = rtype(a->nodetype);
13818213Slinton     eltype = t->type;
13918213Slinton     p = slist->value.arg[0];
14018213Slinton     r = build(O_MUL, p, build(O_LCON, (long) size(eltype)));
14118213Slinton     r = build(O_ADD, build(O_RVAL, a), r);
14218213Slinton     r->nodetype = eltype;
14318213Slinton     return r;
14418213Slinton }
14518213Slinton 
14618213Slinton /*
14718213Slinton  * Evaluate a subscript index.  Assumes dimension is [0..n].
14818213Slinton  */
14918213Slinton 
15018213Slinton public asm_evalaref(s, base, i)
15118213Slinton Symbol s;
15218213Slinton Address base;
15318213Slinton long i;
15418213Slinton {
15518213Slinton     Symbol t;
15618213Slinton 
15718213Slinton     t = rtype(s);
15818213Slinton     push(long, base + i * size(t->type));
15918213Slinton }
16018213Slinton 
161*33308Sdonn public asm_modinit (typetable)
162*33308Sdonn Symbol typetable[];
163*33308Sdonn {
164*33308Sdonn     /* nothing for right now */
165*33308Sdonn }
166*33308Sdonn 
16716606Ssam public boolean asm_hasmodules ()
16816606Ssam {
16916606Ssam     return false;
17016606Ssam }
17116606Ssam 
17216606Ssam public boolean asm_passaddr (param, exprtype)
17316606Ssam Symbol param, exprtype;
17416606Ssam {
17516606Ssam     return false;
17616606Ssam }
177