date and time created 88/07/22 16:08:01 by bostic
[unix-history] / usr / src / old / as.vax / assyms.h
CommitLineData
f70ab843 1/*
bcf1365c
DF
2 * Copyright (c) 1982 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 * @(#)assyms.h 5.1 (Berkeley) %G%
f70ab843 7 */
bcf1365c 8
7c81b4f2
BJ
9/*
10 * To speed up walks through symbols defined in a particular
11 * segment, we buil up a table of pointers into the symbol table
12 * and a table of delimiters for each segment. The delimiter for
13 * the particular segment points to the first word in that segment.
14 */
15
16extern struct symtab **symptrs; /*dynamically allocated*/
17extern struct symtab **symdelim[NLOC + NLOC + 1];
18extern struct symtab **symptrub;
19extern int nsyms; /*number in the symbol table*/
20extern int njxxx; /*the number of jxxx entries in the table*/
21extern int nforgotten; /*how many entries erroneously entered*/
22extern int nlabels; /*how many labels in the symbol table*/
23extern int hshused; /*how many hash slots used*/
24
25#define SEGITERATE(segno, start, end, copointer, walkpointer, ubpointer, direction) \
26 for(copointer = start == 0? symdelim[segno]:start,\
27 ubpointer = end == 0 ? *symdelim[segno+1] : *(symdelim[segno]-1),\
28 walkpointer = *copointer;\
29 walkpointer != ubpointer;\
30 walkpointer = * direction copointer)
31
32#define SYMITERATE(copointer, walkpointer) \
33 for(copointer = symptrs, \
34 walkpointer = *copointer; \
35 copointer < symptrub; \
36 walkpointer = * ++ copointer)
37/*
38 * Symbols are allocated in non contiguous chunks by extending
abcba8d5 39 * the data area.
7c81b4f2
BJ
40 */
41
42#define SYMDALLOP 200
43struct allocbox{
44 struct allocbox *nextalloc;
45 struct symtab symslots[SYMDALLOP];
7c81b4f2
BJ
46};
47
7c81b4f2 48/*
abcba8d5 49 * Names are allocated in a dynamically extensible string pool.
7c81b4f2 50 */
7c81b4f2
BJ
51struct strpool{
52 struct strpool *str_next;
53 int str_nalloc;
54 char str_names[STRPOOLDALLOP];
55};
56
57extern struct strpool *strplhead;
7c81b4f2
BJ
58
59extern struct allocbox *allochead;
60extern struct allocbox *alloctail;
61extern struct symtab *nextsym;
62extern struct allocbox *newbox;
63extern char *namebuffer;
64extern int symsleft;
65
66#define ALLOCQTY sizeof (struct allocbox)
67/*
68 * Iterate through all symbols in the symbol table in declaration
69 * order
70 */
71#define DECLITERATE(allocwalk, walkpointer, ubpointer) \
72 for(allocwalk = allochead; \
73 allocwalk != 0; \
74 allocwalk = allocwalk->nextalloc) \
75 for (walkpointer = &allocwalk->symslots[0],\
76 ubpointer = &allocwalk->symslots[SYMDALLOP], \
77 ubpointer = ubpointer > ( (struct symtab *)alloctail) \
78 ? nextsym : ubpointer ;\
79 walkpointer < ubpointer; \
80 walkpointer++ )
81/*
82 * The hash table is segmented, and dynamically extendable.
83 * We have a linked list of hash table segments; within each
84 * segment we use a quadratic rehash that touches no more than 1/2
85 * of the buckets in the hash table when probing.
86 * If the probe does not find the desired symbol, it moves to the
87 * next segment, or allocates a new segment.
88 *
89 * Hash table segments are kept on the linked list with the first
90 * segment always first (that contains the reserved words) and
91 * the last added segment immediately after the first segment
92 * to hopefully gain something by locality of reference.
93 */
94struct hashdallop {
95 int h_nused;
96 struct hashdallop *h_next;
97 struct symtab *h_htab[NHASH];
98};