xref: /csrg-svn/old/dbx/asm.c (revision 21598)
1*21598Sdist /*
2*21598Sdist  * Copyright (c) 1983 Regents of the University of California.
3*21598Sdist  * All rights reserved.  The Berkeley software License Agreement
4*21598Sdist  * specifies the terms and conditions for redistribution.
5*21598Sdist  */
69658Slinton 
7*21598Sdist #ifndef lint
8*21598Sdist static char sccsid[] = "@(#)asm.c	5.1 (Berkeley) 05/31/85";
9*21598Sdist #endif not lint
109658Slinton 
1118213Slinton static char rcsid[] = "$Header: asm.c,v 1.5 84/12/26 10:38:19 linton 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);
4716606Ssam     language_setop(lang, L_HASMODULES, asm_hasmodules);
4816606Ssam     language_setop(lang, L_PASSADDR, asm_passaddr);
499658Slinton }
509658Slinton 
519658Slinton /*
529658Slinton  * Test if two types are compatible.
539658Slinton  */
549658Slinton 
559658Slinton public Boolean asm_typematch(type1, type2)
569658Slinton Symbol type1, type2;
579658Slinton {
589658Slinton     Boolean b;
599658Slinton 
609658Slinton     b = false;
619658Slinton     return b;
629658Slinton }
639658Slinton 
649658Slinton public asm_printdecl(s)
659658Slinton Symbol s;
669658Slinton {
679658Slinton     switch (s->class) {
6818213Slinton 	case CONST:
6918213Slinton 	    printf("%s = %d", symname(s), s->symvalue.constval->value.lcon);
7018213Slinton 	    break;
7118213Slinton 
729658Slinton 	case VAR:
739658Slinton 	case REF:
749658Slinton 	    printf("&%s = 0x%x", symname(s), s->symvalue.offset);
759658Slinton 	    break;
769658Slinton 
779658Slinton 	case PROC:
789658Slinton 	case FUNC:
799658Slinton 	    printf("%s (0x%x):", symname(s), codeloc(s));
809658Slinton 	    break;
819658Slinton 
8218213Slinton 	case TYPE:
8318213Slinton 	    printf("%s", symname(s));
8418213Slinton 	    break;
8518213Slinton 
8618213Slinton 	case ARRAY:
8718213Slinton 	    printf("$string");
8818213Slinton 	    break;
8918213Slinton 
909658Slinton 	default:
9118213Slinton 	    printf("[%s]", classname(s));
9218213Slinton 	    break;
939658Slinton     }
949658Slinton     putchar('\n');
959658Slinton }
969658Slinton 
979658Slinton /*
989658Slinton  * Print out the value on the top of the expression stack
999658Slinton  * in the format for the type of the given symbol.
1009658Slinton  */
1019658Slinton 
1029658Slinton public asm_printval(s)
1039658Slinton register Symbol s;
1049658Slinton {
1059658Slinton     register Symbol t;
1069658Slinton     register Integer len;
1079658Slinton 
1089658Slinton     switch (s->class) {
1099658Slinton 	case ARRAY:
1109658Slinton 	    t = rtype(s->type);
1119658Slinton 	    if (t->class == RANGE and istypename(t->type, "$char")) {
1129658Slinton 		len = size(s);
1139658Slinton 		sp -= len;
1149658Slinton 		printf("\"%.*s\"", len, sp);
1159658Slinton 	    } else {
1169658Slinton 		printarray(s);
1179658Slinton 	    }
1189658Slinton 	    break;
1199658Slinton 
1209658Slinton 	default:
1219658Slinton 	    printf("0x%x", pop(Integer));
1229658Slinton 	    break;
1239658Slinton     }
1249658Slinton }
12516606Ssam 
12618213Slinton /*
12718213Slinton  * Treat subscripting as indirection through pointer to integer.
12818213Slinton  */
12918213Slinton 
13018213Slinton public Node asm_buildaref(a, slist)
13118213Slinton Node a, slist;
13218213Slinton {
13318213Slinton     Symbol t, eltype;
13418213Slinton     Node p, r;
13518213Slinton 
13618213Slinton     t = rtype(a->nodetype);
13718213Slinton     eltype = t->type;
13818213Slinton     p = slist->value.arg[0];
13918213Slinton     r = build(O_MUL, p, build(O_LCON, (long) size(eltype)));
14018213Slinton     r = build(O_ADD, build(O_RVAL, a), r);
14118213Slinton     r->nodetype = eltype;
14218213Slinton     return r;
14318213Slinton }
14418213Slinton 
14518213Slinton /*
14618213Slinton  * Evaluate a subscript index.  Assumes dimension is [0..n].
14718213Slinton  */
14818213Slinton 
14918213Slinton public asm_evalaref(s, base, i)
15018213Slinton Symbol s;
15118213Slinton Address base;
15218213Slinton long i;
15318213Slinton {
15418213Slinton     Symbol t;
15518213Slinton 
15618213Slinton     t = rtype(s);
15718213Slinton     push(long, base + i * size(t->type));
15818213Slinton }
15918213Slinton 
16016606Ssam public boolean asm_hasmodules ()
16116606Ssam {
16216606Ssam     return false;
16316606Ssam }
16416606Ssam 
16516606Ssam public boolean asm_passaddr (param, exprtype)
16616606Ssam Symbol param, exprtype;
16716606Ssam {
16816606Ssam     return false;
16916606Ssam }
170