diff options
-rw-r--r-- | dwarf_loader.c | 1 | ||||
-rw-r--r-- | dwarves.c | 1 | ||||
-rw-r--r-- | dwarves.h | 1 |
3 files changed, 3 insertions, 0 deletions
diff --git a/dwarf_loader.c b/dwarf_loader.c index 07a74a1..ccf3194 100644 --- a/dwarf_loader.c +++ b/dwarf_loader.c @@ -1286,6 +1286,7 @@ static void ftype__init(struct ftype *ftype, Dwarf_Die *die, struct cu *cu) assert(tag == DW_TAG_subprogram || tag == DW_TAG_subroutine_type); #endif tag__init(&ftype->tag, cu, die); + ftype->byte_size = attr_numeric(die, DW_AT_byte_size); INIT_LIST_HEAD(&ftype->parms); ftype->nr_parms = 0; ftype->unspec_parms = 0; @@ -1136,6 +1136,7 @@ size_t tag__size(const struct tag *tag, const struct cu *cu) case DW_TAG_reference_type: return cu->addr_size; case DW_TAG_base_type: return base_type__size(tag); case DW_TAG_enumeration_type: return tag__type(tag)->size / 8; + case DW_TAG_subroutine_type: return tag__ftype(tag)->byte_size ?: cu->addr_size; } if (tag->type == 0) { /* struct class: unions, structs */ @@ -868,6 +868,7 @@ static inline const char *parameter__name(const struct parameter *parm) struct ftype { struct tag tag; struct list_head parms; + size_t byte_size; // First seen in DW_TAG_subroutine_type in a Go CU uint16_t nr_parms; uint8_t unspec_parms:1; /* just one bit is needed */ uint8_t optimized_parms:1; |