xref: /titanic_44/usr/src/tools/ctf/cvt/st_parse.c (revision 726fad2a65f16c200a03969c29cb5c86c2d427db)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 /*
26  * This file is a sewer.
27  */
28 
29 #include <limits.h>
30 #include <stdarg.h>
31 #include <stdio.h>
32 #include <assert.h>
33 #include <strings.h>
34 #include <setjmp.h>
35 #include <ctype.h>
36 #include <uts/common/sys/ctf.h>
37 
38 #include "ctftools.h"
39 #include "memory.h"
40 #include "list.h"
41 
42 #define	HASH(NUM)	((int)(NUM & (BUCKETS - 1)))
43 #define	BUCKETS		128
44 
45 #define	TYPEPAIRMULT	10000
46 #define	MAKETYPEID(file, num)	((file) * TYPEPAIRMULT + num)
47 #define	TYPEFILE(tid)		((tid) / TYPEPAIRMULT)
48 #define	TYPENUM(tid)		((tid) % TYPEPAIRMULT)
49 
50 #define	expected(a, b, c) _expected(a, b, c, __LINE__)
51 
52 static int faketypenumber = 100000000;
53 
54 static tdesc_t *hash_table[BUCKETS];
55 static tdesc_t *name_table[BUCKETS];
56 
57 list_t *typedbitfldmems;
58 
59 static void reset(void);
60 static jmp_buf	resetbuf;
61 
62 static char *soudef(char *cp, stabtype_t type, tdesc_t **rtdp);
63 static void enumdef(char *cp, tdesc_t **rtdp);
64 static int compute_sum(const char *w);
65 
66 static char *number(char *cp, int *n);
67 static char *name(char *cp, char **w);
68 static char *id(char *cp, int *h);
69 static char *whitesp(char *cp);
70 static void addhash(tdesc_t *tdp, int num);
71 static int tagadd(char *w, int h, tdesc_t *tdp);
72 static char *tdefdecl(char *cp, int h, tdesc_t **rtdp);
73 static char *intrinsic(char *cp, tdesc_t **rtdp);
74 static char *arraydef(char *cp, tdesc_t **rtdp);
75 
76 extern int debug_level;
77 int debug_parse = DEBUG_PARSE;
78 
79 /*PRINTFLIKE3*/
80 static void
81 parse_debug(int level, char *cp, char *fmt, ...)
82 {
83 	va_list ap;
84 	char buf[1024];
85 	char tmp[32];
86 	int i;
87 
88 	if (level > debug_level || !debug_parse)
89 		return;
90 
91 	if (cp != NULL) {
92 		for (i = 0; i < 30; i++) {
93 			if (cp[i] == '\0')
94 				break;
95 			if (!iscntrl(cp[i]))
96 				tmp[i] = cp[i];
97 		}
98 		tmp[i] = '\0';
99 		(void) snprintf(buf, sizeof (buf), "%s [cp='%s']\n", fmt, tmp);
100 	} else {
101 		strcpy(buf, fmt);
102 		strcat(buf, "\n");
103 	}
104 
105 	va_start(ap, fmt);
106 	vadebug(level, buf, ap);
107 	va_end(ap);
108 }
109 
110 /* Report unexpected syntax in stabs. */
111 static void
112 _expected(
113 	char *who,	/* what function, or part thereof, is reporting */
114 	char *what,	/* what was expected */
115 	char *where,	/* where we were in the line of input */
116 	int line)
117 {
118 	fprintf(stderr, "%s, expecting \"%s\" at \"%s\"\n", who, what, where);
119 	fprintf(stderr, "code line: %d, file %s\n", line,
120 	    (curhdr ? curhdr : "NO FILE"));
121 	reset();
122 }
123 
124 /*ARGSUSED*/
125 void
126 parse_init(tdata_t *td)
127 {
128 	int i;
129 
130 	for (i = 0; i < BUCKETS; i++) {
131 		hash_table[i] = NULL;
132 		name_table[i] = NULL;
133 	}
134 
135 	if (typedbitfldmems != NULL) {
136 		list_free(typedbitfldmems, NULL, NULL);
137 		typedbitfldmems = NULL;
138 	}
139 }
140 
141 void
142 parse_finish(tdata_t *td)
143 {
144 	td->td_nextid = ++faketypenumber;
145 }
146 
147 static tdesc_t *
148 unres_new(int tid)
149 {
150 	tdesc_t *tdp;
151 
152 	tdp = xcalloc(sizeof (*tdp));
153 	tdp->t_type = TYPEDEF_UNRES;
154 	tdp->t_id = tid;
155 
156 	return (tdp);
157 }
158 
159 char *
160 read_tid(char *cp, tdesc_t **tdpp)
161 {
162 	tdesc_t *tdp;
163 	int tid;
164 
165 	cp = id(cp, &tid);
166 
167 	assert(tid != 0);
168 
169 	if (*cp == '=') {
170 		if (!(cp = tdefdecl(cp + 1, tid, &tdp)))
171 			return (NULL);
172 		if (tdp->t_id && tdp->t_id != tid) {
173 			tdesc_t *ntdp = xcalloc(sizeof (*ntdp));
174 
175 			ntdp->t_type = TYPEDEF;
176 			ntdp->t_tdesc = tdp;
177 			tdp = ntdp;
178 		}
179 		addhash(tdp, tid);
180 	} else if ((tdp = lookup(tid)) == NULL)
181 		tdp = unres_new(tid);
182 
183 	*tdpp = tdp;
184 	return (cp);
185 }
186 
187 static iitype_t
188 parse_fun(char *cp, iidesc_t *ii)
189 {
190 	iitype_t iitype;
191 	tdesc_t *tdp;
192 	tdesc_t **args = NULL;
193 	int nargs = 0;
194 	int va = 0;
195 
196 	/*
197 	 * name:P		prototype
198 	 * name:F		global function
199 	 * name:f		static function
200 	 */
201 	switch (*cp++) {
202 	case 'P':
203 		iitype = II_NOT; /* not interesting */
204 		break;
205 
206 	case 'F':
207 		iitype = II_GFUN;
208 		break;
209 
210 	case 'f':
211 		iitype = II_SFUN;
212 		break;
213 
214 	default:
215 		expected("parse_nfun", "[PfF]", cp - 1);
216 	}
217 
218 	if (!(cp = read_tid(cp, &tdp)))
219 		return (-1);
220 
221 	if (*cp)
222 		args = xmalloc(sizeof (tdesc_t *) * FUNCARG_DEF);
223 
224 	while (*cp && *++cp) {
225 		if (*cp == '0') {
226 			va = 1;
227 			continue;
228 		}
229 
230 		nargs++;
231 		if (nargs > FUNCARG_DEF)
232 			args = xrealloc(args, sizeof (tdesc_t *) * nargs);
233 		if (!(cp = read_tid(cp, &args[nargs - 1])))
234 			return (-1);
235 	}
236 
237 	ii->ii_type = iitype;
238 	ii->ii_dtype = tdp;
239 	ii->ii_nargs = nargs;
240 	ii->ii_args = args;
241 	ii->ii_vargs = va;
242 
243 	return (iitype);
244 }
245 
246 static iitype_t
247 parse_sym(char *cp, iidesc_t *ii)
248 {
249 	tdesc_t *tdp;
250 	iitype_t iitype;
251 
252 	/*
253 	 * name:G		global variable
254 	 * name:S		static variable
255 	 */
256 	switch (*cp++) {
257 	case 'G':
258 		iitype = II_GVAR;
259 		break;
260 	case 'S':
261 		iitype = II_SVAR;
262 		break;
263 	case 'p':
264 		iitype = II_PSYM;
265 		break;
266 	case '(':
267 		cp--;
268 		/*FALLTHROUGH*/
269 	case 'r':
270 	case 'V':
271 		iitype = II_NOT; /* not interesting */
272 		break;
273 	default:
274 		expected("parse_sym", "[GprSV(]", cp - 1);
275 	}
276 
277 	if (!(cp = read_tid(cp, &tdp)))
278 		return (-1);
279 
280 	ii->ii_type = iitype;
281 	ii->ii_dtype = tdp;
282 
283 	return (iitype);
284 }
285 
286 static iitype_t
287 parse_type(char *cp, iidesc_t *ii)
288 {
289 	tdesc_t *tdp, *ntdp;
290 	int tid;
291 
292 	if (*cp++ != 't')
293 		expected("parse_type", "t (type)", cp - 1);
294 
295 	cp = id(cp, &tid);
296 	if ((tdp = lookup(tid)) == NULL) {
297 		if (*cp++ != '=')
298 			expected("parse_type", "= (definition)", cp - 1);
299 
300 		(void) tdefdecl(cp, tid, &tdp);
301 
302 		if (tdp->t_id == tid) {
303 			assert(tdp->t_type != TYPEDEF);
304 			assert(!lookup(tdp->t_id));
305 
306 			if (!streq(tdp->t_name, ii->ii_name)) {
307 				ntdp = xcalloc(sizeof (*ntdp));
308 				ntdp->t_name = xstrdup(ii->ii_name);
309 				ntdp->t_type = TYPEDEF;
310 				ntdp->t_tdesc = tdp;
311 				tdp->t_id = faketypenumber++;
312 				tdp = ntdp;
313 			}
314 		} else if (tdp->t_id == 0) {
315 			assert(tdp->t_type == FORWARD ||
316 			    tdp->t_type == INTRINSIC);
317 
318 			if (tdp->t_name && !streq(tdp->t_name, ii->ii_name)) {
319 				ntdp = xcalloc(sizeof (*ntdp));
320 				ntdp->t_name = xstrdup(ii->ii_name);
321 				ntdp->t_type = TYPEDEF;
322 				ntdp->t_tdesc = tdp;
323 				tdp->t_id = faketypenumber++;
324 				tdp = ntdp;
325 			}
326 		} else if (tdp->t_id != tid) {
327 			ntdp = xcalloc(sizeof (*ntdp));
328 			ntdp->t_name = xstrdup(ii->ii_name);
329 			ntdp->t_type = TYPEDEF;
330 			ntdp->t_tdesc = tdp;
331 			tdp = ntdp;
332 		}
333 
334 		if (tagadd(ii->ii_name, tid, tdp) < 0)
335 			return (-1);
336 	}
337 
338 	ii->ii_type = II_TYPE;
339 	ii->ii_dtype = tdp;
340 	return (II_TYPE);
341 }
342 
343 static iitype_t
344 parse_sou(char *cp, iidesc_t *idp)
345 {
346 	tdesc_t *rtdp;
347 	int tid;
348 
349 	if (*cp++ != 'T')
350 		expected("parse_sou", "T (sou)", cp - 1);
351 
352 	cp = id(cp, &tid);
353 	if (*cp++ != '=')
354 		expected("parse_sou", "= (definition)", cp - 1);
355 
356 	parse_debug(1, NULL, "parse_sou: declaring '%s'", idp->ii_name ?
357 	    idp->ii_name : "(anon)");
358 	if ((rtdp = lookup(tid)) != NULL) {
359 		if (idp->ii_name != NULL) {
360 			if (rtdp->t_name != NULL &&
361 			    strcmp(rtdp->t_name, idp->ii_name) != 0) {
362 				tdesc_t *tdp;
363 
364 				tdp = xcalloc(sizeof (*tdp));
365 				tdp->t_name = xstrdup(idp->ii_name);
366 				tdp->t_type = TYPEDEF;
367 				tdp->t_tdesc = rtdp;
368 				addhash(tdp, tid); /* for *(x,y) types */
369 				parse_debug(3, NULL, "    %s defined as %s(%d)",
370 				    idp->ii_name, tdesc_name(rtdp), tid);
371 			} else if (rtdp->t_name == NULL) {
372 				rtdp->t_name = xstrdup(idp->ii_name);
373 				addhash(rtdp, tid);
374 			}
375 		}
376 	} else {
377 		rtdp = xcalloc(sizeof (*rtdp));
378 		rtdp->t_name = idp->ii_name ? xstrdup(idp->ii_name) : NULL;
379 		addhash(rtdp, tid);
380 	}
381 
382 	switch (*cp++) {
383 	case 's':
384 		(void) soudef(cp, STRUCT, &rtdp);
385 		break;
386 	case 'u':
387 		(void) soudef(cp, UNION, &rtdp);
388 		break;
389 	case 'e':
390 		enumdef(cp, &rtdp);
391 		break;
392 	default:
393 		expected("parse_sou", "<tag type s/u/e>", cp - 1);
394 		break;
395 	}
396 
397 	idp->ii_type = II_SOU;
398 	idp->ii_dtype = rtdp;
399 	return (II_SOU);
400 }
401 
402 int
403 parse_stab(stab_t *stab, char *cp, iidesc_t **iidescp)
404 {
405 	iidesc_t *ii = NULL;
406 	iitype_t (*parse)(char *, iidesc_t *);
407 	int rc;
408 
409 	/*
410 	 * set up for reset()
411 	 */
412 	if (setjmp(resetbuf))
413 		return (-1);
414 
415 	cp = whitesp(cp);
416 	ii = iidesc_new(NULL);
417 	cp = name(cp, &ii->ii_name);
418 
419 	switch (stab->n_type) {
420 	case N_FUN:
421 		parse = parse_fun;
422 		break;
423 
424 	case N_LSYM:
425 		if (*cp == 't')
426 			parse = parse_type;
427 		else if (*cp == 'T')
428 			parse = parse_sou;
429 		else
430 			parse = parse_sym;
431 		break;
432 
433 	case N_GSYM:
434 	case N_LCSYM:
435 	case N_PSYM:
436 	case N_ROSYM:
437 	case N_RSYM:
438 	case N_STSYM:
439 		parse = parse_sym;
440 		break;
441 	default:
442 		parse_debug(1, cp, "Unknown stab type %#x", stab->n_type);
443 		bzero(&resetbuf, sizeof (resetbuf));
444 		return (-1);
445 	}
446 
447 	rc = parse(cp, ii);
448 	bzero(&resetbuf, sizeof (resetbuf));
449 
450 	if (rc < 0 || ii->ii_type == II_NOT) {
451 		iidesc_free(ii, NULL);
452 		return (rc);
453 	}
454 
455 	*iidescp = ii;
456 
457 	return (1);
458 }
459 
460 /*
461  * Check if we have this node in the hash table already
462  */
463 tdesc_t *
464 lookup(int h)
465 {
466 	int bucket = HASH(h);
467 	tdesc_t *tdp = hash_table[bucket];
468 
469 	while (tdp != NULL) {
470 		if (tdp->t_id == h)
471 			return (tdp);
472 		tdp = tdp->t_hash;
473 	}
474 	return (NULL);
475 }
476 
477 static char *
478 whitesp(char *cp)
479 {
480 	char c;
481 
482 	for (c = *cp++; isspace(c); c = *cp++)
483 		;
484 	--cp;
485 	return (cp);
486 }
487 
488 static char *
489 name(char *cp, char **w)
490 {
491 	char *new, *orig, c;
492 	int len;
493 
494 	orig = cp;
495 	c = *cp++;
496 	if (c == ':')
497 		*w = NULL;
498 	else if (isalpha(c) || strchr("_.$#", c)) {
499 		for (c = *cp++; isalnum(c) || strchr(" _.$#", c); c = *cp++)
500 			;
501 		if (c != ':')
502 			reset();
503 		len = cp - orig;
504 		new = xmalloc(len);
505 		while (orig < cp - 1)
506 			*new++ = *orig++;
507 		*new = '\0';
508 		*w = new - (len - 1);
509 	} else
510 		reset();
511 
512 	return (cp);
513 }
514 
515 static char *
516 number(char *cp, int *n)
517 {
518 	char *next;
519 
520 	*n = (int)strtol(cp, &next, 10);
521 	if (next == cp)
522 		expected("number", "<number>", cp);
523 	return (next);
524 }
525 
526 static char *
527 id(char *cp, int *h)
528 {
529 	int n1, n2;
530 
531 	if (*cp == '(') {	/* SunPro style */
532 		cp++;
533 		cp = number(cp, &n1);
534 		if (*cp++ != ',')
535 			expected("id", ",", cp - 1);
536 		cp = number(cp, &n2);
537 		if (*cp++ != ')')
538 			expected("id", ")", cp - 1);
539 		*h = MAKETYPEID(n1, n2);
540 	} else if (isdigit(*cp)) { /* gcc style */
541 		cp = number(cp, &n1);
542 		*h = n1;
543 	} else {
544 		expected("id", "(/0-9", cp);
545 	}
546 	return (cp);
547 }
548 
549 static int
550 tagadd(char *w, int h, tdesc_t *tdp)
551 {
552 	tdesc_t *otdp;
553 
554 	tdp->t_name = w;
555 	if (!(otdp = lookup(h)))
556 		addhash(tdp, h);
557 	else if (otdp != tdp) {
558 		warning("duplicate entry\n");
559 		warning("  old: %s %d (%d,%d)\n", tdesc_name(otdp),
560 		    otdp->t_type, TYPEFILE(otdp->t_id), TYPENUM(otdp->t_id));
561 		warning("  new: %s %d (%d,%d)\n", tdesc_name(tdp),
562 		    tdp->t_type, TYPEFILE(tdp->t_id), TYPENUM(tdp->t_id));
563 		return (-1);
564 	}
565 
566 	return (0);
567 }
568 
569 static char *
570 tdefdecl(char *cp, int h, tdesc_t **rtdp)
571 {
572 	tdesc_t *ntdp;
573 	char *w;
574 	int c, h2;
575 	char type;
576 
577 	parse_debug(3, cp, "tdefdecl h=%d", h);
578 
579 	/* Type codes */
580 	switch (type = *cp) {
581 	case 'b': /* integer */
582 	case 'R': /* fp */
583 		cp = intrinsic(cp, rtdp);
584 		break;
585 	case '(': /* equiv to another type */
586 		cp = id(cp, &h2);
587 		ntdp = lookup(h2);
588 
589 		if (ntdp != NULL && *cp == '=') {
590 			if (ntdp->t_type == FORWARD && *(cp + 1) == 'x') {
591 				/*
592 				 * The 6.2 compiler, and possibly others, will
593 				 * sometimes emit the same stab for a forward
594 				 * declaration twice.  That is, "(1,2)=xsfoo:"
595 				 * will sometimes show up in two different
596 				 * places.  This is, of course, quite fun.  We
597 				 * want CTF to work in spite of the compiler,
598 				 * so we'll let this one through.
599 				 */
600 				char *c2 = cp + 2;
601 				char *nm;
602 
603 				if (!strchr("sue", *c2++)) {
604 					expected("tdefdecl/x-redefine", "[sue]",
605 					    c2 - 1);
606 				}
607 
608 				c2 = name(c2, &nm);
609 				if (strcmp(nm, ntdp->t_name) != 0) {
610 					terminate("Stabs error: Attempt to "
611 					    "redefine type (%d,%d) as "
612 					    "something else: %s\n",
613 					    TYPEFILE(h2), TYPENUM(h2),
614 					    c2 - 1);
615 				}
616 				free(nm);
617 
618 				h2 = faketypenumber++;
619 				ntdp = NULL;
620 			} else {
621 				terminate("Stabs error: Attempting to "
622 				    "redefine type (%d,%d)\n", TYPEFILE(h2),
623 				    TYPENUM(h2));
624 			}
625 		}
626 
627 		if (ntdp == NULL) {  /* if that type isn't defined yet */
628 			if (*cp != '=') {
629 				/* record it as unresolved */
630 				parse_debug(3, NULL, "tdefdecl unres type %d",
631 				    h2);
632 				*rtdp = calloc(sizeof (**rtdp), 1);
633 				(*rtdp)->t_type = TYPEDEF_UNRES;
634 				(*rtdp)->t_id = h2;
635 				break;
636 			} else
637 				cp++;
638 
639 			/* define a new type */
640 			cp = tdefdecl(cp, h2, rtdp);
641 			if ((*rtdp)->t_id && (*rtdp)->t_id != h2) {
642 				ntdp = calloc(sizeof (*ntdp), 1);
643 				ntdp->t_type = TYPEDEF;
644 				ntdp->t_tdesc = *rtdp;
645 				*rtdp = ntdp;
646 			}
647 
648 			addhash(*rtdp, h2);
649 
650 		} else { /* that type is already defined */
651 			if (ntdp->t_type != TYPEDEF || ntdp->t_name != NULL) {
652 				*rtdp = ntdp;
653 			} else {
654 				parse_debug(3, NULL,
655 				    "No duplicate typedef anon for ref");
656 				*rtdp = ntdp;
657 			}
658 		}
659 		break;
660 	case '*':
661 		ntdp = NULL;
662 		cp = tdefdecl(cp + 1, h, &ntdp);
663 		if (ntdp == NULL)
664 			expected("tdefdecl/*", "id", cp);
665 
666 		if (!ntdp->t_id)
667 			ntdp->t_id = faketypenumber++;
668 
669 		*rtdp = xcalloc(sizeof (**rtdp));
670 		(*rtdp)->t_type = POINTER;
671 		(*rtdp)->t_size = 0;
672 		(*rtdp)->t_id = h;
673 		(*rtdp)->t_tdesc = ntdp;
674 		break;
675 	case 'f':
676 		cp = tdefdecl(cp + 1, h, &ntdp);
677 		*rtdp = xcalloc(sizeof (**rtdp));
678 		(*rtdp)->t_type = FUNCTION;
679 		(*rtdp)->t_size = 0;
680 		(*rtdp)->t_id = h;
681 		(*rtdp)->t_fndef = xcalloc(sizeof (fndef_t));
682 		/*
683 		 * The 6.1 compiler will sometimes generate incorrect stabs for
684 		 * function pointers (it'll get the return type wrong).  This
685 		 * causes merges to fail.  We therefore treat function pointers
686 		 * as if they all point to functions that return int.  When
687 		 * 4432549 is fixed, the lookupname() call below should be
688 		 * replaced with `ntdp'.
689 		 */
690 		(*rtdp)->t_fndef->fn_ret = lookupname("int");
691 		break;
692 	case 'a':
693 	case 'z':
694 		cp++;
695 		if (*cp++ != 'r')
696 			expected("tdefdecl/[az]", "r", cp - 1);
697 		*rtdp = xcalloc(sizeof (**rtdp));
698 		(*rtdp)->t_type = ARRAY;
699 		(*rtdp)->t_id = h;
700 		cp = arraydef(cp, rtdp);
701 		break;
702 	case 'x':
703 		c = *++cp;
704 		if (c != 's' && c != 'u' && c != 'e')
705 			expected("tdefdecl/x", "[sue]", cp - 1);
706 		cp = name(cp + 1, &w);
707 
708 		ntdp = xcalloc(sizeof (*ntdp));
709 		ntdp->t_type = FORWARD;
710 		ntdp->t_name = w;
711 		/*
712 		 * We explicitly don't set t_id here - the caller will do it.
713 		 * The caller may want to use a real type ID, or they may
714 		 * choose to make one up.
715 		 */
716 
717 		*rtdp = ntdp;
718 		break;
719 
720 	case 'B': /* volatile */
721 		cp = tdefdecl(cp + 1, h, &ntdp);
722 
723 		if (!ntdp->t_id)
724 			ntdp->t_id = faketypenumber++;
725 
726 		*rtdp = xcalloc(sizeof (**rtdp));
727 		(*rtdp)->t_type = VOLATILE;
728 		(*rtdp)->t_size = 0;
729 		(*rtdp)->t_tdesc = ntdp;
730 		(*rtdp)->t_id = h;
731 		break;
732 
733 	case 'k': /* const */
734 		cp = tdefdecl(cp + 1, h, &ntdp);
735 
736 		if (!ntdp->t_id)
737 			ntdp->t_id = faketypenumber++;
738 
739 		*rtdp = xcalloc(sizeof (**rtdp));
740 		(*rtdp)->t_type = CONST;
741 		(*rtdp)->t_size = 0;
742 		(*rtdp)->t_tdesc = ntdp;
743 		(*rtdp)->t_id = h;
744 		break;
745 
746 	case 'K': /* restricted */
747 		cp = tdefdecl(cp + 1, h, &ntdp);
748 
749 		if (!ntdp->t_id)
750 			ntdp->t_id = faketypenumber++;
751 
752 		*rtdp = xcalloc(sizeof (**rtdp));
753 		(*rtdp)->t_type = RESTRICT;
754 		(*rtdp)->t_size = 0;
755 		(*rtdp)->t_tdesc = ntdp;
756 		(*rtdp)->t_id = h;
757 		break;
758 
759 	case 'u':
760 	case 's':
761 		cp++;
762 
763 		*rtdp = xcalloc(sizeof (**rtdp));
764 		(*rtdp)->t_name = NULL;
765 		cp = soudef(cp, (type == 'u') ? UNION : STRUCT, rtdp);
766 		break;
767 	default:
768 		expected("tdefdecl", "<type code>", cp);
769 	}
770 	return (cp);
771 }
772 
773 static char *
774 intrinsic(char *cp, tdesc_t **rtdp)
775 {
776 	intr_t *intr = xcalloc(sizeof (intr_t));
777 	tdesc_t *tdp;
778 	int width, fmt, i;
779 
780 	switch (*cp++) {
781 	case 'b':
782 		intr->intr_type = INTR_INT;
783 		if (*cp == 's')
784 			intr->intr_signed = 1;
785 		else if (*cp != 'u')
786 			expected("intrinsic/b", "[su]", cp);
787 		cp++;
788 
789 		if (strchr("cbv", *cp))
790 			intr->intr_iformat = *cp++;
791 
792 		cp = number(cp, &width);
793 		if (*cp++ != ';')
794 			expected("intrinsic/b", "; (post-width)", cp - 1);
795 
796 		cp = number(cp, &intr->intr_offset);
797 		if (*cp++ != ';')
798 			expected("intrinsic/b", "; (post-offset)", cp - 1);
799 
800 		cp = number(cp, &intr->intr_nbits);
801 		break;
802 
803 	case 'R':
804 		intr->intr_type = INTR_REAL;
805 		for (fmt = 0, i = 0; isdigit(*(cp + i)); i++)
806 			fmt = fmt * 10 + (*(cp + i) - '0');
807 
808 		if (fmt < 1 || fmt > CTF_FP_MAX)
809 			expected("intrinsic/R", "number <= CTF_FP_MAX", cp);
810 
811 		intr->intr_fformat = fmt;
812 		cp += i;
813 
814 		if (*cp++ != ';')
815 			expected("intrinsic/R", ";", cp - 1);
816 		cp = number(cp, &width);
817 
818 		intr->intr_nbits = width * 8;
819 		break;
820 	}
821 
822 	tdp = xcalloc(sizeof (*tdp));
823 	tdp->t_type = INTRINSIC;
824 	tdp->t_size = width;
825 	tdp->t_name = NULL;
826 	tdp->t_intr = intr;
827 	parse_debug(3, NULL, "intrinsic: size=%d", width);
828 	*rtdp = tdp;
829 
830 	return (cp);
831 }
832 
833 static tdesc_t *
834 bitintrinsic(tdesc_t *template, int nbits)
835 {
836 	tdesc_t *newtdp = xcalloc(sizeof (tdesc_t));
837 
838 	newtdp->t_name = xstrdup(template->t_name);
839 	newtdp->t_id = faketypenumber++;
840 	newtdp->t_type = INTRINSIC;
841 	newtdp->t_size = template->t_size;
842 	newtdp->t_intr = xmalloc(sizeof (intr_t));
843 	bcopy(template->t_intr, newtdp->t_intr, sizeof (intr_t));
844 	newtdp->t_intr->intr_nbits = nbits;
845 
846 	return (newtdp);
847 }
848 
849 static char *
850 offsize(char *cp, mlist_t *mlp)
851 {
852 	int offset, size;
853 
854 	if (*cp == ',')
855 		cp++;
856 	cp = number(cp, &offset);
857 	if (*cp++ != ',')
858 		expected("offsize/2", ",", cp - 1);
859 	cp = number(cp, &size);
860 	if (*cp++ != ';')
861 		expected("offsize/3", ";", cp - 1);
862 	mlp->ml_offset = offset;
863 	mlp->ml_size = size;
864 	return (cp);
865 }
866 
867 static tdesc_t *
868 find_intrinsic(tdesc_t *tdp)
869 {
870 	for (;;) {
871 		switch (tdp->t_type) {
872 		case TYPEDEF:
873 		case VOLATILE:
874 		case CONST:
875 		case RESTRICT:
876 			tdp = tdp->t_tdesc;
877 			break;
878 
879 		default:
880 			return (tdp);
881 		}
882 	}
883 }
884 
885 static char *
886 soudef(char *cp, stabtype_t type, tdesc_t **rtdp)
887 {
888 	mlist_t *mlp, **prev;
889 	char *w;
890 	int h;
891 	int size;
892 	tdesc_t *tdp, *itdp;
893 
894 	cp = number(cp, &size);
895 	(*rtdp)->t_size = size;
896 	(*rtdp)->t_type = type; /* s or u */
897 
898 	/*
899 	 * An '@' here indicates a bitmask follows.   This is so the
900 	 * compiler can pass information to debuggers about how structures
901 	 * are passed in the v9 world.  We don't need this information
902 	 * so we skip over it.
903 	 */
904 	if (cp[0] == '@') {
905 		cp += 3;
906 	}
907 
908 	parse_debug(3, cp, "soudef: %s size=%d", tdesc_name(*rtdp),
909 	    (*rtdp)->t_size);
910 
911 	prev = &((*rtdp)->t_members);
912 	/* now fill up the fields */
913 	while ((*cp != '\0') && (*cp != ';')) { /* signifies end of fields */
914 		mlp = xcalloc(sizeof (*mlp));
915 		*prev = mlp;
916 		cp = name(cp, &w);
917 		mlp->ml_name = w;
918 		cp = id(cp, &h);
919 		/*
920 		 * find the tdesc struct in the hash table for this type
921 		 * and stick a ptr in here
922 		 */
923 		tdp = lookup(h);
924 		if (tdp == NULL) { /* not in hash list */
925 			parse_debug(3, NULL, "      defines %s (%d)", w, h);
926 			if (*cp++ != '=') {
927 				tdp = unres_new(h);
928 				parse_debug(3, NULL,
929 				    "      refers to %s (unresolved %d)",
930 				    (w ? w : "anon"), h);
931 			} else {
932 				cp = tdefdecl(cp, h, &tdp);
933 
934 				if (tdp->t_id && tdp->t_id != h) {
935 					tdesc_t *ntdp = xcalloc(sizeof (*ntdp));
936 
937 					ntdp->t_type = TYPEDEF;
938 					ntdp->t_tdesc = tdp;
939 					tdp = ntdp;
940 				}
941 
942 				addhash(tdp, h);
943 				parse_debug(4, cp,
944 				    "     soudef now looking at    ");
945 				cp++;
946 			}
947 		} else {
948 			parse_debug(3, NULL, "      refers to %s (%d, %s)",
949 			    w ? w : "anon", h, tdesc_name(tdp));
950 		}
951 
952 		cp = offsize(cp, mlp);
953 
954 		itdp = find_intrinsic(tdp);
955 		if (itdp->t_type == INTRINSIC) {
956 			if (mlp->ml_size != itdp->t_intr->intr_nbits) {
957 				parse_debug(4, cp, "making %d bit intrinsic "
958 				    "from %s", mlp->ml_size, tdesc_name(itdp));
959 				mlp->ml_type = bitintrinsic(itdp, mlp->ml_size);
960 			} else
961 				mlp->ml_type = tdp;
962 		} else if (itdp->t_type == TYPEDEF_UNRES) {
963 			list_add(&typedbitfldmems, mlp);
964 			mlp->ml_type = tdp;
965 		} else {
966 			mlp->ml_type = tdp;
967 		}
968 
969 		/* cp is now pointing to next field */
970 		prev = &mlp->ml_next;
971 	}
972 	return (cp);
973 }
974 
975 static char *
976 arraydef(char *cp, tdesc_t **rtdp)
977 {
978 	int start, end, h;
979 
980 	cp = id(cp, &h);
981 	if (*cp++ != ';')
982 		expected("arraydef/1", ";", cp - 1);
983 
984 	(*rtdp)->t_ardef = xcalloc(sizeof (ardef_t));
985 	(*rtdp)->t_ardef->ad_idxtype = lookup(h);
986 
987 	cp = number(cp, &start); /* lower */
988 	if (*cp++ != ';')
989 		expected("arraydef/2", ";", cp - 1);
990 
991 	if (*cp == 'S') {
992 		/*
993 		 * variable length array - treat as null dimensioned
994 		 *
995 		 * For VLA variables on sparc, SS12 generated stab entry
996 		 * looks as follows:
997 		 * .stabs "buf:(0,28)=zr(0,4);0;S-12;(0,1)", 0x80, 0, 0, -16
998 		 * Whereas SS12u1 generated stab entry looks like this:
999 		 * .stabs "buf:(0,28)=zr(0,4);0;S0;(0,1)", 0x80, 0, 0, 0
1000 		 * On x86, both versions generate the first type of entry.
1001 		 * We should be able to parse both.
1002 		 */
1003 		cp++;
1004 		if (*cp == '-')
1005 			cp++;
1006 		cp = number(cp, &end);
1007 		end = start;
1008 	} else {
1009 		/*
1010 		 * normal fixed-dimension array
1011 		 * Stab entry for this looks as follows :
1012 		 * .stabs "x:(0,28)=ar(0,4);0;9;(0,3)", 0x80, 0, 40, 0
1013 		 */
1014 		cp = number(cp, &end);  /* upper */
1015 	}
1016 
1017 	if (*cp++ != ';')
1018 		expected("arraydef/3", ";", cp - 1);
1019 	(*rtdp)->t_ardef->ad_nelems = end - start + 1;
1020 	cp = tdefdecl(cp, h, &((*rtdp)->t_ardef->ad_contents));
1021 
1022 	parse_debug(3, cp, "defined array idx type %d %d-%d next ",
1023 	    h, start, end);
1024 
1025 	return (cp);
1026 }
1027 
1028 static void
1029 enumdef(char *cp, tdesc_t **rtdp)
1030 {
1031 	elist_t *elp, **prev;
1032 	char *w;
1033 
1034 	(*rtdp)->t_type = ENUM;
1035 	(*rtdp)->t_emem = NULL;
1036 
1037 	prev = &((*rtdp)->t_emem);
1038 	while (*cp != ';') {
1039 		elp = xcalloc(sizeof (*elp));
1040 		elp->el_next = NULL;
1041 		*prev = elp;
1042 		cp = name(cp, &w);
1043 		elp->el_name = w;
1044 		cp = number(cp, &elp->el_number);
1045 		parse_debug(3, NULL, "enum %s: %s=%d", tdesc_name(*rtdp),
1046 		    elp->el_name, elp->el_number);
1047 		prev = &elp->el_next;
1048 		if (*cp++ != ',')
1049 			expected("enumdef", ",", cp - 1);
1050 	}
1051 }
1052 
1053 tdesc_t *
1054 lookup_name(tdesc_t **hash, const char *name)
1055 {
1056 	int bucket = compute_sum(name);
1057 	tdesc_t *tdp, *ttdp = NULL;
1058 
1059 	for (tdp = hash[bucket]; tdp != NULL; tdp = tdp->t_next) {
1060 		if (tdp->t_name != NULL && strcmp(tdp->t_name, name) == 0) {
1061 			if (tdp->t_type == STRUCT || tdp->t_type == UNION ||
1062 			    tdp->t_type == ENUM || tdp->t_type == INTRINSIC)
1063 				return (tdp);
1064 			if (tdp->t_type == TYPEDEF)
1065 				ttdp = tdp;
1066 		}
1067 	}
1068 	return (ttdp);
1069 }
1070 
1071 tdesc_t *
1072 lookupname(const char *name)
1073 {
1074 	return (lookup_name(name_table, name));
1075 }
1076 
1077 /*
1078  * Add a node to the hash queues.
1079  */
1080 static void
1081 addhash(tdesc_t *tdp, int num)
1082 {
1083 	int hash = HASH(num);
1084 	tdesc_t *ttdp;
1085 	char added_num = 0, added_name = 0;
1086 
1087 	/*
1088 	 * If it already exists in the hash table don't add it again
1089 	 * (but still check to see if the name should be hashed).
1090 	 */
1091 	ttdp = lookup(num);
1092 
1093 	if (ttdp == NULL) {
1094 		tdp->t_id = num;
1095 		tdp->t_hash = hash_table[hash];
1096 		hash_table[hash] = tdp;
1097 		added_num = 1;
1098 	}
1099 
1100 	if (tdp->t_name != NULL) {
1101 		ttdp = lookupname(tdp->t_name);
1102 		if (ttdp == NULL) {
1103 			hash = compute_sum(tdp->t_name);
1104 			tdp->t_next = name_table[hash];
1105 			name_table[hash] = tdp;
1106 			added_name = 1;
1107 		}
1108 	}
1109 	if (!added_num && !added_name) {
1110 		terminate("stabs: broken hash\n");
1111 	}
1112 }
1113 
1114 static int
1115 compute_sum(const char *w)
1116 {
1117 	char c;
1118 	int sum;
1119 
1120 	for (sum = 0; (c = *w) != '\0'; sum += c, w++)
1121 		;
1122 	return (HASH(sum));
1123 }
1124 
1125 static void
1126 reset(void)
1127 {
1128 	longjmp(resetbuf, 1);
1129 }
1130 
1131 void
1132 check_hash(void)
1133 {
1134 	tdesc_t *tdp;
1135 	int i;
1136 
1137 	printf("checking hash\n");
1138 	for (i = 0; i < BUCKETS; i++) {
1139 		if (hash_table[i]) {
1140 			for (tdp = hash_table[i]->t_hash;
1141 			    tdp && tdp != hash_table[i];
1142 			    tdp = tdp->t_hash)
1143 				continue;
1144 			if (tdp) {
1145 				terminate("cycle in hash bucket %d\n", i);
1146 				return;
1147 			}
1148 		}
1149 
1150 		if (name_table[i]) {
1151 			for (tdp = name_table[i]->t_next;
1152 			    tdp && tdp != name_table[i];
1153 			    tdp = tdp->t_next)
1154 				continue;
1155 			if (tdp) {
1156 				terminate("cycle in name bucket %d\n", i);
1157 				return;
1158 			}
1159 		}
1160 	}
1161 	printf("done\n");
1162 }
1163 
1164 /*ARGSUSED1*/
1165 static int
1166 resolve_typed_bitfields_cb(mlist_t *ml, void *private)
1167 {
1168 	tdesc_t *tdp = ml->ml_type;
1169 
1170 	debug(3, "Resolving typed bitfields (member %s)\n",
1171 	    (ml->ml_name ? ml->ml_name : "(anon)"));
1172 
1173 	while (tdp) {
1174 		switch (tdp->t_type) {
1175 		case INTRINSIC:
1176 			if (ml->ml_size != tdp->t_intr->intr_nbits) {
1177 				debug(3, "making %d bit intrinsic from %s",
1178 				    ml->ml_size, tdesc_name(tdp));
1179 				ml->ml_type = bitintrinsic(tdp, ml->ml_size);
1180 			} else {
1181 				debug(3, "using existing %d bit %s intrinsic",
1182 				    ml->ml_size, tdesc_name(tdp));
1183 				ml->ml_type = tdp;
1184 			}
1185 			return (1);
1186 
1187 		case POINTER:
1188 		case TYPEDEF:
1189 		case VOLATILE:
1190 		case CONST:
1191 		case RESTRICT:
1192 			tdp = tdp->t_tdesc;
1193 			break;
1194 
1195 		default:
1196 			return (1);
1197 		}
1198 	}
1199 
1200 	terminate("type chain for bitfield member %s has a NULL", ml->ml_name);
1201 	/*NOTREACHED*/
1202 	return (0);
1203 }
1204 
1205 void
1206 resolve_typed_bitfields(void)
1207 {
1208 	(void) list_iter(typedbitfldmems,
1209 	    (int (*)())resolve_typed_bitfields_cb, NULL);
1210 }
1211