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