[PATCH] 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
This commit is contained in:
Indu Bhagat
2025-07-27 09:11:44 +01:00
committed by Nick Clifton
parent e4c5cc3729
commit 3fd0711530
7 changed files with 44 additions and 10 deletions

View File

@@ -1042,14 +1042,14 @@ This program has absolutely no warranty.\n"));
if (optarg)
{
if (strcasecmp (optarg, "no") == 0)
flag_gen_sframe = 0;
flag_gen_sframe = GEN_SFRAME_DISABLED;
else if (strcasecmp (optarg, "yes") == 0)
flag_gen_sframe = 1;
flag_gen_sframe = GEN_SFRAME_ENABLED;
else
as_fatal (_("Invalid --gsframe option: `%s'"), optarg);
}
else
flag_gen_sframe = 1;
flag_gen_sframe = GEN_SFRAME_ENABLED;
break;
#endif /* OBJ_ELF */

View File

@@ -355,8 +355,30 @@ COMMON int flag_execstack;
/* TRUE if .note.GNU-stack section with SEC_CODE should be created */
COMMON int flag_noexecstack;
/* TRUE if .sframe section should be created. */
COMMON int flag_gen_sframe;
/* PR gas/33175.
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 */
COMMON const char *out_file_name;

View File

@@ -2596,10 +2596,13 @@ cfi_finish (void)
flag_traditional_format = save_flag_traditional_format;
}
/* Generate SFrame section if the user specifies:
- the command line option to gas, or
- .sframe in the .cfi_sections directive. */
if (flag_gen_sframe || (all_cfi_sections & CFI_EMIT_sframe) != 0)
/* Generate SFrame section if the user:
- enables via the command line option, or
- specifies .sframe in the .cfi_sections directive and does not disable
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
if (support_sframe_p () && !SUPPORT_FRAME_LINKONCE)

View File

@@ -1,4 +1,4 @@
#as: --gsframe
#as:
#objdump: --sframe=.sframe
#name: SFrame generation using CFI directive .cfi_sections
#...

View File

@@ -0,0 +1,5 @@
#as: --gsframe=no
#readelf: -S
#name: No SFrame section with explicit --gsframe=no
#failif
[ ]*\[.*\][ ]+\.sframe[ ]+GNU_SFRAME.*

View File

@@ -0,0 +1,3 @@
.cfi_sections .sframe
.cfi_startproc
.cfi_endproc

View File

@@ -36,6 +36,7 @@ if { ([istarget "x86_64-*-*"] || [istarget "aarch64*-*-*"]
run_dump_test "cfi-sframe-common-1"
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-3"
run_dump_test "cfi-sframe-common-4"