]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/buildsym.c
[gdb/symtab] Fix uninitialized memory in buildsym_compunit::finish_block_internal
[thirdparty/binutils-gdb.git] / gdb / buildsym.c
CommitLineData
c906108c 1/* Support routines for building symbol tables in GDB's internal format.
213516ef 2 Copyright (C) 1986-2023 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
c5aa993b 9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b 16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 18
c906108c 19#include "defs.h"
d55e5aa6 20#include "buildsym-legacy.h"
4de283e4 21#include "bfd.h"
bf31fd38 22#include "gdbsupport/gdb_obstack.h"
ffaebc19 23#include "gdbsupport/pathstuff.h"
4de283e4
TT
24#include "symtab.h"
25#include "symfile.h"
26#include "objfiles.h"
d55e5aa6 27#include "gdbtypes.h"
4de283e4
TT
28#include "complaints.h"
29#include "expression.h" /* For "enum exp_opcode" used by... */
30#include "filenames.h" /* For DOSish file names. */
d55e5aa6 31#include "macrotab.h"
4de283e4
TT
32#include "demangle.h" /* Needed by SYMBOL_INIT_DEMANGLED_NAME. */
33#include "block.h"
34#include "cp-support.h"
35#include "dictionary.h"
4de283e4 36#include <algorithm>
9219021c 37
0a0edcd5 38/* For cleanup_undefined_stabs_types and finish_global_stabs (somewhat
c906108c
SS
39 questionable--see comment where we call them). */
40
41#include "stabsread.h"
42
93eed41f
TT
43/* List of blocks already made (lexical contexts already closed).
44 This is used at the end to make the blockvector. */
45
46struct pending_block
47 {
48 struct pending_block *next;
49 struct block *block;
50 };
51
ab209f6f
TT
52buildsym_compunit::buildsym_compunit (struct objfile *objfile_,
53 const char *name,
54 const char *comp_dir_,
f71ad555 55 const char *name_for_id,
ab209f6f
TT
56 enum language language_,
57 CORE_ADDR last_addr)
cbb09508 58 : m_objfile (objfile_),
ab209f6f 59 m_last_source_file (name == nullptr ? nullptr : xstrdup (name)),
ebd4e6d0 60 m_comp_dir (comp_dir_ == nullptr ? "" : comp_dir_),
cbb09508 61 m_language (language_),
ab209f6f
TT
62 m_last_source_start_addr (last_addr)
63{
64 /* Allocate the compunit symtab now. The caller needs it to allocate
65 non-primary symtabs. It is also needed by get_macro_table. */
cbb09508 66 m_compunit_symtab = allocate_compunit_symtab (m_objfile, name);
ab209f6f
TT
67
68 /* Build the subfile for NAME (the main source file) so that we can record
69 a pointer to it for later.
70 IMPORTANT: Do not allocate a struct symtab for NAME here.
71 It can happen that the debug info provides a different path to NAME than
72 DIRNAME,NAME. We cope with this in watch_main_source_file_lossage but
73 that only works if the main_subfile doesn't have a symtab yet. */
f71ad555 74 start_subfile (name, name_for_id);
ab209f6f
TT
75 /* Save this so that we don't have to go looking for it at the end
76 of the subfiles list. */
cbb09508 77 m_main_subfile = m_current_subfile;
ab209f6f
TT
78}
79
80buildsym_compunit::~buildsym_compunit ()
81{
82 struct subfile *subfile, *nextsub;
83
84 if (m_pending_macros != nullptr)
85 free_macro_table (m_pending_macros);
86
cbb09508 87 for (subfile = m_subfiles;
ab209f6f
TT
88 subfile != NULL;
89 subfile = nextsub)
90 {
91 nextsub = subfile->next;
71bc95ed 92 delete subfile;
ab209f6f
TT
93 }
94
95 struct pending *next, *next1;
96
97 for (next = m_file_symbols; next != NULL; next = next1)
98 {
99 next1 = next->next;
100 xfree ((void *) next);
101 }
102
103 for (next = m_global_symbols; next != NULL; next = next1)
104 {
105 next1 = next->next;
106 xfree ((void *) next);
107 }
108}
109
110struct macro_table *
111buildsym_compunit::get_macro_table ()
112{
113 if (m_pending_macros == nullptr)
cbb09508 114 m_pending_macros = new_macro_table (&m_objfile->per_bfd->storage_obstack,
be1e3d3e 115 &m_objfile->per_bfd->string_cache,
cbb09508 116 m_compunit_symtab);
ab209f6f
TT
117 return m_pending_macros;
118}
119
4a64f543 120/* Maintain the lists of symbols and blocks. */
c906108c 121
93bf33fd 122/* Add a symbol to one of the lists of symbols. */
c906108c
SS
123
124void
125add_symbol_to_list (struct symbol *symbol, struct pending **listhead)
126{
52f0bd74 127 struct pending *link;
c906108c
SS
128
129 /* If this is an alias for another symbol, don't add it. */
4d4eaa30 130 if (symbol->linkage_name () && symbol->linkage_name ()[0] == '#')
c906108c
SS
131 return;
132
4a64f543 133 /* We keep PENDINGSIZE symbols in each link of the list. If we
c906108c
SS
134 don't have a link with room in it, add a new link. */
135 if (*listhead == NULL || (*listhead)->nsyms == PENDINGSIZE)
136 {
1d376700 137 link = XNEW (struct pending);
c906108c
SS
138 link->next = *listhead;
139 *listhead = link;
140 link->nsyms = 0;
141 }
142
143 (*listhead)->symbol[(*listhead)->nsyms++] = symbol;
144}
145
146/* Find a symbol named NAME on a LIST. NAME need not be
147 '\0'-terminated; LENGTH is the length of the name. */
148
149struct symbol *
150find_symbol_in_list (struct pending *list, char *name, int length)
151{
152 int j;
0d5cff50 153 const char *pp;
c906108c
SS
154
155 while (list != NULL)
156 {
157 for (j = list->nsyms; --j >= 0;)
158 {
987012b8 159 pp = list->symbol[j]->linkage_name ();
5aafa1cc
PM
160 if (*pp == *name && strncmp (pp, name, length) == 0
161 && pp[length] == '\0')
c906108c
SS
162 {
163 return (list->symbol[j]);
164 }
165 }
166 list = list->next;
167 }
168 return (NULL);
169}
170
6b213a47
TT
171/* Record BLOCK on the list of all blocks in the file. Put it after
172 OPBLOCK, or at the beginning if opblock is NULL. This puts the
173 block in the list after all its subblocks. */
174
4a2125f5
TT
175void
176buildsym_compunit::record_pending_block (struct block *block,
177 struct pending_block *opblock)
6b213a47
TT
178{
179 struct pending_block *pblock;
180
4a2125f5 181 pblock = XOBNEW (&m_pending_block_obstack, struct pending_block);
6b213a47
TT
182 pblock->block = block;
183 if (opblock)
184 {
185 pblock->next = opblock->next;
186 opblock->next = pblock;
187 }
188 else
189 {
4a2125f5
TT
190 pblock->next = m_pending_blocks;
191 m_pending_blocks = pblock;
6b213a47
TT
192 }
193}
194
c906108c
SS
195/* Take one of the lists of symbols and make a block from it. Keep
196 the order the symbols have in the list (reversed from the input
197 file). Put the block on the list of pending blocks. */
198
4a2125f5
TT
199struct block *
200buildsym_compunit::finish_block_internal
201 (struct symbol *symbol,
202 struct pending **listhead,
203 struct pending_block *old_blocks,
204 const struct dynamic_prop *static_link,
205 CORE_ADDR start, CORE_ADDR end,
206 int is_global, int expandable)
c906108c 207{
08feed99 208 struct gdbarch *gdbarch = m_objfile->arch ();
52f0bd74
AC
209 struct pending *next, *next1;
210 struct block *block;
211 struct pending_block *pblock;
c906108c 212 struct pending_block *opblock;
c906108c 213
52255383
TT
214 if (is_global)
215 block = new (&m_objfile->objfile_obstack) global_block;
216 else
217 block = new (&m_objfile->objfile_obstack) struct block;
c906108c 218
261397f8
DJ
219 if (symbol)
220 {
24d74bb5
SM
221 block->set_multidict
222 (mdict_create_linear (&m_objfile->objfile_obstack, *listhead));
261397f8
DJ
223 }
224 else
c906108c 225 {
6d30eef8
DE
226 if (expandable)
227 {
24d74bb5
SM
228 block->set_multidict
229 (mdict_create_hashed_expandable (m_language));
230 mdict_add_pending (block->multidict (), *listhead);
6d30eef8
DE
231 }
232 else
233 {
24d74bb5
SM
234 block->set_multidict
235 (mdict_create_hashed (&m_objfile->objfile_obstack, *listhead));
6d30eef8 236 }
c906108c
SS
237 }
238
4b8791e1
SM
239 block->set_start (start);
240 block->set_end (end);
c906108c 241
c906108c
SS
242 /* Put the block in as the value of the symbol that names it. */
243
244 if (symbol)
245 {
5f9c5a63 246 struct type *ftype = symbol->type ();
4aeddc50 247 symbol->set_value_block (block);
5abbfa98 248 symbol->set_section_index (SECT_OFF_TEXT (m_objfile));
6c00f721 249 block->set_function (symbol);
c906108c 250
1f704f76 251 if (ftype->num_fields () <= 0)
c906108c
SS
252 {
253 /* No parameter type information is recorded with the
254 function's type. Set that from the type of the
4a64f543 255 parameter symbols. */
c906108c 256 int nparams = 0, iparams;
8157b174
TT
257
258 /* Here we want to directly access the dictionary, because
259 we haven't fully initialized the block yet. */
8e8d48f9 260 for (struct symbol *sym : block->multidict_symbols ())
c906108c 261 {
d9743061 262 if (sym->is_argument ())
2a2d4dc3 263 nparams++;
c906108c
SS
264 }
265 if (nparams > 0)
266 {
5e33d5f4 267 ftype->set_num_fields (nparams);
3cabb6b0
SM
268 ftype->set_fields
269 ((struct field *)
0b8b932d 270 TYPE_ZALLOC (ftype, nparams * sizeof (struct field)));
c906108c 271
de4f826b 272 iparams = 0;
8157b174
TT
273 /* Here we want to directly access the dictionary, because
274 we haven't fully initialized the block yet. */
8e8d48f9 275 for (struct symbol *sym : block->multidict_symbols ())
c906108c 276 {
de4f826b
DC
277 if (iparams == nparams)
278 break;
279
d9743061 280 if (sym->is_argument ())
c906108c 281 {
5f9c5a63 282 ftype->field (iparams).set_type (sym->type ());
8176bb6d 283 TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
c906108c 284 iparams++;
c906108c
SS
285 }
286 }
287 }
288 }
289 }
290 else
6c00f721 291 block->set_function (nullptr);
c906108c 292
63e43d3a 293 if (static_link != NULL)
cbb09508 294 objfile_register_static_link (m_objfile, block, static_link);
63e43d3a 295
1d376700 296 /* Now free the links of the list, and empty the list. */
c906108c
SS
297
298 for (next = *listhead; next; next = next1)
299 {
300 next1 = next->next;
1d376700 301 xfree (next);
c906108c
SS
302 }
303 *listhead = NULL;
304
c906108c 305 /* Check to be sure that the blocks have an end address that is
4a64f543 306 greater than starting address. */
c906108c 307
4b8791e1 308 if (block->end () < block->start ())
c906108c
SS
309 {
310 if (symbol)
311 {
b98664d3 312 complaint (_("block end address less than block "
3e43a32a 313 "start address in %s (patched it)"),
987012b8 314 symbol->print_name ());
c906108c
SS
315 }
316 else
317 {
b98664d3 318 complaint (_("block end address %s less than block "
3e43a32a 319 "start address %s (patched it)"),
4b8791e1
SM
320 paddress (gdbarch, block->end ()),
321 paddress (gdbarch, block->start ()));
c906108c 322 }
4a64f543 323 /* Better than nothing. */
4b8791e1 324 block->set_end (block->start ());
c906108c 325 }
c906108c
SS
326
327 /* Install this block as the superblock of all blocks made since the
328 start of this scope that don't have superblocks yet. */
329
330 opblock = NULL;
4a2125f5 331 for (pblock = m_pending_blocks;
c0219d42
MS
332 pblock && pblock != old_blocks;
333 pblock = pblock->next)
c906108c 334 {
f135fe72 335 if (pblock->block->superblock () == NULL)
c906108c 336 {
c906108c 337 /* Check to be sure the blocks are nested as we receive
4a64f543 338 them. If the compiler/assembler/linker work, this just
14711c82
DJ
339 burns a small amount of time.
340
341 Skip blocks which correspond to a function; they're not
342 physically nested inside this other blocks, only
343 lexically nested. */
6c00f721 344 if (pblock->block->function () == NULL
4b8791e1
SM
345 && (pblock->block->start () < block->start ()
346 || pblock->block->end () > block->end ()))
c906108c
SS
347 {
348 if (symbol)
349 {
b98664d3 350 complaint (_("inner block not inside outer block in %s"),
987012b8 351 symbol->print_name ());
c906108c
SS
352 }
353 else
354 {
b98664d3 355 complaint (_("inner block (%s-%s) not "
3e43a32a 356 "inside outer block (%s-%s)"),
4b8791e1
SM
357 paddress (gdbarch, pblock->block->start ()),
358 paddress (gdbarch, pblock->block->end ()),
359 paddress (gdbarch, block->start ()),
360 paddress (gdbarch, block->end ()));
c906108c 361 }
4b8791e1
SM
362
363 if (pblock->block->start () < block->start ())
364 pblock->block->set_start (block->start ());
365
366 if (pblock->block->end () > block->end ())
367 pblock->block->set_end (block->end ());
c906108c 368 }
f135fe72 369 pblock->block->set_superblock (block);
c906108c
SS
370 }
371 opblock = pblock;
372 }
373
3c45e9f9
TT
374 block->set_using ((is_global
375 ? m_global_using_directives
376 : m_local_using_directives),
377 &m_objfile->objfile_obstack);
22cee43f 378 if (is_global)
4a2125f5 379 m_global_using_directives = NULL;
22cee43f 380 else
4a2125f5 381 m_local_using_directives = NULL;
27aa8d6a 382
6b213a47 383 record_pending_block (block, opblock);
801e3a5b
JB
384
385 return block;
c906108c
SS
386}
387
84a146c9 388struct block *
4a2125f5
TT
389buildsym_compunit::finish_block (struct symbol *symbol,
390 struct pending_block *old_blocks,
391 const struct dynamic_prop *static_link,
392 CORE_ADDR start, CORE_ADDR end)
84a146c9 393{
4a2125f5
TT
394 return finish_block_internal (symbol, &m_local_symbols,
395 old_blocks, static_link, start, end, 0, 0);
84a146c9 396}
de4f826b 397
801e3a5b
JB
398/* Record that the range of addresses from START to END_INCLUSIVE
399 (inclusive, like it says) belongs to BLOCK. BLOCK's start and end
400 addresses must be set already. You must apply this function to all
401 BLOCK's children before applying it to BLOCK.
402
403 If a call to this function complicates the picture beyond that
404 already provided by BLOCK_START and BLOCK_END, then we create an
405 address map for the block. */
406void
4a2125f5
TT
407buildsym_compunit::record_block_range (struct block *block,
408 CORE_ADDR start,
409 CORE_ADDR end_inclusive)
801e3a5b
JB
410{
411 /* If this is any different from the range recorded in the block's
412 own BLOCK_START and BLOCK_END, then note that the address map has
413 become interesting. Note that even if this block doesn't have
414 any "interesting" ranges, some later block might, so we still
415 need to record this block in the addrmap. */
4b8791e1
SM
416 if (start != block->start ()
417 || end_inclusive + 1 != block->end ())
4a2125f5 418 m_pending_addrmap_interesting = true;
801e3a5b 419
93b527ef 420 m_pending_addrmap.set_empty (start, end_inclusive, block);
801e3a5b
JB
421}
422
4a2125f5
TT
423struct blockvector *
424buildsym_compunit::make_blockvector ()
c906108c 425{
52f0bd74
AC
426 struct pending_block *next;
427 struct blockvector *blockvector;
428 int i;
c906108c
SS
429
430 /* Count the length of the list of blocks. */
431
4a2125f5 432 for (next = m_pending_blocks, i = 0; next; next = next->next, i++)
5ac04550 433 {
c906108c
SS
434 }
435
436 blockvector = (struct blockvector *)
cbb09508 437 obstack_alloc (&m_objfile->objfile_obstack,
c906108c
SS
438 (sizeof (struct blockvector)
439 + (i - 1) * sizeof (struct block *)));
440
4a64f543 441 /* Copy the blocks into the blockvector. This is done in reverse
c906108c 442 order, which happens to put the blocks into the proper order
4a64f543 443 (ascending starting address). finish_block has hair to insert
c906108c
SS
444 each block into the list after its subblocks in order to make
445 sure this is true. */
446
63d609de 447 blockvector->set_num_blocks (i);
4a2125f5 448 for (next = m_pending_blocks; next; next = next->next)
63d609de 449 blockvector->set_block (--i, next->block);
c906108c 450
4a2125f5 451 free_pending_blocks ();
c906108c 452
801e3a5b
JB
453 /* If we needed an address map for this symtab, record it in the
454 blockvector. */
93b527ef 455 if (m_pending_addrmap_interesting)
414705d1 456 blockvector->set_map
d89120e9 457 (new (&m_objfile->objfile_obstack) addrmap_fixed
93b527ef 458 (&m_objfile->objfile_obstack, &m_pending_addrmap));
801e3a5b 459 else
414705d1 460 blockvector->set_map (nullptr);
4aad0dfc 461
c906108c 462 /* Some compilers output blocks in the wrong order, but we depend on
4a64f543 463 their being in the right order so we can binary search. Check the
4aad0dfc
DE
464 order and moan about it.
465 Note: Remember that the first two blocks are the global and static
466 blocks. We could special case that fact and begin checking at block 2.
467 To avoid making that assumption we do not. */
63d609de 468 if (blockvector->num_blocks () > 1)
c906108c 469 {
63d609de 470 for (i = 1; i < blockvector->num_blocks (); i++)
c906108c 471 {
63d609de
SM
472 if (blockvector->block (i - 1)->start ()
473 > blockvector->block (i)->start ())
c906108c 474 {
59527da0 475 CORE_ADDR start
63d609de 476 = blockvector->block (i)->start ();
c906108c 477
b98664d3 478 complaint (_("block at %s out of order"),
bb599908 479 hex_string ((LONGEST) start));
c906108c
SS
480 }
481 }
482 }
c906108c
SS
483
484 return (blockvector);
485}
f71ad555
SM
486
487/* See buildsym.h. */
c906108c
SS
488
489void
f71ad555 490buildsym_compunit::start_subfile (const char *name, const char *name_for_id)
c906108c 491{
43f3e411
DE
492 /* See if this subfile is already registered. */
493
f71ad555 494 symtab_create_debug_printf ("name = %s, name_for_id = %s", name, name_for_id);
80affb9f 495
71bc95ed 496 for (subfile *subfile = m_subfiles; subfile; subfile = subfile->next)
ee26d001
SM
497 if (FILENAME_CMP (subfile->name_for_id.c_str (), name_for_id) == 0)
498 {
499 symtab_create_debug_printf ("found existing symtab with name_for_id %s",
500 subfile->name_for_id.c_str ());
501 m_current_subfile = subfile;
502 return;
503 }
c906108c 504
43f3e411 505 /* This subfile is not known. Add an entry for it. */
c906108c 506
71bc95ed 507 subfile_up subfile (new struct subfile);
ebd4e6d0 508 subfile->name = name;
f71ad555 509 subfile->name_for_id = name_for_id;
43f3e411 510
71bc95ed 511 m_current_subfile = subfile.get ();
c906108c 512
c906108c
SS
513 /* Default the source language to whatever can be deduced from the
514 filename. If nothing can be deduced (such as for a C/C++ include
515 file with a ".h" extension), then inherit whatever language the
516 previous subfile had. This kludgery is necessary because there
517 is no standard way in some object formats to record the source
518 language. Also, when symtabs are allocated we try to deduce a
519 language then as well, but it is too late for us to use that
520 information while reading symbols, since symtabs aren't allocated
521 until after all the symbols have been processed for a given
4a64f543 522 source file. */
c906108c 523
ebd4e6d0 524 subfile->language = deduce_language_from_filename (subfile->name.c_str ());
71bc95ed
SM
525 if (subfile->language == language_unknown && m_subfiles != nullptr)
526 subfile->language = m_subfiles->language;
c906108c 527
25caa7a8 528 /* If the filename of this subfile ends in .C, then change the
c906108c 529 language of any pending subfiles from C to C++. We also accept
25caa7a8 530 any other C++ suffixes accepted by deduce_language_from_filename. */
c906108c
SS
531 /* Likewise for f2c. */
532
ebd4e6d0 533 if (!subfile->name.empty ())
c906108c
SS
534 {
535 struct subfile *s;
ebd4e6d0 536 language sublang = deduce_language_from_filename (subfile->name.c_str ());
c906108c
SS
537
538 if (sublang == language_cplus || sublang == language_fortran)
cbb09508 539 for (s = m_subfiles; s != NULL; s = s->next)
c906108c
SS
540 if (s->language == language_c)
541 s->language = sublang;
542 }
543
544 /* And patch up this file if necessary. */
545 if (subfile->language == language_c
71bc95ed
SM
546 && m_subfiles != nullptr
547 && (m_subfiles->language == language_cplus
548 || m_subfiles->language == language_fortran))
549 subfile->language = m_subfiles->language;
550
551 /* Link this subfile at the front of the subfile list. */
552 subfile->next = m_subfiles;
553 m_subfiles = subfile.release ();
c906108c
SS
554}
555
556/* For stabs readers, the first N_SO symbol is assumed to be the
557 source file name, and the subfile struct is initialized using that
558 assumption. If another N_SO symbol is later seen, immediately
559 following the first one, then the first one is assumed to be the
560 directory name and the second one is really the source file name.
561
562 So we have to patch up the subfile struct by moving the old name
563 value to dirname and remembering the new name. Some sanity
564 checking is performed to ensure that the state of the subfile
565 struct is reasonable and that the old name we are assuming to be a
4a64f543 566 directory name actually is (by checking for a trailing '/'). */
c906108c
SS
567
568void
4a2125f5
TT
569buildsym_compunit::patch_subfile_names (struct subfile *subfile,
570 const char *name)
c906108c 571{
43f3e411 572 if (subfile != NULL
ebd4e6d0
SM
573 && m_comp_dir.empty ()
574 && !subfile->name.empty ()
575 && IS_DIR_SEPARATOR (subfile->name.back ()))
c906108c 576 {
ebd4e6d0
SM
577 m_comp_dir = std::move (subfile->name);
578 subfile->name = name;
f71ad555 579 subfile->name_for_id = name;
46212e0b 580 set_last_source_file (name);
c906108c
SS
581
582 /* Default the source language to whatever can be deduced from
dda83cd7
SM
583 the filename. If nothing can be deduced (such as for a C/C++
584 include file with a ".h" extension), then inherit whatever
585 language the previous subfile had. This kludgery is
586 necessary because there is no standard way in some object
587 formats to record the source language. Also, when symtabs
588 are allocated we try to deduce a language then as well, but
589 it is too late for us to use that information while reading
590 symbols, since symtabs aren't allocated until after all the
591 symbols have been processed for a given source file. */
c906108c 592
ebd4e6d0
SM
593 subfile->language
594 = deduce_language_from_filename (subfile->name.c_str ());
5aafa1cc
PM
595 if (subfile->language == language_unknown
596 && subfile->next != NULL)
c906108c
SS
597 {
598 subfile->language = subfile->next->language;
599 }
600 }
601}
602\f
603/* Handle the N_BINCL and N_EINCL symbol types that act like N_SOL for
604 switching source files (different subfiles, as we call them) within
605 one object file, but using a stack rather than in an arbitrary
606 order. */
607
608void
4a2125f5 609buildsym_compunit::push_subfile ()
c906108c 610{
4a2125f5 611 gdb_assert (m_current_subfile != NULL);
ebd4e6d0
SM
612 gdb_assert (!m_current_subfile->name.empty ());
613 m_subfile_stack.push_back (m_current_subfile->name.c_str ());
c906108c
SS
614}
615
8419ee53 616const char *
4a2125f5 617buildsym_compunit::pop_subfile ()
c906108c 618{
4a2125f5
TT
619 gdb_assert (!m_subfile_stack.empty ());
620 const char *name = m_subfile_stack.back ();
621 m_subfile_stack.pop_back ();
8419ee53 622 return name;
c906108c
SS
623}
624\f
625/* Add a linetable entry for line number LINE and address PC to the
626 line vector for SUBFILE. */
627
628void
4a2125f5 629buildsym_compunit::record_line (struct subfile *subfile, int line,
48e0f38c 630 unrelocated_addr pc, linetable_entry_flags flags)
c906108c 631{
558802e4 632 m_have_line_numbers = true;
c906108c 633
a25198bb
BE
634 /* Normally, we treat lines as unsorted. But the end of sequence
635 marker is special. We sort line markers at the same PC by line
636 number, so end of sequence markers (which have line == 0) appear
637 first. This is right if the marker ends the previous function,
638 and there is no padding before the next function. But it is
639 wrong if the previous line was empty and we are now marking a
640 switch to a different subfile. We must leave the end of sequence
641 marker at the end of this group of lines, not sort the empty line
642 to after the marker. The easiest way to accomplish this is to
643 delete any empty lines from our table, if they are followed by
644 end of sequence markers. All we lose is the ability to set
645 breakpoints at some lines which contain no instructions
646 anyway. */
647 if (line == 0)
607ae575 648 {
558802e4
SM
649 gdb::optional<int> last_line;
650
651 while (!subfile->line_vector_entries.empty ())
607ae575 652 {
558802e4
SM
653 linetable_entry *last = &subfile->line_vector_entries.back ();
654 last_line = last->line;
655
0434c3ef 656 if (last->unrelocated_pc () != pc)
64dc2d4b 657 break;
558802e4
SM
658
659 subfile->line_vector_entries.pop_back ();
607ae575 660 }
e4ad960a
TV
661
662 /* Ignore an end-of-sequence marker marking an empty sequence. */
558802e4 663 if (!last_line.has_value () || *last_line == 0)
e4ad960a 664 return;
607ae575
DJ
665 }
666
558802e4
SM
667 subfile->line_vector_entries.emplace_back ();
668 linetable_entry &e = subfile->line_vector_entries.back ();
669 e.line = line;
670 e.is_stmt = (flags & LEF_IS_STMT) != 0;
0434c3ef 671 e.set_unrelocated_pc (pc);
558802e4 672 e.prologue_end = (flags & LEF_PROLOGUE_END) != 0;
c906108c
SS
673}
674
c906108c 675\f
59dfe8ad 676/* Subroutine of end_compunit_symtab to simplify it. Look for a subfile that
4a64f543
MS
677 matches the main source file's basename. If there is only one, and
678 if the main source file doesn't have any symbol or line number
679 information, then copy this file's symtab and line_vector to the
680 main source file's subfile and discard the other subfile. This can
681 happen because of a compiler bug or from the user playing games
682 with #line or from things like a distributed build system that
43f3e411
DE
683 manipulates the debug info. This can also happen from an innocent
684 symlink in the paths, we don't canonicalize paths here. */
4584e32e 685
4a2125f5
TT
686void
687buildsym_compunit::watch_main_source_file_lossage ()
4584e32e 688{
43f3e411 689 struct subfile *mainsub, *subfile;
4584e32e 690
43f3e411 691 /* Get the main source file. */
cbb09508 692 mainsub = m_main_subfile;
43f3e411 693
4a64f543 694 /* If the main source file doesn't have any line number or symbol
7bab9b58 695 info, look for an alias in another subfile. */
4584e32e 696
558802e4 697 if (mainsub->line_vector_entries.empty ()
43f3e411 698 && mainsub->symtab == NULL)
4584e32e 699 {
ebd4e6d0 700 const char *mainbase = lbasename (mainsub->name.c_str ());
4584e32e
DE
701 int nr_matches = 0;
702 struct subfile *prevsub;
703 struct subfile *mainsub_alias = NULL;
704 struct subfile *prev_mainsub_alias = NULL;
705
706 prevsub = NULL;
cbb09508 707 for (subfile = m_subfiles;
43f3e411 708 subfile != NULL;
4584e32e
DE
709 subfile = subfile->next)
710 {
43f3e411
DE
711 if (subfile == mainsub)
712 continue;
ebd4e6d0 713 if (filename_cmp (lbasename (subfile->name.c_str ()), mainbase) == 0)
4584e32e
DE
714 {
715 ++nr_matches;
716 mainsub_alias = subfile;
717 prev_mainsub_alias = prevsub;
718 }
719 prevsub = subfile;
720 }
721
722 if (nr_matches == 1)
723 {
43f3e411 724 gdb_assert (mainsub_alias != NULL && mainsub_alias != mainsub);
4584e32e
DE
725
726 /* Found a match for the main source file.
727 Copy its line_vector and symtab to the main subfile
728 and then discard it. */
729
80affb9f
SM
730 symtab_create_debug_printf ("using subfile %s as the main subfile",
731 mainsub_alias->name.c_str ());
732
558802e4
SM
733 mainsub->line_vector_entries
734 = std::move (mainsub_alias->line_vector_entries);
43f3e411 735 mainsub->symtab = mainsub_alias->symtab;
4584e32e
DE
736
737 if (prev_mainsub_alias == NULL)
cbb09508 738 m_subfiles = mainsub_alias->next;
4584e32e
DE
739 else
740 prev_mainsub_alias->next = mainsub_alias->next;
71bc95ed
SM
741
742 delete mainsub_alias;
4584e32e
DE
743 }
744 }
745}
746
59dfe8ad
SM
747/* Implementation of the first part of end_compunit_symtab. It allows modifying
748 STATIC_BLOCK before it gets finalized by
749 end_compunit_symtab_from_static_block. If the returned value is NULL there
750 is no blockvector created for this symtab (you still must call
751 end_compunit_symtab_from_static_block).
c906108c 752
59dfe8ad
SM
753 END_ADDR is the same as for end_compunit_symtab: the address of the end of
754 the file's text.
c906108c 755
4359dff1 756 If EXPANDABLE is non-zero the STATIC_BLOCK dictionary is made
36586728
TT
757 expandable.
758
759 If REQUIRED is non-zero, then a symtab is created even if it does
760 not contain any symbols. */
6d30eef8 761
4359dff1 762struct block *
59dfe8ad
SM
763buildsym_compunit::end_compunit_symtab_get_static_block (CORE_ADDR end_addr,
764 int expandable,
765 int required)
c906108c 766{
c906108c
SS
767 /* Finish the lexical context of the last function in the file; pop
768 the context stack. */
769
4a2125f5 770 if (!m_context_stack.empty ())
c906108c 771 {
a60f3166 772 struct context_stack cstk = pop_context ();
4359dff1 773
c906108c 774 /* Make a block for the local symbols within. */
c233e9c6 775 finish_block (cstk.name, cstk.old_blocks, NULL,
a60f3166 776 cstk.start_addr, end_addr);
c906108c 777
4a2125f5 778 if (!m_context_stack.empty ())
c906108c
SS
779 {
780 /* This is said to happen with SCO. The old coffread.c
781 code simply emptied the context stack, so we do the
782 same. FIXME: Find out why it is happening. This is not
783 believed to happen in most cases (even for coffread.c);
784 it used to be an abort(). */
59dfe8ad 785 complaint (_("Context stack not empty in end_compunit_symtab"));
4a2125f5 786 m_context_stack.clear ();
c906108c
SS
787 }
788 }
789
100e3935
TT
790 /* Executables may have out of order pending blocks; sort the
791 pending blocks. */
792 if (m_pending_blocks != nullptr)
c906108c 793 {
07e7f39f 794 struct pending_block *pb;
c906108c 795
b05628f0 796 std::vector<block *> barray;
c906108c 797
4a2125f5 798 for (pb = m_pending_blocks; pb != NULL; pb = pb->next)
b05628f0 799 barray.push_back (pb->block);
07e7f39f 800
5033013f
UW
801 /* Sort blocks by start address in descending order. Blocks with the
802 same start address must remain in the original order to preserve
803 inline function caller/callee relationships. */
804 std::stable_sort (barray.begin (), barray.end (),
805 [] (const block *a, const block *b)
806 {
4b8791e1 807 return a->start () > b->start ();
5033013f 808 });
07e7f39f 809
b05628f0 810 int i = 0;
4a2125f5 811 for (pb = m_pending_blocks; pb != NULL; pb = pb->next)
b05628f0 812 pb->block = barray[i++];
c906108c
SS
813 }
814
815 /* Cleanup any undefined types that have been left hanging around
816 (this needs to be done before the finish_blocks so that
817 file_symbols is still good).
c5aa993b 818
0a0edcd5 819 Both cleanup_undefined_stabs_types and finish_global_stabs are stabs
c906108c
SS
820 specific, but harmless for other symbol readers, since on gdb
821 startup or when finished reading stabs, the state is set so these
822 are no-ops. FIXME: Is this handled right in case of QUIT? Can
823 we make this cleaner? */
824
cbb09508
KS
825 cleanup_undefined_stabs_types (m_objfile);
826 finish_global_stabs (m_objfile);
c906108c 827
36586728 828 if (!required
4a2125f5
TT
829 && m_pending_blocks == NULL
830 && m_file_symbols == NULL
831 && m_global_symbols == NULL
832 && !m_have_line_numbers
833 && m_pending_macros == NULL
834 && m_global_using_directives == NULL)
c906108c 835 {
4359dff1
JK
836 /* Ignore symtabs that have no functions with real debugging info. */
837 return NULL;
838 }
839 else
840 {
841 /* Define the STATIC_BLOCK. */
e148f09d 842 return finish_block_internal (NULL, get_file_symbols (), NULL, NULL,
4a2125f5 843 m_last_source_start_addr,
2c99ee5c 844 end_addr, 0, expandable);
4359dff1
JK
845 }
846}
847
59dfe8ad 848/* Subroutine of end_compunit_symtab_from_static_block to simplify it.
7bab9b58 849 Handle the "have blockvector" case.
59dfe8ad
SM
850 See end_compunit_symtab_from_static_block for a description of the
851 arguments. */
7bab9b58 852
4a2125f5 853struct compunit_symtab *
59dfe8ad 854buildsym_compunit::end_compunit_symtab_with_blockvector
83bad316 855 (struct block *static_block, int expandable)
4359dff1 856{
cbb09508 857 struct compunit_symtab *cu = m_compunit_symtab;
4359dff1
JK
858 struct blockvector *blockvector;
859 struct subfile *subfile;
7bab9b58 860 CORE_ADDR end_addr;
4359dff1 861
7bab9b58 862 gdb_assert (static_block != NULL);
cbb09508 863 gdb_assert (m_subfiles != NULL);
7bab9b58 864
4b8791e1 865 end_addr = static_block->end ();
7bab9b58
DE
866
867 /* Create the GLOBAL_BLOCK and build the blockvector. */
e148f09d 868 finish_block_internal (NULL, get_global_symbols (), NULL, NULL,
4a2125f5 869 m_last_source_start_addr, end_addr,
7bab9b58 870 1, expandable);
43f3e411 871 blockvector = make_blockvector ();
c906108c 872
f56ce883
DE
873 /* Read the line table if it has to be read separately.
874 This is only used by xcoffread.c. */
cbb09508
KS
875 if (m_objfile->sf->sym_read_linetable != NULL)
876 m_objfile->sf->sym_read_linetable (m_objfile);
c906108c 877
4584e32e
DE
878 /* Handle the case where the debug info specifies a different path
879 for the main source file. It can cause us to lose track of its
880 line number information. */
881 watch_main_source_file_lossage ();
882
43f3e411
DE
883 /* Now create the symtab objects proper, if not already done,
884 one for each subfile. */
c906108c 885
cbb09508 886 for (subfile = m_subfiles;
43f3e411
DE
887 subfile != NULL;
888 subfile = subfile->next)
c906108c 889 {
558802e4 890 if (!subfile->line_vector_entries.empty ())
c906108c 891 {
100e3935
TT
892 /* Like the pending blocks, the line table may be scrambled
893 in reordered executables. Sort it. It is important to
894 preserve the order of lines at the same address, as this
895 maintains the inline function caller/callee
3d92a3e3 896 relationships, this is why std::stable_sort is used. */
100e3935 897 std::stable_sort (subfile->line_vector_entries.begin (),
6e6ac32d 898 subfile->line_vector_entries.end ());
7bab9b58 899 }
9182c5bc 900
7bab9b58
DE
901 /* Allocate a symbol table if necessary. */
902 if (subfile->symtab == NULL)
f71ad555
SM
903 subfile->symtab = allocate_symtab (cu, subfile->name.c_str (),
904 subfile->name_for_id.c_str ());
ebd4e6d0 905
5accd1a0 906 struct symtab *symtab = subfile->symtab;
9182c5bc 907
7bab9b58 908 /* Fill in its components. */
43f3e411 909
558802e4 910 if (!subfile->line_vector_entries.empty ())
7bab9b58 911 {
558802e4
SM
912 /* Reallocate the line table on the objfile obstack. */
913 size_t n_entries = subfile->line_vector_entries.size ();
914 size_t entry_array_size = n_entries * sizeof (struct linetable_entry);
915 int linetablesize = sizeof (struct linetable) + entry_array_size;
916
977a0c16
TT
917 struct linetable *new_table
918 = XOBNEWVAR (&m_objfile->objfile_obstack, struct linetable,
919 linetablesize);
558802e4 920
977a0c16
TT
921 new_table->nitems = n_entries;
922 memcpy (new_table->item,
558802e4 923 subfile->line_vector_entries.data (), entry_array_size);
977a0c16
TT
924
925 symtab->set_linetable (new_table);
c906108c 926 }
24be086d 927 else
5b607461 928 symtab->set_linetable (nullptr);
c906108c 929
7bab9b58
DE
930 /* Use whatever language we have been using for this
931 subfile, not the one that was deduced in allocate_symtab
932 from the filename. We already did our own deducing when
933 we created the subfile, and we may have altered our
934 opinion of what language it is from things we found in
935 the symbols. */
1ee2e9f9 936 symtab->set_language (subfile->language);
43f3e411 937 }
c906108c 938
36664835
SM
939 /* Make sure the filetab of main_subfile is the primary filetab of the CU. */
940 cu->set_primary_filetab (m_main_subfile->symtab);
84a146c9 941
0ab9ce85 942 /* Fill out the compunit symtab. */
84a146c9 943
ebd4e6d0 944 if (!m_comp_dir.empty ())
43f3e411
DE
945 {
946 /* Reallocate the dirname on the symbol obstack. */
0d9acb45 947 cu->set_dirname (obstack_strdup (&m_objfile->objfile_obstack,
ebd4e6d0 948 m_comp_dir.c_str ()));
c906108c
SS
949 }
950
43f3e411 951 /* Save the debug format string (if any) in the symtab. */
422f1ea2 952 cu->set_debugformat (m_debugformat);
43f3e411
DE
953
954 /* Similarly for the producer. */
ab5f850e 955 cu->set_producer (m_producer);
43f3e411 956
af39c5c8 957 cu->set_blockvector (blockvector);
7bab9b58 958 {
63d609de 959 struct block *b = blockvector->global_block ();
cb1df416 960
cade9c8a 961 b->set_compunit_symtab (cu);
7bab9b58 962 }
cb1df416 963
10cc645b 964 cu->set_macro_table (release_macros ());
43f3e411 965
7bab9b58
DE
966 /* Default any symbols without a specified symtab to the primary symtab. */
967 {
968 int block_i;
969
43f3e411 970 /* The main source file's symtab. */
510860f2 971 struct symtab *symtab = cu->primary_filetab ();
43f3e411 972
63d609de 973 for (block_i = 0; block_i < blockvector->num_blocks (); block_i++)
7bab9b58 974 {
63d609de 975 struct block *block = blockvector->block (block_i);
7bab9b58
DE
976
977 /* Inlined functions may have symbols not in the global or
978 static symbol lists. */
6c00f721
SM
979 if (block->function () != nullptr
980 && block->function ()->symtab () == nullptr)
981 block->function ()->set_symtab (symtab);
7bab9b58
DE
982
983 /* Note that we only want to fix up symbols from the local
8e8d48f9
TT
984 blocks, not blocks coming from included symtabs. That is
985 why we use an mdict iterator here and not a block
986 iterator. */
987 for (struct symbol *sym : block->multidict_symbols ())
4206d69e
TT
988 if (sym->symtab () == NULL)
989 sym->set_symtab (symtab);
7bab9b58
DE
990 }
991 }
edb3359d 992
43f3e411 993 add_compunit_symtab_to_objfile (cu);
43f3e411
DE
994
995 return cu;
7bab9b58
DE
996}
997
59dfe8ad
SM
998/* Implementation of the second part of end_compunit_symtab. Pass STATIC_BLOCK
999 as value returned by end_compunit_symtab_get_static_block.
7bab9b58 1000
7bab9b58
DE
1001 If EXPANDABLE is non-zero the GLOBAL_BLOCK dictionary is made
1002 expandable. */
1003
43f3e411 1004struct compunit_symtab *
59dfe8ad 1005buildsym_compunit::end_compunit_symtab_from_static_block
83bad316 1006 (struct block *static_block, int expandable)
7bab9b58 1007{
43f3e411 1008 struct compunit_symtab *cu;
7bab9b58
DE
1009
1010 if (static_block == NULL)
1011 {
0ab9ce85
DE
1012 /* Handle the "no blockvector" case.
1013 When this happens there is nothing to record, so there's nothing
1014 to do: memory will be freed up later.
1015
1016 Note: We won't be adding a compunit to the objfile's list of
1017 compunits, so there's nothing to unchain. However, since each symtab
1018 is added to the objfile's obstack we can't free that space.
1019 We could do better, but this is believed to be a sufficiently rare
1020 event. */
43f3e411 1021 cu = NULL;
7bab9b58
DE
1022 }
1023 else
83bad316 1024 cu = end_compunit_symtab_with_blockvector (static_block, expandable);
cb1df416 1025
43f3e411 1026 return cu;
6d30eef8
DE
1027}
1028
4359dff1
JK
1029/* Finish the symbol definitions for one main source file, close off
1030 all the lexical contexts for that file (creating struct block's for
1031 them), then make the struct symtab for that file and put it in the
1032 list of all such.
1033
83bad316 1034 END_ADDR is the address of the end of the file's text.
4359dff1 1035
59dfe8ad 1036 Note that it is possible for end_compunit_symtab() to return NULL. In
4359dff1
JK
1037 particular, for the DWARF case at least, it will return NULL when
1038 it finds a compilation unit that has exactly one DIE, a
1039 TAG_compile_unit DIE. This can happen when we link in an object
1040 file that was compiled from an empty source file. Returning NULL
1041 is probably not the correct thing to do, because then gdb will
1042 never know about this empty file (FIXME).
1043
1044 If you need to modify STATIC_BLOCK before it is finalized you should
59dfe8ad
SM
1045 call end_compunit_symtab_get_static_block and
1046 end_compunit_symtab_from_static_block yourself. */
6d30eef8 1047
43f3e411 1048struct compunit_symtab *
83bad316 1049buildsym_compunit::end_compunit_symtab (CORE_ADDR end_addr)
6d30eef8 1050{
4359dff1
JK
1051 struct block *static_block;
1052
59dfe8ad 1053 static_block = end_compunit_symtab_get_static_block (end_addr, 0, 0);
83bad316 1054 return end_compunit_symtab_from_static_block (static_block, 0);
6d30eef8
DE
1055}
1056
59dfe8ad
SM
1057/* Same as end_compunit_symtab except create a symtab that can be later added
1058 to. */
6d30eef8 1059
43f3e411 1060struct compunit_symtab *
83bad316 1061buildsym_compunit::end_expandable_symtab (CORE_ADDR end_addr)
6d30eef8 1062{
4359dff1
JK
1063 struct block *static_block;
1064
59dfe8ad 1065 static_block = end_compunit_symtab_get_static_block (end_addr, 1, 0);
83bad316 1066 return end_compunit_symtab_from_static_block (static_block, 1);
6d30eef8
DE
1067}
1068
1069/* Subroutine of augment_type_symtab to simplify it.
43f3e411
DE
1070 Attach the main source file's symtab to all symbols in PENDING_LIST that
1071 don't have one. */
6d30eef8
DE
1072
1073static void
43f3e411
DE
1074set_missing_symtab (struct pending *pending_list,
1075 struct compunit_symtab *cu)
6d30eef8
DE
1076{
1077 struct pending *pending;
1078 int i;
1079
1080 for (pending = pending_list; pending != NULL; pending = pending->next)
801e3a5b 1081 {
6d30eef8
DE
1082 for (i = 0; i < pending->nsyms; ++i)
1083 {
4206d69e
TT
1084 if (pending->symbol[i]->symtab () == NULL)
1085 pending->symbol[i]->set_symtab (cu->primary_filetab ());
6d30eef8 1086 }
801e3a5b 1087 }
6d30eef8 1088}
c906108c 1089
59dfe8ad 1090/* Same as end_compunit_symtab, but for the case where we're adding more symbols
6d30eef8
DE
1091 to an existing symtab that is known to contain only type information.
1092 This is the case for DWARF4 Type Units. */
1093
1094void
4a2125f5 1095buildsym_compunit::augment_type_symtab ()
6d30eef8 1096{
cbb09508 1097 struct compunit_symtab *cust = m_compunit_symtab;
63d609de 1098 struct blockvector *blockvector = cust->blockvector ();
6d30eef8 1099
4a2125f5 1100 if (!m_context_stack.empty ())
a60f3166 1101 complaint (_("Context stack not empty in augment_type_symtab"));
4a2125f5 1102 if (m_pending_blocks != NULL)
b98664d3 1103 complaint (_("Blocks in a type symtab"));
4a2125f5 1104 if (m_pending_macros != NULL)
b98664d3 1105 complaint (_("Macro in a type symtab"));
4a2125f5 1106 if (m_have_line_numbers)
b98664d3 1107 complaint (_("Line numbers recorded in a type symtab"));
6d30eef8 1108
4a2125f5 1109 if (m_file_symbols != NULL)
6d30eef8 1110 {
63d609de 1111 struct block *block = blockvector->static_block ();
6d30eef8
DE
1112
1113 /* First mark any symbols without a specified symtab as belonging
1114 to the primary symtab. */
4a2125f5 1115 set_missing_symtab (m_file_symbols, cust);
6d30eef8 1116
24d74bb5 1117 mdict_add_pending (block->multidict (), m_file_symbols);
6d30eef8
DE
1118 }
1119
4a2125f5 1120 if (m_global_symbols != NULL)
6d30eef8 1121 {
63d609de 1122 struct block *block = blockvector->global_block ();
6d30eef8
DE
1123
1124 /* First mark any symbols without a specified symtab as belonging
1125 to the primary symtab. */
4a2125f5 1126 set_missing_symtab (m_global_symbols, cust);
6d30eef8 1127
24d74bb5 1128 mdict_add_pending (block->multidict (), m_global_symbols);
6d30eef8 1129 }
c906108c
SS
1130}
1131
1132/* Push a context block. Args are an identifying nesting level
1133 (checkable when you pop it), and the starting PC address of this
1134 context. */
1135
1136struct context_stack *
4a2125f5 1137buildsym_compunit::push_context (int desc, CORE_ADDR valu)
c906108c 1138{
4a2125f5
TT
1139 m_context_stack.emplace_back ();
1140 struct context_stack *newobj = &m_context_stack.back ();
c906108c 1141
fe978cb0 1142 newobj->depth = desc;
4a2125f5
TT
1143 newobj->locals = m_local_symbols;
1144 newobj->old_blocks = m_pending_blocks;
fe978cb0 1145 newobj->start_addr = valu;
4a2125f5 1146 newobj->local_using_directives = m_local_using_directives;
fe978cb0 1147 newobj->name = NULL;
c906108c 1148
4a2125f5
TT
1149 m_local_symbols = NULL;
1150 m_local_using_directives = NULL;
c906108c 1151
fe978cb0 1152 return newobj;
c906108c 1153}
0c5e171a 1154
a672ef13 1155/* Pop a context block. Returns the address of the context block just
4a64f543 1156 popped. */
a672ef13 1157
a60f3166 1158struct context_stack
4a2125f5 1159buildsym_compunit::pop_context ()
0c5e171a 1160{
4a2125f5
TT
1161 gdb_assert (!m_context_stack.empty ());
1162 struct context_stack result = m_context_stack.back ();
1163 m_context_stack.pop_back ();
a60f3166 1164 return result;
0c5e171a 1165}