1: /* 2: * Copyright (c) 1983 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char sccsid[] = "@(#)asm.c 5.1 (Berkeley) 5/31/85"; 9: #endif not lint 10: 11: static char rcsid[] = "$Header: asm.c,v 1.5 84/12/26 10:38:19 linton Exp $"; 12: 13: /* 14: * Assembly language dependent symbol routines. 15: */ 16: 17: #include "defs.h" 18: #include "symbols.h" 19: #include "asm.h" 20: #include "languages.h" 21: #include "tree.h" 22: #include "eval.h" 23: #include "operators.h" 24: #include "mappings.h" 25: #include "process.h" 26: #include "runtime.h" 27: #include "machine.h" 28: 29: #define isdouble(range) ( \ 30: range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ 31: ) 32: 33: /* 34: * Initialize assembly language information. 35: */ 36: 37: public asm_init() 38: { 39: Language lang; 40: 41: lang = language_define("assembler", ".s"); 42: language_setop(lang, L_PRINTDECL, asm_printdecl); 43: language_setop(lang, L_PRINTVAL, asm_printval); 44: language_setop(lang, L_TYPEMATCH, asm_typematch); 45: language_setop(lang, L_BUILDAREF, asm_buildaref); 46: language_setop(lang, L_EVALAREF, asm_evalaref); 47: language_setop(lang, L_HASMODULES, asm_hasmodules); 48: language_setop(lang, L_PASSADDR, asm_passaddr); 49: } 50: 51: /* 52: * Test if two types are compatible. 53: */ 54: 55: public Boolean asm_typematch(type1, type2) 56: Symbol type1, type2; 57: { 58: Boolean b; 59: 60: b = false; 61: return b; 62: } 63: 64: public asm_printdecl(s) 65: Symbol s; 66: { 67: switch (s->class) { 68: case CONST: 69: printf("%s = %d", symname(s), s->symvalue.constval->value.lcon); 70: break; 71: 72: case VAR: 73: case REF: 74: printf("&%s = 0x%x", symname(s), s->symvalue.offset); 75: break; 76: 77: case PROC: 78: case FUNC: 79: printf("%s (0x%x):", symname(s), codeloc(s)); 80: break; 81: 82: case TYPE: 83: printf("%s", symname(s)); 84: break; 85: 86: case ARRAY: 87: printf("$string"); 88: break; 89: 90: default: 91: printf("[%s]", classname(s)); 92: break; 93: } 94: putchar('\n'); 95: } 96: 97: /* 98: * Print out the value on the top of the expression stack 99: * in the format for the type of the given symbol. 100: */ 101: 102: public asm_printval(s) 103: register Symbol s; 104: { 105: register Symbol t; 106: register Integer len; 107: 108: switch (s->class) { 109: case ARRAY: 110: t = rtype(s->type); 111: if (t->class == RANGE and istypename(t->type, "$char")) { 112: len = size(s); 113: sp -= len; 114: printf("\"%.*s\"", len, sp); 115: } else { 116: printarray(s); 117: } 118: break; 119: 120: default: 121: printf("0x%x", pop(Integer)); 122: break; 123: } 124: } 125: 126: /* 127: * Treat subscripting as indirection through pointer to integer. 128: */ 129: 130: public Node asm_buildaref(a, slist) 131: Node a, slist; 132: { 133: Symbol t, eltype; 134: Node p, r; 135: 136: t = rtype(a->nodetype); 137: eltype = t->type; 138: p = slist->value.arg[0]; 139: r = build(O_MUL, p, build(O_LCON, (long) size(eltype))); 140: r = build(O_ADD, build(O_RVAL, a), r); 141: r->nodetype = eltype; 142: return r; 143: } 144: 145: /* 146: * Evaluate a subscript index. Assumes dimension is [0..n]. 147: */ 148: 149: public asm_evalaref(s, base, i) 150: Symbol s; 151: Address base; 152: long i; 153: { 154: Symbol t; 155: 156: t = rtype(s); 157: push(long, base + i * size(t->type)); 158: } 159: 160: public boolean asm_hasmodules () 161: { 162: return false; 163: } 164: 165: public boolean asm_passaddr (param, exprtype) 166: Symbol param, exprtype; 167: { 168: return false; 169: }