summaryrefslogtreecommitdiffstats
path: root/backends
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2023-01-26 18:19:15 +0100
committerMark Wielaard <[email protected]>2023-02-14 16:30:24 +0100
commitf2c522567ad63ac293535fba9704895e685ab5bc (patch)
tree667604fa01006ac0b8041d156dbd9d345bcb0d17 /backends
parent3fa98a6f29b0f370e32549ead7eb897c839af980 (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/ChangeLog5
-rw-r--r--backends/libebl_CPU.h14
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