public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 00/12] SFrame Version 2 - definition and support
@ 2023-06-27 21:20 Indu Bhagat
  2023-06-27 21:20 ` [PATCH 01/12] sframe.h: format bump to SFrame version 2 Indu Bhagat
                   ` (11 more replies)
  0 siblings, 12 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

This patch set adds support for SFrame version 2.

The main change in SFrame version 2 is in the representation of the SFrame
Function Description Entry - it is now of size 20 bytes making each element
aligned at their natural boundary.

These commits are broken down into small chunks for ease of review only.  The
commits touching sframe.h, gas implementation, ld changes, and readelf/objdump
changes will need to be squashed into a single patch for an upstream commit.

Similarly, the doc updates can be squashed into one.

I would like to commit these by Thursday June 29 ideally.

Thanks,

Indu Bhagat (12):
  sframe.h: format bump to SFrame version 2
  gas: generate SFrame section with version SFRAME_VERSION_2
  libsframe: add new APIs to get SFrame version
  libsframe: add new APIs to add and get SFrame FDE in SFrame version 2
  libsframe: adjust version check in sframe_header_sanity_check_p
  libsframe: testsuite: fixes for SFRAME_VERSION_2
  bfd: linker: add support for rep_block_size for pltN entries
  bfd: linker: generate SFrame sections with version SFRAME_VERSION_2
  objdump/readelf: adjust for SFRAME_VERSION_2
  doc: sframe: update specification for SFRAME_VERSION_2
  doc: sframe: add details about alignment in the SFrame format
  binutils/NEWS: announce SFrame version 2 as the new default

 bfd/elf-sframe.c                              |  32 +++++--
 bfd/elfxx-x86.c                               |  24 ++---
 binutils/NEWS                                 |   3 +
 gas/gen-sframe.c                              |   9 +-
 .../gas/cfi-sframe/cfi-sframe-aarch64-1.d     |   2 +-
 .../gas/cfi-sframe/cfi-sframe-aarch64-2.d     |   2 +-
 .../cfi-sframe-aarch64-pac-ab-key-1.d         |   2 +-
 .../gas/cfi-sframe/cfi-sframe-common-1.d      |   2 +-
 .../gas/cfi-sframe/cfi-sframe-common-2.d      |   2 +-
 .../gas/cfi-sframe/cfi-sframe-common-3.d      |   2 +-
 .../gas/cfi-sframe/cfi-sframe-common-4.d      |   2 +-
 .../gas/cfi-sframe/cfi-sframe-common-5.d      |   2 +-
 .../gas/cfi-sframe/cfi-sframe-common-6.d      |   2 +-
 .../gas/cfi-sframe/cfi-sframe-common-7.d      |   2 +-
 .../gas/cfi-sframe/cfi-sframe-common-8.d      |   2 +-
 .../gas/cfi-sframe/cfi-sframe-x86_64-1.d      |   2 +-
 gas/testsuite/gas/cfi-sframe/common-empty-1.d |   2 +-
 gas/testsuite/gas/cfi-sframe/common-empty-2.d |   2 +-
 gas/testsuite/gas/cfi-sframe/common-empty-3.d |   2 +-
 include/sframe-api.h                          |  31 ++++++
 include/sframe.h                              |   7 +-
 ld/testsuite/ld-aarch64/sframe-simple-1.d     |   4 +-
 ld/testsuite/ld-x86-64/sframe-plt-1.d         |   2 +-
 ld/testsuite/ld-x86-64/sframe-simple-1.d      |   4 +-
 libsframe/doc/sframe-spec.texi                |  84 +++++++++++++++--
 libsframe/libsframe.ver                       |   4 +
 libsframe/sframe-dump.c                       |  42 ++++++---
 libsframe/sframe.c                            |  88 +++++++++++++++++-
 libsframe/testsuite/libsframe.decode/DATA-BE  | Bin 64 -> 67 bytes
 libsframe/testsuite/libsframe.decode/DATA1    | Bin 60 -> 63 bytes
 libsframe/testsuite/libsframe.decode/DATA2    | Bin 92 -> 98 bytes
 .../testsuite/libsframe.encode/encode-1.c     |   6 +-
 32 files changed, 298 insertions(+), 72 deletions(-)

-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 01/12] sframe.h: format bump to SFrame version 2
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 02/12] gas: generate SFrame section with version SFRAME_VERSION_2 Indu Bhagat
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

SFrame version 2 encodes the size of repetitive insn block explicitly
in the format.  Add information in the SFrame FDE to convey the size
of the block of repeating instructions.  This information is used only
for SFrame FDEs of type SFRAME_FDE_TYPE_PCMASK.

Introduce two extra bytes for padding: this ensures that the memory
accesses to the members of the SFrame Frame Descriptor Entry (FDE) are
naturally aligned.

include/
	* sframe.h: Add member to encode size of the code block of
	repeating instructions.  Add 2 bytes of padding.
---
 include/sframe.h | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/include/sframe.h b/include/sframe.h
index cdf275f69e4..bef580fd5cb 100644
--- a/include/sframe.h
+++ b/include/sframe.h
@@ -73,10 +73,11 @@ extern "C"
 
 /* SFrame format versions.  */
 #define SFRAME_VERSION_1	1
+#define SFRAME_VERSION_2	2
 /* SFrame magic number.  */
 #define SFRAME_MAGIC		0xdee2
 /* Current version of SFrame format.  */
-#define SFRAME_VERSION	SFRAME_VERSION_1
+#define SFRAME_VERSION	SFRAME_VERSION_2
 
 /* Various flags for SFrame.  */
 
@@ -193,6 +194,10 @@ typedef struct sframe_func_desc_entry
      ------------------------------------------------------------------------
      8               6                             5           4              0     */
   uint8_t sfde_func_info;
+  /* Size of the block of repeating insns.  Used for SFrame FDEs of type
+     SFRAME_FDE_TYPE_PCMASK.  */
+  uint8_t sfde_func_rep_size;
+  uint16_t sfde_func_padding2;
 } ATTRIBUTE_PACKED sframe_func_desc_entry;
 
 /* Macros to compose and decompose function info in FDE.  */
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 02/12] gas: generate SFrame section with version SFRAME_VERSION_2
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
  2023-06-27 21:20 ` [PATCH 01/12] sframe.h: format bump to SFrame version 2 Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 03/12] libsframe: add new APIs to get SFrame version Indu Bhagat
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

gas/
	* gen-sframe.c (sframe_set_version): Update to SFRAME_VERSION_2.
	(output_sframe): Likewise.

gas/testsuite/
	* gas/cfi-sframe/cfi-sframe-aarch64-1.d: Use SFRAME_VERSION_2.
	* gas/cfi-sframe/cfi-sframe-aarch64-2.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-aarch64-pac-ab-key-1.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-common-1.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-common-2.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-common-3.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-common-4.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-common-5.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-common-6.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-common-7.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-common-8.d: Likewise.
	* gas/cfi-sframe/cfi-sframe-x86_64-1.d: Likewise.
	* gas/cfi-sframe/common-empty-1.d: Likewise.
	* gas/cfi-sframe/common-empty-2.d: Likewise.
	* gas/cfi-sframe/common-empty-3.d: Likewise.
---
 gas/gen-sframe.c                                         | 9 +++++++--
 gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-1.d      | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-2.d      | 2 +-
 .../gas/cfi-sframe/cfi-sframe-aarch64-pac-ab-key-1.d     | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-2.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-3.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d       | 2 +-
 gas/testsuite/gas/cfi-sframe/common-empty-1.d            | 2 +-
 gas/testsuite/gas/cfi-sframe/common-empty-2.d            | 2 +-
 gas/testsuite/gas/cfi-sframe/common-empty-3.d            | 2 +-
 16 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index b0bf514be75..7fca83bd610 100644
--- a/gas/gen-sframe.c
+++ b/gas/gen-sframe.c
@@ -278,7 +278,10 @@ sframe_v1_set_func_info (unsigned int fde_type, unsigned int fre_type,
 static void
 sframe_set_version (uint32_t sframe_version ATTRIBUTE_UNUSED)
 {
-  sframe_ver_ops.format_version = SFRAME_VERSION_1;
+  sframe_ver_ops.format_version = SFRAME_VERSION_2;
+
+  /* These operations remain the same for SFRAME_VERSION_2 as fre_info and
+     func_info have not changed from SFRAME_VERSION_1.  */
 
   sframe_ver_ops.set_fre_info = sframe_v1_set_fre_info;
 
@@ -605,6 +608,8 @@ output_sframe_funcdesc (symbolS *start_of_fre_section,
 #else
   out_one (func_info);
 #endif
+  out_one (0);
+  out_two (0);
 }
 
 static void
@@ -1355,7 +1360,7 @@ output_sframe (segT sframe_seg)
   (void) sframe_seg;
 
   /* Setup the version specific access functions.  */
-  sframe_set_version (SFRAME_VERSION_1);
+  sframe_set_version (SFRAME_VERSION_2);
 
   /* Process all fdes and create SFrame stack trace information.  */
   create_sframe_all ();
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-1.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-1.d
index aeefbc9cdef..8ae46217117 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-1.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-1.d
@@ -5,7 +5,7 @@
 Contents of the SFrame section .sframe:
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 3
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-2.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-2.d
index 985f51fcda9..b7834d53b07 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-2.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-2.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 2
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-pac-ab-key-1.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-pac-ab-key-1.d
index 666a94101ab..599d4c4e795 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-pac-ab-key-1.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-pac-ab-key-1.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 2
     Num FREs: 6
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1.d
index 7d97383bb90..32577f31860 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-1.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 1
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-2.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-2.d
index fc7d5c440db..3e3f74dbe42 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-2.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-2.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 1
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-3.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-3.d
index 95954508e3d..6430d463a89 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-3.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-3.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 1
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d
index b835980ecbd..319ff96cce2 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-4.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 3
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d
index d2bef7507c2..82d34973ddd 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-5.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 3
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d
index f915ac5f234..fe6917c7080 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-6.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 3
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d
index cab19d5bc25..39724d9cdf1 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-7.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 3
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d
index c0a4a8de250..c0a0e627fad 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-8.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 2
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d
index bba3b5920f1..ae36c21b3b7 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-x86_64-1.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 1
     Num FREs: 4
diff --git a/gas/testsuite/gas/cfi-sframe/common-empty-1.d b/gas/testsuite/gas/cfi-sframe/common-empty-1.d
index 0b09799826c..141922517f0 100644
--- a/gas/testsuite/gas/cfi-sframe/common-empty-1.d
+++ b/gas/testsuite/gas/cfi-sframe/common-empty-1.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 0
     Num FREs: 0
diff --git a/gas/testsuite/gas/cfi-sframe/common-empty-2.d b/gas/testsuite/gas/cfi-sframe/common-empty-2.d
index e566c078249..ab8de0b8afa 100644
--- a/gas/testsuite/gas/cfi-sframe/common-empty-2.d
+++ b/gas/testsuite/gas/cfi-sframe/common-empty-2.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 0
     Num FREs: 0
diff --git a/gas/testsuite/gas/cfi-sframe/common-empty-3.d b/gas/testsuite/gas/cfi-sframe/common-empty-3.d
index f7a6062d392..df0b19ee1bd 100644
--- a/gas/testsuite/gas/cfi-sframe/common-empty-3.d
+++ b/gas/testsuite/gas/cfi-sframe/common-empty-3.d
@@ -6,7 +6,7 @@ Contents of the SFrame section .sframe:
 
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: NONE
     Num FDEs: 0
     Num FREs: 0
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 03/12] libsframe: add new APIs to get SFrame version
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
  2023-06-27 21:20 ` [PATCH 01/12] sframe.h: format bump to SFrame version 2 Indu Bhagat
  2023-06-27 21:20 ` [PATCH 02/12] gas: generate SFrame section with version SFRAME_VERSION_2 Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 04/12] libsframe: add new APIs to add and get SFrame FDE in SFrame version 2 Indu Bhagat
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

While the SFrame preamble is guaranteed to not change between versions,
providing these access APIs from the SFrame decoder and encoder APIs is
for convenience only.  The linker may want to use these APIs as the
format evolves.

include/
	* sframe-api.h (sframe_decoder_get_version): New declaration.
	(sframe_encoder_get_version): Likewise.

libsframe/
	* libsframe/libsframe.ver: Add new APIs.
	* libsframe/sframe.c (sframe_decoder_get_version): New
	definition.
	(sframe_encoder_get_version): Likewise.
---
 include/sframe-api.h    |  8 ++++++++
 libsframe/libsframe.ver |  2 ++
 libsframe/sframe.c      | 20 ++++++++++++++++++++
 3 files changed, 30 insertions(+)

diff --git a/include/sframe-api.h b/include/sframe-api.h
index 7594011a48f..7883b668e31 100644
--- a/include/sframe-api.h
+++ b/include/sframe-api.h
@@ -120,6 +120,10 @@ sframe_decoder_get_hdr_size (sframe_decoder_ctx *dctx);
 extern uint8_t
 sframe_decoder_get_abi_arch (sframe_decoder_ctx *dctx);
 
+/* Get the format version from the SFrame decoder context DCTX.  */
+extern uint8_t
+sframe_decoder_get_version (sframe_decoder_ctx *dctx);
+
 /* Return the number of function descriptor entries in the SFrame decoder
    DCTX.  */
 extern uint32_t
@@ -217,6 +221,10 @@ sframe_encoder_get_hdr_size (sframe_encoder_ctx *encoder);
 extern uint8_t
 sframe_encoder_get_abi_arch (sframe_encoder_ctx *encoder);
 
+/* Get the format version from the SFrame encoder context ENCODER.  */
+extern uint8_t
+sframe_encoder_get_version (sframe_encoder_ctx *encoder);
+
 /* Return the number of function descriptor entries in the SFrame encoder
    ENCODER.  */
 extern uint32_t
diff --git a/libsframe/libsframe.ver b/libsframe/libsframe.ver
index 2c2081f311a..3e2a5695e93 100644
--- a/libsframe/libsframe.ver
+++ b/libsframe/libsframe.ver
@@ -13,6 +13,7 @@ LIBSFRAME_1.0 {
     sframe_decode;
     sframe_decoder_get_hdr_size;
     sframe_decoder_get_abi_arch;
+    sframe_decoder_get_version;
     sframe_decoder_get_fixed_fp_offset;
     sframe_decoder_get_fixed_ra_offset;
     sframe_get_funcdesc_with_addr;
@@ -24,6 +25,7 @@ LIBSFRAME_1.0 {
     sframe_encoder_free;
     sframe_encoder_get_hdr_size;
     sframe_encoder_get_abi_arch;
+    sframe_encoder_get_version;
     sframe_encoder_get_num_fidx;
     sframe_encoder_add_fre;
     sframe_encoder_add_funcdesc;
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index fd966cfffd4..cb73a0ca87f 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -988,6 +988,16 @@ sframe_decoder_get_abi_arch (sframe_decoder_ctx *dctx)
   return sframe_header->sfh_abi_arch;
 }
 
+/* Get the format version from the SFrame decoder context DCTX.  */
+
+uint8_t
+sframe_decoder_get_version (sframe_decoder_ctx *dctx)
+{
+  sframe_header *dhp;
+  dhp = sframe_decoder_get_header (dctx);
+  return dhp->sfh_preamble.sfp_version;
+}
+
 /* Get the SFrame's fixed FP offset given the decoder context CTX.  */
 int8_t
 sframe_decoder_get_fixed_fp_offset (sframe_decoder_ctx *ctx)
@@ -1368,6 +1378,16 @@ sframe_encoder_get_abi_arch (sframe_encoder_ctx *encoder)
   return abi_arch;
 }
 
+/* Get the format version from the SFrame encoder context ENCODER.  */
+
+uint8_t
+sframe_encoder_get_version (sframe_encoder_ctx *encoder)
+{
+  sframe_header *ehp;
+  ehp = sframe_encoder_get_header (encoder);
+  return ehp->sfh_preamble.sfp_version;
+}
+
 /* Return the number of function descriptor entries in the SFrame encoder
    ENCODER.  */
 
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 04/12] libsframe: add new APIs to add and get SFrame FDE in SFrame version 2
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (2 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 03/12] libsframe: add new APIs to get SFrame version Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 05/12] libsframe: adjust version check in sframe_header_sanity_check_p Indu Bhagat
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

These APIs are used to:
  - get an SFrame FDE data from the decoder context, and
  - add an SFrame FDE to the encoder context.

The additional argument is useful for SFrame FDEs where FDE type is
SFRAME_FDE_TYPE_PCMASK.

include/
	* sframe-api.h (sframe_decoder_get_funcdesc_v2): New
	declaration.
	(sframe_encoder_add_funcdesc_v2): Likewise.
libsframe/
	* libsframe.ver: Add the new APIs.
	* sframe.c (sframe_decoder_get_funcdesc_v2): New definition.
	(sframe_encoder_add_funcdesc_v2): Likewise.
---
 include/sframe-api.h    | 23 ++++++++++++++++
 libsframe/libsframe.ver |  2 ++
 libsframe/sframe.c      | 61 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 86 insertions(+)

diff --git a/include/sframe-api.h b/include/sframe-api.h
index 7883b668e31..961ff7eb05f 100644
--- a/include/sframe-api.h
+++ b/include/sframe-api.h
@@ -172,6 +172,19 @@ sframe_decoder_get_funcdesc (sframe_decoder_ctx *ctx,
 			     int32_t *func_start_address,
 			     unsigned char *func_info);
 
+/* Get the data (NUM_FRES, FUNC_SIZE, FUNC_START_ADDRESS, FUNC_INFO,
+   REP_BLOCK_SIZE) from the function descriptor entry at index I'th
+   in the decoder CTX.  If failed, return error code.
+   This API is only available from SFRAME_VERSION_2.  */
+extern int
+sframe_decoder_get_funcdesc_v2 (sframe_decoder_ctx *ctx,
+				unsigned int i,
+				uint32_t *num_fres,
+				uint32_t *func_size,
+				int32_t *func_start_address,
+				unsigned char *func_info,
+				uint8_t *rep_block_size);
+
 /* SFrame textual dump.  */
 extern void
 dump_sframe (sframe_decoder_ctx *decoder, uint64_t addr);
@@ -246,6 +259,16 @@ sframe_encoder_add_funcdesc (sframe_encoder_ctx *encoder,
 			     unsigned char func_info,
 			     uint32_t num_fres);
 
+/* Add a new function descriptor entry with START_ADDR, FUNC_SIZE, FUNC_INFO
+   and REP_BLOCK_SIZE to the encoder.  */
+extern int
+sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *encoder,
+				int32_t start_addr,
+				uint32_t func_size,
+				unsigned char func_info,
+				uint8_t rep_block_size,
+				uint32_t num_fres);
+
 /* Serialize the contents of the encoder and return the buffer.  ENCODED_SIZE
    is updated to the size of the buffer.  Sets ERRP if failure.  */
 extern char  *
diff --git a/libsframe/libsframe.ver b/libsframe/libsframe.ver
index 3e2a5695e93..57f5fb6c378 100644
--- a/libsframe/libsframe.ver
+++ b/libsframe/libsframe.ver
@@ -20,6 +20,7 @@ LIBSFRAME_1.0 {
     sframe_find_fre;
     sframe_decoder_get_num_fidx;
     sframe_decoder_get_funcdesc;
+    sframe_decoder_get_funcdesc_v2;
     sframe_decoder_get_fre;
     sframe_encode;
     sframe_encoder_free;
@@ -29,6 +30,7 @@ LIBSFRAME_1.0 {
     sframe_encoder_get_num_fidx;
     sframe_encoder_add_fre;
     sframe_encoder_add_funcdesc;
+    sframe_encoder_add_funcdesc_v2;
     sframe_encoder_write;
     dump_sframe;
     sframe_errmsg;
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index cb73a0ca87f..7031cee50b8 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -1208,6 +1208,36 @@ sframe_decoder_get_funcdesc (sframe_decoder_ctx *ctx,
   return 0;
 }
 
+int
+sframe_decoder_get_funcdesc_v2 (sframe_decoder_ctx *dctx,
+				unsigned int i,
+				uint32_t *num_fres,
+				uint32_t *func_size,
+				int32_t *func_start_address,
+				unsigned char *func_info,
+				uint8_t *rep_block_size)
+{
+  sframe_func_desc_entry *fdp;
+  int err = 0;
+
+  if (dctx == NULL || func_start_address == NULL
+      || num_fres == NULL || func_size == NULL
+      || sframe_decoder_get_version (dctx) == SFRAME_VERSION_1)
+    return sframe_set_errno (&err, SFRAME_ERR_INVAL);
+
+  fdp = sframe_decoder_get_funcdesc_at_index (dctx, i);
+
+  if (fdp == NULL)
+    return sframe_set_errno (&err, SFRAME_ERR_FDE_NOTFOUND);
+
+  *num_fres = fdp->sfde_func_num_fres;
+  *func_start_address = fdp->sfde_func_start_address;
+  *func_size = fdp->sfde_func_size;
+  *func_info = fdp->sfde_func_info;
+  *rep_block_size = fdp->sfde_func_rep_size;
+
+  return 0;
+}
 /* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
    descriptor entry in the SFrame decoder CTX.  Returns error code as
    applicable.  */
@@ -1579,6 +1609,37 @@ bad:
   return -1;
 }
 
+/* Add a new function descriptor entry with START_ADDR, FUNC_SIZE, FUNC_INFO
+   and REP_BLOCK_SIZE to the encoder.
+
+   This API is valid only for SFrame format version 2.  */
+
+int
+sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *encoder,
+				int32_t start_addr,
+				uint32_t func_size,
+				unsigned char func_info,
+				uint8_t rep_block_size,
+				uint32_t num_fres __attribute__ ((unused)))
+{
+  sf_fde_tbl *fd_info;
+  int err;
+
+  if (encoder == NULL
+      || sframe_encoder_get_version (encoder) == SFRAME_VERSION_1)
+    return sframe_set_errno (&err, SFRAME_ERR_INVAL);
+
+  err = sframe_encoder_add_funcdesc (encoder, start_addr, func_size, func_info,
+				     num_fres);
+  if (err)
+    return SFRAME_ERR;
+
+  fd_info = encoder->sfe_funcdesc;
+  fd_info->entry[fd_info->count-1].sfde_func_rep_size = rep_block_size;
+
+  return 0;
+}
+
 static int
 sframe_sort_funcdesc (sframe_encoder_ctx *encoder)
 {
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 05/12] libsframe: adjust version check in sframe_header_sanity_check_p
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (3 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 04/12] libsframe: add new APIs to add and get SFrame FDE in SFrame version 2 Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 06/12] libsframe: testsuite: fixes for SFRAME_VERSION_2 Indu Bhagat
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

libsframe/
	* sframe.c (sframe_header_sanity_check_p): Include
	SFRAME_VERSION_2.
---
 libsframe/sframe.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index 7031cee50b8..6faae8d96ef 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -206,9 +206,10 @@ sframe_header_sanity_check_p (sframe_header *hp)
 {
   unsigned char all_flags = SFRAME_F_FDE_SORTED | SFRAME_F_FRAME_POINTER;
   /* Check preamble is valid.  */
-  if ((hp->sfh_preamble.sfp_magic != SFRAME_MAGIC)
-      || (hp->sfh_preamble.sfp_version != SFRAME_VERSION)
-      || ((hp->sfh_preamble.sfp_flags | all_flags) != all_flags))
+  if (hp->sfh_preamble.sfp_magic != SFRAME_MAGIC
+      || (hp->sfh_preamble.sfp_version != SFRAME_VERSION_1
+	  && hp->sfh_preamble.sfp_version != SFRAME_VERSION_2)
+      || (hp->sfh_preamble.sfp_flags | all_flags) != all_flags)
     return false;
 
   /* Check offsets are valid.  */
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 06/12] libsframe: testsuite: fixes for SFRAME_VERSION_2
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (4 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 05/12] libsframe: adjust version check in sframe_header_sanity_check_p Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 07/12] bfd: linker: add support for rep_block_size for pltN entries Indu Bhagat
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

libsframe/
	* testsuite/libsframe.decode/DATA-BE: Regenerated data file.
	* testsuite/libsframe.decode/DATA1: Likewise.
	* testsuite/libsframe.decode/DATA2: Likewise.
	* testsuite/libsframe.encode/encode-1.c: Use new API in the
	testcase.
---
 libsframe/testsuite/libsframe.decode/DATA-BE    | Bin 64 -> 67 bytes
 libsframe/testsuite/libsframe.decode/DATA1      | Bin 60 -> 63 bytes
 libsframe/testsuite/libsframe.decode/DATA2      | Bin 92 -> 98 bytes
 libsframe/testsuite/libsframe.encode/encode-1.c |   6 +++---
 4 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/libsframe/testsuite/libsframe.decode/DATA-BE b/libsframe/testsuite/libsframe.decode/DATA-BE
index 3e19ff48e9c67f30645a9d8bdca0af834dd345f4..b31b905571313aabe3ac84c334ce0a9e0788225f 100644
GIT binary patch
literal 67
vcmccjh>3xb0SrJCD-a7qxC|mt+6793<QN#38CcjAUOdoYW-tKJ4$KSytZoLu

literal 64
tcmccjh>?Mj0SrJCD-a7qxD0|&+677j<(L^**cBeU&|zjU0MQQ23;?AA2E70P

diff --git a/libsframe/testsuite/libsframe.decode/DATA1 b/libsframe/testsuite/libsframe.decode/DATA1
index 2b3ef8e4e727ac30c993903a320698bbd6e098b9..1e675398af503ffea686f989b283b07329ee9dea 100644
GIT binary patch
literal 63
zcmaEKkBO0);RgdF0|NsK5c2~u2#5f2+K2!DrNKOi9GJ<>!N@A`frUljgA^;r2LLbm
B35oy!

literal 60
zcmaEKkCBm?;RgdF0|NsK5c2~u2nYgk+K2!DrNKOi90LP02P3P%2No8A4^pfg9{?Oh
B35Eaw

diff --git a/libsframe/testsuite/libsframe.decode/DATA2 b/libsframe/testsuite/libsframe.decode/DATA2
index 68fc2d240cd34878747f552d1b12bbc0e59a5217..472f736f872a0bb23b8f075a2b6da8d3aeaabbcd 100644
GIT binary patch
literal 98
zcmaEKkBO0);Rgc~0|NsG5X%8E2xtJY-G~4GrNKM~1{NqC2^13mviX4+CdR<b!N@A`
SfrUljgA^;r2P7^(kP86w+YlK5

literal 92
zcmaEKkCBm?;Rgc~0|NsG5X%8E2q*!u-G~4GrNKM~1{M$<2^0_j()>US7GPlJU}P2e
Sz``Q%L5h{*0}_`X$OQnwj}Q_7

diff --git a/libsframe/testsuite/libsframe.encode/encode-1.c b/libsframe/testsuite/libsframe.encode/encode-1.c
index 15aeee8922c..025f5556759 100644
--- a/libsframe/testsuite/libsframe.encode/encode-1.c
+++ b/libsframe/testsuite/libsframe.encode/encode-1.c
@@ -41,7 +41,7 @@ add_fde1 (sframe_encoder_ctx *encode, int idx)
 
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
 						     SFRAME_FDE_TYPE_PCINC);
-  err = sframe_encoder_add_funcdesc (encode, 0xfffff03e, 0x1b, finfo, 4);
+  err = sframe_encoder_add_funcdesc_v2 (encode, 0xfffff03e, 0x1b, finfo, 0, 4);
   if (err == -1)
     return err;
 
@@ -66,7 +66,7 @@ add_fde2 (sframe_encoder_ctx *encode, int idx)
 
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
 						     SFRAME_FDE_TYPE_PCINC);
-  err = sframe_encoder_add_funcdesc (encode, 0xfffff059, 0x10, finfo, 4);
+  err = sframe_encoder_add_funcdesc_v2 (encode, 0xfffff059, 0x10, finfo, 0, 4);
   if (err == -1)
     return err;
 
@@ -145,7 +145,7 @@ int main (void)
     }                                                                         \
     while (0)
 
-  encode = sframe_encode (SFRAME_VERSION, 0,
+  encode = sframe_encode (SFRAME_VERSION_2, 0,
 			  SFRAME_ABI_AMD64_ENDIAN_LITTLE,
 			  SFRAME_CFA_FIXED_FP_INVALID,
 			  -8, /* Fixed RA offset for AMD64.  */
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 07/12] bfd: linker: add support for rep_block_size for pltN entries
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (5 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 06/12] libsframe: testsuite: fixes for SFRAME_VERSION_2 Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 08/12] bfd: linker: generate SFrame sections with version SFRAME_VERSION_2 Indu Bhagat
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

Use the new SFrame V2 APIs to encode the size of the pltN entries in the
SFrame FDE.

bfd/
	* elf-sframe.c (_bfd_elf_merge_section_sframe): Use new API.
	* elfxx-x86.c (_bfd_x86_elf_create_sframe_plt): Likewise.
---
 bfd/elf-sframe.c | 16 +++++++++-------
 bfd/elfxx-x86.c  | 22 ++++++++++++----------
 2 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/bfd/elf-sframe.c b/bfd/elf-sframe.c
index 013a892e08a..c09822a5503 100644
--- a/bfd/elf-sframe.c
+++ b/bfd/elf-sframe.c
@@ -411,16 +411,18 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
   for (i = 0; i < num_fidx; i++)
     {
       unsigned int num_fres = 0;
-      int32_t func_start_address;
+      int32_t func_start_addr;
       bfd_vma address;
       uint32_t func_size = 0;
       unsigned char func_info = 0;
       unsigned int r_offset = 0;
       bool pltn_reloc_by_hand = false;
       unsigned int pltn_r_offset = 0;
+      uint8_t rep_block_size = 0;
 
-      if (!sframe_decoder_get_funcdesc (sfd_ctx, i, &num_fres, &func_size,
-					&func_start_address, &func_info))
+      if (!sframe_decoder_get_funcdesc_v2 (sfd_ctx, i, &num_fres, &func_size,
+					   &func_start_addr, &func_info,
+					   &rep_block_size))
 	{
 	  /* If function belongs to a deleted section, skip editing the
 	     function descriptor entry.  */
@@ -471,13 +473,13 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
 	      /* FIXME For testing only. Cleanup later.  */
 	      // address += (sec->output_section->vma);
 
-	      func_start_address = address;
+	      func_start_addr = address;
 	    }
 
 	  /* Update the encoder context with updated content.  */
-	  int err = sframe_encoder_add_funcdesc (sfe_ctx, func_start_address,
-						 func_size, func_info,
-						 num_fres);
+	  int err = sframe_encoder_add_funcdesc_v2 (sfe_ctx, func_start_addr,
+						    func_size, func_info,
+						    rep_block_size, num_fres);
 	  cur_fidx++;
 	  BFD_ASSERT (!err);
 	}
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index ffd02f137d1..b6512c9c49c 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -1900,11 +1900,12 @@ _bfd_x86_elf_create_sframe_plt (bfd *output_bfd,
     {
       /* Add SFrame FDE for plt0, the function start address is updated later
 	 at _bfd_elf_merge_section_sframe time.  */
-      sframe_encoder_add_funcdesc (*ectx,
-				   0, /* func start addr.  */
-				   plt0_entry_size,
-				   func_info,
-				   0 /* Num FREs.  */);
+      sframe_encoder_add_funcdesc_v2 (*ectx,
+				      0, /* func start addr.  */
+				      plt0_entry_size,
+				      func_info,
+				      16,
+				      0 /* Num FREs.  */);
       sframe_frame_row_entry plt0_fre;
       unsigned int num_plt0_fres = htab->sframe_plt->plt0_num_fres;
       for (unsigned int j = 0; j < num_plt0_fres; j++)
@@ -1928,11 +1929,12 @@ _bfd_x86_elf_create_sframe_plt (bfd *output_bfd,
 	 function start address = plt0_entry_size.  As usual, this will be
 	 updated later at _bfd_elf_merge_section_sframe, by when the
 	 sections are relocated.  */
-      sframe_encoder_add_funcdesc (*ectx,
-				   plt0_entry_size, /* func start addr.  */
-				   dpltsec->size - plt0_entry_size,
-				   func_info,
-				   0 /* Num FREs.  */);
+      sframe_encoder_add_funcdesc_v2 (*ectx,
+				      plt0_entry_size, /* func start addr.  */
+				      dpltsec->size - plt0_entry_size,
+				      func_info,
+				      16,
+				      0 /* Num FREs.  */);
 
       sframe_frame_row_entry pltn_fre;
       /* Now add the FREs for pltn.  Simply adding the two FREs suffices due
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 08/12] bfd: linker: generate SFrame sections with version SFRAME_VERSION_2
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (6 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 07/12] bfd: linker: add support for rep_block_size for pltN entries Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 09/12] objdump/readelf: adjust for SFRAME_VERSION_2 Indu Bhagat
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

The linker will generate the output SFrame sections in the
SFRAME_VERSION_2 format.  If the input sections offered to the linker
are not all in the SFRAME_VERSION_2 format, the linker issues an error
to the user.

bfd/
	* elf-sframe.c (_bfd_elf_merge_section_sframe): Generate an
	output SFrame section with version SFRAME_VERSION_2.  Also,
	error out if the SFrame sections do not all have
	SFRAME_VERSION_2.
	* elfxx-x86.c (_bfd_x86_elf_create_sframe_plt): Generate SFrame
	section for plt entries with version SFRAME_VERSION_2.

ld/testsuite/
	* ld-aarch64/sframe-simple-1.d: Adjust for SFRAME_VERSION_2.
	* ld-x86-64/sframe-plt-1.d: Likewise.
	* ld-x86-64/sframe-simple-1.d: Likewise.
---
 bfd/elf-sframe.c                          | 16 +++++++++++++++-
 bfd/elfxx-x86.c                           |  2 +-
 ld/testsuite/ld-aarch64/sframe-simple-1.d |  4 ++--
 ld/testsuite/ld-x86-64/sframe-plt-1.d     |  2 +-
 ld/testsuite/ld-x86-64/sframe-simple-1.d  |  4 ++--
 5 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/bfd/elf-sframe.c b/bfd/elf-sframe.c
index c09822a5503..1b38768ec71 100644
--- a/bfd/elf-sframe.c
+++ b/bfd/elf-sframe.c
@@ -328,6 +328,8 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
   uint8_t sfd_ctx_abi_arch;
   int8_t sfd_ctx_fixed_fp_offset;
   int8_t sfd_ctx_fixed_ra_offset;
+  uint8_t dctx_version;
+  uint8_t ectx_version;
   int encerr = 0;
 
   struct elf_link_hash_table *htab;
@@ -361,7 +363,7 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
       if (!sfd_ctx_abi_arch)
 	return false;
 
-      htab->sfe_info.sfe_ctx = sframe_encode (SFRAME_VERSION_1,
+      htab->sfe_info.sfe_ctx = sframe_encode (SFRAME_VERSION_2,
 					      0, /* SFrame flags.  */
 					      sfd_ctx_abi_arch,
 					      sfd_ctx_fixed_fp_offset,
@@ -400,6 +402,18 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
       return false;
     }
 
+  /* Check that all .sframe sections being linked have the same version.  */
+  dctx_version = sframe_decoder_get_version (sfd_ctx);
+  ectx_version = sframe_encoder_get_version (sfe_ctx);
+  if (dctx_version != SFRAME_VERSION_2 || dctx_version != ectx_version)
+    {
+      _bfd_error_handler
+	(_("input SFrame sections with different format versions prevent"
+	  " .sframe generation"));
+      return false;
+    }
+
+
   /* Iterate over the function descriptor entries and the FREs of the
      function from the decoder context.  Add each of them to the encoder
      context, if suitable.  */
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index b6512c9c49c..f224e8f1354 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -1883,7 +1883,7 @@ _bfd_x86_elf_create_sframe_plt (bfd *output_bfd,
       break;
     }
 
-  *ectx = sframe_encode (SFRAME_VERSION_1,
+  *ectx = sframe_encode (SFRAME_VERSION_2,
 			 0,
 			 SFRAME_ABI_AMD64_ENDIAN_LITTLE,
 			 SFRAME_CFA_FIXED_FP_INVALID,
diff --git a/ld/testsuite/ld-aarch64/sframe-simple-1.d b/ld/testsuite/ld-aarch64/sframe-simple-1.d
index 6f617153a35..6ab8c2ab46a 100644
--- a/ld/testsuite/ld-aarch64/sframe-simple-1.d
+++ b/ld/testsuite/ld-aarch64/sframe-simple-1.d
@@ -3,14 +3,14 @@
 #source: sframe-bar.s
 #objdump: --sframe=.sframe
 #ld: -shared
-#name: SFrame Simple link
+#name: SFrame simple link
 
 .*:     file format .*
 
 Contents of the SFrame section .sframe:
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: SFRAME_F_FDE_SORTED
     Num FDEs: 2
     Num FREs: 2
diff --git a/ld/testsuite/ld-x86-64/sframe-plt-1.d b/ld/testsuite/ld-x86-64/sframe-plt-1.d
index 06bb16bd482..5e734610b97 100644
--- a/ld/testsuite/ld-x86-64/sframe-plt-1.d
+++ b/ld/testsuite/ld-x86-64/sframe-plt-1.d
@@ -10,7 +10,7 @@
 Contents of the SFrame section .sframe:
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: SFRAME_F_FDE_SORTED
 #...
 
diff --git a/ld/testsuite/ld-x86-64/sframe-simple-1.d b/ld/testsuite/ld-x86-64/sframe-simple-1.d
index afc0006112e..7f4db31fe1b 100644
--- a/ld/testsuite/ld-x86-64/sframe-simple-1.d
+++ b/ld/testsuite/ld-x86-64/sframe-simple-1.d
@@ -3,14 +3,14 @@
 #source: sframe-bar.s
 #objdump: --sframe=.sframe
 #ld: -shared
-#name: SFrame Simple link
+#name: SFrame simple link
 
 .*: +file format .*
 
 Contents of the SFrame section .sframe:
   Header :
 
-    Version: SFRAME_VERSION_1
+    Version: SFRAME_VERSION_2
     Flags: SFRAME_F_FDE_SORTED
 #...
 
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 09/12] objdump/readelf: adjust for SFRAME_VERSION_2
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (7 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 08/12] bfd: linker: generate SFrame sections with version SFRAME_VERSION_2 Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-28 23:04   ` Hans-Peter Nilsson
  2023-06-27 21:20 ` [PATCH 10/12] doc: sframe: update specification " Indu Bhagat
                   ` (2 subsequent siblings)
  11 siblings, 1 reply; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

Make adjustments to account for a new format version and its name.
Also shuffle some code to make it more readable and use the available
APIs rather than direct access.

objdump/readelf will show the following message to the user if .sframe
section in SFRAME_VERSION_1 format is seen:

 "No further information can be displayed.  SFrame version not
 supported."

In other words, like the rest of the binutils, only the current SFrame
format version, i.e., SFRAME_VERSION_2 is supported by the textual dump
facilities.

libsframe/
	* sframe-dump.c (dump_sframe_header): Add support for
	SFRAME_VERSION_2.
	(dump_sframe): Inform user if SFrame section in SFRAME_VERSION_1
	format is seen.
---
 libsframe/sframe-dump.c | 42 +++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/libsframe/sframe-dump.c b/libsframe/sframe-dump.c
index 4799652f727..bb83528bc79 100644
--- a/libsframe/sframe-dump.c
+++ b/libsframe/sframe-dump.c
@@ -43,27 +43,33 @@ is_sframe_abi_arch_aarch64 (sframe_decoder_ctx *sfd_ctx)
 static void
 dump_sframe_header (sframe_decoder_ctx *sfd_ctx)
 {
-  const char *verstr = NULL;
+  uint8_t ver;
+  uint8_t flags;
+  char *flags_str;
+  const char *ver_str = NULL;
   const sframe_header *header = &(sfd_ctx->sfd_header);
 
   /* Prepare SFrame section version string.  */
   const char *version_names[]
     = { "NULL",
-	"SFRAME_VERSION_1" };
-  unsigned char ver = header->sfh_preamble.sfp_version;
+	"SFRAME_VERSION_1",
+	"SFRAME_VERSION_2" };
+
+  /* PS: Keep SFRAME_HEADER_FLAGS_STR_MAX_LEN in sync if adding more members to
+     this array.  */
+  const char *flag_names[]
+    = { "SFRAME_F_FDE_SORTED",
+	"SFRAME_F_FRAME_POINTER" };
+
+  ver = sframe_decoder_get_version (sfd_ctx);
   if (ver <= SFRAME_VERSION)
-    verstr = version_names[ver];
+    ver_str = version_names[ver];
 
   /* Prepare SFrame section flags string.  */
-  unsigned char flags = header->sfh_preamble.sfp_flags;
-  char *flags_str
-    = (char*) calloc (sizeof (char), SFRAME_HEADER_FLAGS_STR_MAX_LEN);
+  flags = header->sfh_preamble.sfp_flags;
+  flags_str = (char*) calloc (sizeof (char), SFRAME_HEADER_FLAGS_STR_MAX_LEN);
   if (flags)
     {
-      const char *flag_names[]
-	= { "SFRAME_F_FDE_SORTED",
-	    "SFRAME_F_FRAME_POINTER" };
-      unsigned char flags = header->sfh_preamble.sfp_flags;
       if (flags & SFRAME_F_FDE_SORTED)
 	strcpy (flags_str, flag_names[0]);
       if (flags & SFRAME_F_FRAME_POINTER)
@@ -80,9 +86,9 @@ dump_sframe_header (sframe_decoder_ctx *sfd_ctx)
   printf ("\n");
   printf ("  %s :\n", subsec_name);
   printf ("\n");
-  printf ("    Version: %s\n", verstr);
+  printf ("    Version: %s\n", ver_str);
   printf ("    Flags: %s\n", flags_str);
-  printf ("    Num FDEs: %d\n", header->sfh_num_fdes);
+  printf ("    Num FDEs: %d\n", sframe_decoder_get_num_fidx (sfd_ctx));
   printf ("    Num FREs: %d\n", header->sfh_num_fres);
 
   free (flags_str);
@@ -203,6 +209,14 @@ dump_sframe_functions (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
 void
 dump_sframe (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
 {
+  uint8_t ver;
+
   dump_sframe_header (sfd_ctx);
-  dump_sframe_functions (sfd_ctx, sec_addr);
+
+  ver = sframe_decoder_get_version (sfd_ctx);
+  if (ver == SFRAME_VERSION)
+    dump_sframe_functions (sfd_ctx, sec_addr);
+  else
+    printf ("\n No further information can be displayed.  %s",
+	    "SFrame version not supported\n");
 }
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 10/12] doc: sframe: update specification for SFRAME_VERSION_2
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (8 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 09/12] objdump/readelf: adjust for SFRAME_VERSION_2 Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 11/12] doc: sframe: add details about alignment in the SFrame format Indu Bhagat
  2023-06-27 21:20 ` [PATCH 12/12] binutils/NEWS: announce SFrame version 2 as the new default Indu Bhagat
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

Add details for the changes made from Version 1 to Version 2 of the format.
---
 libsframe/doc/sframe-spec.texi | 68 +++++++++++++++++++++++++++++-----
 1 file changed, 58 insertions(+), 10 deletions(-)

diff --git a/libsframe/doc/sframe-spec.texi b/libsframe/doc/sframe-spec.texi
index a37a6f91414..68f465e2aa7 100644
--- a/libsframe/doc/sframe-spec.texi
+++ b/libsframe/doc/sframe-spec.texi
@@ -20,7 +20,7 @@ License''.
 
 @titlepage
 @title The SFrame Format
-@subtitle Version 1
+@subtitle Version 2
 @author Indu Bhagat
 
 @page
@@ -33,7 +33,7 @@ License''.
 @node Top
 @top The SFrame format
 
-This manual describes version 1 of the SFrame file format.  SFrame stands for
+This manual describes version 2 of the SFrame file format.  SFrame stands for
 Simple Frame format.  SFrame format keeps track of the minimal necessary
 information needed for generating stack traces:
 
@@ -50,17 +50,25 @@ The reason for existence of the SFrame format is to provide a simple, fast and
 low-overhead mechanism to generate stack traces.
 
 @menu
-* Overview::
+* Introduction::
 * SFrame section::
 * Index::
 @end menu
 
 @end ifnottex
 
+@node Introduction
+@chapter Introduction
+@cindex Introduction
+
+@menu
+* Overview::
+* Changes from Version 1 to Version 2::
+@end menu
+
 @node Overview
-@unnumbered Overview
+@section Overview
 @cindex Overview
-@tindex PT_GNU_SFRAME
 
 The SFrame stack trace information is provided in a loaded section, known as the
 @code{.sframe} section.  When available, the @code{.sframe} section appears in
@@ -76,6 +84,11 @@ identify the endianness of the SFrame section.
 
 Addresses in this specification are expressed in bytes.
 
+The rest of this specification describes the current version of the format,
+@code{SFRAME_VERSION_2}, in detail.  Additional sections outline the major
+changes made to each previously published version of the SFrame stack trace
+format.
+
 The associated API to decode, probe and encode the SFrame section, provided via
 @code{libsframe}, is not accompanied here at this time.  This will be added
 later.
@@ -83,6 +96,26 @@ later.
 This document is intended to be in sync with the C code in @file{sframe.h}.
 Please report discrepancies between the two, if any.
 
+@node Changes from Version 1 to Version 2
+@section Changes from Version 1 to Version 2
+@cindex Changes from Version 1 to Version 2
+
+The following is a list of the changes made to the SFrame stack trace format
+since Version 1 was published.
+
+@itemize @bullet
+@item
+SFrame Function Descriptor Entry encodes the size of the repetitive code
+blocks, e.g., pltN entries for which an FDE of type SFRAME_FDE_TYPE_PCMASK is
+used.
+@item
+SFrame Function Descriptor Entry includes an explicit padding of two bytes to
+ensure natural alignment for its data members.
+@item
+The above two imply that each SFrame Function Descriptor Entry has a fixed size
+of 20 bytes instead of its size of 17 bytes in SFrame format version 1.
+@end itemize
+
 @node SFrame section
 @chapter SFrame section
 @cindex SFrame section
@@ -160,13 +193,15 @@ The version of the SFrame format can be determined by inspecting
 
 @tindex SFRAME_VERSION_1
 @cindex SFrame versions
-@multitable {SFRAME_VERSION_1} {Number} {First version, under development.}
+@multitable {SFRAME_VERSION_2} {Number} {Current version, under development.}
 @headitem Version @tab Number @tab Description
 @item @code{SFRAME_VERSION_1}
-@tab 1 @tab First version, under development.
+@tab 1 @tab First version, obsolete.
+@item @code{SFRAME_VERSION_2}
+@tab 2 @tab Current version, under development.
 @end multitable
 
-This section documents @code{SFRAME_VERSION_1}.
+This document describes @code{SFRAME_VERSION_2}.
 
 @node SFrame flags
 @subsection SFrame flags
@@ -344,6 +379,8 @@ typedef struct sframe_func_desc_entry
   uint32_t sfde_func_start_fre_off;
   uint32_t sfde_func_num_fres;
   uint8_t sfde_func_info;
+  uint8_t sfde_func_rep_size;
+  uint16_t sfde_func_padding2;
 @} ATTRIBUTE_PACKED sframe_func_desc_entry;
 @end example
 
@@ -357,7 +394,7 @@ type and the FDE type for the function @xref{The SFrame FDE info word}.
 
 Following table describes each component of the SFrame FDE structure:
 
-@multitable {Offset} {@code{uint32_t sfde_func_start_fre_off}} {The ABI/arch identifier. See above}
+@multitable {Offset} {@code{uint32_t sfde_func_start_fre_off}} {Signed 32-bit integral field denoting the}
 @headitem Offset @tab Name @tab Description
 @item 0x00
 @tab @code{int32_t sfde_func_start_address}
@@ -381,7 +418,18 @@ used for the function.
 
 @item 0x10
 @tab @code{uint8_t sfde_func_info}
-@tab The SFrame FDE info word. @xref{The SFrame FDE info word}.
+@tab Unsigned 8-bit integral field specifying the SFrame FDE info word.
+@xref{The SFrame FDE info word}.
+
+@item 0x11
+@tab @code{uint8_t sfde_func_rep_size}
+@tab Unsigned 8-bit integral field specifying the size of the repetitive code
+block for which an SFrame FDE of type SFRAME_FDE_TYPE_PCMASK is used.  For
+example, in AMD64, the size of a pltN entry is 16 bytes.
+
+@item 0x12
+@tab @code{uint16_t sfde_func_padding2}
+@tab Padding of 2 bytes.  Currently unused bytes.
 
 @end multitable
 
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 11/12] doc: sframe: add details about alignment in the SFrame format
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (9 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 10/12] doc: sframe: update specification " Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  2023-06-27 21:20 ` [PATCH 12/12] binutils/NEWS: announce SFrame version 2 as the new default Indu Bhagat
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

A portion of the SFrame stack trace format has an unaligned on-disk
representation.  Add description at relevant points in the specification
to clarify the alignment related details.
---
 libsframe/doc/sframe-spec.texi | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/libsframe/doc/sframe-spec.texi b/libsframe/doc/sframe-spec.texi
index 68f465e2aa7..8a59aa76f52 100644
--- a/libsframe/doc/sframe-spec.texi
+++ b/libsframe/doc/sframe-spec.texi
@@ -77,6 +77,11 @@ a new segment of its own, PT_GNU_SFRAME.
 The SFrame format is currently supported only for select ABIs, namely, AMD64
 and AAPCS64.
 
+A portion of the SFrame format follows an unaligned on-disk representation.
+Some data structures, however, (namely the SFrame header and the SFrame
+function descriptor entry) have elements at their natural boundaries.  All data
+structures are packed, unless otherwise stated.
+
 The contents of the SFrame section are stored in the target endianness, i.e.,
 in the endianness of the system on which the section is targetted to be used.
 An SFrame section reader may use the magic number in the SFrame header to
@@ -147,6 +152,8 @@ typedef struct sframe_preamble
 @} ATTRIBUTE_PACKED sframe_preamble;
 @end example
 
+Every element of the SFrame preamble is naturally aligned.
+
 All values are stored in the endianness of the target system for which the
 SFrame section is intended.  Further details:
 
@@ -258,6 +265,8 @@ typedef struct sframe_header
 @} ATTRIBUTE_PACKED sframe_header;
 @end example
 
+Every element of the SFrame header is naturally aligned.
+
 The sub-section offsets, namely @code{sfh_fdeoff} and @code{sfh_freoff}, in the
 SFrame header are relative to the @emph{end} of the SFrame header; they are
 each an offset in bytes into the SFrame section where the SFrame FDE
@@ -384,6 +393,8 @@ typedef struct sframe_func_desc_entry
 @} ATTRIBUTE_PACKED sframe_func_desc_entry;
 @end example
 
+Every element of the SFrame function descriptor entry is naturally aligned.
+
 @code{sfde_func_start_fre_off} is the offset to the first SFrame FRE for the
 function.  This offset is relative to the @emph{end of the SFrame FDE}
 sub-section (unlike the offsets in the SFrame header, which are relative to the
@@ -608,6 +619,11 @@ typedef struct sframe_frame_row_entry_addr4
 @} ATTRIBUTE_PACKED sframe_frame_row_entry_addr4;
 @end example
 
+For ensuring compactness, SFrame frame row entries are stored unaligned on
+disk.  Appropriate mechanisms need to be employed, as necessary, by the
+serializing and deserializing entities, if unaligned accesses need to be
+avoided.
+
 @code{sfre_start_address} is an unsigned 8-bit/16-bit/32-bit integral field
 identifies the start address of the range of program counters, for which the
 SFrame FRE applies.  The value encoded in the @code{sfre_start_address} field
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 12/12] binutils/NEWS: announce SFrame version 2 as the new default
  2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
                   ` (10 preceding siblings ...)
  2023-06-27 21:20 ` [PATCH 11/12] doc: sframe: add details about alignment in the SFrame format Indu Bhagat
@ 2023-06-27 21:20 ` Indu Bhagat
  11 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-27 21:20 UTC (permalink / raw)
  To: binutils; +Cc: Indu Bhagat

---
 binutils/NEWS | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/binutils/NEWS b/binutils/NEWS
index 00ef7c43610..152e8d0ce64 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -13,6 +13,9 @@
   updates the ABI in an incompatible way: this includes removal of
   sframe_get_funcdesc_with_addr API, change in the behavior of
   sframe_fre_get_ra_offset and sframe_fre_get_fp_offset APIs.
+
+* SFrame Version 2 is now the default (and only) format version supported by
+  gas, ld, readelf and objdump.
   
 Changes in 2.40:
 
-- 
2.39.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 09/12] objdump/readelf: adjust for SFRAME_VERSION_2
  2023-06-27 21:20 ` [PATCH 09/12] objdump/readelf: adjust for SFRAME_VERSION_2 Indu Bhagat
@ 2023-06-28 23:04   ` Hans-Peter Nilsson
  2023-06-29  6:41     ` Indu Bhagat
  0 siblings, 1 reply; 15+ messages in thread
From: Hans-Peter Nilsson @ 2023-06-28 23:04 UTC (permalink / raw)
  To: Indu Bhagat; +Cc: binutils

On Tue, 27 Jun 2023, Indu Bhagat via Binutils wrote:
> Make adjustments to account for a new format version and its name.
> Also shuffle some code to make it more readable and use the available
> APIs rather than direct access.
> 
> objdump/readelf will show the following message to the user if .sframe
> section in SFRAME_VERSION_1 format is seen:
> 
>  "No further information can be displayed.  SFrame version not
>  supported."
> 
> In other words, like the rest of the binutils, only the current SFrame
> format version, i.e., SFRAME_VERSION_2 is supported by the textual dump
> facilities.

A decision that IMHO is counter to binutils philosophy (AFAIU), 
unless version 1 is actually generated by nobody nowhere.

If there are object files out there generated with version 1, 
support should be kept, at the very least for inspection tools.

brgds, H-P

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 09/12] objdump/readelf: adjust for SFRAME_VERSION_2
  2023-06-28 23:04   ` Hans-Peter Nilsson
@ 2023-06-29  6:41     ` Indu Bhagat
  0 siblings, 0 replies; 15+ messages in thread
From: Indu Bhagat @ 2023-06-29  6:41 UTC (permalink / raw)
  To: Hans-Peter Nilsson; +Cc: binutils

On 6/28/23 16:04, Hans-Peter Nilsson wrote:
> On Tue, 27 Jun 2023, Indu Bhagat via Binutils wrote:
>> Make adjustments to account for a new format version and its name.
>> Also shuffle some code to make it more readable and use the available
>> APIs rather than direct access.
>>
>> objdump/readelf will show the following message to the user if .sframe
>> section in SFRAME_VERSION_1 format is seen:
>>
>>   "No further information can be displayed.  SFrame version not
>>   supported."
>>
>> In other words, like the rest of the binutils, only the current SFrame
>> format version, i.e., SFRAME_VERSION_2 is supported by the textual dump
>> facilities.
> 
> A decision that IMHO is counter to binutils philosophy (AFAIU),
> unless version 1 is actually generated by nobody nowhere.
> 
> If there are object files out there generated with version 1,
> support should be kept, at the very least for inspection tools.
> 

SFrame Version 1 format definition had issues related to unaligned 
accesses. In most cases of when there are version 1 .sframe sections out 
there, those applications should ideally be rebuilt to switch to using 
SFRAME_VERSION_2.  When other assemblers and linkers begin to add 
support for SFrame format, SFRAME_VERSION_2 should be used as it is the 
latest - there is little incentive to implement SFRAME_VERSION_1 there.

The trouble with supporting both SFRAME_VERSION_1 and SFRAME_VERSION_2 
in readelf/objdump is that the abstraction sframe_func_desc_entry used 
in libsframe is the same as the binary representation defined in 
include/sframe.h. This means that to support two versions of SFrame FDE, 
libsframe will need to revisit some of its APIs and will be a bit of 
rejig. I tried to do some of this, but it looked very clunky to me.

The choice to keep libsframe's internal representation for SFrame FDE to 
be the same as the on-disk representation has the advantage that an 
unwinder does not need to do any copy operations at run time.  It could 
simply read the SFrame FDE from memory.

Thanks
Indu

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2023-06-29  6:42 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-27 21:20 [PATCH 00/12] SFrame Version 2 - definition and support Indu Bhagat
2023-06-27 21:20 ` [PATCH 01/12] sframe.h: format bump to SFrame version 2 Indu Bhagat
2023-06-27 21:20 ` [PATCH 02/12] gas: generate SFrame section with version SFRAME_VERSION_2 Indu Bhagat
2023-06-27 21:20 ` [PATCH 03/12] libsframe: add new APIs to get SFrame version Indu Bhagat
2023-06-27 21:20 ` [PATCH 04/12] libsframe: add new APIs to add and get SFrame FDE in SFrame version 2 Indu Bhagat
2023-06-27 21:20 ` [PATCH 05/12] libsframe: adjust version check in sframe_header_sanity_check_p Indu Bhagat
2023-06-27 21:20 ` [PATCH 06/12] libsframe: testsuite: fixes for SFRAME_VERSION_2 Indu Bhagat
2023-06-27 21:20 ` [PATCH 07/12] bfd: linker: add support for rep_block_size for pltN entries Indu Bhagat
2023-06-27 21:20 ` [PATCH 08/12] bfd: linker: generate SFrame sections with version SFRAME_VERSION_2 Indu Bhagat
2023-06-27 21:20 ` [PATCH 09/12] objdump/readelf: adjust for SFRAME_VERSION_2 Indu Bhagat
2023-06-28 23:04   ` Hans-Peter Nilsson
2023-06-29  6:41     ` Indu Bhagat
2023-06-27 21:20 ` [PATCH 10/12] doc: sframe: update specification " Indu Bhagat
2023-06-27 21:20 ` [PATCH 11/12] doc: sframe: add details about alignment in the SFrame format Indu Bhagat
2023-06-27 21:20 ` [PATCH 12/12] binutils/NEWS: announce SFrame version 2 as the new default Indu Bhagat

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).