mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-02 12:37:05 +08:00
Use enum bitfield for the calling_convention attribute of a subroutine
This is a refactoring. Instead of a plain unsigned value, use an enum bitfield. gdb/ChangeLog: 2019-12-20 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * dwarf2read.c (is_valid_DW_AT_calling_convention_for_subroutine): New function. (read_subroutine_type): Validate the parsed DW_AT_calling_convention value before assigning it to a subroutine's calling_convention attribute. * gdbtypes.h (struct func_type) <calling_convention>: Use an enum bitfield as its type, instead of plain unsigned. Change-Id: Ibc6b2f71e885cbc5c3c9d49734f7125acbfd1bcd
This commit is contained in:
@ -1,3 +1,13 @@
|
|||||||
|
2019-12-20 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
|
||||||
|
|
||||||
|
* dwarf2read.c (is_valid_DW_AT_calling_convention_for_subroutine):
|
||||||
|
New function.
|
||||||
|
(read_subroutine_type): Validate the parsed
|
||||||
|
DW_AT_calling_convention value before assigning it to a
|
||||||
|
subroutine's calling_convention attribute.
|
||||||
|
* gdbtypes.h (struct func_type) <calling_convention>: Use
|
||||||
|
an enum bitfield as its type, instead of plain unsigned.
|
||||||
|
|
||||||
2019-12-20 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
|
2019-12-20 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
|
||||||
|
|
||||||
PR gdb/25054
|
PR gdb/25054
|
||||||
|
@ -15872,6 +15872,32 @@ is_valid_DW_AT_calling_convention_for_type (ULONGEST value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if the given VALUE is a valid enum dwarf_calling_convention
|
||||||
|
constant for a subroutine, according to DWARF5 spec, Table 3.3, and
|
||||||
|
also according to GNU-specific values (see include/dwarf2.h). */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_valid_DW_AT_calling_convention_for_subroutine (ULONGEST value)
|
||||||
|
{
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case DW_CC_normal:
|
||||||
|
case DW_CC_program:
|
||||||
|
case DW_CC_nocall:
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case DW_CC_GNU_renesas_sh:
|
||||||
|
case DW_CC_GNU_borland_fastcall_i386:
|
||||||
|
case DW_CC_GDB_IBM_OpenCL:
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
complaint (_("unrecognized DW_AT_calling_convention value "
|
||||||
|
"(%lu) for a subroutine"), value);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Called when we find the DIE that starts a structure or union scope
|
/* Called when we find the DIE that starts a structure or union scope
|
||||||
(definition) to create a type for the structure or union. Fill in
|
(definition) to create a type for the structure or union. Fill in
|
||||||
the type's name and general properties; the members will not be
|
the type's name and general properties; the members will not be
|
||||||
@ -17540,8 +17566,10 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
|
|||||||
the subroutine die. Otherwise set the calling convention to
|
the subroutine die. Otherwise set the calling convention to
|
||||||
the default value DW_CC_normal. */
|
the default value DW_CC_normal. */
|
||||||
attr = dwarf2_attr (die, DW_AT_calling_convention, cu);
|
attr = dwarf2_attr (die, DW_AT_calling_convention, cu);
|
||||||
if (attr != nullptr)
|
if (attr != nullptr
|
||||||
TYPE_CALLING_CONVENTION (ftype) = DW_UNSND (attr);
|
&& is_valid_DW_AT_calling_convention_for_subroutine (DW_UNSND (attr)))
|
||||||
|
TYPE_CALLING_CONVENTION (ftype)
|
||||||
|
= (enum dwarf_calling_convention) (DW_UNSND (attr));
|
||||||
else if (cu->producer && strstr (cu->producer, "IBM XL C for OpenCL"))
|
else if (cu->producer && strstr (cu->producer, "IBM XL C for OpenCL"))
|
||||||
TYPE_CALLING_CONVENTION (ftype) = DW_CC_GDB_IBM_OpenCL;
|
TYPE_CALLING_CONVENTION (ftype) = DW_CC_GDB_IBM_OpenCL;
|
||||||
else
|
else
|
||||||
|
@ -1157,9 +1157,9 @@ struct func_type
|
|||||||
/* * The calling convention for targets supporting multiple ABIs.
|
/* * The calling convention for targets supporting multiple ABIs.
|
||||||
Right now this is only fetched from the Dwarf-2
|
Right now this is only fetched from the Dwarf-2
|
||||||
DW_AT_calling_convention attribute. The value is one of the
|
DW_AT_calling_convention attribute. The value is one of the
|
||||||
DW_CC enum dwarf_calling_convention constants. */
|
DW_CC constants. */
|
||||||
|
|
||||||
unsigned calling_convention : 8;
|
ENUM_BITFIELD (dwarf_calling_convention) calling_convention : 8;
|
||||||
|
|
||||||
/* * Whether this function normally returns to its caller. It is
|
/* * Whether this function normally returns to its caller. It is
|
||||||
set from the DW_AT_noreturn attribute if set on the
|
set from the DW_AT_noreturn attribute if set on the
|
||||||
|
Reference in New Issue
Block a user