Look up primitive types as symbols.
[deliverable/binutils-gdb.git] / gdb / block.c
CommitLineData
fe898f56
DC
1/* Block-related functions for the GNU debugger, GDB.
2
ecd75fc8 3 Copyright (C) 2003-2014 Free Software Foundation, Inc.
fe898f56
DC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
fe898f56
DC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fe898f56
DC
19
20#include "defs.h"
21#include "block.h"
22#include "symtab.h"
23#include "symfile.h"
9219021c
DC
24#include "gdb_obstack.h"
25#include "cp-support.h"
801e3a5b 26#include "addrmap.h"
8e3b41a9 27#include "gdbtypes.h"
1994afbf 28#include "objfiles.h"
9219021c
DC
29
30/* This is used by struct block to store namespace-related info for
31 C++ files, namely using declarations and the current namespace in
32 scope. */
33
34struct block_namespace_info
35{
36 const char *scope;
37 struct using_direct *using;
38};
39
40static void block_initialize_namespace (struct block *block,
41 struct obstack *obstack);
fe898f56 42
1994afbf
DE
43/* See block.h. */
44
45struct objfile *
46block_objfile (const struct block *block)
47{
48 const struct global_block *global_block;
49
50 if (BLOCK_FUNCTION (block) != NULL)
51 return symbol_objfile (BLOCK_FUNCTION (block));
52
53 global_block = (struct global_block *) block_global_block (block);
54 return COMPUNIT_OBJFILE (global_block->compunit_symtab);
55}
56
57/* See block. */
58
59struct gdbarch *
60block_gdbarch (const struct block *block)
61{
62 if (BLOCK_FUNCTION (block) != NULL)
63 return symbol_arch (BLOCK_FUNCTION (block));
64
65 return get_objfile_arch (block_objfile (block));
66}
67
fe898f56
DC
68/* Return Nonzero if block a is lexically nested within block b,
69 or if a and b have the same pc range.
4a64f543 70 Return zero otherwise. */
fe898f56
DC
71
72int
0cf566ec 73contained_in (const struct block *a, const struct block *b)
fe898f56
DC
74{
75 if (!a || !b)
76 return 0;
edb3359d
DJ
77
78 do
79 {
80 if (a == b)
81 return 1;
49e794ac
JB
82 /* If A is a function block, then A cannot be contained in B,
83 except if A was inlined. */
84 if (BLOCK_FUNCTION (a) != NULL && !block_inlined_p (a))
85 return 0;
edb3359d
DJ
86 a = BLOCK_SUPERBLOCK (a);
87 }
88 while (a != NULL);
89
90 return 0;
fe898f56
DC
91}
92
93
94/* Return the symbol for the function which contains a specified
7f0df278
DJ
95 lexical block, described by a struct block BL. The return value
96 will not be an inlined function; the containing function will be
97 returned instead. */
fe898f56
DC
98
99struct symbol *
7f0df278 100block_linkage_function (const struct block *bl)
fe898f56 101{
edb3359d
DJ
102 while ((BLOCK_FUNCTION (bl) == NULL || block_inlined_p (bl))
103 && BLOCK_SUPERBLOCK (bl) != NULL)
fe898f56
DC
104 bl = BLOCK_SUPERBLOCK (bl);
105
106 return BLOCK_FUNCTION (bl);
107}
108
f8eba3c6
TT
109/* Return the symbol for the function which contains a specified
110 block, described by a struct block BL. The return value will be
111 the closest enclosing function, which might be an inline
112 function. */
113
114struct symbol *
115block_containing_function (const struct block *bl)
116{
117 while (BLOCK_FUNCTION (bl) == NULL && BLOCK_SUPERBLOCK (bl) != NULL)
118 bl = BLOCK_SUPERBLOCK (bl);
119
120 return BLOCK_FUNCTION (bl);
121}
122
edb3359d
DJ
123/* Return one if BL represents an inlined function. */
124
125int
126block_inlined_p (const struct block *bl)
127{
128 return BLOCK_FUNCTION (bl) != NULL && SYMBOL_INLINED (BLOCK_FUNCTION (bl));
129}
130
9703b513
TT
131/* A helper function that checks whether PC is in the blockvector BL.
132 It returns the containing block if there is one, or else NULL. */
fe898f56 133
9703b513 134static struct block *
346d1dfe 135find_block_in_blockvector (const struct blockvector *bl, CORE_ADDR pc)
fe898f56 136{
b59661bd
AC
137 struct block *b;
138 int bot, top, half;
fe898f56 139
801e3a5b
JB
140 /* If we have an addrmap mapping code addresses to blocks, then use
141 that. */
142 if (BLOCKVECTOR_MAP (bl))
9703b513 143 return addrmap_find (BLOCKVECTOR_MAP (bl), pc);
801e3a5b
JB
144
145 /* Otherwise, use binary search to find the last block that starts
6ac9ef80
DE
146 before PC.
147 Note: GLOBAL_BLOCK is block 0, STATIC_BLOCK is block 1.
148 They both have the same START,END values.
149 Historically this code would choose STATIC_BLOCK over GLOBAL_BLOCK but the
150 fact that this choice was made was subtle, now we make it explicit. */
151 gdb_assert (BLOCKVECTOR_NBLOCKS (bl) >= 2);
152 bot = STATIC_BLOCK;
fe898f56
DC
153 top = BLOCKVECTOR_NBLOCKS (bl);
154
155 while (top - bot > 1)
156 {
157 half = (top - bot + 1) >> 1;
158 b = BLOCKVECTOR_BLOCK (bl, bot + half);
159 if (BLOCK_START (b) <= pc)
160 bot += half;
161 else
162 top = bot + half;
163 }
164
165 /* Now search backward for a block that ends after PC. */
166
6ac9ef80 167 while (bot >= STATIC_BLOCK)
fe898f56
DC
168 {
169 b = BLOCKVECTOR_BLOCK (bl, bot);
170 if (BLOCK_END (b) > pc)
9703b513 171 return b;
fe898f56
DC
172 bot--;
173 }
9703b513
TT
174
175 return NULL;
176}
177
178/* Return the blockvector immediately containing the innermost lexical
179 block containing the specified pc value and section, or 0 if there
180 is none. PBLOCK is a pointer to the block. If PBLOCK is NULL, we
181 don't pass this information back to the caller. */
182
346d1dfe 183const struct blockvector *
9703b513 184blockvector_for_pc_sect (CORE_ADDR pc, struct obj_section *section,
43f3e411
DE
185 const struct block **pblock,
186 struct compunit_symtab *cust)
9703b513 187{
346d1dfe 188 const struct blockvector *bl;
9703b513
TT
189 struct block *b;
190
43f3e411 191 if (cust == NULL)
9703b513
TT
192 {
193 /* First search all symtabs for one whose file contains our pc */
43f3e411
DE
194 cust = find_pc_sect_compunit_symtab (pc, section);
195 if (cust == NULL)
9703b513
TT
196 return 0;
197 }
198
43f3e411 199 bl = COMPUNIT_BLOCKVECTOR (cust);
9703b513
TT
200
201 /* Then search that symtab for the smallest block that wins. */
202 b = find_block_in_blockvector (bl, pc);
203 if (b == NULL)
204 return NULL;
205
206 if (pblock)
207 *pblock = b;
208 return bl;
209}
210
211/* Return true if the blockvector BV contains PC, false otherwise. */
212
213int
346d1dfe 214blockvector_contains_pc (const struct blockvector *bv, CORE_ADDR pc)
9703b513
TT
215{
216 return find_block_in_blockvector (bv, pc) != NULL;
fe898f56
DC
217}
218
8e3b41a9
JK
219/* Return call_site for specified PC in GDBARCH. PC must match exactly, it
220 must be the next instruction after call (or after tail call jump). Throw
221 NO_ENTRY_VALUE_ERROR otherwise. This function never returns NULL. */
222
223struct call_site *
224call_site_for_pc (struct gdbarch *gdbarch, CORE_ADDR pc)
225{
43f3e411 226 struct compunit_symtab *cust;
8e3b41a9
JK
227 void **slot = NULL;
228
229 /* -1 as tail call PC can be already after the compilation unit range. */
43f3e411 230 cust = find_pc_compunit_symtab (pc - 1);
8e3b41a9 231
43f3e411
DE
232 if (cust != NULL && COMPUNIT_CALL_SITE_HTAB (cust) != NULL)
233 slot = htab_find_slot (COMPUNIT_CALL_SITE_HTAB (cust), &pc, NO_INSERT);
8e3b41a9
JK
234
235 if (slot == NULL)
236 {
7cbd4a93 237 struct bound_minimal_symbol msym = lookup_minimal_symbol_by_pc (pc);
8e3b41a9
JK
238
239 /* DW_TAG_gnu_call_site will be missing just if GCC could not determine
240 the call target. */
241 throw_error (NO_ENTRY_VALUE_ERROR,
242 _("DW_OP_GNU_entry_value resolving cannot find "
243 "DW_TAG_GNU_call_site %s in %s"),
244 paddress (gdbarch, pc),
7cbd4a93 245 (msym.minsym == NULL ? "???"
efd66ac6 246 : MSYMBOL_PRINT_NAME (msym.minsym)));
8e3b41a9
JK
247 }
248
249 return *slot;
250}
251
fe898f56
DC
252/* Return the blockvector immediately containing the innermost lexical block
253 containing the specified pc value, or 0 if there is none.
254 Backward compatibility, no section. */
255
346d1dfe 256const struct blockvector *
3977b71f 257blockvector_for_pc (CORE_ADDR pc, const struct block **pblock)
fe898f56
DC
258{
259 return blockvector_for_pc_sect (pc, find_pc_mapped_section (pc),
801e3a5b 260 pblock, NULL);
fe898f56
DC
261}
262
263/* Return the innermost lexical block containing the specified pc value
264 in the specified section, or 0 if there is none. */
265
3977b71f 266const struct block *
714835d5 267block_for_pc_sect (CORE_ADDR pc, struct obj_section *section)
fe898f56 268{
346d1dfe 269 const struct blockvector *bl;
3977b71f 270 const struct block *b;
fe898f56 271
801e3a5b 272 bl = blockvector_for_pc_sect (pc, section, &b, NULL);
fe898f56 273 if (bl)
801e3a5b 274 return b;
fe898f56
DC
275 return 0;
276}
277
278/* Return the innermost lexical block containing the specified pc value,
279 or 0 if there is none. Backward compatibility, no section. */
280
3977b71f 281const struct block *
b59661bd 282block_for_pc (CORE_ADDR pc)
fe898f56
DC
283{
284 return block_for_pc_sect (pc, find_pc_mapped_section (pc));
285}
9219021c 286
1fcb5155
DC
287/* Now come some functions designed to deal with C++ namespace issues.
288 The accessors are safe to use even in the non-C++ case. */
289
290/* This returns the namespace that BLOCK is enclosed in, or "" if it
291 isn't enclosed in a namespace at all. This travels the chain of
292 superblocks looking for a scope, if necessary. */
293
294const char *
295block_scope (const struct block *block)
296{
297 for (; block != NULL; block = BLOCK_SUPERBLOCK (block))
298 {
299 if (BLOCK_NAMESPACE (block) != NULL
300 && BLOCK_NAMESPACE (block)->scope != NULL)
301 return BLOCK_NAMESPACE (block)->scope;
302 }
303
304 return "";
305}
9219021c
DC
306
307/* Set BLOCK's scope member to SCOPE; if needed, allocate memory via
308 OBSTACK. (It won't make a copy of SCOPE, however, so that already
309 has to be allocated correctly.) */
310
311void
312block_set_scope (struct block *block, const char *scope,
313 struct obstack *obstack)
314{
315 block_initialize_namespace (block, obstack);
316
317 BLOCK_NAMESPACE (block)->scope = scope;
318}
319
27aa8d6a 320/* This returns the using directives list associated with BLOCK, if
1fcb5155
DC
321 any. */
322
1fcb5155
DC
323struct using_direct *
324block_using (const struct block *block)
325{
27aa8d6a 326 if (block == NULL || BLOCK_NAMESPACE (block) == NULL)
1fcb5155
DC
327 return NULL;
328 else
27aa8d6a 329 return BLOCK_NAMESPACE (block)->using;
1fcb5155
DC
330}
331
9219021c
DC
332/* Set BLOCK's using member to USING; if needed, allocate memory via
333 OBSTACK. (It won't make a copy of USING, however, so that already
334 has to be allocated correctly.) */
335
336void
337block_set_using (struct block *block,
338 struct using_direct *using,
339 struct obstack *obstack)
340{
341 block_initialize_namespace (block, obstack);
342
343 BLOCK_NAMESPACE (block)->using = using;
344}
345
346/* If BLOCK_NAMESPACE (block) is NULL, allocate it via OBSTACK and
347 ititialize its members to zero. */
348
349static void
350block_initialize_namespace (struct block *block, struct obstack *obstack)
351{
352 if (BLOCK_NAMESPACE (block) == NULL)
353 {
354 BLOCK_NAMESPACE (block)
355 = obstack_alloc (obstack, sizeof (struct block_namespace_info));
356 BLOCK_NAMESPACE (block)->scope = NULL;
357 BLOCK_NAMESPACE (block)->using = NULL;
358 }
359}
89a9d1b1
DC
360
361/* Return the static block associated to BLOCK. Return NULL if block
362 is NULL or if block is a global block. */
363
364const struct block *
365block_static_block (const struct block *block)
366{
367 if (block == NULL || BLOCK_SUPERBLOCK (block) == NULL)
368 return NULL;
369
370 while (BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) != NULL)
371 block = BLOCK_SUPERBLOCK (block);
372
373 return block;
374}
1fcb5155
DC
375
376/* Return the static block associated to BLOCK. Return NULL if block
377 is NULL. */
378
379const struct block *
380block_global_block (const struct block *block)
381{
382 if (block == NULL)
383 return NULL;
384
385 while (BLOCK_SUPERBLOCK (block) != NULL)
386 block = BLOCK_SUPERBLOCK (block);
387
388 return block;
389}
5c4e30ca
DC
390
391/* Allocate a block on OBSTACK, and initialize its elements to
392 zero/NULL. This is useful for creating "dummy" blocks that don't
393 correspond to actual source files.
394
395 Warning: it sets the block's BLOCK_DICT to NULL, which isn't a
396 valid value. If you really don't want the block to have a
397 dictionary, then you should subsequently set its BLOCK_DICT to
398 dict_create_linear (obstack, NULL). */
399
400struct block *
401allocate_block (struct obstack *obstack)
402{
4c35218e 403 struct block *bl = OBSTACK_ZALLOC (obstack, struct block);
5c4e30ca
DC
404
405 return bl;
406}
8157b174 407
84a146c9
TT
408/* Allocate a global block. */
409
410struct block *
411allocate_global_block (struct obstack *obstack)
412{
413 struct global_block *bl = OBSTACK_ZALLOC (obstack, struct global_block);
414
415 return &bl->block;
416}
417
43f3e411 418/* Set the compunit of the global block. */
84a146c9
TT
419
420void
43f3e411 421set_block_compunit_symtab (struct block *block, struct compunit_symtab *cu)
84a146c9
TT
422{
423 struct global_block *gb;
424
425 gdb_assert (BLOCK_SUPERBLOCK (block) == NULL);
426 gb = (struct global_block *) block;
43f3e411
DE
427 gdb_assert (gb->compunit_symtab == NULL);
428 gb->compunit_symtab = cu;
84a146c9
TT
429}
430
43f3e411 431/* Return the compunit of the global block. */
b5b04b5b 432
43f3e411
DE
433static struct compunit_symtab *
434get_block_compunit_symtab (const struct block *block)
b5b04b5b
TT
435{
436 struct global_block *gb;
437
438 gdb_assert (BLOCK_SUPERBLOCK (block) == NULL);
439 gb = (struct global_block *) block;
43f3e411
DE
440 gdb_assert (gb->compunit_symtab != NULL);
441 return gb->compunit_symtab;
b5b04b5b
TT
442}
443
8157b174
TT
444\f
445
b5b04b5b
TT
446/* Initialize a block iterator, either to iterate over a single block,
447 or, for static and global blocks, all the included symtabs as
448 well. */
449
450static void
451initialize_block_iterator (const struct block *block,
452 struct block_iterator *iter)
453{
454 enum block_enum which;
43f3e411 455 struct compunit_symtab *cu;
b5b04b5b
TT
456
457 iter->idx = -1;
458
459 if (BLOCK_SUPERBLOCK (block) == NULL)
460 {
461 which = GLOBAL_BLOCK;
43f3e411 462 cu = get_block_compunit_symtab (block);
b5b04b5b
TT
463 }
464 else if (BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) == NULL)
465 {
466 which = STATIC_BLOCK;
43f3e411 467 cu = get_block_compunit_symtab (BLOCK_SUPERBLOCK (block));
b5b04b5b
TT
468 }
469 else
470 {
471 iter->d.block = block;
472 /* A signal value meaning that we're iterating over a single
473 block. */
474 iter->which = FIRST_LOCAL_BLOCK;
475 return;
476 }
477
478 /* If this is an included symtab, find the canonical includer and
479 use it instead. */
43f3e411
DE
480 while (cu->user != NULL)
481 cu = cu->user;
b5b04b5b
TT
482
483 /* Putting this check here simplifies the logic of the iterator
484 functions. If there are no included symtabs, we only need to
485 search a single block, so we might as well just do that
486 directly. */
43f3e411 487 if (cu->includes == NULL)
b5b04b5b
TT
488 {
489 iter->d.block = block;
490 /* A signal value meaning that we're iterating over a single
491 block. */
492 iter->which = FIRST_LOCAL_BLOCK;
493 }
494 else
495 {
43f3e411 496 iter->d.compunit_symtab = cu;
b5b04b5b
TT
497 iter->which = which;
498 }
499}
500
43f3e411 501/* A helper function that finds the current compunit over whose static
b5b04b5b
TT
502 or global block we should iterate. */
503
43f3e411
DE
504static struct compunit_symtab *
505find_iterator_compunit_symtab (struct block_iterator *iterator)
b5b04b5b
TT
506{
507 if (iterator->idx == -1)
43f3e411
DE
508 return iterator->d.compunit_symtab;
509 return iterator->d.compunit_symtab->includes[iterator->idx];
b5b04b5b
TT
510}
511
512/* Perform a single step for a plain block iterator, iterating across
513 symbol tables as needed. Returns the next symbol, or NULL when
514 iteration is complete. */
515
516static struct symbol *
517block_iterator_step (struct block_iterator *iterator, int first)
518{
519 struct symbol *sym;
520
521 gdb_assert (iterator->which != FIRST_LOCAL_BLOCK);
522
523 while (1)
524 {
525 if (first)
526 {
43f3e411
DE
527 struct compunit_symtab *cust
528 = find_iterator_compunit_symtab (iterator);
b5b04b5b
TT
529 const struct block *block;
530
531 /* Iteration is complete. */
43f3e411 532 if (cust == NULL)
b5b04b5b
TT
533 return NULL;
534
43f3e411 535 block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust),
439247b6 536 iterator->which);
b5b04b5b
TT
537 sym = dict_iterator_first (BLOCK_DICT (block), &iterator->dict_iter);
538 }
539 else
540 sym = dict_iterator_next (&iterator->dict_iter);
541
542 if (sym != NULL)
543 return sym;
544
545 /* We have finished iterating the appropriate block of one
546 symtab. Now advance to the next symtab and begin iteration
547 there. */
548 ++iterator->idx;
549 first = 1;
550 }
551}
552
8157b174
TT
553/* See block.h. */
554
555struct symbol *
556block_iterator_first (const struct block *block,
557 struct block_iterator *iterator)
558{
b5b04b5b
TT
559 initialize_block_iterator (block, iterator);
560
561 if (iterator->which == FIRST_LOCAL_BLOCK)
562 return dict_iterator_first (block->dict, &iterator->dict_iter);
563
564 return block_iterator_step (iterator, 1);
8157b174
TT
565}
566
567/* See block.h. */
568
569struct symbol *
570block_iterator_next (struct block_iterator *iterator)
571{
b5b04b5b
TT
572 if (iterator->which == FIRST_LOCAL_BLOCK)
573 return dict_iterator_next (&iterator->dict_iter);
574
575 return block_iterator_step (iterator, 0);
576}
577
578/* Perform a single step for a "name" block iterator, iterating across
579 symbol tables as needed. Returns the next symbol, or NULL when
580 iteration is complete. */
581
582static struct symbol *
583block_iter_name_step (struct block_iterator *iterator, const char *name,
584 int first)
585{
586 struct symbol *sym;
587
588 gdb_assert (iterator->which != FIRST_LOCAL_BLOCK);
589
590 while (1)
591 {
592 if (first)
593 {
43f3e411
DE
594 struct compunit_symtab *cust
595 = find_iterator_compunit_symtab (iterator);
b5b04b5b
TT
596 const struct block *block;
597
598 /* Iteration is complete. */
43f3e411 599 if (cust == NULL)
b5b04b5b
TT
600 return NULL;
601
43f3e411 602 block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust),
439247b6 603 iterator->which);
b5b04b5b
TT
604 sym = dict_iter_name_first (BLOCK_DICT (block), name,
605 &iterator->dict_iter);
606 }
607 else
608 sym = dict_iter_name_next (name, &iterator->dict_iter);
609
610 if (sym != NULL)
611 return sym;
612
613 /* We have finished iterating the appropriate block of one
614 symtab. Now advance to the next symtab and begin iteration
615 there. */
616 ++iterator->idx;
617 first = 1;
618 }
8157b174
TT
619}
620
621/* See block.h. */
622
623struct symbol *
624block_iter_name_first (const struct block *block,
625 const char *name,
626 struct block_iterator *iterator)
627{
b5b04b5b
TT
628 initialize_block_iterator (block, iterator);
629
630 if (iterator->which == FIRST_LOCAL_BLOCK)
631 return dict_iter_name_first (block->dict, name, &iterator->dict_iter);
632
633 return block_iter_name_step (iterator, name, 1);
8157b174
TT
634}
635
636/* See block.h. */
637
638struct symbol *
639block_iter_name_next (const char *name, struct block_iterator *iterator)
640{
b5b04b5b
TT
641 if (iterator->which == FIRST_LOCAL_BLOCK)
642 return dict_iter_name_next (name, &iterator->dict_iter);
643
644 return block_iter_name_step (iterator, name, 0);
645}
646
647/* Perform a single step for a "match" block iterator, iterating
648 across symbol tables as needed. Returns the next symbol, or NULL
649 when iteration is complete. */
650
651static struct symbol *
652block_iter_match_step (struct block_iterator *iterator,
653 const char *name,
654 symbol_compare_ftype *compare,
655 int first)
656{
657 struct symbol *sym;
658
659 gdb_assert (iterator->which != FIRST_LOCAL_BLOCK);
660
661 while (1)
662 {
663 if (first)
664 {
43f3e411
DE
665 struct compunit_symtab *cust
666 = find_iterator_compunit_symtab (iterator);
b5b04b5b
TT
667 const struct block *block;
668
669 /* Iteration is complete. */
43f3e411 670 if (cust == NULL)
b5b04b5b
TT
671 return NULL;
672
43f3e411 673 block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust),
439247b6 674 iterator->which);
b5b04b5b
TT
675 sym = dict_iter_match_first (BLOCK_DICT (block), name,
676 compare, &iterator->dict_iter);
677 }
678 else
679 sym = dict_iter_match_next (name, compare, &iterator->dict_iter);
680
681 if (sym != NULL)
682 return sym;
683
684 /* We have finished iterating the appropriate block of one
685 symtab. Now advance to the next symtab and begin iteration
686 there. */
687 ++iterator->idx;
688 first = 1;
689 }
8157b174
TT
690}
691
692/* See block.h. */
693
694struct symbol *
695block_iter_match_first (const struct block *block,
696 const char *name,
697 symbol_compare_ftype *compare,
698 struct block_iterator *iterator)
699{
b5b04b5b
TT
700 initialize_block_iterator (block, iterator);
701
702 if (iterator->which == FIRST_LOCAL_BLOCK)
703 return dict_iter_match_first (block->dict, name, compare,
704 &iterator->dict_iter);
705
706 return block_iter_match_step (iterator, name, compare, 1);
8157b174
TT
707}
708
709/* See block.h. */
710
711struct symbol *
712block_iter_match_next (const char *name,
713 symbol_compare_ftype *compare,
714 struct block_iterator *iterator)
715{
b5b04b5b
TT
716 if (iterator->which == FIRST_LOCAL_BLOCK)
717 return dict_iter_match_next (name, compare, &iterator->dict_iter);
718
719 return block_iter_match_step (iterator, name, compare, 0);
8157b174 720}
16b2eaa1
DE
721
722/* See block.h.
723
724 Note that if NAME is the demangled form of a C++ symbol, we will fail
725 to find a match during the binary search of the non-encoded names, but
726 for now we don't worry about the slight inefficiency of looking for
727 a match we'll never find, since it will go pretty quick. Once the
728 binary search terminates, we drop through and do a straight linear
729 search on the symbols. Each symbol which is marked as being a ObjC/C++
730 symbol (language_cplus or language_objc set) has both the encoded and
731 non-encoded names tested for a match. */
732
733struct symbol *
734block_lookup_symbol (const struct block *block, const char *name,
735 const domain_enum domain)
736{
737 struct block_iterator iter;
738 struct symbol *sym;
739
740 if (!BLOCK_FUNCTION (block))
741 {
358d6ab3 742 ALL_BLOCK_SYMBOLS_WITH_NAME (block, name, iter, sym)
16b2eaa1
DE
743 {
744 if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
745 SYMBOL_DOMAIN (sym), domain))
746 return sym;
747 }
748 return NULL;
749 }
750 else
751 {
752 /* Note that parameter symbols do not always show up last in the
753 list; this loop makes sure to take anything else other than
754 parameter symbols first; it only uses parameter symbols as a
755 last resort. Note that this only takes up extra computation
756 time on a match. */
757
758 struct symbol *sym_found = NULL;
759
358d6ab3 760 ALL_BLOCK_SYMBOLS_WITH_NAME (block, name, iter, sym)
16b2eaa1
DE
761 {
762 if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
763 SYMBOL_DOMAIN (sym), domain))
764 {
765 sym_found = sym;
766 if (!SYMBOL_IS_ARGUMENT (sym))
767 {
768 break;
769 }
770 }
771 }
772 return (sym_found); /* Will be NULL if not found. */
773 }
774}
ba715d7f
JK
775
776/* See block.h. */
777
778struct symbol *
779block_lookup_symbol_primary (const struct block *block, const char *name,
780 const domain_enum domain)
781{
782 struct symbol *sym;
783 struct dict_iterator dict_iter;
784
785 /* Verify BLOCK is STATIC_BLOCK or GLOBAL_BLOCK. */
786 gdb_assert (BLOCK_SUPERBLOCK (block) == NULL
787 || BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) == NULL);
788
789 for (sym = dict_iter_name_first (block->dict, name, &dict_iter);
790 sym != NULL;
791 sym = dict_iter_name_next (name, &dict_iter))
792 {
793 if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
794 SYMBOL_DOMAIN (sym), domain))
795 return sym;
796 }
797
798 return NULL;
799}
This page took 0.792311 seconds and 4 git commands to generate.