forked from Imagelibrary/binutils-gdb
gas: sframe: command line option takes precedence
over gas directive to emit .sframe section.
Fix PR gas/33175 sframe: --gsframe=no does not disable when
.cfi_sections directive with .sframe
--gsframe=no should also disable generation of SFrame section when
explicit CFI directive:
.cfi_sections .sframe
is specified in the input. This means we need to track whether SFrame
generation was explicitly disabled by the user. Introduce a new enum to
facilitate disambiguation between GEN_SFRAME_DEFAULT_NONE and
GEN_SFRAME_DISABLED.
While fixing the bug by adding the enum, keep the upcoming requirement
in mind: we will also need to disambiguate between
--enable-default-sframe and user-specified --gsframe/--gsframe=yes. The
intent is to not display SFrame related warnings or errors like:
as_bad (_(".sframe not supported for target"));
for unsupported targets if --enable-default-sframe is in effect.
This implies we need to have a four state enum (
GEN_SFRAME_DEFAULT_NONE, GEN_SFRAME_CONFIG_ENABLED,
GEN_SFRAME_DISABLED, GEN_SFRAME_ENABLED)
gas/
PR gas/33175
* dw2gencfi.c (cfi_finish): Check state of flag_gen_sframe to
determine whether any SFrame section is generated.
* as.h (enum gen_sframe_option): New definition.
* as.c (parse_args): Keep track of whether the flag is
explicitly enabled or disabled
gas/testsuite/
PR gas/33175
* gas/cfi-sframe/cfi-sframe-common-1.d: Remove redundant
--gsframe.
* gas/cfi-sframe/cfi-sframe.exp: Add new test.
* gas/cfi-sframe/cfi-sframe-common-1c.d: New test. No SFrame
section if explicit --gsframe=no.
* gas/cfi-sframe/cfi-sframe-common-1c.s: New test.
This commit is contained in:
6
gas/as.c
6
gas/as.c
@@ -1042,14 +1042,14 @@ This program has absolutely no warranty.\n"));
|
|||||||
if (optarg)
|
if (optarg)
|
||||||
{
|
{
|
||||||
if (strcasecmp (optarg, "no") == 0)
|
if (strcasecmp (optarg, "no") == 0)
|
||||||
flag_gen_sframe = 0;
|
flag_gen_sframe = GEN_SFRAME_DISABLED;
|
||||||
else if (strcasecmp (optarg, "yes") == 0)
|
else if (strcasecmp (optarg, "yes") == 0)
|
||||||
flag_gen_sframe = 1;
|
flag_gen_sframe = GEN_SFRAME_ENABLED;
|
||||||
else
|
else
|
||||||
as_fatal (_("Invalid --gsframe option: `%s'"), optarg);
|
as_fatal (_("Invalid --gsframe option: `%s'"), optarg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
flag_gen_sframe = 1;
|
flag_gen_sframe = GEN_SFRAME_ENABLED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#endif /* OBJ_ELF */
|
#endif /* OBJ_ELF */
|
||||||
|
|||||||
26
gas/as.h
26
gas/as.h
@@ -355,8 +355,30 @@ COMMON int flag_execstack;
|
|||||||
/* TRUE if .note.GNU-stack section with SEC_CODE should be created */
|
/* TRUE if .note.GNU-stack section with SEC_CODE should be created */
|
||||||
COMMON int flag_noexecstack;
|
COMMON int flag_noexecstack;
|
||||||
|
|
||||||
/* TRUE if .sframe section should be created. */
|
/* PR gas/33175.
|
||||||
COMMON int flag_gen_sframe;
|
Add enumerators to disambiguate between configure-time
|
||||||
|
enablement (or not) vs user-specficied enablement/disablement (the latter
|
||||||
|
via command line). The expected usage of these states is:
|
||||||
|
- user-specified command line takes precedence over configure-time
|
||||||
|
setting and .cfi_sections directive usage.
|
||||||
|
- .cfi_sections usage takes precedence over configure-time setting. */
|
||||||
|
enum gen_sframe_option
|
||||||
|
{
|
||||||
|
/* Default. SFrame generation not enabled at configure time. GNU as will
|
||||||
|
not generate SFrame sections by default, unless enabled by user via
|
||||||
|
command line. */
|
||||||
|
GEN_SFRAME_DEFAULT_NONE,
|
||||||
|
/* SFrame generation enabled at configure time. GNU as will generate SFrame
|
||||||
|
sections for all objects, unless disabled by user via command line. */
|
||||||
|
GEN_SFRAME_CONFIG_ENABLED,
|
||||||
|
/* User specified disablement via --gsframe=no. */
|
||||||
|
GEN_SFRAME_DISABLED,
|
||||||
|
/* User specified enablement via --gsframe or --gsframe=yes. */
|
||||||
|
GEN_SFRAME_ENABLED,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* State of the setting for SFrame section creation. */
|
||||||
|
COMMON enum gen_sframe_option flag_gen_sframe;
|
||||||
|
|
||||||
/* name of emitted object file */
|
/* name of emitted object file */
|
||||||
COMMON const char *out_file_name;
|
COMMON const char *out_file_name;
|
||||||
|
|||||||
@@ -2596,10 +2596,13 @@ cfi_finish (void)
|
|||||||
flag_traditional_format = save_flag_traditional_format;
|
flag_traditional_format = save_flag_traditional_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate SFrame section if the user specifies:
|
/* Generate SFrame section if the user:
|
||||||
- the command line option to gas, or
|
- enables via the command line option, or
|
||||||
- .sframe in the .cfi_sections directive. */
|
- specifies .sframe in the .cfi_sections directive and does not disable
|
||||||
if (flag_gen_sframe || (all_cfi_sections & CFI_EMIT_sframe) != 0)
|
via the command line. */
|
||||||
|
if (flag_gen_sframe == GEN_SFRAME_ENABLED
|
||||||
|
|| ((all_cfi_sections & CFI_EMIT_sframe) != 0
|
||||||
|
&& flag_gen_sframe != GEN_SFRAME_DISABLED))
|
||||||
{
|
{
|
||||||
#ifdef support_sframe_p
|
#ifdef support_sframe_p
|
||||||
if (support_sframe_p () && !SUPPORT_FRAME_LINKONCE)
|
if (support_sframe_p () && !SUPPORT_FRAME_LINKONCE)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#as: --gsframe
|
#as:
|
||||||
#objdump: --sframe=.sframe
|
#objdump: --sframe=.sframe
|
||||||
#name: SFrame generation using CFI directive .cfi_sections
|
#name: SFrame generation using CFI directive .cfi_sections
|
||||||
#...
|
#...
|
||||||
|
|||||||
5
gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1c.d
Normal file
5
gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1c.d
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#as: --gsframe=no
|
||||||
|
#readelf: -S
|
||||||
|
#name: No SFrame section with explicit --gsframe=no
|
||||||
|
#failif
|
||||||
|
[ ]*\[.*\][ ]+\.sframe[ ]+GNU_SFRAME.*
|
||||||
3
gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1c.s
Normal file
3
gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1c.s
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
.cfi_sections .sframe
|
||||||
|
.cfi_startproc
|
||||||
|
.cfi_endproc
|
||||||
@@ -36,6 +36,7 @@ if { ([istarget "x86_64-*-*"] || [istarget "aarch64*-*-*"]
|
|||||||
|
|
||||||
run_dump_test "cfi-sframe-common-1"
|
run_dump_test "cfi-sframe-common-1"
|
||||||
run_dump_test "cfi-sframe-common-1b"
|
run_dump_test "cfi-sframe-common-1b"
|
||||||
|
run_dump_test "cfi-sframe-common-1c"
|
||||||
run_dump_test "cfi-sframe-common-2"
|
run_dump_test "cfi-sframe-common-2"
|
||||||
run_dump_test "cfi-sframe-common-3"
|
run_dump_test "cfi-sframe-common-3"
|
||||||
run_dump_test "cfi-sframe-common-4"
|
run_dump_test "cfi-sframe-common-4"
|
||||||
|
|||||||
Reference in New Issue
Block a user