mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
[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:
committed by
Nick Clifton
parent
e4c5cc3729
commit
3fd0711530
6
gas/as.c
6
gas/as.c
@@ -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 */
|
||||
|
||||
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 */
|
||||
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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#as: --gsframe
|
||||
#as:
|
||||
#objdump: --sframe=.sframe
|
||||
#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-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"
|
||||
|
||||
Reference in New Issue
Block a user