|
|
1.1 ! root 1: /* ! 2: * adb - symbol table routines ! 3: */ ! 4: #include "defs.h" ! 5: #include "sym.h" ! 6: #include "space.h" ! 7: ! 8: struct sym *cursym; ! 9: struct sym *symtab; ! 10: ! 11: static int gsname(), lsname(); ! 12: ! 13: /* ! 14: * Lookup a symbol by name ! 15: * leave a pointer to the symbol in cursym ! 16: */ ! 17: struct sym * ! 18: lookup(symstr) ! 19: register char *symstr; ! 20: { ! 21: register struct sym *sp; ! 22: ! 23: cursym = 0; ! 24: for (sp = symtab; sp; sp = sp->y_next) ! 25: if (eqsym(sp, symstr)) ! 26: return(cursym = sp); ! 27: return (0); ! 28: } ! 29: ! 30: /* ! 31: * find the symbols for a routine ! 32: */ ! 33: ! 34: int ! 35: findrtn(rtn) ! 36: char *rtn; ! 37: { ! 38: register struct sym *sp; ! 39: ! 40: cursym = 0; ! 41: for (sp = symtab; sp; sp = sp->y_next) ! 42: switch (sp->y_type) { ! 43: case S_TEXT: ! 44: if (eqsym(sp, rtn)) { ! 45: cursym = sp; ! 46: return (1); ! 47: } ! 48: } ! 49: return (0); ! 50: } ! 51: ! 52: /* ! 53: * Find the closest symbol to val, and return ! 54: * the difference between val and the symbol found. ! 55: * Leave a pointer to the symbol found as cursym. ! 56: */ ! 57: WORD ! 58: findsym(w, type) ! 59: WORD w; ! 60: int type; ! 61: { ! 62: register unsigned long diff; ! 63: register unsigned long val; ! 64: register struct sym *sp; ! 65: ! 66: val = w; ! 67: cursym = 0; ! 68: diff = HUGE; ! 69: type &= SPTYPE; ! 70: if (type == NOSP || symtab == 0) ! 71: return (diff); ! 72: for (sp = symtab; sp; sp = sp->y_next) { ! 73: switch (type) { ! 74: case INSTSP: ! 75: if (sp->y_type != S_TEXT && sp->y_type != S_ABS) ! 76: continue; ! 77: break; ! 78: ! 79: case DATASP: ! 80: if (sp->y_type != S_DATA && sp->y_type != S_ABS) ! 81: continue; ! 82: break; ! 83: } ! 84: if (val >= (unsigned long)sp->y_value ! 85: && val - (unsigned long)sp->y_value < diff) { ! 86: diff = val - (unsigned long)sp->y_value; ! 87: cursym = sp; ! 88: if (diff == 0) ! 89: break; ! 90: } ! 91: } ! 92: if (cursym && cursym->y_value == 0 && diff != 0) ! 93: return (HUGE); ! 94: return (diff); ! 95: } ! 96: ! 97: /* ! 98: * advance cursym to the next local variable ! 99: * return 0 if the next variable is a global ! 100: */ ! 101: int ! 102: localsym() ! 103: { ! 104: register struct sym *sp; ! 105: ! 106: if ((sp = cursym) == NULL) ! 107: return (0); ! 108: if (sp->y_type != S_STAB) ! 109: sp = sp->y_locals; ! 110: else ! 111: sp = sp->y_next; ! 112: cursym = sp; ! 113: return (cursym != 0); ! 114: } ! 115: ! 116: /* ! 117: * Print value v and then the string s. ! 118: * If v is not zero, then we look for a nearby symbol ! 119: * and print name+offset if we find a symbol for which ! 120: * offset is small enough. ! 121: */ ! 122: psymoff(v, type, s) ! 123: WORD v; ! 124: int type; ! 125: char *s; ! 126: { ! 127: WORD w; ! 128: ! 129: if ((type & SPTYPE) == REGSP) { ! 130: printf("%%%R", v); ! 131: printf(s); ! 132: return; ! 133: } ! 134: if (v) ! 135: w = findsym(v, type); ! 136: if (v==0 || w >= maxoff) ! 137: printf("%R", v); ! 138: else { ! 139: printf("%s", cursym->y_name); ! 140: if (w) ! 141: printf("+%R", w); ! 142: } ! 143: printf(s); ! 144: } ! 145: ! 146: /* ! 147: * Print value v symbolically if it has a reasonable ! 148: * interpretation as name+offset. If not, print nothing. ! 149: * Used in printing out registers $r. ! 150: */ ! 151: valpr(v, idsp) ! 152: WORD v; ! 153: { ! 154: WORD d; ! 155: ! 156: d = findsym(v, idsp); ! 157: if (d >= maxoff) ! 158: return; ! 159: printf("%s", cursym->y_name); ! 160: if (d) ! 161: printf("+%R", d); ! 162: } ! 163: ! 164: printsym() ! 165: { ! 166: register struct sym *sp; ! 167: register struct sym *lp; ! 168: ! 169: for (sp = symtab; sp; sp = sp->y_next) { ! 170: printf("%8R %c %s\n", sp->y_value, gsname(sp->y_type), sp->y_name); ! 171: for (lp = sp->y_locals; lp; lp = lp->y_next) ! 172: printf("%8R %c %s\n", lp->y_value, lsname(lp->y_ltype), lp->y_name); ! 173: } ! 174: } ! 175: ! 176: static ! 177: gsname(t) ! 178: int t; ! 179: { ! 180: switch (t) { ! 181: case S_TEXT: ! 182: return ('T'); ! 183: case S_DATA: ! 184: return ('D'); ! 185: case S_ABS: ! 186: return ('A'); ! 187: case S_STAB: ! 188: return ('L'); ! 189: default: ! 190: return ('?'); ! 191: } ! 192: } ! 193: ! 194: static ! 195: lsname(t) ! 196: int t; ! 197: { ! 198: switch (t) { ! 199: case S_LSYM: ! 200: return ('l'); ! 201: case S_PSYM: ! 202: return ('p'); ! 203: case S_RSYM: ! 204: return ('r'); ! 205: case S_STSYM: ! 206: return ('s'); ! 207: default: ! 208: return ('?'); ! 209: } ! 210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.