xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/block.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* Block-related functions for the GNU debugger, GDB.
2 
3    Copyright (C) 2003-2023 Free Software Foundation, Inc.
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
9    the Free Software Foundation; either version 3 of the License, or
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
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include "defs.h"
21 #include "block.h"
22 #include "symtab.h"
23 #include "symfile.h"
24 #include "gdbsupport/gdb_obstack.h"
25 #include "cp-support.h"
26 #include "addrmap.h"
27 #include "gdbtypes.h"
28 #include "objfiles.h"
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 
34 struct block_namespace_info : public allocate_on_obstack
35 {
36   const char *scope = nullptr;
37   struct using_direct *using_decl = nullptr;
38 };
39 
40 static void block_initialize_namespace (struct block *block,
41 					struct obstack *obstack);
42 
43 /* See block.h.  */
44 
45 struct objfile *
46 block_objfile (const struct block *block)
47 {
48   const struct global_block *global_block;
49 
50   if (block->function () != nullptr)
51     return block->function ()->objfile ();
52 
53   global_block = (struct global_block *) block_global_block (block);
54   return global_block->compunit_symtab->objfile ();
55 }
56 
57 /* See block.  */
58 
59 struct gdbarch *
60 block_gdbarch (const struct block *block)
61 {
62   if (block->function () != nullptr)
63     return block->function ()->arch ();
64 
65   return block_objfile (block)->arch ();
66 }
67 
68 /* See block.h.  */
69 
70 bool
71 contained_in (const struct block *a, const struct block *b,
72 	      bool allow_nested)
73 {
74   if (!a || !b)
75     return false;
76 
77   do
78     {
79       if (a == b)
80 	return true;
81       /* If A is a function block, then A cannot be contained in B,
82 	 except if A was inlined.  */
83       if (!allow_nested && a->function () != NULL && !block_inlined_p (a))
84 	return false;
85       a = a->superblock ();
86     }
87   while (a != NULL);
88 
89   return false;
90 }
91 
92 
93 /* Return the symbol for the function which contains a specified
94    lexical block, described by a struct block BL.  The return value
95    will not be an inlined function; the containing function will be
96    returned instead.  */
97 
98 struct symbol *
99 block_linkage_function (const struct block *bl)
100 {
101   while ((bl->function () == NULL || block_inlined_p (bl))
102 	 && bl->superblock () != NULL)
103     bl = bl->superblock ();
104 
105   return bl->function ();
106 }
107 
108 /* Return the symbol for the function which contains a specified
109    block, described by a struct block BL.  The return value will be
110    the closest enclosing function, which might be an inline
111    function.  */
112 
113 struct symbol *
114 block_containing_function (const struct block *bl)
115 {
116   while (bl->function () == NULL && bl->superblock () != NULL)
117     bl = bl->superblock ();
118 
119   return bl->function ();
120 }
121 
122 /* Return one if BL represents an inlined function.  */
123 
124 int
125 block_inlined_p (const struct block *bl)
126 {
127   return bl->function () != NULL && bl->function ()->is_inlined ();
128 }
129 
130 /* A helper function that checks whether PC is in the blockvector BL.
131    It returns the containing block if there is one, or else NULL.  */
132 
133 static const struct block *
134 find_block_in_blockvector (const struct blockvector *bl, CORE_ADDR pc)
135 {
136   const struct block *b;
137   int bot, top, half;
138 
139   /* If we have an addrmap mapping code addresses to blocks, then use
140      that.  */
141   if (bl->map ())
142     return (const struct block *) bl->map ()->find (pc);
143 
144   /* Otherwise, use binary search to find the last block that starts
145      before PC.
146      Note: GLOBAL_BLOCK is block 0, STATIC_BLOCK is block 1.
147      They both have the same START,END values.
148      Historically this code would choose STATIC_BLOCK over GLOBAL_BLOCK but the
149      fact that this choice was made was subtle, now we make it explicit.  */
150   gdb_assert (bl->blocks ().size () >= 2);
151   bot = STATIC_BLOCK;
152   top = bl->blocks ().size ();
153 
154   while (top - bot > 1)
155     {
156       half = (top - bot + 1) >> 1;
157       b = bl->block (bot + half);
158       if (b->start () <= pc)
159 	bot += half;
160       else
161 	top = bot + half;
162     }
163 
164   /* Now search backward for a block that ends after PC.  */
165 
166   while (bot >= STATIC_BLOCK)
167     {
168       b = bl->block (bot);
169       if (!(b->start () <= pc))
170 	return NULL;
171       if (b->end () > pc)
172 	return b;
173       bot--;
174     }
175 
176   return NULL;
177 }
178 
179 /* Return the blockvector immediately containing the innermost lexical
180    block containing the specified pc value and section, or 0 if there
181    is none.  PBLOCK is a pointer to the block.  If PBLOCK is NULL, we
182    don't pass this information back to the caller.  */
183 
184 const struct blockvector *
185 blockvector_for_pc_sect (CORE_ADDR pc, struct obj_section *section,
186 			 const struct block **pblock,
187 			 struct compunit_symtab *cust)
188 {
189   const struct blockvector *bl;
190   const struct block *b;
191 
192   if (cust == NULL)
193     {
194       /* First search all symtabs for one whose file contains our pc */
195       cust = find_pc_sect_compunit_symtab (pc, section);
196       if (cust == NULL)
197 	return 0;
198     }
199 
200   bl = cust->blockvector ();
201 
202   /* Then search that symtab for the smallest block that wins.  */
203   b = find_block_in_blockvector (bl, pc);
204   if (b == NULL)
205     return NULL;
206 
207   if (pblock)
208     *pblock = b;
209   return bl;
210 }
211 
212 /* Return true if the blockvector BV contains PC, false otherwise.  */
213 
214 int
215 blockvector_contains_pc (const struct blockvector *bv, CORE_ADDR pc)
216 {
217   return find_block_in_blockvector (bv, pc) != NULL;
218 }
219 
220 /* Return call_site for specified PC in GDBARCH.  PC must match exactly, it
221    must be the next instruction after call (or after tail call jump).  Throw
222    NO_ENTRY_VALUE_ERROR otherwise.  This function never returns NULL.  */
223 
224 struct call_site *
225 call_site_for_pc (struct gdbarch *gdbarch, CORE_ADDR pc)
226 {
227   struct compunit_symtab *cust;
228   call_site *cs = nullptr;
229 
230   /* -1 as tail call PC can be already after the compilation unit range.  */
231   cust = find_pc_compunit_symtab (pc - 1);
232 
233   if (cust != nullptr)
234     cs = cust->find_call_site (pc);
235 
236   if (cs == nullptr)
237     {
238       struct bound_minimal_symbol msym = lookup_minimal_symbol_by_pc (pc);
239 
240       /* DW_TAG_gnu_call_site will be missing just if GCC could not determine
241 	 the call target.  */
242       throw_error (NO_ENTRY_VALUE_ERROR,
243 		   _("DW_OP_entry_value resolving cannot find "
244 		     "DW_TAG_call_site %s in %s"),
245 		   paddress (gdbarch, pc),
246 		   (msym.minsym == NULL ? "???"
247 		    : msym.minsym->print_name ()));
248     }
249 
250   return cs;
251 }
252 
253 /* Return the blockvector immediately containing the innermost lexical block
254    containing the specified pc value, or 0 if there is none.
255    Backward compatibility, no section.  */
256 
257 const struct blockvector *
258 blockvector_for_pc (CORE_ADDR pc, const struct block **pblock)
259 {
260   return blockvector_for_pc_sect (pc, find_pc_mapped_section (pc),
261 				  pblock, NULL);
262 }
263 
264 /* Return the innermost lexical block containing the specified pc value
265    in the specified section, or 0 if there is none.  */
266 
267 const struct block *
268 block_for_pc_sect (CORE_ADDR pc, struct obj_section *section)
269 {
270   const struct blockvector *bl;
271   const struct block *b;
272 
273   bl = blockvector_for_pc_sect (pc, section, &b, NULL);
274   if (bl)
275     return b;
276   return 0;
277 }
278 
279 /* Return the innermost lexical block containing the specified pc value,
280    or 0 if there is none.  Backward compatibility, no section.  */
281 
282 const struct block *
283 block_for_pc (CORE_ADDR pc)
284 {
285   return block_for_pc_sect (pc, find_pc_mapped_section (pc));
286 }
287 
288 /* Now come some functions designed to deal with C++ namespace issues.
289    The accessors are safe to use even in the non-C++ case.  */
290 
291 /* This returns the namespace that BLOCK is enclosed in, or "" if it
292    isn't enclosed in a namespace at all.  This travels the chain of
293    superblocks looking for a scope, if necessary.  */
294 
295 const char *
296 block_scope (const struct block *block)
297 {
298   for (; block != NULL; block = block->superblock ())
299     {
300       if (block->namespace_info () != NULL
301 	  && block->namespace_info ()->scope != NULL)
302 	return block->namespace_info ()->scope;
303     }
304 
305   return "";
306 }
307 
308 /* Set BLOCK's scope member to SCOPE; if needed, allocate memory via
309    OBSTACK.  (It won't make a copy of SCOPE, however, so that already
310    has to be allocated correctly.)  */
311 
312 void
313 block_set_scope (struct block *block, const char *scope,
314 		 struct obstack *obstack)
315 {
316   block_initialize_namespace (block, obstack);
317 
318   block->namespace_info ()->scope = scope;
319 }
320 
321 /* This returns the using directives list associated with BLOCK, if
322    any.  */
323 
324 struct using_direct *
325 block_using (const struct block *block)
326 {
327   if (block == NULL || block->namespace_info () == NULL)
328     return NULL;
329   else
330     return block->namespace_info ()->using_decl;
331 }
332 
333 /* Set BLOCK's using member to USING; if needed, allocate memory via
334    OBSTACK.  (It won't make a copy of USING, however, so that already
335    has to be allocated correctly.)  */
336 
337 void
338 block_set_using (struct block *block,
339 		 struct using_direct *using_decl,
340 		 struct obstack *obstack)
341 {
342   block_initialize_namespace (block, obstack);
343 
344   block->namespace_info ()->using_decl = using_decl;
345 }
346 
347 /* If block->namespace_info () is NULL, allocate it via OBSTACK and
348    initialize its members to zero.  */
349 
350 static void
351 block_initialize_namespace (struct block *block, struct obstack *obstack)
352 {
353   if (block->namespace_info () == NULL)
354     block->set_namespace_info (new (obstack) struct block_namespace_info ());
355 }
356 
357 /* Return the static block associated to BLOCK.  Return NULL if block
358    is NULL or if block is a global block.  */
359 
360 const struct block *
361 block_static_block (const struct block *block)
362 {
363   if (block == NULL || block->superblock () == NULL)
364     return NULL;
365 
366   while (block->superblock ()->superblock () != NULL)
367     block = block->superblock ();
368 
369   return block;
370 }
371 
372 /* Return the static block associated to BLOCK.  Return NULL if block
373    is NULL.  */
374 
375 const struct block *
376 block_global_block (const struct block *block)
377 {
378   if (block == NULL)
379     return NULL;
380 
381   while (block->superblock () != NULL)
382     block = block->superblock ();
383 
384   return block;
385 }
386 
387 /* Allocate a block on OBSTACK, and initialize its elements to
388    zero/NULL.  This is useful for creating "dummy" blocks that don't
389    correspond to actual source files.
390 
391    Warning: it sets the block's BLOCK_MULTIDICT to NULL, which isn't a
392    valid value.  If you really don't want the block to have a
393    dictionary, then you should subsequently set its BLOCK_MULTIDICT to
394    dict_create_linear (obstack, NULL).  */
395 
396 struct block *
397 allocate_block (struct obstack *obstack)
398 {
399   struct block *bl = OBSTACK_ZALLOC (obstack, struct block);
400 
401   return bl;
402 }
403 
404 /* Allocate a global block.  */
405 
406 struct block *
407 allocate_global_block (struct obstack *obstack)
408 {
409   struct global_block *bl = OBSTACK_ZALLOC (obstack, struct global_block);
410 
411   return &bl->block;
412 }
413 
414 /* Set the compunit of the global block.  */
415 
416 void
417 set_block_compunit_symtab (struct block *block, struct compunit_symtab *cu)
418 {
419   struct global_block *gb;
420 
421   gdb_assert (block->superblock () == NULL);
422   gb = (struct global_block *) block;
423   gdb_assert (gb->compunit_symtab == NULL);
424   gb->compunit_symtab = cu;
425 }
426 
427 /* See block.h.  */
428 
429 struct dynamic_prop *
430 block_static_link (const struct block *block)
431 {
432   struct objfile *objfile = block_objfile (block);
433 
434   /* Only objfile-owned blocks that materialize top function scopes can have
435      static links.  */
436   if (objfile == NULL || block->function () == NULL)
437     return NULL;
438 
439   return (struct dynamic_prop *) objfile_lookup_static_link (objfile, block);
440 }
441 
442 /* Return the compunit of the global block.  */
443 
444 static struct compunit_symtab *
445 get_block_compunit_symtab (const struct block *block)
446 {
447   struct global_block *gb;
448 
449   gdb_assert (block->superblock () == NULL);
450   gb = (struct global_block *) block;
451   gdb_assert (gb->compunit_symtab != NULL);
452   return gb->compunit_symtab;
453 }
454 
455 
456 
457 /* Initialize a block iterator, either to iterate over a single block,
458    or, for static and global blocks, all the included symtabs as
459    well.  */
460 
461 static void
462 initialize_block_iterator (const struct block *block,
463 			   struct block_iterator *iter)
464 {
465   enum block_enum which;
466   struct compunit_symtab *cu;
467 
468   iter->idx = -1;
469 
470   if (block->superblock () == NULL)
471     {
472       which = GLOBAL_BLOCK;
473       cu = get_block_compunit_symtab (block);
474     }
475   else if (block->superblock ()->superblock () == NULL)
476     {
477       which = STATIC_BLOCK;
478       cu = get_block_compunit_symtab (block->superblock ());
479     }
480   else
481     {
482       iter->d.block = block;
483       /* A signal value meaning that we're iterating over a single
484 	 block.  */
485       iter->which = FIRST_LOCAL_BLOCK;
486       return;
487     }
488 
489   /* If this is an included symtab, find the canonical includer and
490      use it instead.  */
491   while (cu->user != NULL)
492     cu = cu->user;
493 
494   /* Putting this check here simplifies the logic of the iterator
495      functions.  If there are no included symtabs, we only need to
496      search a single block, so we might as well just do that
497      directly.  */
498   if (cu->includes == NULL)
499     {
500       iter->d.block = block;
501       /* A signal value meaning that we're iterating over a single
502 	 block.  */
503       iter->which = FIRST_LOCAL_BLOCK;
504     }
505   else
506     {
507       iter->d.compunit_symtab = cu;
508       iter->which = which;
509     }
510 }
511 
512 /* A helper function that finds the current compunit over whose static
513    or global block we should iterate.  */
514 
515 static struct compunit_symtab *
516 find_iterator_compunit_symtab (struct block_iterator *iterator)
517 {
518   if (iterator->idx == -1)
519     return iterator->d.compunit_symtab;
520   return iterator->d.compunit_symtab->includes[iterator->idx];
521 }
522 
523 /* Perform a single step for a plain block iterator, iterating across
524    symbol tables as needed.  Returns the next symbol, or NULL when
525    iteration is complete.  */
526 
527 static struct symbol *
528 block_iterator_step (struct block_iterator *iterator, int first)
529 {
530   struct symbol *sym;
531 
532   gdb_assert (iterator->which != FIRST_LOCAL_BLOCK);
533 
534   while (1)
535     {
536       if (first)
537 	{
538 	  struct compunit_symtab *cust
539 	    = find_iterator_compunit_symtab (iterator);
540 	  const struct block *block;
541 
542 	  /* Iteration is complete.  */
543 	  if (cust == NULL)
544 	    return  NULL;
545 
546 	  block = cust->blockvector ()->block (iterator->which);
547 	  sym = mdict_iterator_first (block->multidict (),
548 				      &iterator->mdict_iter);
549 	}
550       else
551 	sym = mdict_iterator_next (&iterator->mdict_iter);
552 
553       if (sym != NULL)
554 	return sym;
555 
556       /* We have finished iterating the appropriate block of one
557 	 symtab.  Now advance to the next symtab and begin iteration
558 	 there.  */
559       ++iterator->idx;
560       first = 1;
561     }
562 }
563 
564 /* See block.h.  */
565 
566 struct symbol *
567 block_iterator_first (const struct block *block,
568 		      struct block_iterator *iterator)
569 {
570   initialize_block_iterator (block, iterator);
571 
572   if (iterator->which == FIRST_LOCAL_BLOCK)
573     return mdict_iterator_first (block->multidict (), &iterator->mdict_iter);
574 
575   return block_iterator_step (iterator, 1);
576 }
577 
578 /* See block.h.  */
579 
580 struct symbol *
581 block_iterator_next (struct block_iterator *iterator)
582 {
583   if (iterator->which == FIRST_LOCAL_BLOCK)
584     return mdict_iterator_next (&iterator->mdict_iter);
585 
586   return block_iterator_step (iterator, 0);
587 }
588 
589 /* Perform a single step for a "match" block iterator, iterating
590    across symbol tables as needed.  Returns the next symbol, or NULL
591    when iteration is complete.  */
592 
593 static struct symbol *
594 block_iter_match_step (struct block_iterator *iterator,
595 		       const lookup_name_info &name,
596 		       int first)
597 {
598   struct symbol *sym;
599 
600   gdb_assert (iterator->which != FIRST_LOCAL_BLOCK);
601 
602   while (1)
603     {
604       if (first)
605 	{
606 	  struct compunit_symtab *cust
607 	    = find_iterator_compunit_symtab (iterator);
608 	  const struct block *block;
609 
610 	  /* Iteration is complete.  */
611 	  if (cust == NULL)
612 	    return  NULL;
613 
614 	  block = cust->blockvector ()->block (iterator->which);
615 	  sym = mdict_iter_match_first (block->multidict (), name,
616 					&iterator->mdict_iter);
617 	}
618       else
619 	sym = mdict_iter_match_next (name, &iterator->mdict_iter);
620 
621       if (sym != NULL)
622 	return sym;
623 
624       /* We have finished iterating the appropriate block of one
625 	 symtab.  Now advance to the next symtab and begin iteration
626 	 there.  */
627       ++iterator->idx;
628       first = 1;
629     }
630 }
631 
632 /* See block.h.  */
633 
634 struct symbol *
635 block_iter_match_first (const struct block *block,
636 			const lookup_name_info &name,
637 			struct block_iterator *iterator)
638 {
639   initialize_block_iterator (block, iterator);
640 
641   if (iterator->which == FIRST_LOCAL_BLOCK)
642     return mdict_iter_match_first (block->multidict (), name,
643 				   &iterator->mdict_iter);
644 
645   return block_iter_match_step (iterator, name, 1);
646 }
647 
648 /* See block.h.  */
649 
650 struct symbol *
651 block_iter_match_next (const lookup_name_info &name,
652 		       struct block_iterator *iterator)
653 {
654   if (iterator->which == FIRST_LOCAL_BLOCK)
655     return mdict_iter_match_next (name, &iterator->mdict_iter);
656 
657   return block_iter_match_step (iterator, name, 0);
658 }
659 
660 /* See block.h.  */
661 
662 bool
663 best_symbol (struct symbol *a, const domain_enum domain)
664 {
665   return (a->domain () == domain
666 	  && a->aclass () != LOC_UNRESOLVED);
667 }
668 
669 /* See block.h.  */
670 
671 struct symbol *
672 better_symbol (struct symbol *a, struct symbol *b, const domain_enum domain)
673 {
674   if (a == NULL)
675     return b;
676   if (b == NULL)
677     return a;
678 
679   if (a->domain () == domain && b->domain () != domain)
680     return a;
681 
682   if (b->domain () == domain && a->domain () != domain)
683     return b;
684 
685   if (a->aclass () != LOC_UNRESOLVED && b->aclass () == LOC_UNRESOLVED)
686     return a;
687 
688   if (b->aclass () != LOC_UNRESOLVED && a->aclass () == LOC_UNRESOLVED)
689     return b;
690 
691   return a;
692 }
693 
694 /* See block.h.
695 
696    Note that if NAME is the demangled form of a C++ symbol, we will fail
697    to find a match during the binary search of the non-encoded names, but
698    for now we don't worry about the slight inefficiency of looking for
699    a match we'll never find, since it will go pretty quick.  Once the
700    binary search terminates, we drop through and do a straight linear
701    search on the symbols.  Each symbol which is marked as being a ObjC/C++
702    symbol (language_cplus or language_objc set) has both the encoded and
703    non-encoded names tested for a match.  */
704 
705 struct symbol *
706 block_lookup_symbol (const struct block *block, const char *name,
707 		     symbol_name_match_type match_type,
708 		     const domain_enum domain)
709 {
710   struct block_iterator iter;
711   struct symbol *sym;
712 
713   lookup_name_info lookup_name (name, match_type);
714 
715   if (!block->function ())
716     {
717       struct symbol *other = NULL;
718 
719       ALL_BLOCK_SYMBOLS_WITH_NAME (block, lookup_name, iter, sym)
720 	{
721 	  /* See comment related to PR gcc/debug/91507 in
722 	     block_lookup_symbol_primary.  */
723 	  if (best_symbol (sym, domain))
724 	    return sym;
725 	  /* This is a bit of a hack, but symbol_matches_domain might ignore
726 	     STRUCT vs VAR domain symbols.  So if a matching symbol is found,
727 	     make sure there is no "better" matching symbol, i.e., one with
728 	     exactly the same domain.  PR 16253.  */
729 	  if (symbol_matches_domain (sym->language (),
730 				     sym->domain (), domain))
731 	    other = better_symbol (other, sym, domain);
732 	}
733       return other;
734     }
735   else
736     {
737       /* Note that parameter symbols do not always show up last in the
738 	 list; this loop makes sure to take anything else other than
739 	 parameter symbols first; it only uses parameter symbols as a
740 	 last resort.  Note that this only takes up extra computation
741 	 time on a match.
742 	 It's hard to define types in the parameter list (at least in
743 	 C/C++) so we don't do the same PR 16253 hack here that is done
744 	 for the !BLOCK_FUNCTION case.  */
745 
746       struct symbol *sym_found = NULL;
747 
748       ALL_BLOCK_SYMBOLS_WITH_NAME (block, lookup_name, iter, sym)
749 	{
750 	  if (symbol_matches_domain (sym->language (),
751 				     sym->domain (), domain))
752 	    {
753 	      sym_found = sym;
754 	      if (!sym->is_argument ())
755 		{
756 		  break;
757 		}
758 	    }
759 	}
760       return (sym_found);	/* Will be NULL if not found.  */
761     }
762 }
763 
764 /* See block.h.  */
765 
766 struct symbol *
767 block_lookup_symbol_primary (const struct block *block, const char *name,
768 			     const domain_enum domain)
769 {
770   struct symbol *sym, *other;
771   struct mdict_iterator mdict_iter;
772 
773   lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
774 
775   /* Verify BLOCK is STATIC_BLOCK or GLOBAL_BLOCK.  */
776   gdb_assert (block->superblock () == NULL
777 	      || block->superblock ()->superblock () == NULL);
778 
779   other = NULL;
780   for (sym = mdict_iter_match_first (block->multidict (), lookup_name,
781 				     &mdict_iter);
782        sym != NULL;
783        sym = mdict_iter_match_next (lookup_name, &mdict_iter))
784     {
785       /* With the fix for PR gcc/debug/91507, we get for:
786 	 ...
787 	 extern char *zzz[];
788 	 char *zzz[ ] = {
789 	   "abc",
790 	   "cde"
791 	 };
792 	 ...
793 	 DWARF which will result in two entries in the symbol table, a decl
794 	 with type char *[] and a def with type char *[2].
795 
796 	 If we return the decl here, we don't get the value of zzz:
797 	 ...
798 	 $ gdb a.spec.out -batch -ex "p zzz"
799 	 $1 = 0x601030 <zzz>
800 	 ...
801 	 because we're returning the symbol without location information, and
802 	 because the fallback that uses the address from the minimal symbols
803 	 doesn't work either because the type of the decl does not specify a
804 	 size.
805 
806 	 To fix this, we prefer def over decl in best_symbol and
807 	 better_symbol.
808 
809 	 In absence of the gcc fix, both def and decl have type char *[], so
810 	 the only option to make this work is improve the fallback to use the
811 	 size of the minimal symbol.  Filed as PR exp/24989.  */
812       if (best_symbol (sym, domain))
813 	return sym;
814 
815       /* This is a bit of a hack, but symbol_matches_domain might ignore
816 	 STRUCT vs VAR domain symbols.  So if a matching symbol is found,
817 	 make sure there is no "better" matching symbol, i.e., one with
818 	 exactly the same domain.  PR 16253.  */
819       if (symbol_matches_domain (sym->language (), sym->domain (), domain))
820 	other = better_symbol (other, sym, domain);
821     }
822 
823   return other;
824 }
825 
826 /* See block.h.  */
827 
828 struct symbol *
829 block_find_symbol (const struct block *block, const char *name,
830 		   const domain_enum domain,
831 		   block_symbol_matcher_ftype *matcher, void *data)
832 {
833   struct block_iterator iter;
834   struct symbol *sym;
835 
836   lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
837 
838   /* Verify BLOCK is STATIC_BLOCK or GLOBAL_BLOCK.  */
839   gdb_assert (block->superblock () == NULL
840 	      || block->superblock ()->superblock () == NULL);
841 
842   ALL_BLOCK_SYMBOLS_WITH_NAME (block, lookup_name, iter, sym)
843     {
844       /* MATCHER is deliberately called second here so that it never sees
845 	 a non-domain-matching symbol.  */
846       if (symbol_matches_domain (sym->language (), sym->domain (), domain)
847 	  && matcher (sym, data))
848 	return sym;
849     }
850   return NULL;
851 }
852 
853 /* See block.h.  */
854 
855 int
856 block_find_non_opaque_type (struct symbol *sym, void *data)
857 {
858   return !TYPE_IS_OPAQUE (sym->type ());
859 }
860 
861 /* See block.h.  */
862 
863 int
864 block_find_non_opaque_type_preferred (struct symbol *sym, void *data)
865 {
866   struct symbol **best = (struct symbol **) data;
867 
868   if (!TYPE_IS_OPAQUE (sym->type ()))
869     return 1;
870   *best = sym;
871   return 0;
872 }
873 
874 /* See block.h.  */
875 
876 struct blockranges *
877 make_blockranges (struct objfile *objfile,
878 		  const std::vector<blockrange> &rangevec)
879 {
880   struct blockranges *blr;
881   size_t n = rangevec.size();
882 
883   blr = (struct blockranges *)
884     obstack_alloc (&objfile->objfile_obstack,
885 		   sizeof (struct blockranges)
886 		   + (n - 1) * sizeof (struct blockrange));
887 
888   blr->nranges = n;
889   for (int i = 0; i < n; i++)
890     blr->range[i] = rangevec[i];
891   return blr;
892 }
893 
894