7d45c7c3f6
This change introduces a new function, dwarf2_string_attr(), which is a wrapper for dwarf2_attr(). dwarf2read.c has been updated to call dwarf2_string_attr in most instances where a string-valued attribute is decoded to produce a string value. In most cases, it simplifies the code; in some instances, the complexity of the code remains unchanged. I performed this change by looking for instances where the result of DW_STRING was used in an assignment. Many of these had a pattern which (roughly) looks something like this: struct attribute *attr = NULL; attr = dwarf2_attr (die, name, cu); if (attr != NULL && DW_STRING (attr)) { const char *str; ... str = DW_STRING (attr); ... /* Use str in some fashion. */ } Code of this form is transformed to look like this instead: const char *str; str = dwarf2_string_attr (die, name, cu) if (str != NULL) { ... /* Use str in some fashion. */ ... } In addition to invoking dwarf2_attr() and DW_STRING(), dwarf2_string_attr() checks to make sure that the attribute's `form' field matches one of DW_FORM_strp, DW_FORM_string, or DW_FORM_GNU_strp_alt. If it does not match one of these forms, it will return a NULL value in addition to calling complaint(). An earlier version of this patch did this type checking for one particular instance where a string attribute was being decoded. The situation that I was attempting to handle in that earlier patch is this: The Texas Instruments compiler uses the encoding for DW_AT_MIPS_linkage_name for other purposes. TI uses the encoding, 0x2007, for TI_AT_TI_end_line which, unlike DW_AT_MIPS_linkage_name, does not have a string-typed value. In this instance, GDB was attempting to use an integer value as a string pointer, with predictable results. (GDB would die with a segmentation fault.) I've added a test which reproduces the problem that I was orignally wanting to fix. It uses DW_AT_MIPS_linkage name with an associate value which is a string, and again, where the value is a small integer. My test case causes GDB to segfault in an unpatched GDB. There will be two PASSes in a patched GDB. Unpatched GDB: (gdb) ptype f ERROR: Process no longer exists UNRESOLVED: gdb.dwarf2/dw2-bad-mips-linkage-name.exp: ptype f ERROR: Couldn't send ptype g to GDB. UNRESOLVED: gdb.dwarf2/dw2-bad-mips-linkage-name.exp: ptype g Patched GDB: (gdb) ptype f type = bool () (gdb) PASS: gdb.dwarf2/dw2-bad-mips-linkage-name.exp: ptype f ptype g type = bool () (gdb) PASS: gdb.dwarf2/dw2-bad-mips-linkage-name.exp: ptype g I see no regressions on an x86_64 native target. gdb/ChangeLog: * dwarf2read.c (dwarf2_string_attr): New function. (lookup_dwo_unit, process_psymtab_comp_unit_reader) (dwarf2_compute_name, dwarf2_physname, find_file_and_directory) (read_call_site_scope, namespace_name, guess_full_die_structure_name) (anonymous_struct_prefix, prepare_one_comp_unit): Use dwarf2_string_attr in place of dwarf2_attr and DW_STRING. gdb/testsuite/ChangeLog: * gdb.dwarf2/dw2-bad-mips-linkage-name.c: New file. * gdb.dwarf2/dw2-bad-mips-linkage-name.exp: New file. |
||
---|---|---|
.. | ||
arr-stride.c | ||
arr-stride.exp | ||
arr-subrange.c | ||
arr-subrange.exp | ||
atomic-type.exp | ||
atomic.c | ||
callframecfa.exp | ||
callframecfa.S | ||
clztest.c | ||
clztest.exp | ||
clztest.S | ||
corrupt.c | ||
corrupt.exp | ||
count.exp | ||
data-loc.c | ||
data-loc.exp | ||
dup-psym.exp | ||
dup-psym.S | ||
dw2-abs-hi-pc-hello-dbg.S | ||
dw2-abs-hi-pc-hello.c | ||
dw2-abs-hi-pc-world-dbg.S | ||
dw2-abs-hi-pc-world.c | ||
dw2-abs-hi-pc.c | ||
dw2-abs-hi-pc.exp | ||
dw2-ada-ffffffff.exp | ||
dw2-ada-ffffffff.S | ||
dw2-anon-mptr.exp | ||
dw2-anon-mptr.S | ||
dw2-anonymous-func.exp | ||
dw2-anonymous-func.S | ||
dw2-bad-mips-linkage-name.c | ||
dw2-bad-mips-linkage-name.exp | ||
dw2-bad-parameter-type.exp | ||
dw2-bad-parameter-type.S | ||
dw2-basic.exp | ||
dw2-basic.S | ||
dw2-canonicalize-type.exp | ||
dw2-canonicalize-type.S | ||
dw2-case-insensitive-debug.S | ||
dw2-case-insensitive.c | ||
dw2-case-insensitive.exp | ||
dw2-common-block.exp | ||
dw2-common-block.S | ||
dw2-compdir-oldgcc.exp | ||
dw2-compdir-oldgcc.S | ||
dw2-compressed.exp | ||
dw2-compressed.S | ||
dw2-const.exp | ||
dw2-const.S | ||
dw2-cp-infcall-ref-static-main.c | ||
dw2-cp-infcall-ref-static.exp | ||
dw2-cp-infcall-ref-static.S | ||
dw2-cu-size.exp | ||
dw2-cu-size.S | ||
dw2-dir-file-name.c | ||
dw2-dir-file-name.exp | ||
dw2-dos-drive.exp | ||
dw2-dos-drive.S | ||
dw2-double-set-die-type.exp | ||
dw2-double-set-die-type.S | ||
dw2-dummy-cu.exp | ||
dw2-dummy-cu.S | ||
dw2-dup-frame.c | ||
dw2-dup-frame.exp | ||
dw2-dup-frame.S | ||
dw2-empty-namespace.exp | ||
dw2-empty-namespace.S | ||
dw2-empty-pc-range.exp | ||
dw2-empty-pc-range.S | ||
dw2-entry-value-main.c | ||
dw2-entry-value.exp | ||
dw2-entry-value.S | ||
dw2-error.c | ||
dw2-error.exp | ||
dw2-error.S | ||
dw2-filename.exp | ||
dw2-filename.S | ||
dw2-icc-opaque.exp | ||
dw2-icc-opaque.S | ||
dw2-icycle.c | ||
dw2-icycle.exp | ||
dw2-icycle.S | ||
dw2-ifort-parameter.c | ||
dw2-ifort-parameter.exp | ||
dw2-inheritance.exp | ||
dw2-inheritance.S | ||
dw2-inline-break.exp | ||
dw2-inline-break.S | ||
dw2-inline-param-main.c | ||
dw2-inline-param.exp | ||
dw2-inline-param.S | ||
dw2-intercu.exp | ||
dw2-intercu.S | ||
dw2-intermix.exp | ||
dw2-intermix.S | ||
dw2-linkage-name-trust-main.cc | ||
dw2-linkage-name-trust.exp | ||
dw2-linkage-name-trust.S | ||
dw2-minsym-in-cu.exp | ||
dw2-minsym-in-cu.S | ||
dw2-modula2-self-type.exp | ||
dw2-modula2-self-type.S | ||
dw2-namespaceless-anonymous.exp | ||
dw2-namespaceless-anonymous.S | ||
dw2-noloc-main.c | ||
dw2-noloc.exp | ||
dw2-noloc.S | ||
dw2-objfile-overlap-inner.S | ||
dw2-objfile-overlap-outer.S | ||
dw2-objfile-overlap.exp | ||
dw2-op-call.exp | ||
dw2-op-call.S | ||
dw2-op-out-param.exp | ||
dw2-op-out-param.S | ||
dw2-op-stack-value.exp | ||
dw2-op-stack-value.S | ||
dw2-param-error-main.c | ||
dw2-param-error.exp | ||
dw2-param-error.S | ||
dw2-producer.exp | ||
dw2-producer.S | ||
dw2-ranges.c | ||
dw2-ranges.exp | ||
dw2-ranges2.c | ||
dw2-ranges3.c | ||
dw2-ref-missing-frame-func.c | ||
dw2-ref-missing-frame-main.c | ||
dw2-ref-missing-frame.exp | ||
dw2-ref-missing-frame.S | ||
dw2-reg-undefined.c | ||
dw2-reg-undefined.exp | ||
dw2-reg-undefined.S | ||
dw2-restore.exp | ||
dw2-restore.S | ||
dw2-restrict.c | ||
dw2-restrict.exp | ||
dw2-restrict.S | ||
dw2-simple-locdesc.exp | ||
dw2-simple-locdesc.S | ||
dw2-single-line-discriminators.c | ||
dw2-single-line-discriminators.exp | ||
dw2-single-line-discriminators.S | ||
dw2-skip-prologue.c | ||
dw2-skip-prologue.exp | ||
dw2-skip-prologue.S | ||
dw2-stack-boundary.exp | ||
dw2-stack-boundary.S | ||
dw2-strp.exp | ||
dw2-strp.S | ||
dw2-undefined-ret-addr.c | ||
dw2-undefined-ret-addr.exp | ||
dw2-undefined-ret-addr.S | ||
dw2-unresolved-main.c | ||
dw2-unresolved.exp | ||
dw2-unresolved.S | ||
dw2-var-zero-addr.exp | ||
dw2-var-zero-addr.S | ||
dw4-sig-type-unused.exp | ||
dw4-sig-type-unused.S | ||
dw4-sig-types-b.cc | ||
dw4-sig-types.cc | ||
dw4-sig-types.exp | ||
dw4-sig-types.h | ||
dwp-symlink.c | ||
dwp-symlink.exp | ||
dwz.exp | ||
dwzbuildid.exp | ||
dynarr-ptr.c | ||
dynarr-ptr.exp | ||
enum-type.exp | ||
file1.txt | ||
fission-base.c | ||
fission-base.exp | ||
fission-base.S | ||
fission-loclists.exp | ||
fission-loclists.S | ||
fission-mix.c | ||
fission-mix.exp | ||
fission-mix.h | ||
fission-mix2.c | ||
fission-reread.exp | ||
fission-reread.S | ||
gdb-index.exp | ||
implptr-64bit.exp | ||
implptr-64bit.S | ||
implptr-optimized-out.exp | ||
implptr.c | ||
implptr.exp | ||
implptr.S | ||
implptrconst.c | ||
implptrconst.exp | ||
implptrpiece.exp | ||
mac-fileno.exp | ||
mac-fileno.S | ||
main.c | ||
Makefile.in | ||
member-ptr-forwardref.exp | ||
member-ptr-forwardref.S | ||
method-ptr.cc | ||
method-ptr.exp | ||
missing-sig-type.exp | ||
nostaticblock.exp | ||
opaque-type-lookup-2.c | ||
opaque-type-lookup.c | ||
opaque-type-lookup.exp | ||
pieces-optimized-out.c | ||
pieces-optimized-out.exp | ||
pieces-optimized-out.S | ||
pieces.c | ||
pieces.exp | ||
pieces.S | ||
pr10770.c | ||
pr10770.exp | ||
pr11465.exp | ||
pr11465.S | ||
pr13961.exp | ||
pr13961.S | ||
staticvirtual.exp | ||
subrange.exp | ||
symtab-producer.exp | ||
trace-crash.exp | ||
trace-crash.S | ||
typeddwarf-amd64.S | ||
typeddwarf.c | ||
typeddwarf.exp | ||
typeddwarf.S | ||
valop.exp | ||
valop.S | ||
watch-notconst.c | ||
watch-notconst.exp | ||
watch-notconst2.c | ||
watch-notconst2.S |