This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [rfa/symtab] Sign extend dwarf2 addresses (sometimes)
- To: Elena Zannoni <ezannoni at cygnus dot com>, Jim Blandy <jimb at cygnus dot com>, GDB Patches <gdb-patches at sourceware dot cygnus dot com>
- Subject: Re: [rfa/symtab] Sign extend dwarf2 addresses (sometimes)
- From: Andrew Cagney <ac131313 at cygnus dot com>
- Date: Wed, 12 Jul 2000 19:00:36 +1000
- References: <395420A0.E7E6E386@cygnus.com> <14680.3283.756052.399963@kwikemart.cygnus.com>
Hello,
> Fri Jun 23 18:30:58 2000 Andrew Cagney <cagney@b1.cygnus.com>
>
> * dwarf2read.c (address_signed_p): New variable.
> (dwarf2_build_psymtabs_hard): Set according to
> bfd_elf_get_sign_extend_vma.
> (read_address): Sign extend the address when necessary.
Attached is a revised / updated version of this patch.
In addition to needing to sign extend addresses (when specified by the
ISA) I found that dwarf2read.c wasn't keeping the global variable
``address_size'' up-to-date. The code in psymtab_to_symtab_1, for
instance, forgets to update it. On more obscure targets (some MIPS 64)
it changes between sections!
Rather than add more code that tries to keep the global ``address_size''
up-to-date, I've instead eliminated it. It has been replaced by
cu_header parameter and initialization function. Hopefully, this will
stop the problem re-occuring.
Of course the alternative to this jumbo patch is to just keep the two
globals up-to-date.
ok?
Andrew
Sun Jun 25 10:27:30 2000 Andrew Cagney <cagney@b1.cygnus.com>
* dwarf2read.c (address_size): Delete file wide global.
(struct comp_unit_head): Add signed_addr_p;
(read_comp_unit_head): New function.
(psymtab_to_symtab_1, dwarf2_build_psymtabs_hard): Use
read_comp_unit_head to parse the debug_info header.
(read_address): Add parameters cu_header and bytes_read. When
specified, sign extend the address.
* dwarf2read.c (add_partial_symbol, decode_locdesc,
die_containing_type, die_type, dwarf_decode_lines,
dwarf2_add_field, dwarf2_add_member_fn,
dwarf2_build_psymtabs_hard, dwarf2_const_value, new_symbol,
process_die, psymtab_to_symtab_1, read_array_type,
read_enumeration, read_attribute, read_common_block,
read_comp_unit, read_file_scope, read_full_die, read_func_scope,
read_lexical_block_scope, read_partial_die, scan_partial_symbols,
read_structure_scope, read_subroutine_type, read_tag_const_type,
read_tag_pointer_type, read_tag_ptr_to_member_type,
read_tag_reference_type, read_type_die, read_typedef,
tag_type_to_type): Pass cu_header parameter.
Index: dwarf2read.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/dwarf2read.c,v
retrieving revision 2.46
diff -p -r2.46 dwarf2read.c
*** dwarf2read.c 2000/06/19 22:19:53 2.46
--- dwarf2read.c 2000/07/12 08:38:26
***************
*** 43,48 ****
--- 43,49 ----
#include "gdb_string.h"
#include <sys/types.h>
+ #if 0
/* .debug_info header for a compilation unit
Because of alignment constraints, this structure has padding and cannot
be mapped directly onto the beginning of the .debug_info section. */
*************** typedef struct comp_unit_header
*** 57,62 ****
--- 58,64 ----
}
_COMP_UNIT_HEADER;
#define _ACTUAL_COMP_UNIT_HEADER_SIZE 11
+ #endif
/* .debug_pubnames header
Because of alignment constraints, this structure has padding and cannot
*************** static unsigned int dwarf_str_size;
*** 146,158 ****
/* local data types */
! /* The data in a compilation unit header looks like this. */
struct comp_unit_head
{
unsigned int length;
short version;
unsigned int abbrev_offset;
unsigned char addr_size;
};
/* The data in the .debug_line statement prologue looks like this. */
--- 148,162 ----
/* local data types */
! /* The data in a compilation unit header, after target2host
! translation, looks like this. */
struct comp_unit_head
{
unsigned int length;
short version;
unsigned int abbrev_offset;
unsigned char addr_size;
+ unsigned char signed_addr_p;
};
/* The data in the .debug_line statement prologue looks like this. */
*************** static struct complaint dwarf2_unsupport
*** 545,556 ****
"unsupported const value attribute form: '%s'", 0, 0
};
- /* Remember the addr_size read from the dwarf.
- If a target expects to link compilation units with differing address
- sizes, gdb needs to be sure that the appropriate size is here for
- whatever scope is currently getting read. */
- static int address_size;
-
/* Externals references. */
extern int info_verbose; /* From main.c; nonzero => verbose */
--- 549,554 ----
*************** static void dwarf2_build_psymtabs_easy (
*** 565,573 ****
static void dwarf2_build_psymtabs_hard (struct objfile *, int);
static char *scan_partial_symbols (char *, struct objfile *,
! CORE_ADDR *, CORE_ADDR *);
! static void add_partial_symbol (struct partial_die_info *, struct objfile *);
static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
--- 563,573 ----
static void dwarf2_build_psymtabs_hard (struct objfile *, int);
static char *scan_partial_symbols (char *, struct objfile *,
! CORE_ADDR *, CORE_ADDR *,
! const struct comp_unit_head *);
! static void add_partial_symbol (struct partial_die_info *, struct objfile *,
! const struct comp_unit_head *);
static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
*************** static void dwarf2_empty_abbrev_table (P
*** 582,593 ****
static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int);
static char *read_partial_die (struct partial_die_info *,
! bfd *, char *, int *);
! static char *read_full_die (struct die_info **, bfd *, char *);
static char *read_attribute (struct attribute *, struct attr_abbrev *,
! bfd *, char *);
static unsigned int read_1_byte (bfd *, char *);
--- 582,595 ----
static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int);
static char *read_partial_die (struct partial_die_info *,
! bfd *, char *, int *,
! const struct comp_unit_head *);
! static char *read_full_die (struct die_info **, bfd *, char *,
! const struct comp_unit_head *);
static char *read_attribute (struct attribute *, struct attr_abbrev *,
! bfd *, char *, const struct comp_unit_head *);
static unsigned int read_1_byte (bfd *, char *);
*************** static unsigned int read_4_bytes (bfd *,
*** 599,605 ****
static unsigned long read_8_bytes (bfd *, char *);
! static CORE_ADDR read_address (bfd *, char *);
static char *read_n_bytes (bfd *, char *, unsigned int);
--- 601,608 ----
static unsigned long read_8_bytes (bfd *, char *);
! static CORE_ADDR read_address (bfd *, char *ptr, const struct comp_unit_head *,
! int *bytes_read);
static char *read_n_bytes (bfd *, char *, unsigned int);
*************** static struct attribute *dwarf_attr (str
*** 615,705 ****
static int die_is_declaration (struct die_info *);
! static void dwarf_decode_lines (unsigned int, char *, bfd *);
static void dwarf2_start_subfile (char *, char *);
static struct symbol *new_symbol (struct die_info *, struct type *,
! struct objfile *);
static void dwarf2_const_value (struct attribute *, struct symbol *,
! struct objfile *);
static void dwarf2_const_value_data (struct attribute *attr,
struct symbol *sym,
int bits);
! static struct type *die_type (struct die_info *, struct objfile *);
! static struct type *die_containing_type (struct die_info *, struct objfile *);
#if 0
static struct type *type_at_offset (unsigned int, struct objfile *);
#endif
! static struct type *tag_type_to_type (struct die_info *, struct objfile *);
! static void read_type_die (struct die_info *, struct objfile *);
! static void read_typedef (struct die_info *, struct objfile *);
static void read_base_type (struct die_info *, struct objfile *);
! static void read_file_scope (struct die_info *, struct objfile *);
! static void read_func_scope (struct die_info *, struct objfile *);
! static void read_lexical_block_scope (struct die_info *, struct objfile *);
static int dwarf2_get_pc_bounds (struct die_info *,
CORE_ADDR *, CORE_ADDR *, struct objfile *);
static void dwarf2_add_field (struct field_info *, struct die_info *,
! struct objfile *);
static void dwarf2_attach_fields_to_type (struct field_info *,
struct type *, struct objfile *);
static void dwarf2_add_member_fn (struct field_info *,
struct die_info *, struct type *,
! struct objfile *objfile);
static void dwarf2_attach_fn_fields_to_type (struct field_info *,
struct type *, struct objfile *);
! static void read_structure_scope (struct die_info *, struct objfile *);
! static void read_common_block (struct die_info *, struct objfile *);
! static void read_enumeration (struct die_info *, struct objfile *);
static struct type *dwarf_base_type (int, int, struct objfile *);
! static CORE_ADDR decode_locdesc (struct dwarf_block *, struct objfile *);
! static void read_array_type (struct die_info *, struct objfile *);
! static void read_tag_pointer_type (struct die_info *, struct objfile *);
! static void read_tag_ptr_to_member_type (struct die_info *, struct objfile *);
! static void read_tag_reference_type (struct die_info *, struct objfile *);
! static void read_tag_const_type (struct die_info *, struct objfile *);
! static void read_tag_volatile_type (struct die_info *, struct objfile *);
static void read_tag_string_type (struct die_info *, struct objfile *);
! static void read_subroutine_type (struct die_info *, struct objfile *);
! struct die_info *read_comp_unit (char *, bfd *);
static void free_die_list (struct die_info *);
static struct cleanup *make_cleanup_free_die_list (struct die_info *);
! static void process_die (struct die_info *, struct objfile *);
static char *dwarf2_linkage_name (struct die_info *);
--- 618,730 ----
static int die_is_declaration (struct die_info *);
! static void dwarf_decode_lines (unsigned int, char *, bfd *,
! const struct comp_unit_head *);
static void dwarf2_start_subfile (char *, char *);
static struct symbol *new_symbol (struct die_info *, struct type *,
! struct objfile *, const struct comp_unit_head *);
static void dwarf2_const_value (struct attribute *, struct symbol *,
! struct objfile *, const struct comp_unit_head *);
static void dwarf2_const_value_data (struct attribute *attr,
struct symbol *sym,
int bits);
! static struct type *die_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static struct type *die_containing_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
#if 0
static struct type *type_at_offset (unsigned int, struct objfile *);
#endif
! static struct type *tag_type_to_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_type_die (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_typedef (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
static void read_base_type (struct die_info *, struct objfile *);
! static void read_file_scope (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_func_scope (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_lexical_block_scope (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
static int dwarf2_get_pc_bounds (struct die_info *,
CORE_ADDR *, CORE_ADDR *, struct objfile *);
static void dwarf2_add_field (struct field_info *, struct die_info *,
! struct objfile *, const struct comp_unit_head *);
static void dwarf2_attach_fields_to_type (struct field_info *,
struct type *, struct objfile *);
static void dwarf2_add_member_fn (struct field_info *,
struct die_info *, struct type *,
! struct objfile *objfile,
! const struct comp_unit_head *);
static void dwarf2_attach_fn_fields_to_type (struct field_info *,
struct type *, struct objfile *);
! static void read_structure_scope (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_common_block (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_enumeration (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
static struct type *dwarf_base_type (int, int, struct objfile *);
! static CORE_ADDR decode_locdesc (struct dwarf_block *, struct objfile *,
! const struct comp_unit_head *);
! static void read_array_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_tag_pointer_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_tag_ptr_to_member_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_tag_reference_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_tag_const_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! static void read_tag_volatile_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
static void read_tag_string_type (struct die_info *, struct objfile *);
! static void read_subroutine_type (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
! struct die_info *read_comp_unit (char *, bfd *, const struct comp_unit_head *);
static void free_die_list (struct die_info *);
static struct cleanup *make_cleanup_free_die_list (struct die_info *);
! static void process_die (struct die_info *, struct objfile *,
! const struct comp_unit_head *);
static char *dwarf2_linkage_name (struct die_info *);
*************** dwarf2_build_psymtabs_easy (objfile, mai
*** 898,903 ****
--- 923,951 ----
}
#endif
+ /* Read in the comp unit header information from the debug_info at
+ info_ptr. */
+
+ static char *
+ read_comp_unit_head (struct comp_unit_head *cu_header,
+ char *info_ptr, bfd *abfd)
+ {
+ int signed_addr;
+ cu_header->length = read_4_bytes (abfd, info_ptr);
+ info_ptr += 4;
+ cu_header->version = read_2_bytes (abfd, info_ptr);
+ info_ptr += 2;
+ cu_header->abbrev_offset = read_4_bytes (abfd, info_ptr);
+ info_ptr += 4;
+ cu_header->addr_size = read_1_byte (abfd, info_ptr);
+ info_ptr += 1;
+ signed_addr = bfd_elf_get_sign_extend_vma (abfd);
+ if (signed_addr < 0)
+ internal_error ("dwarf2_build_psymtabs_hard: dwarf from non elf file");
+ cu_header->signed_addr_p = signed_addr;
+ return info_ptr;
+ }
+
/* Build the partial symbol table by doing a quick pass through the
.debug_info and .debug_abbrev sections. */
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 911,917 ****
bfd *abfd = objfile->obfd;
char *info_ptr, *abbrev_ptr;
char *beg_of_comp_unit;
- struct comp_unit_head cu_header;
struct partial_die_info comp_unit_die;
struct partial_symtab *pst;
struct cleanup *back_to;
--- 959,964 ----
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 927,942 ****
while ((unsigned int) (info_ptr - dwarf_info_buffer)
+ ((info_ptr - dwarf_info_buffer) % 4) < dwarf_info_size)
{
beg_of_comp_unit = info_ptr;
! cu_header.length = read_4_bytes (abfd, info_ptr);
! info_ptr += 4;
! cu_header.version = read_2_bytes (abfd, info_ptr);
! info_ptr += 2;
! cu_header.abbrev_offset = read_4_bytes (abfd, info_ptr);
! info_ptr += 4;
! cu_header.addr_size = read_1_byte (abfd, info_ptr);
! info_ptr += 1;
! address_size = cu_header.addr_size;
if (cu_header.version != 2)
{
--- 974,982 ----
while ((unsigned int) (info_ptr - dwarf_info_buffer)
+ ((info_ptr - dwarf_info_buffer) % 4) < dwarf_info_size)
{
+ struct comp_unit_head cu_header;
beg_of_comp_unit = info_ptr;
! info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);
if (cu_header.version != 2)
{
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 963,970 ****
make_cleanup (dwarf2_empty_abbrev_table, NULL);
/* Read the compilation unit die */
! info_ptr = read_partial_die (&comp_unit_die, abfd,
! info_ptr, &comp_unit_has_pc_info);
/* Set the language we're debugging */
set_cu_language (comp_unit_die.language);
--- 1003,1010 ----
make_cleanup (dwarf2_empty_abbrev_table, NULL);
/* Read the compilation unit die */
! info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr,
! &comp_unit_has_pc_info, &cu_header);
/* Set the language we're debugging */
set_cu_language (comp_unit_die.language);
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 994,1000 ****
If not, there's no more debug_info for this comp unit. */
if (comp_unit_die.has_children)
{
! info_ptr = scan_partial_symbols (info_ptr, objfile, &lowpc, &highpc);
/* If the compilation unit didn't have an explicit address range,
then use the information extracted from its child dies. */
--- 1034,1041 ----
If not, there's no more debug_info for this comp unit. */
if (comp_unit_die.has_children)
{
! info_ptr = scan_partial_symbols (info_ptr, objfile, &lowpc, &highpc,
! &cu_header);
/* If the compilation unit didn't have an explicit address range,
then use the information extracted from its child dies. */
*************** dwarf2_build_psymtabs_hard (objfile, mai
*** 1026,1036 ****
/* Read in all interesting dies to the end of the compilation unit. */
static char *
! scan_partial_symbols (info_ptr, objfile, lowpc, highpc)
! char *info_ptr;
! struct objfile *objfile;
! CORE_ADDR *lowpc;
! CORE_ADDR *highpc;
{
bfd *abfd = objfile->obfd;
struct partial_die_info pdi;
--- 1067,1075 ----
/* Read in all interesting dies to the end of the compilation unit. */
static char *
! scan_partial_symbols (char *info_ptr, struct objfile *objfile,
! CORE_ADDR *lowpc, CORE_ADDR *highpc,
! const struct comp_unit_head *cu_header)
{
bfd *abfd = objfile->obfd;
struct partial_die_info pdi;
*************** scan_partial_symbols (info_ptr, objfile,
*** 1049,1055 ****
while (nesting_level)
{
! info_ptr = read_partial_die (&pdi, abfd, info_ptr, &has_pc_info);
if (pdi.name)
{
--- 1088,1095 ----
while (nesting_level)
{
! info_ptr = read_partial_die (&pdi, abfd, info_ptr,
! &has_pc_info, cu_header);
if (pdi.name)
{
*************** scan_partial_symbols (info_ptr, objfile,
*** 1069,1075 ****
if ((pdi.is_external || nesting_level == 1)
&& !pdi.is_declaration)
{
! add_partial_symbol (&pdi, objfile);
}
}
break;
--- 1109,1115 ----
if ((pdi.is_external || nesting_level == 1)
&& !pdi.is_declaration)
{
! add_partial_symbol (&pdi, objfile, cu_header);
}
}
break;
*************** scan_partial_symbols (info_ptr, objfile,
*** 1082,1101 ****
if ((pdi.is_external || nesting_level == 1)
&& !pdi.is_declaration)
{
! add_partial_symbol (&pdi, objfile);
}
break;
case DW_TAG_enumerator:
/* File scope enumerators are added to the partial symbol
table. */
if (nesting_level == 2)
! add_partial_symbol (&pdi, objfile);
break;
case DW_TAG_base_type:
/* File scope base type definitions are added to the partial
symbol table. */
if (nesting_level == 1)
! add_partial_symbol (&pdi, objfile);
break;
default:
break;
--- 1122,1141 ----
if ((pdi.is_external || nesting_level == 1)
&& !pdi.is_declaration)
{
! add_partial_symbol (&pdi, objfile, cu_header);
}
break;
case DW_TAG_enumerator:
/* File scope enumerators are added to the partial symbol
table. */
if (nesting_level == 2)
! add_partial_symbol (&pdi, objfile, cu_header);
break;
case DW_TAG_base_type:
/* File scope base type definitions are added to the partial
symbol table. */
if (nesting_level == 1)
! add_partial_symbol (&pdi, objfile, cu_header);
break;
default:
break;
*************** scan_partial_symbols (info_ptr, objfile,
*** 1130,1138 ****
}
static void
! add_partial_symbol (pdi, objfile)
! struct partial_die_info *pdi;
! struct objfile *objfile;
{
CORE_ADDR addr = 0;
--- 1170,1177 ----
}
static void
! add_partial_symbol (struct partial_die_info *pdi, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
CORE_ADDR addr = 0;
*************** add_partial_symbol (pdi, objfile)
*** 1175,1181 ****
table building. */
if (pdi->locdesc)
! addr = decode_locdesc (pdi->locdesc, objfile);
if (pdi->locdesc || pdi->has_type)
add_psymbol_to_list (pdi->name, strlen (pdi->name),
VAR_NAMESPACE, LOC_STATIC,
--- 1214,1220 ----
table building. */
if (pdi->locdesc)
! addr = decode_locdesc (pdi->locdesc, objfile, cu_header);
if (pdi->locdesc || pdi->has_type)
add_psymbol_to_list (pdi->name, strlen (pdi->name),
VAR_NAMESPACE, LOC_STATIC,
*************** add_partial_symbol (pdi, objfile)
*** 1187,1193 ****
/* Static Variable. Skip symbols without location descriptors. */
if (pdi->locdesc == NULL)
return;
! addr = decode_locdesc (pdi->locdesc, objfile);
/*prim_record_minimal_symbol (pdi->name, addr + baseaddr,
mst_file_data, objfile); */
add_psymbol_to_list (pdi->name, strlen (pdi->name),
--- 1226,1232 ----
/* Static Variable. Skip symbols without location descriptors. */
if (pdi->locdesc == NULL)
return;
! addr = decode_locdesc (pdi->locdesc, objfile, cu_header);
/*prim_record_minimal_symbol (pdi->name, addr + baseaddr,
mst_file_data, objfile); */
add_psymbol_to_list (pdi->name, strlen (pdi->name),
*************** psymtab_to_symtab_1 (pst)
*** 1298,1322 ****
make_cleanup (really_free_pendings, NULL);
/* read in the comp_unit header */
! cu_header.length = read_4_bytes (abfd, info_ptr);
! info_ptr += 4;
! cu_header.version = read_2_bytes (abfd, info_ptr);
! info_ptr += 2;
! cu_header.abbrev_offset = read_4_bytes (abfd, info_ptr);
! info_ptr += 4;
! cu_header.addr_size = read_1_byte (abfd, info_ptr);
! info_ptr += 1;
/* Read the abbrevs for this compilation unit */
dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset);
make_cleanup (dwarf2_empty_abbrev_table, NULL);
! dies = read_comp_unit (info_ptr, abfd);
make_cleanup_free_die_list (dies);
/* Do line number decoding in read_file_scope () */
! process_die (dies, objfile);
if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile))
{
--- 1337,1354 ----
make_cleanup (really_free_pendings, NULL);
/* read in the comp_unit header */
! info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);
/* Read the abbrevs for this compilation unit */
dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset);
make_cleanup (dwarf2_empty_abbrev_table, NULL);
! dies = read_comp_unit (info_ptr, abfd, &cu_header);
make_cleanup_free_die_list (dies);
/* Do line number decoding in read_file_scope () */
! process_die (dies, objfile, &cu_header);
if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile))
{
*************** psymtab_to_symtab_1 (pst)
*** 1362,1381 ****
/* Process a die and its children. */
static void
! process_die (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
switch (die->tag)
{
case DW_TAG_padding:
break;
case DW_TAG_compile_unit:
! read_file_scope (die, objfile);
break;
case DW_TAG_subprogram:
! read_subroutine_type (die, objfile);
! read_func_scope (die, objfile);
break;
case DW_TAG_inlined_subroutine:
/* FIXME: These are ignored for now.
--- 1394,1412 ----
/* Process a die and its children. */
static void
! process_die (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
switch (die->tag)
{
case DW_TAG_padding:
break;
case DW_TAG_compile_unit:
! read_file_scope (die, objfile, cu_header);
break;
case DW_TAG_subprogram:
! read_subroutine_type (die, objfile, cu_header);
! read_func_scope (die, objfile, cu_header);
break;
case DW_TAG_inlined_subroutine:
/* FIXME: These are ignored for now.
*************** process_die (die, objfile)
*** 1383,1412 ****
of a function and make GDB `next' properly over inlined functions. */
break;
case DW_TAG_lexical_block:
! read_lexical_block_scope (die, objfile);
break;
case DW_TAG_class_type:
case DW_TAG_structure_type:
case DW_TAG_union_type:
! read_structure_scope (die, objfile);
break;
case DW_TAG_enumeration_type:
! read_enumeration (die, objfile);
break;
case DW_TAG_subroutine_type:
! read_subroutine_type (die, objfile);
break;
case DW_TAG_array_type:
! read_array_type (die, objfile);
break;
case DW_TAG_pointer_type:
! read_tag_pointer_type (die, objfile);
break;
case DW_TAG_ptr_to_member_type:
! read_tag_ptr_to_member_type (die, objfile);
break;
case DW_TAG_reference_type:
! read_tag_reference_type (die, objfile);
break;
case DW_TAG_string_type:
read_tag_string_type (die, objfile);
--- 1414,1443 ----
of a function and make GDB `next' properly over inlined functions. */
break;
case DW_TAG_lexical_block:
! read_lexical_block_scope (die, objfile, cu_header);
break;
case DW_TAG_class_type:
case DW_TAG_structure_type:
case DW_TAG_union_type:
! read_structure_scope (die, objfile, cu_header);
break;
case DW_TAG_enumeration_type:
! read_enumeration (die, objfile, cu_header);
break;
case DW_TAG_subroutine_type:
! read_subroutine_type (die, objfile, cu_header);
break;
case DW_TAG_array_type:
! read_array_type (die, objfile, cu_header);
break;
case DW_TAG_pointer_type:
! read_tag_pointer_type (die, objfile, cu_header);
break;
case DW_TAG_ptr_to_member_type:
! read_tag_ptr_to_member_type (die, objfile, cu_header);
break;
case DW_TAG_reference_type:
! read_tag_reference_type (die, objfile, cu_header);
break;
case DW_TAG_string_type:
read_tag_string_type (die, objfile);
*************** process_die (die, objfile)
*** 1416,1439 ****
if (dwarf_attr (die, DW_AT_name))
{
/* Add a typedef symbol for the base type definition. */
! new_symbol (die, die->type, objfile);
}
break;
case DW_TAG_common_block:
! read_common_block (die, objfile);
break;
case DW_TAG_common_inclusion:
break;
default:
! new_symbol (die, NULL, objfile);
break;
}
}
static void
! read_file_scope (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
unsigned int line_offset = 0;
CORE_ADDR lowpc = ((CORE_ADDR) -1);
--- 1447,1469 ----
if (dwarf_attr (die, DW_AT_name))
{
/* Add a typedef symbol for the base type definition. */
! new_symbol (die, die->type, objfile, cu_header);
}
break;
case DW_TAG_common_block:
! read_common_block (die, objfile, cu_header);
break;
case DW_TAG_common_inclusion:
break;
default:
! new_symbol (die, NULL, objfile, cu_header);
break;
}
}
static void
! read_file_scope (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
unsigned int line_offset = 0;
CORE_ADDR lowpc = ((CORE_ADDR) -1);
*************** read_file_scope (die, objfile)
*** 1528,1534 ****
if (attr)
{
line_offset = DW_UNSND (attr);
! dwarf_decode_lines (line_offset, comp_dir, abfd);
}
/* Process all dies in compilation unit. */
--- 1558,1564 ----
if (attr)
{
line_offset = DW_UNSND (attr);
! dwarf_decode_lines (line_offset, comp_dir, abfd, cu_header);
}
/* Process all dies in compilation unit. */
*************** read_file_scope (die, objfile)
*** 1537,1552 ****
child_die = die->next;
while (child_die && child_die->tag)
{
! process_die (child_die, objfile);
child_die = sibling_die (child_die);
}
}
}
static void
! read_func_scope (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
register struct context_stack *new;
CORE_ADDR lowpc;
--- 1567,1581 ----
child_die = die->next;
while (child_die && child_die->tag)
{
! process_die (child_die, objfile, cu_header);
child_die = sibling_die (child_die);
}
}
}
static void
! read_func_scope (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
register struct context_stack *new;
CORE_ADDR lowpc;
*************** read_func_scope (die, objfile)
*** 1579,1585 ****
attr = dwarf_attr (die, DW_AT_frame_base);
if (attr)
{
! CORE_ADDR addr = decode_locdesc (DW_BLOCK (attr), objfile);
if (isderef)
complain (&dwarf2_unsupported_at_frame_base, name);
else if (isreg)
--- 1608,1614 ----
attr = dwarf_attr (die, DW_AT_frame_base);
if (attr)
{
! CORE_ADDR addr = decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
if (isderef)
complain (&dwarf2_unsupported_at_frame_base, name);
else if (isreg)
*************** read_func_scope (die, objfile)
*** 1594,1600 ****
}
new = push_context (0, lowpc);
! new->name = new_symbol (die, die->type, objfile);
list_in_scope = &local_symbols;
if (die->has_children)
--- 1623,1629 ----
}
new = push_context (0, lowpc);
! new->name = new_symbol (die, die->type, objfile, cu_header);
list_in_scope = &local_symbols;
if (die->has_children)
*************** read_func_scope (die, objfile)
*** 1602,1608 ****
child_die = die->next;
while (child_die && child_die->tag)
{
! process_die (child_die, objfile);
child_die = sibling_die (child_die);
}
}
--- 1631,1637 ----
child_die = die->next;
while (child_die && child_die->tag)
{
! process_die (child_die, objfile, cu_header);
child_die = sibling_die (child_die);
}
}
*************** read_func_scope (die, objfile)
*** 1618,1626 ****
a new scope, process the dies, and then close the scope. */
static void
! read_lexical_block_scope (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
register struct context_stack *new;
CORE_ADDR lowpc, highpc;
--- 1647,1654 ----
a new scope, process the dies, and then close the scope. */
static void
! read_lexical_block_scope (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
register struct context_stack *new;
CORE_ADDR lowpc, highpc;
*************** read_lexical_block_scope (die, objfile)
*** 1638,1644 ****
child_die = die->next;
while (child_die && child_die->tag)
{
! process_die (child_die, objfile);
child_die = sibling_die (child_die);
}
}
--- 1666,1672 ----
child_die = die->next;
while (child_die && child_die->tag)
{
! process_die (child_die, objfile, cu_header);
child_die = sibling_die (child_die);
}
}
*************** dwarf2_get_pc_bounds (die, lowpc, highpc
*** 1699,1708 ****
/* Add an aggregate field to the field list. */
static void
! dwarf2_add_field (fip, die, objfile)
! struct field_info *fip;
! struct die_info *die;
! struct objfile *objfile;
{
struct nextfield *new_field;
struct attribute *attr;
--- 1727,1735 ----
/* Add an aggregate field to the field list. */
static void
! dwarf2_add_field (struct field_info *fip, struct die_info *die,
! struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct nextfield *new_field;
struct attribute *attr;
*************** dwarf2_add_field (fip, die, objfile)
*** 1739,1745 ****
if (die->tag == DW_TAG_member)
{
/* Get type of field. */
! fp->type = die_type (die, objfile);
/* Get bit size of field (zero if none). */
attr = dwarf_attr (die, DW_AT_bit_size);
--- 1766,1772 ----
if (die->tag == DW_TAG_member)
{
/* Get type of field. */
! fp->type = die_type (die, objfile, cu_header);
/* Get bit size of field (zero if none). */
attr = dwarf_attr (die, DW_AT_bit_size);
*************** dwarf2_add_field (fip, die, objfile)
*** 1757,1763 ****
if (attr)
{
FIELD_BITPOS (*fp) =
! decode_locdesc (DW_BLOCK (attr), objfile) * bits_per_byte;
}
else
FIELD_BITPOS (*fp) = 0;
--- 1784,1790 ----
if (attr)
{
FIELD_BITPOS (*fp) =
! decode_locdesc (DW_BLOCK (attr), objfile, cu_header) * bits_per_byte;
}
else
FIELD_BITPOS (*fp) = 0;
*************** dwarf2_add_field (fip, die, objfile)
*** 1837,1843 ****
SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname),
&objfile->type_obstack));
! FIELD_TYPE (*fp) = die_type (die, objfile);
FIELD_NAME (*fp) = obsavestring (fieldname, strlen (fieldname),
&objfile->type_obstack);
}
--- 1864,1870 ----
SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname),
&objfile->type_obstack));
! FIELD_TYPE (*fp) = die_type (die, objfile, cu_header);
FIELD_NAME (*fp) = obsavestring (fieldname, strlen (fieldname),
&objfile->type_obstack);
}
*************** dwarf2_add_field (fip, die, objfile)
*** 1846,1854 ****
/* C++ base class field. */
attr = dwarf_attr (die, DW_AT_data_member_location);
if (attr)
! FIELD_BITPOS (*fp) = decode_locdesc (DW_BLOCK (attr), objfile) * bits_per_byte;
FIELD_BITSIZE (*fp) = 0;
! FIELD_TYPE (*fp) = die_type (die, objfile);
FIELD_NAME (*fp) = type_name_no_tag (fp->type);
fip->nbaseclasses++;
}
--- 1873,1882 ----
/* C++ base class field. */
attr = dwarf_attr (die, DW_AT_data_member_location);
if (attr)
! FIELD_BITPOS (*fp) = (decode_locdesc (DW_BLOCK (attr), objfile, cu_header)
! * bits_per_byte);
FIELD_BITSIZE (*fp) = 0;
! FIELD_TYPE (*fp) = die_type (die, objfile, cu_header);
FIELD_NAME (*fp) = type_name_no_tag (fp->type);
fip->nbaseclasses++;
}
*************** dwarf2_attach_fields_to_type (fip, type,
*** 1946,1956 ****
/* Add a member function to the proper fieldlist. */
static void
! dwarf2_add_member_fn (fip, die, type, objfile)
! struct field_info *fip;
! struct die_info *die;
! struct type *type;
! struct objfile *objfile;
{
struct attribute *attr;
struct fnfieldlist *flp;
--- 1974,1982 ----
/* Add a member function to the proper fieldlist. */
static void
! dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
! struct type *type, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct attribute *attr;
struct fnfieldlist *flp;
*************** dwarf2_add_member_fn (fip, die, type, ob
*** 2047,2053 ****
/* Get fcontext from DW_AT_containing_type if present. */
if (dwarf_attr (die, DW_AT_containing_type) != NULL)
! fnp->fcontext = die_containing_type (die, objfile);
/* dwarf2 doesn't have stubbed physical names, so the setting of is_const
and is_volatile is irrelevant, as it is needed by gdb_mangle_name only. */
--- 2073,2079 ----
/* Get fcontext from DW_AT_containing_type if present. */
if (dwarf_attr (die, DW_AT_containing_type) != NULL)
! fnp->fcontext = die_containing_type (die, objfile, cu_header);
/* dwarf2 doesn't have stubbed physical names, so the setting of is_const
and is_volatile is irrelevant, as it is needed by gdb_mangle_name only. */
*************** dwarf2_add_member_fn (fip, die, type, ob
*** 2070,2076 ****
/* Get index in virtual function table if it is a virtual member function. */
attr = dwarf_attr (die, DW_AT_vtable_elem_location);
if (attr)
! fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile) + 2;
}
/* Create the vector of member function fields, and attach it to the type. */
--- 2096,2102 ----
/* Get index in virtual function table if it is a virtual member function. */
attr = dwarf_attr (die, DW_AT_vtable_elem_location);
if (attr)
! fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile, cu_header) + 2;
}
/* Create the vector of member function fields, and attach it to the type. */
*************** dwarf2_attach_fn_fields_to_type (fip, ty
*** 2126,2134 ****
suppresses creating a symbol table entry itself). */
static void
! read_structure_scope (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct type *type;
struct attribute *attr;
--- 2152,2159 ----
suppresses creating a symbol table entry itself). */
static void
! read_structure_scope (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct type *type;
struct attribute *attr;
*************** read_structure_scope (die, objfile)
*** 2188,2214 ****
{
if (child_die->tag == DW_TAG_member)
{
! dwarf2_add_field (&fi, child_die, objfile);
}
else if (child_die->tag == DW_TAG_variable)
{
/* C++ static member. */
! dwarf2_add_field (&fi, child_die, objfile);
}
! else if (child_die->tag == DW_TAG_subprogram)
{
/* C++ member function. */
! process_die (child_die, objfile);
! dwarf2_add_member_fn (&fi, child_die, type, objfile);
}
else if (child_die->tag == DW_TAG_inheritance)
{
/* C++ base class field. */
! dwarf2_add_field (&fi, child_die, objfile);
}
else
{
! process_die (child_die, objfile);
}
child_die = sibling_die (child_die);
}
--- 2213,2239 ----
{
if (child_die->tag == DW_TAG_member)
{
! dwarf2_add_field (&fi, child_die, objfile, cu_header);
}
else if (child_die->tag == DW_TAG_variable)
{
/* C++ static member. */
! dwarf2_add_field (&fi, child_die, objfile, cu_header);
}
! else if (child_die->tag == DW_TAG_subprogram, cu_header)
{
/* C++ member function. */
! process_die (child_die, objfile, cu_header);
! dwarf2_add_member_fn (&fi, child_die, type, objfile, cu_header);
}
else if (child_die->tag == DW_TAG_inheritance)
{
/* C++ base class field. */
! dwarf2_add_field (&fi, child_die, objfile, cu_header);
}
else
{
! process_die (child_die, objfile, cu_header);
}
child_die = sibling_die (child_die);
}
*************** read_structure_scope (die, objfile)
*** 2226,2232 ****
if (dwarf_attr (die, DW_AT_containing_type) != NULL)
{
! struct type *t = die_containing_type (die, objfile);
TYPE_VPTR_BASETYPE (type) = t;
if (type == t)
--- 2251,2257 ----
if (dwarf_attr (die, DW_AT_containing_type) != NULL)
{
! struct type *t = die_containing_type (die, objfile, cu_header);
TYPE_VPTR_BASETYPE (type) = t;
if (type == t)
*************** read_structure_scope (die, objfile)
*** 2262,2268 ****
}
}
! new_symbol (die, type, objfile);
do_cleanups (back_to);
}
--- 2287,2293 ----
}
}
! new_symbol (die, type, objfile, cu_header);
do_cleanups (back_to);
}
*************** read_structure_scope (die, objfile)
*** 2285,2293 ****
NOTE: We reverse the order of the element list. */
static void
! read_enumeration (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct die_info *child_die;
struct type *type;
--- 2310,2317 ----
NOTE: We reverse the order of the element list. */
static void
! read_enumeration (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct die_info *child_die;
struct type *type;
*************** read_enumeration (die, objfile)
*** 2327,2340 ****
{
if (child_die->tag != DW_TAG_enumerator)
{
! process_die (child_die, objfile);
}
else
{
attr = dwarf_attr (child_die, DW_AT_name);
if (attr)
{
! sym = new_symbol (child_die, type, objfile);
if (SYMBOL_VALUE (sym) < 0)
unsigned_enum = 0;
--- 2351,2364 ----
{
if (child_die->tag != DW_TAG_enumerator)
{
! process_die (child_die, objfile, cu_header);
}
else
{
attr = dwarf_attr (child_die, DW_AT_name);
if (attr)
{
! sym = new_symbol (child_die, type, objfile, cu_header);
if (SYMBOL_VALUE (sym) < 0)
unsigned_enum = 0;
*************** read_enumeration (die, objfile)
*** 2371,2377 ****
TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
}
die->type = type;
! new_symbol (die, type, objfile);
}
/* Extract all information from a DW_TAG_array_type DIE and put it in
--- 2395,2401 ----
TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
}
die->type = type;
! new_symbol (die, type, objfile, cu_header);
}
/* Extract all information from a DW_TAG_array_type DIE and put it in
*************** read_enumeration (die, objfile)
*** 2379,2387 ****
arrays. */
static void
! read_array_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct die_info *child_die;
struct type *type = NULL;
--- 2403,2410 ----
arrays. */
static void
! read_array_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct die_info *child_die;
struct type *type = NULL;
*************** read_array_type (die, objfile)
*** 2397,2403 ****
return;
}
! element_type = die_type (die, objfile);
/* Irix 6.2 native cc creates array types without children for
arrays with unspecified length. */
--- 2420,2426 ----
return;
}
! element_type = die_type (die, objfile, cu_header);
/* Irix 6.2 native cc creates array types without children for
arrays with unspecified length. */
*************** read_array_type (die, objfile)
*** 2426,2432 ****
low = 1;
}
! index_type = die_type (child_die, objfile);
attr = dwarf_attr (child_die, DW_AT_lower_bound);
if (attr)
{
--- 2449,2455 ----
low = 1;
}
! index_type = die_type (child_die, objfile, cu_header);
attr = dwarf_attr (child_die, DW_AT_lower_bound);
if (attr)
{
*************** read_array_type (die, objfile)
*** 2518,2526 ****
/* First cut: install each common block member as a global variable. */
static void
! read_common_block (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct die_info *child_die;
struct attribute *attr;
--- 2541,2548 ----
/* First cut: install each common block member as a global variable. */
static void
! read_common_block (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct die_info *child_die;
struct attribute *attr;
*************** read_common_block (die, objfile)
*** 2530,2548 ****
attr = dwarf_attr (die, DW_AT_location);
if (attr)
{
! base = decode_locdesc (DW_BLOCK (attr), objfile);
}
if (die->has_children)
{
child_die = die->next;
while (child_die && child_die->tag)
{
! sym = new_symbol (child_die, NULL, objfile);
attr = dwarf_attr (child_die, DW_AT_data_member_location);
if (attr)
{
SYMBOL_VALUE_ADDRESS (sym) =
! base + decode_locdesc (DW_BLOCK (attr), objfile);
add_symbol_to_list (sym, &global_symbols);
}
child_die = sibling_die (child_die);
--- 2552,2570 ----
attr = dwarf_attr (die, DW_AT_location);
if (attr)
{
! base = decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
}
if (die->has_children)
{
child_die = die->next;
while (child_die && child_die->tag)
{
! sym = new_symbol (child_die, NULL, objfile, cu_header);
attr = dwarf_attr (child_die, DW_AT_data_member_location);
if (attr)
{
SYMBOL_VALUE_ADDRESS (sym) =
! base + decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
add_symbol_to_list (sym, &global_symbols);
}
child_die = sibling_die (child_die);
*************** read_common_block (die, objfile)
*** 2554,2562 ****
the user defined type vector. */
static void
! read_tag_pointer_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct type *type;
struct attribute *attr;
--- 2576,2583 ----
the user defined type vector. */
static void
! read_tag_pointer_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct type *type;
struct attribute *attr;
*************** read_tag_pointer_type (die, objfile)
*** 2566,2572 ****
return;
}
! type = lookup_pointer_type (die_type (die, objfile));
attr = dwarf_attr (die, DW_AT_byte_size);
if (attr)
{
--- 2587,2593 ----
return;
}
! type = lookup_pointer_type (die_type (die, objfile, cu_header));
attr = dwarf_attr (die, DW_AT_byte_size);
if (attr)
{
*************** read_tag_pointer_type (die, objfile)
*** 2574,2580 ****
}
else
{
! TYPE_LENGTH (type) = address_size;
}
die->type = type;
}
--- 2595,2601 ----
}
else
{
! TYPE_LENGTH (type) = cu_header->addr_size;
}
die->type = type;
}
*************** read_tag_pointer_type (die, objfile)
*** 2583,2591 ****
the user defined type vector. */
static void
! read_tag_ptr_to_member_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct type *type;
struct type *to_type;
--- 2604,2611 ----
the user defined type vector. */
static void
! read_tag_ptr_to_member_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct type *type;
struct type *to_type;
*************** read_tag_ptr_to_member_type (die, objfil
*** 2597,2604 ****
}
type = alloc_type (objfile);
! to_type = die_type (die, objfile);
! domain = die_containing_type (die, objfile);
smash_to_member_type (type, domain, to_type);
die->type = type;
--- 2617,2624 ----
}
type = alloc_type (objfile);
! to_type = die_type (die, objfile, cu_header);
! domain = die_containing_type (die, objfile, cu_header);
smash_to_member_type (type, domain, to_type);
die->type = type;
*************** read_tag_ptr_to_member_type (die, objfil
*** 2608,2616 ****
the user defined type vector. */
static void
! read_tag_reference_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct type *type;
struct attribute *attr;
--- 2628,2635 ----
the user defined type vector. */
static void
! read_tag_reference_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct type *type;
struct attribute *attr;
*************** read_tag_reference_type (die, objfile)
*** 2620,2626 ****
return;
}
! type = lookup_reference_type (die_type (die, objfile));
attr = dwarf_attr (die, DW_AT_byte_size);
if (attr)
{
--- 2639,2645 ----
return;
}
! type = lookup_reference_type (die_type (die, objfile, cu_header));
attr = dwarf_attr (die, DW_AT_byte_size);
if (attr)
{
*************** read_tag_reference_type (die, objfile)
*** 2628,2642 ****
}
else
{
! TYPE_LENGTH (type) = address_size;
}
die->type = type;
}
static void
! read_tag_const_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
if (die->type)
{
--- 2647,2660 ----
}
else
{
! TYPE_LENGTH (type) = cu_header->addr_size;
}
die->type = type;
}
static void
! read_tag_const_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
if (die->type)
{
*************** read_tag_const_type (die, objfile)
*** 2644,2656 ****
}
complain (&dwarf2_const_ignored);
! die->type = die_type (die, objfile);
}
static void
! read_tag_volatile_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
if (die->type)
{
--- 2662,2673 ----
}
complain (&dwarf2_const_ignored);
! die->type = die_type (die, objfile, cu_header);
}
static void
! read_tag_volatile_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
if (die->type)
{
*************** read_tag_volatile_type (die, objfile)
*** 2658,2664 ****
}
complain (&dwarf2_volatile_ignored);
! die->type = die_type (die, objfile);
}
/* Extract all information from a DW_TAG_string_type DIE and add to
--- 2675,2681 ----
}
complain (&dwarf2_volatile_ignored);
! die->type = die_type (die, objfile, cu_header);
}
/* Extract all information from a DW_TAG_string_type DIE and add to
*************** read_tag_string_type (die, objfile)
*** 2708,2716 ****
*/
static void
! read_subroutine_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct type *type; /* Type that this function returns */
struct type *ftype; /* Function that returns above type */
--- 2725,2732 ----
*/
static void
! read_subroutine_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct type *type; /* Type that this function returns */
struct type *ftype; /* Function that returns above type */
*************** read_subroutine_type (die, objfile)
*** 2721,2727 ****
{
return;
}
! type = die_type (die, objfile);
ftype = lookup_function_type (type);
/* All functions in C++ have prototypes. */
--- 2737,2743 ----
{
return;
}
! type = die_type (die, objfile, cu_header);
ftype = lookup_function_type (type);
/* All functions in C++ have prototypes. */
*************** read_subroutine_type (die, objfile)
*** 2769,2775 ****
TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr);
else
TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
! TYPE_FIELD_TYPE (ftype, iparams) = die_type (child_die, objfile);
iparams++;
}
child_die = sibling_die (child_die);
--- 2785,2792 ----
TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr);
else
TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
! TYPE_FIELD_TYPE (ftype, iparams) = die_type (child_die, objfile,
! cu_header);
iparams++;
}
child_die = sibling_die (child_die);
*************** read_subroutine_type (die, objfile)
*** 2780,2788 ****
}
static void
! read_typedef (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct type *type;
--- 2797,2804 ----
}
static void
! read_typedef (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct type *type;
*************** read_typedef (die, objfile)
*** 2791,2797 ****
struct attribute *attr;
struct type *xtype;
! xtype = die_type (die, objfile);
type = alloc_type (objfile);
TYPE_CODE (type) = TYPE_CODE_TYPEDEF;
--- 2807,2813 ----
struct attribute *attr;
struct type *xtype;
! xtype = die_type (die, objfile, cu_header);
type = alloc_type (objfile);
TYPE_CODE (type) = TYPE_CODE_TYPEDEF;
*************** read_base_type (die, objfile)
*** 2884,2892 ****
/* Read a whole compilation unit into a linked list of dies. */
struct die_info *
! read_comp_unit (info_ptr, abfd)
! char *info_ptr;
! bfd *abfd;
{
struct die_info *first_die, *last_die, *die;
char *cur_ptr;
--- 2900,2907 ----
/* Read a whole compilation unit into a linked list of dies. */
struct die_info *
! read_comp_unit (char *info_ptr, bfd *abfd,
! const struct comp_unit_head *cu_header)
{
struct die_info *first_die, *last_die, *die;
char *cur_ptr;
*************** read_comp_unit (info_ptr, abfd)
*** 2900,2906 ****
first_die = last_die = NULL;
do
{
! cur_ptr = read_full_die (&die, abfd, cur_ptr);
if (die->has_children)
{
nesting_level++;
--- 2915,2921 ----
first_die = last_die = NULL;
do
{
! cur_ptr = read_full_die (&die, abfd, cur_ptr, cu_header);
if (die->has_children)
{
nesting_level++;
*************** dwarf2_lookup_abbrev (number)
*** 3113,3123 ****
/* Read a minimal amount of information into the minimal die structure. */
static char *
! read_partial_die (part_die, abfd, info_ptr, has_pc_info)
! struct partial_die_info *part_die;
! bfd *abfd;
! char *info_ptr;
! int *has_pc_info;
{
unsigned int abbrev_number, bytes_read, i;
struct abbrev_info *abbrev;
--- 3128,3136 ----
/* Read a minimal amount of information into the minimal die structure. */
static char *
! read_partial_die (struct partial_die_info *part_die, bfd *abfd,
! char *info_ptr, int *has_pc_info,
! const struct comp_unit_head *cu_header)
{
unsigned int abbrev_number, bytes_read, i;
struct abbrev_info *abbrev;
*************** read_partial_die (part_die, abfd, info_p
*** 3146,3152 ****
for (i = 0; i < abbrev->num_attrs; ++i)
{
! info_ptr = read_attribute (&attr, &abbrev->attrs[i], abfd, info_ptr);
/* Store the data if it is of an attribute we want to keep in a
partial symbol table. */
--- 3159,3166 ----
for (i = 0; i < abbrev->num_attrs; ++i)
{
! info_ptr = read_attribute (&attr, &abbrev->attrs[i], abfd,
! info_ptr, cu_header);
/* Store the data if it is of an attribute we want to keep in a
partial symbol table. */
*************** read_partial_die (part_die, abfd, info_p
*** 3213,3219 ****
int dummy;
spec_ptr = dwarf_info_buffer + dwarf2_get_ref_die_offset (&spec_attr);
! read_partial_die (&spec_die, abfd, spec_ptr, &dummy);
if (spec_die.name)
{
part_die->name = spec_die.name;
--- 3227,3233 ----
int dummy;
spec_ptr = dwarf_info_buffer + dwarf2_get_ref_die_offset (&spec_attr);
! read_partial_die (&spec_die, abfd, spec_ptr, &dummy, cu_header);
if (spec_die.name)
{
part_die->name = spec_die.name;
*************** read_partial_die (part_die, abfd, info_p
*** 3244,3253 ****
point to a newly allocated die with its information. */
static char *
! read_full_die (diep, abfd, info_ptr)
! struct die_info **diep;
! bfd *abfd;
! char *info_ptr;
{
unsigned int abbrev_number, bytes_read, i, offset;
struct abbrev_info *abbrev;
--- 3258,3265 ----
point to a newly allocated die with its information. */
static char *
! read_full_die (struct die_info **diep, bfd *abfd, char *info_ptr,
! const struct comp_unit_head *cu_header)
{
unsigned int abbrev_number, bytes_read, i, offset;
struct abbrev_info *abbrev;
*************** read_full_die (diep, abfd, info_ptr)
*** 3285,3291 ****
for (i = 0; i < abbrev->num_attrs; ++i)
{
info_ptr = read_attribute (&die->attrs[i], &abbrev->attrs[i],
! abfd, info_ptr);
}
*diep = die;
--- 3297,3303 ----
for (i = 0; i < abbrev->num_attrs; ++i)
{
info_ptr = read_attribute (&die->attrs[i], &abbrev->attrs[i],
! abfd, info_ptr, cu_header);
}
*diep = die;
*************** read_full_die (diep, abfd, info_ptr)
*** 3295,3305 ****
/* Read an attribute described by an abbreviated attribute. */
static char *
! read_attribute (attr, abbrev, abfd, info_ptr)
! struct attribute *attr;
! struct attr_abbrev *abbrev;
! bfd *abfd;
! char *info_ptr;
{
unsigned int bytes_read;
struct dwarf_block *blk;
--- 3307,3315 ----
/* Read an attribute described by an abbreviated attribute. */
static char *
! read_attribute (struct attribute *attr, struct attr_abbrev *abbrev,
! bfd *abfd, char *info_ptr,
! const struct comp_unit_head *cu_header)
{
unsigned int bytes_read;
struct dwarf_block *blk;
*************** read_attribute (attr, abbrev, abfd, info
*** 3310,3317 ****
{
case DW_FORM_addr:
case DW_FORM_ref_addr:
! DW_ADDR (attr) = read_address (abfd, info_ptr);
! info_ptr += address_size;
break;
case DW_FORM_block2:
blk = dwarf_alloc_block ();
--- 3320,3327 ----
{
case DW_FORM_addr:
case DW_FORM_ref_addr:
! DW_ADDR (attr) = read_address (abfd, info_ptr, cu_header, &bytes_read);
! info_ptr += bytes_read;
break;
case DW_FORM_block2:
blk = dwarf_alloc_block ();
*************** read_8_bytes (abfd, buf)
*** 3461,3489 ****
}
static CORE_ADDR
! read_address (abfd, buf)
! bfd *abfd;
! char *buf;
{
CORE_ADDR retval = 0;
! switch (address_size)
{
! case 2:
! retval = bfd_get_16 (abfd, (bfd_byte *) buf);
! break;
! case 4:
! retval = bfd_get_32 (abfd, (bfd_byte *) buf);
! break;
! case 8:
! retval = bfd_get_64 (abfd, (bfd_byte *) buf);
! break;
! default:
! /* *THE* alternative is 8, right? */
! abort ();
}
! return retval;
}
static char *
--- 3471,3518 ----
}
static CORE_ADDR
! read_address (bfd *abfd, char *buf, const struct comp_unit_head *cu_header,
! int *bytes_read)
{
CORE_ADDR retval = 0;
! if (cu_header->signed_addr_p)
{
! switch (cu_header->addr_size)
! {
! case 2:
! retval = bfd_get_signed_16 (abfd, (bfd_byte *) buf);
! break;
! case 4:
! retval = bfd_get_signed_32 (abfd, (bfd_byte *) buf);
! break;
! case 8:
! retval = bfd_get_signed_64 (abfd, (bfd_byte *) buf);
! break;
! default:
! internal_error ("read_address: bad switch, signed");
! }
! }
! else
! {
! switch (cu_header->addr_size)
! {
! case 2:
! retval = bfd_get_16 (abfd, (bfd_byte *) buf);
! break;
! case 4:
! retval = bfd_get_32 (abfd, (bfd_byte *) buf);
! break;
! case 8:
! retval = bfd_get_64 (abfd, (bfd_byte *) buf);
! break;
! default:
! internal_error ("read_address: bad switch, unsigned");
! }
}
! *bytes_read = cu_header->addr_size;
! return retval;
}
static char *
*************** struct directories
*** 3710,3719 ****
};
static void
! dwarf_decode_lines (offset, comp_dir, abfd)
! unsigned int offset;
! char *comp_dir;
! bfd *abfd;
{
char *line_ptr;
char *line_end;
--- 3739,3746 ----
};
static void
! dwarf_decode_lines (unsigned int offset, char *comp_dir, bfd *abfd,
! const struct comp_unit_head *cu_header)
{
char *line_ptr;
char *line_end;
*************** dwarf_decode_lines (offset, comp_dir, ab
*** 3861,3868 ****
not the ends. This is a weakness of GDB. */
break;
case DW_LNE_set_address:
! address = read_address (abfd, line_ptr) + baseaddr;
! line_ptr += address_size;
break;
case DW_LNE_define_file:
cur_file = read_string (abfd, line_ptr, &bytes_read);
--- 3888,3896 ----
not the ends. This is a weakness of GDB. */
break;
case DW_LNE_set_address:
! address = read_address (abfd, line_ptr, cu_header, &bytes_read);
! line_ptr += bytes_read;
! address += baseaddr;
break;
case DW_LNE_define_file:
cur_file = read_string (abfd, line_ptr, &bytes_read);
*************** dwarf2_start_subfile (filename, dirname)
*** 4009,4018 ****
used the passed type. */
static struct symbol *
! new_symbol (die, type, objfile)
! struct die_info *die;
! struct type *type;
! struct objfile *objfile;
{
struct symbol *sym = NULL;
char *name;
--- 4037,4044 ----
used the passed type. */
static struct symbol *
! new_symbol (struct die_info *die, struct type *type, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct symbol *sym = NULL;
char *name;
*************** new_symbol (die, type, objfile)
*** 4037,4043 ****
if (type != NULL)
SYMBOL_TYPE (sym) = type;
else
! SYMBOL_TYPE (sym) = die_type (die, objfile);
attr = dwarf_attr (die, DW_AT_decl_line);
if (attr)
{
--- 4063,4069 ----
if (type != NULL)
SYMBOL_TYPE (sym) = type;
else
! SYMBOL_TYPE (sym) = die_type (die, objfile, cu_header);
attr = dwarf_attr (die, DW_AT_decl_line);
if (attr)
{
*************** new_symbol (die, type, objfile)
*** 4088,4094 ****
attr = dwarf_attr (die, DW_AT_const_value);
if (attr)
{
! dwarf2_const_value (attr, sym, objfile);
attr2 = dwarf_attr (die, DW_AT_external);
if (attr2 && (DW_UNSND (attr2) != 0))
add_symbol_to_list (sym, &global_symbols);
--- 4114,4120 ----
attr = dwarf_attr (die, DW_AT_const_value);
if (attr)
{
! dwarf2_const_value (attr, sym, objfile, cu_header);
attr2 = dwarf_attr (die, DW_AT_external);
if (attr2 && (DW_UNSND (attr2) != 0))
add_symbol_to_list (sym, &global_symbols);
*************** new_symbol (die, type, objfile)
*** 4103,4109 ****
if (attr2 && (DW_UNSND (attr2) != 0))
{
SYMBOL_VALUE_ADDRESS (sym) =
! decode_locdesc (DW_BLOCK (attr), objfile);
add_symbol_to_list (sym, &global_symbols);
/* In shared libraries the address of the variable
--- 4129,4135 ----
if (attr2 && (DW_UNSND (attr2) != 0))
{
SYMBOL_VALUE_ADDRESS (sym) =
! decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
add_symbol_to_list (sym, &global_symbols);
/* In shared libraries the address of the variable
*************** new_symbol (die, type, objfile)
*** 4124,4130 ****
else
{
SYMBOL_VALUE (sym) = addr =
! decode_locdesc (DW_BLOCK (attr), objfile);
add_symbol_to_list (sym, list_in_scope);
if (optimized_out)
{
--- 4150,4156 ----
else
{
SYMBOL_VALUE (sym) = addr =
! decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
add_symbol_to_list (sym, list_in_scope);
if (optimized_out)
{
*************** new_symbol (die, type, objfile)
*** 4171,4177 ****
attr = dwarf_attr (die, DW_AT_location);
if (attr)
{
! SYMBOL_VALUE (sym) = decode_locdesc (DW_BLOCK (attr), objfile);
if (isreg)
{
SYMBOL_CLASS (sym) = LOC_REGPARM;
--- 4197,4204 ----
attr = dwarf_attr (die, DW_AT_location);
if (attr)
{
! SYMBOL_VALUE (sym) =
! decode_locdesc (DW_BLOCK (attr), objfile, cu_header);
if (isreg)
{
SYMBOL_CLASS (sym) = LOC_REGPARM;
*************** new_symbol (die, type, objfile)
*** 4198,4204 ****
attr = dwarf_attr (die, DW_AT_const_value);
if (attr)
{
! dwarf2_const_value (attr, sym, objfile);
}
add_symbol_to_list (sym, list_in_scope);
break;
--- 4225,4231 ----
attr = dwarf_attr (die, DW_AT_const_value);
if (attr)
{
! dwarf2_const_value (attr, sym, objfile, cu_header);
}
add_symbol_to_list (sym, list_in_scope);
break;
*************** new_symbol (die, type, objfile)
*** 4243,4249 ****
attr = dwarf_attr (die, DW_AT_const_value);
if (attr)
{
! dwarf2_const_value (attr, sym, objfile);
}
add_symbol_to_list (sym, list_in_scope);
break;
--- 4270,4276 ----
attr = dwarf_attr (die, DW_AT_const_value);
if (attr)
{
! dwarf2_const_value (attr, sym, objfile, cu_header);
}
add_symbol_to_list (sym, list_in_scope);
break;
*************** new_symbol (die, type, objfile)
*** 4262,4283 ****
/* Copy constant value from an attribute to a symbol. */
static void
! dwarf2_const_value (attr, sym, objfile)
! struct attribute *attr;
! struct symbol *sym;
! struct objfile *objfile;
{
struct dwarf_block *blk;
switch (attr->form)
{
case DW_FORM_addr:
! if (TYPE_LENGTH (SYMBOL_TYPE (sym)) != (unsigned int) address_size)
complain (&dwarf2_const_value_length_mismatch, SYMBOL_NAME (sym),
! address_size, TYPE_LENGTH (SYMBOL_TYPE (sym)));
SYMBOL_VALUE_BYTES (sym) = (char *)
! obstack_alloc (&objfile->symbol_obstack, address_size);
! store_address (SYMBOL_VALUE_BYTES (sym), address_size, DW_ADDR (attr));
SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
break;
case DW_FORM_block1:
--- 4289,4310 ----
/* Copy constant value from an attribute to a symbol. */
static void
! dwarf2_const_value (struct attribute *attr, struct symbol *sym,
! struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct dwarf_block *blk;
switch (attr->form)
{
case DW_FORM_addr:
! if (TYPE_LENGTH (SYMBOL_TYPE (sym)) != cu_header->addr_size)
complain (&dwarf2_const_value_length_mismatch, SYMBOL_NAME (sym),
! cu_header->addr_size, TYPE_LENGTH (SYMBOL_TYPE (sym)));
SYMBOL_VALUE_BYTES (sym) = (char *)
! obstack_alloc (&objfile->symbol_obstack, cu_header->addr_size);
! store_address (SYMBOL_VALUE_BYTES (sym), cu_header->addr_size,
! DW_ADDR (attr));
SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
break;
case DW_FORM_block1:
*************** dwarf2_const_value_data (struct attribut
*** 4357,4365 ****
/* Return the type of the die in question using its DW_AT_type attribute. */
static struct type *
! die_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct type *type;
struct attribute *type_attr;
--- 4384,4391 ----
/* Return the type of the die in question using its DW_AT_type attribute. */
static struct type *
! die_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct type *type;
struct attribute *type_attr;
*************** die_type (die, objfile)
*** 4382,4388 ****
return NULL;
}
}
! type = tag_type_to_type (type_die, objfile);
if (!type)
{
dump_die (type_die);
--- 4408,4414 ----
return NULL;
}
}
! type = tag_type_to_type (type_die, objfile, cu_header);
if (!type)
{
dump_die (type_die);
*************** die_type (die, objfile)
*** 4395,4403 ****
DW_AT_containing_type attribute. */
static struct type *
! die_containing_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
struct type *type = NULL;
struct attribute *type_attr;
--- 4421,4428 ----
DW_AT_containing_type attribute. */
static struct type *
! die_containing_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
struct type *type = NULL;
struct attribute *type_attr;
*************** die_containing_type (die, objfile)
*** 4414,4420 ****
error ("Dwarf Error: Cannot find referent at offset %d.", ref);
return NULL;
}
! type = tag_type_to_type (type_die, objfile);
}
if (!type)
{
--- 4439,4445 ----
error ("Dwarf Error: Cannot find referent at offset %d.", ref);
return NULL;
}
! type = tag_type_to_type (type_die, objfile, cu_header);
}
if (!type)
{
*************** type_at_offset (offset, objfile)
*** 4446,4454 ****
#endif
static struct type *
! tag_type_to_type (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
if (die->type)
{
--- 4471,4478 ----
#endif
static struct type *
! tag_type_to_type (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
if (die->type)
{
*************** tag_type_to_type (die, objfile)
*** 4473,4491 ****
}
else
{
! read_type_die (die, objfile);
dwarf2_cached_types[hashval] = die->type;
}
}
else
{
! read_type_die (die, objfile);
dwarf2_cached_types[hashval] = die->type;
}
}
else
{
! read_type_die (die, objfile);
}
if (!die->type)
--- 4497,4515 ----
}
else
{
! read_type_die (die, objfile, cu_header);
dwarf2_cached_types[hashval] = die->type;
}
}
else
{
! read_type_die (die, objfile, cu_header);
dwarf2_cached_types[hashval] = die->type;
}
}
else
{
! read_type_die (die, objfile, cu_header);
}
if (!die->type)
*************** tag_type_to_type (die, objfile)
*** 4498,4544 ****
}
static void
! read_type_die (die, objfile)
! struct die_info *die;
! struct objfile *objfile;
{
switch (die->tag)
{
case DW_TAG_class_type:
case DW_TAG_structure_type:
case DW_TAG_union_type:
! read_structure_scope (die, objfile);
break;
case DW_TAG_enumeration_type:
! read_enumeration (die, objfile);
break;
case DW_TAG_subprogram:
case DW_TAG_subroutine_type:
! read_subroutine_type (die, objfile);
break;
case DW_TAG_array_type:
! read_array_type (die, objfile);
break;
case DW_TAG_pointer_type:
! read_tag_pointer_type (die, objfile);
break;
case DW_TAG_ptr_to_member_type:
! read_tag_ptr_to_member_type (die, objfile);
break;
case DW_TAG_reference_type:
! read_tag_reference_type (die, objfile);
break;
case DW_TAG_const_type:
! read_tag_const_type (die, objfile);
break;
case DW_TAG_volatile_type:
! read_tag_volatile_type (die, objfile);
break;
case DW_TAG_string_type:
read_tag_string_type (die, objfile);
break;
case DW_TAG_typedef:
! read_typedef (die, objfile);
break;
case DW_TAG_base_type:
read_base_type (die, objfile);
--- 4522,4567 ----
}
static void
! read_type_die (struct die_info *die, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
switch (die->tag)
{
case DW_TAG_class_type:
case DW_TAG_structure_type:
case DW_TAG_union_type:
! read_structure_scope (die, objfile, cu_header);
break;
case DW_TAG_enumeration_type:
! read_enumeration (die, objfile, cu_header);
break;
case DW_TAG_subprogram:
case DW_TAG_subroutine_type:
! read_subroutine_type (die, objfile, cu_header);
break;
case DW_TAG_array_type:
! read_array_type (die, objfile, cu_header);
break;
case DW_TAG_pointer_type:
! read_tag_pointer_type (die, objfile, cu_header);
break;
case DW_TAG_ptr_to_member_type:
! read_tag_ptr_to_member_type (die, objfile, cu_header);
break;
case DW_TAG_reference_type:
! read_tag_reference_type (die, objfile, cu_header);
break;
case DW_TAG_const_type:
! read_tag_const_type (die, objfile, cu_header);
break;
case DW_TAG_volatile_type:
! read_tag_volatile_type (die, objfile, cu_header);
break;
case DW_TAG_string_type:
read_tag_string_type (die, objfile);
break;
case DW_TAG_typedef:
! read_typedef (die, objfile, cu_header);
break;
case DW_TAG_base_type:
read_base_type (die, objfile);
*************** dwarf2_fundamental_type (objfile, typeid
*** 5649,5657 ****
Note that stack overflow is not yet handled. */
static CORE_ADDR
! decode_locdesc (blk, objfile)
! struct dwarf_block *blk;
! struct objfile *objfile;
{
int i;
int size = blk->size;
--- 5672,5679 ----
Note that stack overflow is not yet handled. */
static CORE_ADDR
! decode_locdesc (struct dwarf_block *blk, struct objfile *objfile,
! const struct comp_unit_head *cu_header)
{
int i;
int size = blk->size;
*************** decode_locdesc (blk, objfile)
*** 5788,5795 ****
break;
case DW_OP_addr:
! stack[++stacki] = read_address (objfile->obfd, &data[i]);
! i += address_size;
break;
case DW_OP_const1u:
--- 5810,5818 ----
break;
case DW_OP_addr:
! stack[++stacki] = read_address (objfile->obfd, &data[i],
! cu_header, &bytes_read);
! i += bytes_read;
break;
case DW_OP_const1u: