diff options
| author | Mark Wielaard <[email protected]> | 2023-01-26 18:19:15 +0100 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2023-02-14 16:30:24 +0100 |
| commit | f2c522567ad63ac293535fba9704895e685ab5bc (patch) | |
| tree | 667604fa01006ac0b8041d156dbd9d345bcb0d17 /backends | |
| parent | 3fa98a6f29b0f370e32549ead7eb897c839af980 (diff) | |
backends: Handle DW_TAG_unspecified_type in dwarf_peeled_die_type
binutils 2.40 introduces DW_TAG_unspecified_type for assembly
functions with an unknown return type. This breaks the
run-funcretval.sh testcase because dwfl_module_return_value_location
returns an error for such functions because it cannot determine the
return value location. Fix that by treating DW_TAG_unspecified_type
as if the DIE doesn't have a DW_AT_type.
Also update the testcase to explicitly checking for
DW_TAG_unspecified_type and printing "returns unspecified type".
https://sourceware.org/bugzilla/show_bug.cgi?id=30047
Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'backends')
| -rw-r--r-- | backends/ChangeLog | 5 | ||||
| -rw-r--r-- | backends/libebl_CPU.h | 14 |
2 files changed, 17 insertions, 2 deletions
diff --git a/backends/ChangeLog b/backends/ChangeLog index 40ec7c0c..81f08314 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,8 @@ +2023-02-07 Mark Wielaard <[email protected]> + + * libebl_CPU.h (dwarf_peeled_die_type): Explicitly handle + DW_TAG_unspecified_type as if there was no DW_AT_type. + 2023-01-19 Mark Wielaard <[email protected]> * sparc_reloc.def (NONE): Add EXEC and DYN. diff --git a/backends/libebl_CPU.h b/backends/libebl_CPU.h index 2abad76f..3b2cc3e4 100644 --- a/backends/libebl_CPU.h +++ b/backends/libebl_CPU.h @@ -1,5 +1,6 @@ /* Common interface for libebl modules. Copyright (C) 2000, 2001, 2002, 2003, 2005, 2013, 2014 Red Hat, Inc. + Copyright (C) 2023 Mark J. Wielaard <[email protected]> This file is part of elfutils. This file is free software; you can redistribute it and/or modify @@ -53,7 +54,9 @@ extern bool (*generic_debugscn_p) (const char *) attribute_hidden; dwarf_tag (_die); }) /* Get a type die corresponding to DIE. Peel CV qualifiers off - it. */ + it. Returns zero if the DIE doesn't have a type, or the type + is DW_TAG_unspecified_type. Returns -1 on error. Otherwise + returns the result tag DW_AT value. */ static inline int dwarf_peeled_die_type (Dwarf_Die *die, Dwarf_Die *result) { @@ -69,7 +72,14 @@ dwarf_peeled_die_type (Dwarf_Die *die, Dwarf_Die *result) if (dwarf_peel_type (result, result) != 0) return -1; - return DWARF_TAG_OR_RETURN (result); + if (result == NULL) + return -1; + + int tag = dwarf_tag (result); + if (tag == DW_TAG_unspecified_type) + return 0; /* Treat an unspecified type as if there was no type. */ + + return tag; } static inline bool |
