|
|
1.1 root 1: #include "strip.h"
2: #include "hash.h"
3: #define DESCSYMBS
4: #include "stab.h"
5:
6: struct hn {
7: struct nlist *symbol;
8: int len;
9: };
10:
11: static int nglobs; static struct hn *tabstart, *tabend;
12:
13: shrink(a)
14: register struct Adotout *a;
15: {
16: register struct nlist *sym, *ssym;
17: register char *str; register int n;
18:
19: hashinit();
20: nglobs = 0;
21:
22: for (sym=a->symtab; sym<a->symend; sym++)
23: if (str = sym->n_un.n_name) {
24: if (sym->n_type == N_GSYM || sym->n_type == N_BSTR)
25: nglobs++;
26: if (*(str += (int)a->strtab) == '_')
27: sym->n_un.n_name = hash(str);
28: else
29: sym->n_un.n_name = str;
30: }
31:
32: for (sym=a->symtab; sym<a->symend; sym++)
33: if ((str = sym->n_un.n_name) && *str != '_')
34: sym->n_un.n_name = hash(str);
35:
36: if (prtflag) prthash();
37:
38: Free(a->strtab);
39: if ((tabstart = Calloc(struct hn, nglobs)) == 0)
40: fatal("cannot malloc hashed symbol table", "");
41: tabend = tabstart + nglobs;
42:
43: for (sym=ssym=a->symtab; sym<a->symend;) {
44: if (gflag && (sym->n_type == N_SLINE ||
45: sym->n_type == N_LBRAC || sym->n_type == N_RBRAC)) {
46: sym++;
47: } else if (sym->n_type != N_GSYM && sym->n_type != N_BSTR) {
48: if (ssym != sym)
49: *ssym++ = *sym++;
50: else
51: ssym++, sym++;
52: } else if ((n = lookup(sym, ssym)) < 0) {
53: sym -= n;
54: } else if (ssym != sym) {
55: while (--n >= 0)
56: *ssym++ = *sym++;
57: } else {
58: ssym += n, sym += n;
59: }
60: }
61: Free(tabstart);
62: a->symend = ssym;
63: a->nsymbols = ssym - a->symtab;
64: a->symtab = Realloc(struct nlist, a->symtab, a->nsymbols);
65: if (prtflag)
66: printf("number of symbols reduced to %d\n", a->nsymbols);
67: }
68:
69: lookup(sym, where)
70: register struct nlist *sym; struct nlist *where;
71: {
72: register struct nlist *t;
73: register struct hn *pt; struct hn *ptstart;
74: int lsym = symlen(sym);
75:
76: pt = ptstart = tabstart +
77: ((unsigned long)(sym->n_un.n_name)) % nglobs;
78:
79: do {
80: if ((t = pt->symbol) == 0) {
81: pt->symbol = where;
82: pt->len = lsym;
83: return lsym;
84: }
85: if (t->n_un.n_name != sym->n_un.n_name ||
86: t->n_type != sym->n_type) {
87: continue;
88: }
89: if (pt->len == lsym && nlistcmp(t, sym, lsym) == 0) {
90: return -lsym;
91: } else {
92: return lsym;
93: }
94: } while ((++pt >= tabend ? pt = tabstart : pt) != ptstart);
95:
96: fatal("hashed symbol table full", "");
97: }
98:
99: symlen(sym)
100: register struct nlist *sym;
101: {
102: register len = 1, t, m;
103: if (sym[1].n_type == N_TYSIG)
104: ++len;
105: else if (sym->n_type == N_BSTR) {
106: do ++len; while ((++sym)->n_type != N_ESTR);
107: } else {
108: switch (BTYPE(t = sym->n_desc)) {
109: case STRTY:
110: case UNIONTY:
111: case ENUMTY:
112: ++len;
113: }
114: for (; m = t&TMASK; t >>= TSHIFT)
115: if (m == ARY) ++len;
116: }
117: return len;
118: }
119:
120: nlistcmp(a,b,n)
121: register int *a, *b, n;
122: {
123: n *= sizeof(struct nlist)/sizeof(int);
124: while (--n >= 0)
125: if (*a++ != *b++) return 1;
126: return 0;
127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.