From: Indu Bhagat <indu.bhagat@oracle.com>
To: binutils@sourceware.org
Cc: Indu Bhagat <indu.bhagat@oracle.com>
Subject: [PATCH, V5 08/16] gas: scfidw2gen: new functionality to prepare for SCFI
Date: Wed, 10 Jan 2024 23:48:12 -0800 [thread overview]
Message-ID: <20240111074820.2677826-9-indu.bhagat@oracle.com> (raw)
In-Reply-To: <20240111074820.2677826-1-indu.bhagat@oracle.com>
[Changes from V4 to V5]
- Reword the warning. Now that the command line option has changed to
--scfi=experimental. Reword the warning
from: "--scfi=all ignores most user-specified CFI directives"
to: "SCFI ignores most user-specified CFI directives"
[End of changes from V4 to V5]
[No Changes from V3 to V4]
[Changes from V2 to V3]
- Use dot_cfi_sections () from dw2gencfi and do not ignore
.cfi_sections CFI directive from user anymore.
- Addressed review comments:
+ Remove dummy functions, use #ifdef in read.c
+ Move the handlers of 'no ignore' functions together
+ Move functions around so no need for forward declaration
+ Use bool for scfi_ignore_warn_once, not int
+ Reword message around not closed CFI entry
+ Fix year range
+ scfidw2gen.c: reword warning message s/some/most/
+ ginsn/scfidw2gen: use const with symbolS*
[End of changes from V2 to V3]
Define a new set of handlers for CFI directives for the purpose of SCFI.
The SCFI machinery ignores many of the user-specified CFI direcives when
SCFI is in effect. A warning ("Warning: SCFI ignores most
user-specified CFI directives") is issued once per file. The following
CFI directives, however, are not ignored:
- .cfi_sections
- .cfi_label
- .cfi_signal_frame
gas/
* Makefile.am: Add new files to GAS_CFILES and HFILES.
* Makefile.in: Likewise.
* gas/read.c (scfi_pop_insert): New define.
(pobegin): Use the SCFI handlers.
* scfidw2gen.c: New file.
* scfidw2gen.h: New file.
---
gas/Makefile.am | 2 +
gas/Makefile.in | 9 +-
gas/read.c | 19 +++-
gas/scfidw2gen.c | 252 +++++++++++++++++++++++++++++++++++++++++++++++
gas/scfidw2gen.h | 35 +++++++
5 files changed, 312 insertions(+), 5 deletions(-)
create mode 100644 gas/scfidw2gen.c
create mode 100644 gas/scfidw2gen.h
diff --git a/gas/Makefile.am b/gas/Makefile.am
index 77c92d4d8ed..2848fac47b0 100644
--- a/gas/Makefile.am
+++ b/gas/Makefile.am
@@ -93,6 +93,7 @@ GAS_CFILES = \
read.c \
remap.c \
sb.c \
+ scfidw2gen.c \
sframe-opt.c \
stabs.c \
subsegs.c \
@@ -128,6 +129,7 @@ HFILES = \
output-file.h \
read.h \
sb.h \
+ scfidw2gen.h \
subsegs.h \
symbols.h \
tc.h \
diff --git a/gas/Makefile.in b/gas/Makefile.in
index 7aee1e1d460..7d4fbfc055c 100644
--- a/gas/Makefile.in
+++ b/gas/Makefile.in
@@ -176,9 +176,9 @@ am__objects_1 = app.$(OBJEXT) as.$(OBJEXT) atof-generic.$(OBJEXT) \
hash.$(OBJEXT) input-file.$(OBJEXT) input-scrub.$(OBJEXT) \
listing.$(OBJEXT) literal.$(OBJEXT) macro.$(OBJEXT) \
messages.$(OBJEXT) output-file.$(OBJEXT) read.$(OBJEXT) \
- remap.$(OBJEXT) sb.$(OBJEXT) sframe-opt.$(OBJEXT) \
- stabs.$(OBJEXT) subsegs.$(OBJEXT) symbols.$(OBJEXT) \
- write.$(OBJEXT)
+ remap.$(OBJEXT) sb.$(OBJEXT) scfidw2gen.$(OBJEXT) \
+ sframe-opt.$(OBJEXT) stabs.$(OBJEXT) subsegs.$(OBJEXT) \
+ symbols.$(OBJEXT) write.$(OBJEXT)
am_as_new_OBJECTS = $(am__objects_1)
am__dirstamp = $(am__leading_dot)dirstamp
as_new_OBJECTS = $(am_as_new_OBJECTS)
@@ -592,6 +592,7 @@ GAS_CFILES = \
read.c \
remap.c \
sb.c \
+ scfidw2gen.c \
sframe-opt.c \
stabs.c \
subsegs.c \
@@ -626,6 +627,7 @@ HFILES = \
output-file.h \
read.h \
sb.h \
+ scfidw2gen.h \
subsegs.h \
symbols.h \
tc.h \
@@ -1348,6 +1350,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remap.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scfidw2gen.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sframe-opt.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stabs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subsegs.Po@am__quote@
diff --git a/gas/read.c b/gas/read.c
index 753c92d2f1a..2aa5ce2facb 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -38,6 +38,7 @@
#include "obstack.h"
#include "ecoff.h"
#include "dw2gencfi.h"
+#include "scfidw2gen.h"
#include "codeview.h"
#include "wchar.h"
#include "filenames.h"
@@ -587,6 +588,10 @@ pop_insert (const pseudo_typeS *table)
#define cfi_pop_insert() pop_insert(cfi_pseudo_table)
#endif
+#ifndef scfi_pop_insert
+#define scfi_pop_insert() pop_insert(scfi_pseudo_table)
+#endif
+
static void
pobegin (void)
{
@@ -607,8 +612,18 @@ pobegin (void)
pop_insert (potable);
/* Now CFI ones. */
- pop_table_name = "cfi";
- cfi_pop_insert ();
+#if defined (TARGET_USE_SCFI) && defined (TARGET_USE_GINSN)
+ if (flag_synth_cfi)
+ {
+ pop_table_name = "scfi";
+ scfi_pop_insert ();
+ }
+ else
+#endif
+ {
+ pop_table_name = "cfi";
+ cfi_pop_insert ();
+ }
}
static void
diff --git a/gas/scfidw2gen.c b/gas/scfidw2gen.c
new file mode 100644
index 00000000000..1b3fb158e20
--- /dev/null
+++ b/gas/scfidw2gen.c
@@ -0,0 +1,252 @@
+/* scfidw2gen.c - Support for emission of synthesized Dwarf2 CFI.
+ Copyright (C) 2023 Free Software Foundation, Inc.
+
+ This file is part of GAS, the GNU Assembler.
+
+ GAS is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GAS is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GAS; see the file COPYING. If not, write to the Free
+ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#include "as.h"
+#include "dw2gencfi.h"
+#include "subsegs.h"
+#include "scfidw2gen.h"
+
+#if defined (TARGET_USE_SCFI) && defined (TARGET_USE_GINSN)
+
+static bool scfi_ignore_warn_once;
+
+static void
+dot_scfi_ignore (int ignored ATTRIBUTE_UNUSED)
+{
+ gas_assert (flag_synth_cfi);
+
+ if (!scfi_ignore_warn_once)
+ {
+ as_warn (_("SCFI ignores most user-specified CFI directives"));
+ scfi_ignore_warn_once = true;
+ }
+ ignore_rest_of_line ();
+}
+
+static void
+scfi_process_cfi_label (void)
+{
+ /* To be implemented. */
+ return;
+}
+
+static void
+scfi_process_cfi_signal_frame (void)
+{
+ /* To be implemented. */
+ return;
+}
+
+static void
+dot_scfi (int arg)
+{
+ switch (arg)
+ {
+ case CFI_label:
+ scfi_process_cfi_label ();
+ break;
+ case CFI_signal_frame:
+ scfi_process_cfi_signal_frame ();
+ break;
+ default:
+ abort ();
+ }
+}
+
+const pseudo_typeS scfi_pseudo_table[] =
+ {
+ { "cfi_sections", dot_cfi_sections, 0 }, /* No ignore. */
+ { "cfi_signal_frame", dot_scfi, CFI_signal_frame }, /* No ignore. */
+ { "cfi_label", dot_scfi, CFI_label }, /* No ignore. */
+ { "cfi_startproc", dot_scfi_ignore, 0 },
+ { "cfi_endproc", dot_scfi_ignore, 0 },
+ { "cfi_fde_data", dot_scfi_ignore, 0 },
+ { "cfi_def_cfa", dot_scfi_ignore, 0 },
+ { "cfi_def_cfa_register", dot_scfi_ignore, 0 },
+ { "cfi_def_cfa_offset", dot_scfi_ignore, 0 },
+ { "cfi_adjust_cfa_offset", dot_scfi_ignore, 0 },
+ { "cfi_offset", dot_scfi_ignore, 0 },
+ { "cfi_rel_offset", dot_scfi_ignore, 0 },
+ { "cfi_register", dot_scfi_ignore, 0 },
+ { "cfi_return_column", dot_scfi_ignore, 0 },
+ { "cfi_restore", dot_scfi_ignore, 0 },
+ { "cfi_undefined", dot_scfi_ignore, 0 },
+ { "cfi_same_value", dot_scfi_ignore, 0 },
+ { "cfi_remember_state", dot_scfi_ignore, 0 },
+ { "cfi_restore_state", dot_scfi_ignore, 0 },
+ { "cfi_window_save", dot_scfi_ignore, 0 },
+ { "cfi_negate_ra_state", dot_scfi_ignore, 0 },
+ { "cfi_escape", dot_scfi_ignore, 0 },
+ { "cfi_personality", dot_scfi_ignore, 0 },
+ { "cfi_personality_id", dot_scfi_ignore, 0 },
+ { "cfi_lsda", dot_scfi_ignore, 0 },
+ { "cfi_val_encoded_addr", dot_scfi_ignore, 0 },
+ { "cfi_inline_lsda", dot_scfi_ignore, 0 },
+ { "cfi_val_offset", dot_scfi_ignore, 0 },
+ { NULL, NULL, 0 }
+ };
+
+void
+scfi_dot_cfi_startproc (const symbolS *start_sym)
+{
+ if (frchain_now->frch_cfi_data != NULL)
+ {
+ as_bad (_("SCFI: missing previous SCFI endproc marker"));
+ return;
+ }
+
+ cfi_new_fde ((symbolS *)start_sym);
+
+ cfi_set_sections ();
+
+ frchain_now->frch_cfi_data->cur_cfa_offset = 0;
+
+ /* By default, SCFI machinery assumes .cfi_startproc is used without
+ parameter simple. */
+ tc_cfi_frame_initial_instructions ();
+
+ if ((all_cfi_sections & CFI_EMIT_target) != 0)
+ tc_cfi_startproc ();
+}
+
+void
+scfi_dot_cfi_endproc (const symbolS *end_sym)
+{
+ struct fde_entry *fde_last;
+
+ if (frchain_now->frch_cfi_data == NULL)
+ {
+ as_bad (_(".cfi_endproc without corresponding .cfi_startproc"));
+ return;
+ }
+
+ fde_last = frchain_now->frch_cfi_data->cur_fde_data;
+ cfi_set_last_fde (fde_last);
+
+ cfi_end_fde ((symbolS *)end_sym);
+
+ if ((all_cfi_sections & CFI_EMIT_target) != 0)
+ tc_cfi_endproc (fde_last);
+}
+
+void
+scfi_dot_cfi (int arg, unsigned reg1, unsigned reg2, offsetT offset,
+ const char *name, const symbolS *advloc)
+{
+ if (frchain_now->frch_cfi_data == NULL)
+ {
+ as_bad (_("CFI instruction used without previous .cfi_startproc"));
+ return;
+ }
+
+ /* If the last address was not at the current PC, advance to current. */
+ if (frchain_now->frch_cfi_data->last_address != advloc)
+ cfi_add_advance_loc ((symbolS *)advloc);
+
+ switch (arg)
+ {
+ case DW_CFA_offset:
+ cfi_add_CFA_offset (reg1, offset);
+ break;
+
+ case DW_CFA_val_offset:
+ cfi_add_CFA_val_offset (reg1, offset);
+ break;
+
+ case CFI_rel_offset:
+ cfi_add_CFA_offset (reg1,
+ offset - frchain_now->frch_cfi_data->cur_cfa_offset);
+ break;
+
+ case DW_CFA_def_cfa:
+ cfi_add_CFA_def_cfa (reg1, offset);
+ break;
+
+ case DW_CFA_register:
+ cfi_add_CFA_register (reg1, reg2);
+ break;
+
+ case DW_CFA_def_cfa_register:
+ cfi_add_CFA_def_cfa_register (reg1);
+ break;
+
+ case DW_CFA_def_cfa_offset:
+ cfi_add_CFA_def_cfa_offset (offset);
+ break;
+
+ case CFI_adjust_cfa_offset:
+ cfi_add_CFA_def_cfa_offset (frchain_now->frch_cfi_data->cur_cfa_offset
+ + offset);
+ break;
+
+ case DW_CFA_restore:
+ cfi_add_CFA_restore (reg1);
+ break;
+
+ case DW_CFA_remember_state:
+ cfi_add_CFA_remember_state ();
+ break;
+
+ case DW_CFA_restore_state:
+ cfi_add_CFA_restore_state ();
+ break;
+
+ case CFI_label:
+ cfi_add_label (name);
+ break;
+
+ case CFI_signal_frame:
+ frchain_now->frch_cfi_data->cur_fde_data->signal_frame = 1;
+ break;
+
+/*
+ case DW_CFA_undefined:
+ for (;;)
+ {
+ reg1 = cfi_parse_reg ();
+ cfi_add_CFA_undefined (reg1);
+ SKIP_WHITESPACE ();
+ if (*input_line_pointer != ',')
+ break;
+ ++input_line_pointer;
+ }
+ break;
+
+ case DW_CFA_same_value:
+ reg1 = cfi_parse_reg ();
+ cfi_add_CFA_same_value (reg1);
+ break;
+
+ case CFI_return_column:
+ reg1 = cfi_parse_reg ();
+ cfi_set_return_column (reg1);
+ break;
+
+ case DW_CFA_GNU_window_save:
+ cfi_add_CFA_insn (DW_CFA_GNU_window_save);
+ break;
+
+*/
+ default:
+ abort ();
+ }
+}
+
+#endif
diff --git a/gas/scfidw2gen.h b/gas/scfidw2gen.h
new file mode 100644
index 00000000000..b96ff4848d9
--- /dev/null
+++ b/gas/scfidw2gen.h
@@ -0,0 +1,35 @@
+/* scfidw2gen.h - Support for emitting synthesized Dwarf2 CFI.
+ Copyright (C) 2023 Free Software Foundation, Inc.
+
+ This file is part of GAS, the GNU Assembler.
+
+ GAS is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GAS is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GAS; see the file COPYING. If not, write to the Free
+ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#ifndef SCFIDW2GEN_H
+#define SCFIDW2GEN_H
+
+#include "as.h"
+#include "dwarf2.h"
+
+extern const pseudo_typeS scfi_pseudo_table[];
+
+void scfi_dot_cfi_startproc (const symbolS *start_sym);
+void scfi_dot_cfi_endproc (const symbolS *end_sym);
+void scfi_dot_cfi (int arg, unsigned reg1, unsigned reg2, offsetT offset,
+ const char *name, const symbolS *advloc);
+
+#endif
+
--
2.41.0
next prev parent reply other threads:[~2024-01-11 7:49 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-11 7:48 [PATCH, V5 00/16] Experimental support for synthesizing CFI for hand-written asm Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 01/16] gas: dw2gencfi: minor rejig for cfi_sections_set and all_cfi_sections Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 02/16] gas: dw2gencfi: use all_cfi_sections instead of cfi_sections Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 03/16] gas: dw2gencfi: expose a new cfi_set_last_fde API Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 04/16] gas: dw2gencfi: move some tc_* defines to the header file Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 05/16] gas: dw2gencfi: expose dot_cfi_sections for scfidw2gen Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 06/16] gas: dw2gencfi: externalize the all_cfi_sections Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 07/16] gas: add new command line option --scfi=experimental Indu Bhagat
2024-01-11 7:48 ` Indu Bhagat [this message]
2024-01-11 7:48 ` [PATCH, V5 09/16] opcodes: i386: fix dw2_regnum data type in reg_entry Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 10/16] opcodes: gas: i386: define and use Rex2 as attribute not constraint Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 11/16] opcodes: i386: new marker for insns that implicitly update stack pointer Indu Bhagat
2024-01-11 7:57 ` Jan Beulich
2024-01-11 7:48 ` [PATCH, V5 12/16] gas: synthesize CFI for hand-written asm Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 13/16] gas: doc: update documentation for the new listing option Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 14/16] opcodes: i386-reg.tbl: Add a comment to reflect dependency on ordering Indu Bhagat
2024-01-11 7:59 ` Jan Beulich
2024-01-11 7:48 ` [PATCH, V5 15/16] gas: testsuite: add an x86_64 testsuite for SCFI Indu Bhagat
2024-01-11 7:48 ` [PATCH, V5 16/16] gas/NEWS: announce the new SCFI command line option Indu Bhagat
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240111074820.2677826-9-indu.bhagat@oracle.com \
--to=indu.bhagat@oracle.com \
--cc=binutils@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).