gdb-2.8
[deliverable/binutils-gdb.git] / gdb / symtab.c
1 /* Symbol table lookup for the GNU debugger, GDB.
2 Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc.
3
4 GDB is distributed in the hope that it will be useful, but WITHOUT ANY
5 WARRANTY. No author or distributor accepts responsibility to anyone
6 for the consequences of using it or for whether it serves any
7 particular purpose or works at all, unless he says so in writing.
8 Refer to the GDB General Public License for full details.
9
10 Everyone is granted permission to copy, modify and redistribute GDB,
11 but only under the conditions described in the GDB General Public
12 License. A copy of this license is supposed to have been given to you
13 along with GDB so you can know your rights and responsibilities. It
14 should be in a file named COPYING. Among other things, the copyright
15 notice and this notice must be preserved on all copies.
16
17 In other words, go ahead and share GDB, but don't try to stop
18 anyone else from sharing it farther. Help stamp out software hoarding!
19 */
20
21 #include "defs.h"
22 #include "initialize.h"
23 #include "symtab.h"
24 #include "param.h"
25
26 #include <stdio.h>
27 #include <obstack.h>
28
29 START_FILE
30
31 /* Allocate an obstack to hold objects that should be freed
32 when we load a new symbol table.
33 This includes the symbols made by dbxread
34 and the types that are not permanent. */
35
36 struct obstack obstack1;
37
38 struct obstack *symbol_obstack = &obstack1;
39
40 /* These variables point to the objects
41 representing the predefined C data types. */
42
43 struct type *builtin_type_void;
44 struct type *builtin_type_char;
45 struct type *builtin_type_short;
46 struct type *builtin_type_int;
47 struct type *builtin_type_long;
48 struct type *builtin_type_unsigned_char;
49 struct type *builtin_type_unsigned_short;
50 struct type *builtin_type_unsigned_int;
51 struct type *builtin_type_unsigned_long;
52 struct type *builtin_type_float;
53 struct type *builtin_type_double;
54
55 /* Lookup the symbol table of a source file named NAME. */
56
57 struct symtab *
58 lookup_symtab (name)
59 char *name;
60 {
61 register struct symtab *s;
62 register char *copy;
63
64 for (s = symtab_list; s; s = s->next)
65 if (!strcmp (name, s->filename))
66 return s;
67
68 /* If name not found as specified, see if adding ".c" helps. */
69
70 copy = (char *) alloca (strlen (name) + 3);
71 strcpy (copy, name);
72 strcat (copy, ".c");
73 for (s = symtab_list; s; s = s->next)
74 if (!strcmp (copy, s->filename))
75 return s;
76
77 return 0;
78 }
79 \f
80 /* Lookup a typedef or primitive type named NAME,
81 visible in lexical block BLOCK.
82 If NOERR is nonzero, return zero if NAME is not suitably defined. */
83
84 struct type *
85 lookup_typename (name, block, noerr)
86 char *name;
87 struct block *block;
88 int noerr;
89 {
90 register struct symbol *sym = lookup_symbol (name, block, VAR_NAMESPACE);
91 if (sym == 0 || SYMBOL_CLASS (sym) != LOC_TYPEDEF)
92 {
93 if (!strcmp (name, "int"))
94 return builtin_type_int;
95 if (!strcmp (name, "long"))
96 return builtin_type_long;
97 if (!strcmp (name, "short"))
98 return builtin_type_short;
99 if (!strcmp (name, "char"))
100 return builtin_type_char;
101 if (!strcmp (name, "float"))
102 return builtin_type_float;
103 if (!strcmp (name, "double"))
104 return builtin_type_double;
105 if (!strcmp (name, "void"))
106 return builtin_type_void;
107
108 if (noerr)
109 return 0;
110 error ("No type named %s.", name);
111 }
112 return SYMBOL_TYPE (sym);
113 }
114
115 struct type *
116 lookup_unsigned_typename (name)
117 char *name;
118 {
119 if (!strcmp (name, "int"))
120 return builtin_type_unsigned_int;
121 if (!strcmp (name, "long"))
122 return builtin_type_unsigned_long;
123 if (!strcmp (name, "short"))
124 return builtin_type_unsigned_short;
125 if (!strcmp (name, "char"))
126 return builtin_type_unsigned_char;
127 error ("No type named unsigned %s.", name);
128 }
129
130 /* Lookup a structure type named "struct NAME",
131 visible in lexical block BLOCK. */
132
133 struct type *
134 lookup_struct (name, block)
135 char *name;
136 struct block *block;
137 {
138 register struct symbol *sym = lookup_symbol (name, block, STRUCT_NAMESPACE);
139 if (sym == 0)
140 error ("No struct type named %s.", name);
141 if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_STRUCT)
142 error ("This context has union or enum %s, not a struct.", name);
143 return SYMBOL_TYPE (sym);
144 }
145
146 /* Lookup a union type named "union NAME",
147 visible in lexical block BLOCK. */
148
149 struct type *
150 lookup_union (name, block)
151 char *name;
152 struct block *block;
153 {
154 register struct symbol *sym = lookup_symbol (name, block, STRUCT_NAMESPACE);
155 if (sym == 0)
156 error ("No union type named %s.", name);
157 if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_UNION)
158 error ("This context has struct or enum %s, not a union.", name);
159 return SYMBOL_TYPE (sym);
160 }
161
162 /* Lookup an enum type named "enum NAME",
163 visible in lexical block BLOCK. */
164
165 struct type *
166 lookup_enum (name, block)
167 char *name;
168 struct block *block;
169 {
170 register struct symbol *sym = lookup_symbol (name, block, STRUCT_NAMESPACE);
171 if (sym == 0)
172 error ("No enum type named %s.", name);
173 if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_ENUM)
174 error ("This context has struct or union %s, not an enum.", name);
175 return SYMBOL_TYPE (sym);
176 }
177
178 /* Given a type TYPE, return a type of pointers to that type.
179 May need to construct such a type if this is the first use. */
180
181 struct type *
182 lookup_pointer_type (type)
183 struct type *type;
184 {
185 register struct type *ptype = TYPE_POINTER_TYPE (type);
186 if (ptype) return ptype;
187
188 /* This is the first time anyone wanted a pointer to a TYPE. */
189 if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
190 ptype = (struct type *) xmalloc (sizeof (struct type));
191 else
192 ptype = (struct type *) obstack_alloc (symbol_obstack,
193 sizeof (struct type));
194
195 bzero (ptype, sizeof (struct type));
196 TYPE_TARGET_TYPE (ptype) = type;
197 TYPE_POINTER_TYPE (type) = ptype;
198 /* New type is permanent if type pointed to is permanent. */
199 if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
200 TYPE_FLAGS (ptype) |= TYPE_FLAG_PERM;
201 /* We assume the machine has only one representation for pointers! */
202 TYPE_LENGTH (ptype) = sizeof (char *);
203 TYPE_CODE (ptype) = TYPE_CODE_PTR;
204 return ptype;
205 }
206
207 /* Given a type TYPE, return a type of functions that return that type.
208 May need to construct such a type if this is the first use. */
209
210 struct type *
211 lookup_function_type (type)
212 struct type *type;
213 {
214 register struct type *ptype = TYPE_FUNCTION_TYPE (type);
215 if (ptype) return ptype;
216
217 /* This is the first time anyone wanted a function returning a TYPE. */
218 if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
219 ptype = (struct type *) xmalloc (sizeof (struct type));
220 else
221 ptype = (struct type *) obstack_alloc (symbol_obstack,
222 sizeof (struct type));
223
224 bzero (ptype, sizeof (struct type));
225 TYPE_TARGET_TYPE (ptype) = type;
226 TYPE_FUNCTION_TYPE (type) = ptype;
227 /* New type is permanent if type returned is permanent. */
228 if (TYPE_FLAGS (type) & TYPE_FLAG_PERM)
229 TYPE_FLAGS (ptype) |= TYPE_FLAG_PERM;
230 TYPE_LENGTH (ptype) = 1;
231 TYPE_CODE (ptype) = TYPE_CODE_FUNC;
232 TYPE_NFIELDS (ptype) = 0;
233 return ptype;
234 }
235 \f
236 /* Smash TYPE to be a type of pointers to TO_TYPE.
237 If TO_TYPE is not permanent and has no pointer-type yet,
238 record TYPE as its pointer-type. */
239
240 void
241 smash_to_pointer_type (type, to_type)
242 struct type *type, *to_type;
243 {
244 bzero (type, sizeof (struct type));
245 TYPE_TARGET_TYPE (type) = to_type;
246 /* We assume the machine has only one representation for pointers! */
247 TYPE_LENGTH (type) = sizeof (char *);
248 TYPE_CODE (type) = TYPE_CODE_PTR;
249
250 if (TYPE_POINTER_TYPE (to_type) == 0
251 && !(TYPE_FLAGS (type) & TYPE_FLAG_PERM))
252 {
253 TYPE_POINTER_TYPE (to_type) = type;
254 }
255 }
256
257 /* Smash TYPE to be a type of functions returning TO_TYPE.
258 If TO_TYPE is not permanent and has no function-type yet,
259 record TYPE as its function-type. */
260
261 void
262 smash_to_function_type (type, to_type)
263 struct type *type, *to_type;
264 {
265 bzero (type, sizeof (struct type));
266 TYPE_TARGET_TYPE (type) = to_type;
267 TYPE_LENGTH (type) = 1;
268 TYPE_CODE (type) = TYPE_CODE_FUNC;
269 TYPE_NFIELDS (type) = 0;
270
271 if (TYPE_FUNCTION_TYPE (to_type) == 0
272 && !(TYPE_FLAGS (type) & TYPE_FLAG_PERM))
273 {
274 TYPE_FUNCTION_TYPE (to_type) = type;
275 }
276 }
277 \f
278 static struct symbol *lookup_block_symbol ();
279
280 /* Find the definition for a specified symbol name NAME
281 in namespace NAMESPACE, visible from lexical block BLOCK.
282 Returns the struct symbol pointer, or zero if no symbol is found. */
283
284 struct symbol *
285 lookup_symbol (name, block, namespace)
286 char *name;
287 register struct block *block;
288 enum namespace namespace;
289 {
290 register int i, n;
291 register struct symbol *sym;
292 register struct symtab *s;
293 struct blockvector *bv;
294
295 /* Search specified block and its superiors. */
296
297 while (block != 0)
298 {
299 sym = lookup_block_symbol (block, name, namespace);
300 if (sym) return sym;
301 block = BLOCK_SUPERBLOCK (block);
302 }
303
304 /* Now search all symtabs' global blocks. */
305
306 for (s = symtab_list; s; s = s->next)
307 {
308 bv = BLOCKVECTOR (s);
309 block = BLOCKVECTOR_BLOCK (bv, 0);
310 sym = lookup_block_symbol (block, name, namespace);
311 if (sym) return sym;
312 }
313
314 /* Now search all symtabs' per-file blocks.
315 Not strictly correct, but more useful than an error. */
316
317 for (s = symtab_list; s; s = s->next)
318 {
319 bv = BLOCKVECTOR (s);
320 block = BLOCKVECTOR_BLOCK (bv, 1);
321 sym = lookup_block_symbol (block, name, namespace);
322 if (sym) return sym;
323 }
324 return 0;
325 }
326
327 /* Look for a symbol in block BLOCK. */
328
329 static struct symbol *
330 lookup_block_symbol (block, name, namespace)
331 register struct block *block;
332 char *name;
333 enum namespace namespace;
334 {
335 register int bot, top, inc;
336 register struct symbol *sym;
337
338 top = BLOCK_NSYMS (block);
339 bot = 0;
340
341 /* If the blocks's symbols were sorted, start with a binary search. */
342
343 if (BLOCK_SHOULD_SORT (block))
344 {
345 /* First, advance BOT to not far before
346 the first symbol whose name is NAME. */
347
348 while (1)
349 {
350 inc = (top - bot + 1);
351 /* No need to keep binary searching for the last few bits worth. */
352 if (inc < 4)
353 break;
354 inc = (inc >> 1) + bot;
355 sym = BLOCK_SYM (block, inc);
356 if (SYMBOL_NAME (sym)[0] < name[0])
357 bot = inc;
358 else if (SYMBOL_NAME (sym)[0] > name[0])
359 top = inc;
360 else if (strcmp (SYMBOL_NAME (sym), name) < 0)
361 bot = inc;
362 else
363 top = inc;
364 }
365
366 /* Now scan forward until we run out of symbols,
367 find one whose name is greater than NAME,
368 or find one we want.
369 If there is more than one symbol with the right name and namespace,
370 we return the first one. dbxread.c is careful to make sure
371 that if one is a register then it comes first. */
372
373 top = BLOCK_NSYMS (block);
374 while (bot < top)
375 {
376 sym = BLOCK_SYM (block, bot);
377 inc = SYMBOL_NAME (sym)[0] - name[0];
378 if (inc == 0)
379 inc = strcmp (SYMBOL_NAME (sym), name);
380 if (inc == 0 && SYMBOL_NAMESPACE (sym) == namespace)
381 return sym;
382 if (inc > 0)
383 return 0;
384 bot++;
385 }
386 return 0;
387 }
388
389 /* Here if block isn't sorted.
390 This loop is equivalent to the loop above,
391 but hacked greatly for speed. */
392
393 top = BLOCK_NSYMS (block);
394 inc = name[0];
395 while (bot < top)
396 {
397 sym = BLOCK_SYM (block, bot);
398 if (SYMBOL_NAME (sym)[0] == inc
399 && !strcmp (SYMBOL_NAME (sym), name)
400 && SYMBOL_NAMESPACE (sym) == namespace)
401 return sym;
402 bot++;
403 }
404 return 0;
405 }
406 \f
407 /* Return the symbol for the function which contains a specified
408 lexical block, described by a struct block BL. */
409
410 struct symbol *
411 block_function (bl)
412 struct block *bl;
413 {
414 while (BLOCK_FUNCTION (bl) == 0 && BLOCK_SUPERBLOCK (bl) != 0)
415 bl = BLOCK_SUPERBLOCK (bl);
416
417 return BLOCK_FUNCTION (bl);
418 }
419
420 /* Subroutine of find_pc_line */
421
422 static struct symtab *
423 find_pc_symtab (pc)
424 register CORE_ADDR pc;
425 {
426 register struct block *b;
427 struct blockvector *bv;
428 register struct symtab *s;
429
430 /* Search all symtabs for one whose file contains our pc */
431
432 for (s = symtab_list; s; s = s->next)
433 {
434 bv = BLOCKVECTOR (s);
435 b = BLOCKVECTOR_BLOCK (bv, 0);
436 if (BLOCK_START (b) <= pc
437 && BLOCK_END (b) > pc)
438 break;
439 }
440
441 return s;
442 }
443
444 /* Find the source file and line number for a given PC value.
445 Return a structure containing a symtab pointer, a line number,
446 and a pc range for the entire source line.
447 The value's .pc field is NOT the specified pc.
448 NOTCURRENT nonzero means, if specified pc is on a line boundary,
449 use the line that ends there. Otherwise, in that case, the line
450 that begins there is used. */
451
452 struct symtab_and_line
453 find_pc_line (pc, notcurrent)
454 CORE_ADDR pc;
455 int notcurrent;
456 {
457 struct symtab *s;
458 register struct linetable *l;
459 register int len;
460 register int i, item;
461 int line;
462 struct symtab_and_line value;
463 struct blockvector *bv;
464
465 /* Info on best line seen so far, and where it starts, and its file. */
466
467 int best_line = 0;
468 CORE_ADDR best_pc = 0;
469 CORE_ADDR best_end = 0;
470 struct symtab *best_symtab = 0;
471
472 /* Store here the first line number
473 of a file which contains the line at the smallest pc after PC.
474 If we don't find a line whose range contains PC,
475 we will use a line one less than this,
476 with a range from the start of that file to the first line's pc. */
477 int alt_line = 0;
478 CORE_ADDR alt_pc = 0;
479 struct symtab *alt_symtab = 0;
480
481 /* Info on best line seen in this file. */
482
483 int prev_line;
484 CORE_ADDR prev_pc;
485
486 /* Info on first line of this file. */
487
488 int first_line;
489 CORE_ADDR first_pc;
490
491 /* If this pc is not from the current frame,
492 it is the address of the end of a call instruction.
493 Quite likely that is the start of the following statement.
494 But what we want is the statement containing the instruction.
495 Fudge the pc to make sure we get that. */
496
497 if (notcurrent) pc -= 1;
498
499 s = find_pc_symtab (pc);
500 if (s == 0)
501 {
502 value.symtab = 0;
503 value.line = 0;
504 value.pc = pc;
505 return value;
506 }
507
508 bv = BLOCKVECTOR (s);
509
510 /* Look at all the symtabs that share this blockvector.
511 They all have the same apriori range, that we found was right;
512 but they have different line tables. */
513
514 for (; s && BLOCKVECTOR (s) == bv; s = s->next)
515 {
516 /* Find the best line in this symtab. */
517 l = LINETABLE (s);
518 len = l->nitems;
519 prev_line = -1;
520 first_line = -1;
521 for (i = 0; i < len; i++)
522 {
523 item = l->item[i];
524 if (item < 0)
525 line = - item - 1;
526 else
527 {
528 line++;
529 if (first_line < 0)
530 {
531 first_line = line;
532 first_pc = item;
533 }
534 /* Return the last line that did not start after PC. */
535 if (pc >= item)
536 {
537 prev_line = line;
538 prev_pc = item;
539 }
540 else
541 break;
542 }
543 }
544
545 /* Is this file's best line closer than the best in the other files?
546 If so, record this file, and its best line, as best so far. */
547 if (prev_line >= 0 && prev_pc > best_pc)
548 {
549 best_pc = prev_pc;
550 best_line = prev_line;
551 best_symtab = s;
552 if (i < len)
553 best_end = item;
554 else
555 best_end = 0;
556 }
557 /* Is this file's first line closer than the first lines of other files?
558 If so, record this file, and its first line, as best alternate. */
559 if (first_line >= 0 && first_pc > pc
560 && (alt_pc == 0 || first_pc < alt_pc))
561 {
562 alt_pc = first_pc;
563 alt_line = first_line;
564 alt_symtab = s;
565 }
566 }
567 if (best_symtab == 0)
568 {
569 value.symtab = alt_symtab;
570 value.line = alt_line - 1;
571 value.pc = BLOCK_END (BLOCKVECTOR_BLOCK (bv, 0));
572 value.end = alt_pc;
573 }
574 else
575 {
576 value.symtab = best_symtab;
577 value.line = best_line;
578 value.pc = best_pc;
579 value.end = (best_end ? best_end
580 : (alt_pc ? alt_pc
581 : BLOCK_END (BLOCKVECTOR_BLOCK (bv, 0))));
582 }
583 return value;
584 }
585 \f
586 /* Find the PC value for a given source file and line number.
587 Returns zero for invalid line number.
588 The source file is specified with a struct symtab. */
589
590 CORE_ADDR
591 find_line_pc (symtab, line)
592 struct symtab *symtab;
593 int line;
594 {
595 register struct linetable *l;
596 register int index;
597 int dummy;
598
599 if (symtab == 0)
600 return 0;
601 l = LINETABLE (symtab);
602 index = find_line_common(l, line, &dummy);
603 return index ? l->item[index] : 0;
604 }
605
606 /* Find the range of pc values in a line.
607 Store the starting pc of the line into *STARTPTR
608 and the ending pc (start of next line) into *ENDPTR.
609 Returns 1 to indicate success.
610 Returns 0 if could not find the specified line. */
611
612 int
613 find_line_pc_range (symtab, thisline, startptr, endptr)
614 struct symtab *symtab;
615 int thisline;
616 CORE_ADDR *startptr, *endptr;
617 {
618 register struct linetable *l;
619 register int index;
620 int exact_match; /* did we get an exact linenumber match */
621 register CORE_ADDR prev_pc;
622 CORE_ADDR last_pc;
623
624 if (symtab == 0)
625 return 0;
626
627 l = LINETABLE (symtab);
628 index = find_line_common (l, thisline, &exact_match);
629 if (index)
630 {
631 *startptr = l->item[index];
632 /* If we have not seen an entry for the specified line,
633 assume that means the specified line has zero bytes. */
634 if (!exact_match || index == l->nitems-1)
635 *endptr = *startptr;
636 else
637 /* Perhaps the following entry is for the following line.
638 It's worth a try. */
639 if (l->item[index+1] > 0)
640 *endptr = l->item[index+1];
641 else
642 *endptr = find_line_pc (symtab, thisline+1);
643 return 1;
644 }
645
646 return 0;
647 }
648
649 /* Given a line table and a line number, return the index into the line
650 table for the pc of the nearest line whose number is >= the specified one.
651 Return 0 if none is found. The value is never zero is it is an index.
652
653 Set *EXACT_MATCH nonzero if the value returned is an exact match. */
654
655 static int
656 find_line_common (l, lineno, exact_match)
657 register struct linetable *l;
658 register int lineno;
659 int *exact_match;
660 {
661 register int i;
662 register int len;
663
664 /* BEST is the smallest linenumber > LINENO so far seen,
665 or 0 if none has been seen so far.
666 BEST_INDEX identifies the item for it. */
667
668 int best_index = 0;
669 int best = 0;
670
671 int nextline = -1;
672
673 if (lineno <= 0)
674 return 0;
675
676 len = l->nitems;
677 for (i = 0; i < len; i++)
678 {
679 register int item = l->item[i];
680
681 if (item < 0)
682 nextline = - item - 1;
683 else
684 {
685 nextline++;
686 if (nextline == lineno)
687 {
688 *exact_match = 1;
689 return i;
690 }
691
692 if (nextline > lineno && (best == 0 || nextline < best))
693 {
694 best = lineno;
695 best_index = i;
696 }
697 }
698 }
699
700 /* If we got here, we didn't get an exact match. */
701
702 *exact_match = 0;
703 return best_index;
704 }
705
706 int
707 find_pc_line_pc_range (pc, startptr, endptr)
708 CORE_ADDR pc;
709 CORE_ADDR *startptr, *endptr;
710 {
711 struct symtab_and_line sal;
712 sal = find_pc_line (pc, 0);
713 *startptr = sal.pc;
714 *endptr = sal.end;
715 return sal.symtab != 0;
716 }
717 \f
718 /* Parse a string that specifies a line number.
719 Pass the address of a char * variable; that variable will be
720 advanced over the characters actually parsed.
721
722 The string can be:
723
724 LINENUM -- that line number in current file. PC returned is 0.
725 FILE:LINENUM -- that line in that file. PC returned is 0.
726 FUNCTION -- line number of openbrace of that function.
727 PC returned is the start of the function.
728 FILE:FUNCTION -- likewise, but prefer functions in that file.
729 *EXPR -- line in which address EXPR appears.
730
731 FUNCTION may be an undebuggable function found in misc_function_vector.
732
733 If the argument FUNFIRSTLINE is nonzero, we want the first line
734 of real code inside a function when a function is specified.
735
736 DEFAULT_SYMTAB specifies the file to use if none is specified.
737 It defaults to current_source_symtab.
738 DEFAULT_LINE specifies the line number to use for relative
739 line numbers (that start with signs). Defaults to current_source_line.
740
741 Note that it is possible to return zero for the symtab
742 if no file is validly specified. Callers must check that.
743 Also, the line number returned may be invalid. */
744
745 struct symtab_and_line
746 decode_line_1 (argptr, funfirstline, default_symtab, default_line)
747 char **argptr;
748 int funfirstline;
749 struct symtab *default_symtab;
750 int default_line;
751 {
752 struct symtab_and_line value;
753 register char *p, *p1;
754 register struct symtab *s;
755 register struct symbol *sym;
756 register CORE_ADDR pc;
757 register int i;
758 char *copy;
759
760 /* Defaults have defaults. */
761
762 if (default_symtab == 0)
763 {
764 default_symtab = current_source_symtab;
765 default_line = current_source_line;
766 }
767
768 /* See if arg is *PC */
769
770 if (**argptr == '*')
771 {
772 (*argptr)++;
773 pc = parse_and_eval_address_1 (argptr);
774 value = find_pc_line (pc, 0);
775 value.pc = pc;
776 return value;
777 }
778
779 /* Maybe arg is FILE : LINENUM or FILE : FUNCTION */
780
781 s = 0;
782
783 for (p = *argptr; *p; p++)
784 {
785 if (p[0] == ':' || p[0] == ' ' || p[0] == '\t')
786 break;
787 }
788 while (p[0] == ' ' || p[0] == '\t') p++;
789
790 if (p[0] == ':')
791 {
792 /* Extract the file name. */
793 p1 = p;
794 while (p != *argptr && p[-1] == ' ') --p;
795 copy = (char *) alloca (p - *argptr + 1);
796 bcopy (*argptr, copy, p - *argptr);
797 copy[p - *argptr] = 0;
798
799 /* Find that file's data. */
800 s = lookup_symtab (copy);
801 if (s == 0)
802 {
803 if (symtab_list == 0)
804 error ("No symbol table is loaded. Use the \"symbol-file\" command.");
805 error ("No source file named %s.", copy);
806 }
807
808 /* Discard the file name from the arg. */
809 p = p1 + 1;
810 while (*p == ' ' || *p == '\t') p++;
811 *argptr = p;
812 }
813
814 /* S is specified file's symtab, or 0 if no file specified.
815 arg no longer contains the file name. */
816
817 /* Check whether arg is all digits (and sign) */
818
819 p = *argptr;
820 if (*p == '-' || *p == '+') p++;
821 while (*p >= '0' && *p <= '9')
822 p++;
823
824 if (p != *argptr && (*p == 0 || *p == ' ' || *p == '\t' || *p == ','))
825 {
826 /* We found a token consisting of all digits -- at least one digit. */
827 enum sign {none, plus, minus} sign = none;
828
829 if (**argptr == '+')
830 sign = plus, (*argptr)++;
831 else if (**argptr == '-')
832 sign = minus, (*argptr)++;
833 value.line = atoi (*argptr);
834 switch (sign)
835 {
836 case plus:
837 if (p == *argptr)
838 value.line = 5;
839 if (s == 0)
840 value.line = default_line + value.line;
841 break;
842 case minus:
843 if (p == *argptr)
844 value.line = 15;
845 if (s == 0)
846 value.line = default_line - value.line;
847 else
848 value.line = 1;
849 break;
850 }
851
852 while (*p == ' ' || *p == '\t') p++;
853 *argptr = p;
854 if (s == 0)
855 s = default_symtab;
856 value.symtab = s;
857 value.pc = 0;
858 return value;
859 }
860
861 /* Arg token is not digits => try it as a function name
862 Find the next token (everything up to end or next whitespace). */
863 p = *argptr;
864 while (*p && *p != ' ' && *p != '\t' && *p != ',') p++;
865 copy = (char *) alloca (p - *argptr + 1);
866 bcopy (*argptr, copy, p - *argptr);
867 copy[p - *argptr] = 0;
868 while (*p == ' ' || *p == '\t') p++;
869 *argptr = p;
870
871 /* Look up that token as a function.
872 If file specified, use that file's per-file block to start with. */
873
874 sym = lookup_symbol (copy, s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1) : 0,
875 VAR_NAMESPACE);
876
877 if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK)
878 {
879 /* Arg is the name of a function */
880 pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) + FUNCTION_START_OFFSET;
881 if (funfirstline)
882 SKIP_PROLOGUE (pc);
883 value = find_pc_line (pc, 0);
884 value.pc = (value.end && value.pc != pc) ? value.end : pc;
885 return value;
886 }
887
888 if (sym)
889 error ("%s is not a function.", copy);
890
891 if ((i = lookup_misc_func (copy)) < 0)
892 error ("Function %s not defined.", copy);
893 else
894 {
895 value.symtab = 0;
896 value.line = 0;
897 value.pc = misc_function_vector[i].address + FUNCTION_START_OFFSET;
898 if (funfirstline)
899 SKIP_PROLOGUE (value.pc);
900 return value;
901 }
902
903 if (symtab_list == 0)
904 error ("No symbol table is loaded. Use the \"symbol-file\" command.");
905 error ("Function %s not defined.", copy);
906 }
907
908 struct symtab_and_line
909 decode_line_spec (string, funfirstline)
910 char *string;
911 int funfirstline;
912 {
913 struct symtab_and_line sal;
914 if (string == 0)
915 error ("Empty line specification.");
916 sal = decode_line_1 (&string, funfirstline,
917 current_source_symtab, current_source_line);
918 if (*string)
919 error ("Junk at end of line specification: %s", string);
920 return sal;
921 }
922
923 /* Return the index of misc function named NAME. */
924
925 static
926 lookup_misc_func (name)
927 register char *name;
928 {
929 register int i;
930
931 for (i = 0; i < misc_function_count; i++)
932 if (!strcmp (misc_function_vector[i].name, name))
933 return i;
934 return -1; /* not found */
935 }
936 \f
937 static void
938 sources_info ()
939 {
940 register struct symtab *s;
941 register int column = 0;
942
943 if (symtab_list == 0)
944 {
945 printf ("No symbol table is loaded.\n");
946 return;
947 }
948 printf ("Source files for which symbol table is known:\n");
949 for (s = symtab_list; s; s = s->next)
950 {
951 if (column != 0 && column + strlen (s->filename) >= 70)
952 {
953 printf ("\n");
954 column = 0;
955 }
956 else if (column != 0)
957 {
958 printf (" ");
959 column++;
960 }
961 printf ("%s", s->filename);
962 column += strlen (s->filename);
963 if (s->next)
964 {
965 printf (",");
966 column++;
967 }
968 }
969 printf ("\n");
970 }
971
972 /* List all symbols (if REGEXP is 0) or all symbols matching REGEXP.
973 If CLASS is zero, list all symbols except functions and type names.
974 If CLASS is 1, list only functions.
975 If CLASS is 2, list only type names. */
976
977 #define MORE \
978 { print_count++; \
979 if (print_count >= 21) \
980 { printf ("--Type Return to print more--"); \
981 print_count = 0; \
982 fflush (stdout); \
983 read_line (); } }
984
985 static void sort_block_syms ();
986
987 static void
988 list_symbols (regexp, class)
989 char *regexp;
990 int class;
991 {
992 register struct symtab *s;
993 register struct blockvector *bv;
994 struct blockvector *prev_bv = 0;
995 register struct block *b;
996 register int i, j;
997 register struct symbol *sym;
998 char *val;
999 int found_in_file;
1000 static char *classnames[]
1001 = {"variable", "function", "type"};
1002 int print_count = 0;
1003
1004 if (regexp)
1005 if (val = (char *) re_comp (regexp))
1006 error ("Invalid regexp: %s", val);
1007
1008 printf (regexp
1009 ? "All %ss matching regular expression \"%s\":\n"
1010 : "All defined %ss:\n",
1011 classnames[class],
1012 regexp);
1013
1014 for (s = symtab_list; s; s = s->next)
1015 {
1016 found_in_file = 0;
1017 bv = BLOCKVECTOR (s);
1018 /* Often many files share a blockvector.
1019 Scan each blockvector only once so that
1020 we don't get every symbol many times.
1021 It happens that the first symtab in the list
1022 for any given blockvector is the main file. */
1023 if (bv != prev_bv)
1024 for (i = 0; i < 2; i++)
1025 {
1026 b = BLOCKVECTOR_BLOCK (bv, i);
1027 /* Skip the sort if this block is always sorted. */
1028 if (!BLOCK_SHOULD_SORT (b))
1029 sort_block_syms (b);
1030 for (j = 0; j < BLOCK_NSYMS (b); j++)
1031 {
1032 QUIT;
1033 sym = BLOCK_SYM (b, j);
1034 if ((regexp == 0 || re_exec (SYMBOL_NAME (sym)))
1035 && ((class == 0 && SYMBOL_CLASS (sym) != LOC_TYPEDEF
1036 && SYMBOL_CLASS (sym) != LOC_BLOCK)
1037 || (class == 1 && SYMBOL_CLASS (sym) == LOC_BLOCK)
1038 || (class == 2 && SYMBOL_CLASS (sym) == LOC_TYPEDEF)))
1039 {
1040 if (!found_in_file)
1041 {
1042 printf ("\nFile %s:\n", s->filename);
1043 print_count += 2;
1044 }
1045 found_in_file = 1;
1046 MORE;
1047 if (class != 2 && i == 1)
1048 printf ("static ");
1049 if (class == 2
1050 && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE)
1051 printf ("typedef ");
1052
1053 type_print (SYMBOL_TYPE (sym),
1054 (SYMBOL_CLASS (sym) == LOC_TYPEDEF
1055 ? "" : SYMBOL_NAME (sym)),
1056 stdout, 0);
1057 if (class == 2
1058 && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE
1059 && (TYPE_NAME ((SYMBOL_TYPE (sym))) == 0
1060 || 0 != strcmp (TYPE_NAME ((SYMBOL_TYPE (sym))),
1061 SYMBOL_NAME (sym))))
1062 printf (" %s", SYMBOL_NAME (sym));
1063 printf (";\n");
1064 }
1065 }
1066 }
1067 prev_bv = bv;
1068 }
1069 }
1070
1071 static void
1072 variables_info (regexp)
1073 char *regexp;
1074 {
1075 list_symbols (regexp, 0);
1076 }
1077
1078 static void
1079 functions_info (regexp)
1080 char *regexp;
1081 {
1082 list_symbols (regexp, 1);
1083 }
1084
1085 static void
1086 types_info (regexp)
1087 char *regexp;
1088 {
1089 list_symbols (regexp, 2);
1090 }
1091 \f
1092 /* Call sort_block_syms to sort alphabetically the symbols of one block. */
1093
1094 static int
1095 compare_symbols (s1, s2)
1096 struct symbol **s1, **s2;
1097 {
1098 /* Names that are less should come first. */
1099 register int namediff = strcmp (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2));
1100 if (namediff != 0) return namediff;
1101 /* For symbols of the same name, registers should come first. */
1102 return ((SYMBOL_CLASS (*s2) == LOC_REGISTER)
1103 - (SYMBOL_CLASS (*s1) == LOC_REGISTER));
1104 }
1105
1106 static void
1107 sort_block_syms (b)
1108 register struct block *b;
1109 {
1110 qsort (&BLOCK_SYM (b, 0), BLOCK_NSYMS (b),
1111 sizeof (struct symbol *), compare_symbols);
1112 }
1113 \f
1114 /* Initialize the standard C scalar types. */
1115
1116 static
1117 struct type *
1118 init_type (code, length, uns, name)
1119 enum type_code code;
1120 int length, uns;
1121 char *name;
1122 {
1123 register struct type *type;
1124
1125 type = (struct type *) xmalloc (sizeof (struct type));
1126 bzero (type, sizeof *type);
1127 TYPE_CODE (type) = code;
1128 TYPE_LENGTH (type) = length;
1129 TYPE_FLAGS (type) = uns ? TYPE_FLAG_UNSIGNED : 0;
1130 TYPE_FLAGS (type) |= TYPE_FLAG_PERM;
1131 TYPE_NFIELDS (type) = 0;
1132 TYPE_NAME (type) = name;
1133
1134 return type;
1135 }
1136
1137 static
1138 initialize ()
1139 {
1140 add_info ("variables", variables_info,
1141 "All global and static variable names, or those matching REGEXP.");
1142 add_info ("functions", functions_info,
1143 "All function names, or those matching REGEXP.");
1144 add_info ("types", types_info,
1145 "All types names, or those matching REGEXP.");
1146 add_info ("sources", sources_info,
1147 "Source files in the program.");
1148
1149 obstack_init (symbol_obstack);
1150
1151 builtin_type_void = init_type (TYPE_CODE_VOID, 0, 0, "void");
1152
1153 builtin_type_float = init_type (TYPE_CODE_FLT, sizeof (float), 0, "float");
1154 builtin_type_double = init_type (TYPE_CODE_FLT, sizeof (double), 0, "double");
1155
1156 builtin_type_char = init_type (TYPE_CODE_INT, sizeof (char), 0, "char");
1157 builtin_type_short = init_type (TYPE_CODE_INT, sizeof (short), 0, "short");
1158 builtin_type_long = init_type (TYPE_CODE_INT, sizeof (long), 0, "long");
1159 builtin_type_int = init_type (TYPE_CODE_INT, sizeof (int), 0, "int");
1160
1161 builtin_type_unsigned_char = init_type (TYPE_CODE_INT, sizeof (char), 1, "unsigned char");
1162 builtin_type_unsigned_short = init_type (TYPE_CODE_INT, sizeof (short), 1, "unsigned short");
1163 builtin_type_unsigned_long = init_type (TYPE_CODE_INT, sizeof (long), 1, "unsigned long");
1164 builtin_type_unsigned_int = init_type (TYPE_CODE_INT, sizeof (int), 1, "unsigned int");
1165 }
1166
1167 END_FILE
This page took 0.053915 seconds and 5 git commands to generate.