]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[SFrame-V3] include: libsframe: bfd: gas: testsuite: support for signed 64-bit offset...
authorIndu Bhagat <indu.bhagat@oracle.com>
Tue, 28 Oct 2025 08:39:55 +0000 (01:39 -0700)
committerIndu Bhagat <indu.bhagat@oracle.com>
Tue, 9 Dec 2025 08:26:13 +0000 (00:26 -0800)
This change enables support text > 2 GiB in SFrame format.

Each SFrame FDE needs to hold information about the start PC of the
function it pertains to.  Currently, the field 'sfde_func_start_address'
in SFrame FDE is encoded as a 32-bit offset to the start PC of the
function from the field itself.

In SFrame V2, this offset was a signed 32-bit offset.  The signedness
gives the flexibility of having .sframe ELF section before or after the
.text* sections.  But the size of 32-bit puts the limitation that
.sframe togther with the .text* sections must fit the 2 GiB range.

Currently, if the linker sees the offset not representable as 32-bit
signed offset, it issues an error (not seen in the wild, simulated by
forcing a function to align via an '.align  2147483648' directive):

  test.o:(.sframe+0x1c): relocation truncated to fit: R_X86_64_PC32 against `.text'
  make: *** [Makefile:7: all] Error 1

ATM, EH Frame also suffers with the same issue.

Moving forward, some cloud applications have been shown to be nearing
1.5 GiB threshold.  Extending the offset to int64_t now seems to be good
choice to make now for future-proof'ing the sections.

The use of int64_t offset is done for all SFrame V3 sections.  This
bump from int32_t to int64_t should not lead to an increase in the size
of SFrame sections, because of the following additional changes to the
SFrame FDE specification:
  - Reduce the type of sfde_func_num_fres (from uint32_t to uint16_t)
  - Remove the 2 bytes of padding (sfde_func_padding2). These served the
    two-fold purpose of keeping FDE data aligned _and_ unused space for
    future needs.

Now that the offset is int64_t, start using the
sframe_decoder_get_funcdesc_v3 () instead of
sframe_decoder_get_funcdesc_v2 () in GNU ld.

This patch changes the offset type in the SFrame FDE definition to an
int64_t.  No further changes in gas are necessary because the code
already accounts for writing out as per the size of the member of the
struct:

  emit_expr (&exp, sizeof_member (sframe_func_desc_entry,
                                  sfde_func_start_address));

bfd/
* elf-sframe.c (sframe_read_value): Signed offset for start PC
is 8-bytes now.
(_bfd_elf_merge_section_sframe): Likewise.
* elf64-s390.c (_bfd_s390_elf_create_sframe_plt): Use V3 API.
(elf_s390_finish_dynamic_sections): Signed offset for start PC
is 8-bytes now.
* elfxx-x86.c (_bfd_x86_elf_create_sframe_plt): Use V3 API.
(_bfd_x86_elf_finish_dynamic_sections): Signed offset for start
PC is 8-bytes now.
libsframe/
* sframe-dump.c (dump_sframe_func_with_fres): Use int64_t.
* sframe.c (sframe_decoder_get_secrel_func_start_addr): Likewise.
(sframe_fre_check_range_p): Likewise.
(sframe_find_fre): Likewise.
(sframe_encoder_add_funcdesc): Likewise.
(sframe_encoder_write_fde): Write out int64_t now.
libsframe/testsuite/
* libsframe.decode/DATA2: Regenerate the data file.
* libsframe.encode/encode-1.c: Use int64_t for start pc offset.
* libsframe.find/findfre-1.c: Likewise.
* libsframe.find/findfunc-1.c: Likewise.
* libsframe.find/plt-findfre-1.c: Likewise.
* libsframe.find/plt-findfre-2.c: Likewise.
include/
* sframe-api.h (sframe_find_fre): Update arg type to int64_t.
(sframe_encoder_add_funcdesc): Likewise.
* sframe.h: Change data type to int64_t.

13 files changed:
bfd/elf-sframe.c
bfd/elf64-s390.c
bfd/elfxx-x86.c
include/sframe-api.h
include/sframe.h
libsframe/sframe-dump.c
libsframe/sframe.c
libsframe/testsuite/libsframe.decode/DATA2
libsframe/testsuite/libsframe.encode/encode-1.c
libsframe/testsuite/libsframe.find/findfre-1.c
libsframe/testsuite/libsframe.find/findfunc-1.c
libsframe/testsuite/libsframe.find/plt-findfre-1.c
libsframe/testsuite/libsframe.find/plt-findfre-2.c

index 5c7941b3ea30e33076f0f7963ba544cc081b7fe6..ba4827819ad4dd00a69e0f1d2e0f8c0836490fdc 100644 (file)
@@ -151,12 +151,12 @@ sframe_read_value (bfd *abfd, bfd_byte *contents, unsigned int offset,
                   unsigned int width)
 {
   BFD_ASSERT (contents && offset);
-  /* Supporting the usecase of reading only the 4-byte relocated
-     value (signed offset for func start addr) for now.  */
-  BFD_ASSERT (width == 4);
+  /* ATM, for SFrame, the sole usecase is of reading only the 8-byte relocated
+     value (signed offset for func start addr).  */
+  BFD_ASSERT (width == 8);
   /* FIXME endianness ?? */
   unsigned char *buf = contents + offset;
-  bfd_vma value = bfd_get_signed_32 (abfd, buf);
+  bfd_vma value = bfd_get_signed_64 (abfd, buf);
   return value;
 }
 
@@ -468,11 +468,12 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
 
   uint32_t num_fidx = sframe_decoder_get_num_fidx (sfd_ctx);
   uint32_t num_enc_fidx = sframe_encoder_get_num_fidx (sfe_ctx);
+  uint8_t reloc_size = 8;
 
   for (i = 0; i < num_fidx; i++)
     {
       unsigned int num_fres = 0;
-      int32_t func_start_addr;
+      int64_t func_start_addr;
       bfd_vma address;
       uint32_t func_size = 0;
       unsigned char func_info = 0;
@@ -481,7 +482,7 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
       unsigned int pltn_r_offset = 0;
       uint8_t rep_block_size = 0;
 
-      if (!sframe_decoder_get_funcdesc_v2 (sfd_ctx, i, &num_fres, &func_size,
+      if (!sframe_decoder_get_funcdesc_v3 (sfd_ctx, i, &num_fres, &func_size,
                                           &func_start_addr, &func_info,
                                           &rep_block_size))
        {
@@ -525,10 +526,11 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
                }
 
              /* Get the SFrame FDE function start address after relocation.  */
-             address = sframe_read_value (abfd, contents, r_offset, 4);
+             address = sframe_read_value (abfd, contents, r_offset,
+                                          reloc_size);
              if (pltn_reloc_by_hand)
-               address += sframe_read_value (abfd, contents,
-                                             pltn_r_offset, 4);
+               address += sframe_read_value (abfd, contents, pltn_r_offset,
+                                             reloc_size);
              address += (sec->output_offset + r_offset);
              /* SFrame FDE function start address is an offset from the
                 sfde_func_start_address field to the start PC.  The
@@ -547,7 +549,7 @@ _bfd_elf_merge_section_sframe (bfd *abfd,
            }
 
          /* Update the encoder context with updated content.  */
-         int err = sframe_encoder_add_funcdesc_v2 (sfe_ctx, func_start_addr,
+         int err = sframe_encoder_add_funcdesc_v3 (sfe_ctx, func_start_addr,
                                                    func_size, func_info,
                                                    rep_block_size, num_fres);
          cur_fidx++;
index aaa2d327d7e25e82ac3fde8a72f6e9ad0c832f92..ae609903d80ccd44bc9c4f86c9229caa9f098860 100644 (file)
@@ -1612,7 +1612,7 @@ _bfd_s390_elf_create_sframe_plt (struct bfd_link_info *info)
     {
       /* Add SFrame FDE for PLT0, the function start address is updated later
         at _bfd_elf_merge_section_sframe time.  */
-      sframe_encoder_add_funcdesc_v2 (*ectx,
+      sframe_encoder_add_funcdesc_v3 (*ectx,
                                      0, /* func start addr.  */
                                      plt0_entry_size,
                                      func_info,
@@ -1640,7 +1640,7 @@ _bfd_s390_elf_create_sframe_plt (struct bfd_link_info *info)
         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_v2 (*ectx,
+      sframe_encoder_add_funcdesc_v3 (*ectx,
                                      plt0_entry_size, /* func start addr.  */
                                      dpltsec->size - plt0_entry_size,
                                      func_info,
@@ -4030,7 +4030,7 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
          bfd_vma sframe_start = htab->plt_sframe->output_section->vma
                                   + htab->plt_sframe->output_offset
                                   + PLT_SFRAME_FDE_START_OFFSET;
-         bfd_put_signed_32 (dynobj, plt_start - sframe_start,
+         bfd_put_signed_64 (dynobj, plt_start - sframe_start,
                             htab->plt_sframe->contents
                             + PLT_SFRAME_FDE_START_OFFSET);
        }
index f0b021f15495dbda5bf7524ef10bcb5db142eb51..5f610ab3fc126c0e466002d5b75a1d87a494d088 100644 (file)
@@ -1923,7 +1923,7 @@ _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_v2 (*ectx,
+      sframe_encoder_add_funcdesc_v3 (*ectx,
                                      0, /* func start addr.  */
                                      plt0_entry_size,
                                      func_info,
@@ -1952,7 +1952,7 @@ _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_v2 (*ectx,
+      sframe_encoder_add_funcdesc_v3 (*ectx,
                                      plt0_entry_size, /* func start addr.  */
                                      dpltsec->size - plt0_entry_size,
                                      func_info,
@@ -3007,7 +3007,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
            + PLT_SFRAME_FDE_START_OFFSET;
          bfd_put_signed_32 (dynobj, test_value,
 #endif
-         bfd_put_signed_32 (dynobj, plt_start - sframe_start,
+         bfd_put_signed_64 (dynobj, plt_start - sframe_start,
                             htab->plt_sframe->contents
                             + PLT_SFRAME_FDE_START_OFFSET);
        }
@@ -3041,7 +3041,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
            + PLT_SFRAME_FDE_START_OFFSET;
          bfd_put_signed_32 (dynobj, test_value,
 #endif
-         bfd_put_signed_32 (dynobj, plt_start - sframe_start,
+         bfd_put_signed_64 (dynobj, plt_start - sframe_start,
                             htab->plt_second_sframe->contents
                             + PLT_SFRAME_FDE_START_OFFSET);
        }
@@ -3068,7 +3068,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
            = (htab->plt_got_sframe->output_section->vma
               + htab->plt_got_sframe->output_offset
               + PLT_SFRAME_FDE_START_OFFSET);
-         bfd_put_signed_32 (dynobj, plt_start - sframe_start,
+         bfd_put_signed_64 (dynobj, plt_start - sframe_start,
                             htab->plt_got_sframe->contents
                             + PLT_SFRAME_FDE_START_OFFSET);
        }
index a4ba797794f7944ba712d17a553c14c6382affa7..0745445635682589dff09e66aef1cae6203979d6 100644 (file)
@@ -157,7 +157,7 @@ sframe_decoder_get_fixed_ra_offset (const sframe_decoder_ctx *dctx);
    SFRAME_ERR if failure.  */
 
 extern int
-sframe_find_fre (const sframe_decoder_ctx *ctx, int32_t pc,
+sframe_find_fre (const sframe_decoder_ctx *ctx, int64_t pc,
                 sframe_frame_row_entry *frep);
 
 /* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
@@ -293,7 +293,7 @@ sframe_encoder_add_fre (sframe_encoder_ctx *ectx,
    the encoder context ECTX.  */
 extern int
 sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx,
-                            int32_t start_addr,
+                            int64_t start_addr,
                             uint32_t func_size);
 
 /* Add a new SFrame function descriptor entry with START_ADDR, FUNC_SIZE,
index fb4d7d03fce33c69df3c92fc088545930e3db34b..8588ba667eaeb7b035a19f94c1463013f90c6e0d 100644 (file)
@@ -244,7 +244,7 @@ typedef struct sframe_func_desc_entry_v3
 {
   /* Function start address.  Encoded as a signed offset, relative to the
      beginning of the current FDE.  */
-  int32_t sfde_func_start_address;
+  int64_t sfde_func_start_address;
   /* Size of the function in bytes.  */
   uint32_t sfde_func_size;
   /* Offset of the first SFrame Frame Row Entry of the function, relative to the
index 4837b456e3501d4a64b3850d0f3ee52885759a05..49fa7b28ce77ac61206151b493d8512b9cdf793f 100644 (file)
@@ -125,7 +125,6 @@ dump_sframe_func_with_fres (const sframe_decoder_ctx *sfd_ctx,
   uint32_t j = 0;
   uint32_t num_fres = 0;
   uint32_t func_size = 0;
-  int32_t func_start_address = 0;
   unsigned char func_info = 0;
   uint8_t rep_block_size = 0;
 
@@ -141,15 +140,30 @@ dump_sframe_func_with_fres (const sframe_decoder_ctx *sfd_ctx,
 
   sframe_frame_row_entry fre;
 
+  uint8_t ver = sframe_decoder_get_version (sfd_ctx);
+  sframe_assert (ver == SFRAME_VERSION_3 || ver == SFRAME_VERSION_2);
   /* Get the SFrame function descriptor.  */
-  sframe_decoder_get_funcdesc_v2 (sfd_ctx, funcidx, &num_fres,
-                                 &func_size, &func_start_address,
-                                 &func_info, &rep_block_size);
+  if (ver == SFRAME_VERSION_3)
+    {
+      int64_t func_start_addr = 0;
+      sframe_decoder_get_funcdesc_v3 (sfd_ctx, funcidx, &num_fres,
+                                     &func_size, &func_start_addr,
+                                     &func_info, &rep_block_size);
+      func_start_pc_vma = func_start_addr + sec_addr;
+    }
+  else
+    {
+      int32_t func_start_addr = 0;
+      sframe_decoder_get_funcdesc_v2 (sfd_ctx, funcidx, &num_fres, &func_size,
+                                     &func_start_addr, &func_info,
+                                     &rep_block_size);
+      func_start_pc_vma = func_start_addr + sec_addr;
+    }
+
 /* Calculate the virtual memory address for function start pc.  Some older
    SFrame V2 sections in ET_DYN or ET_EXEC may still have the
    SFRAME_F_FDE_FUNC_START_PCREL flag unset, and hence may be using the
    old encoding.  Continue to support dumping the sections at least.  */
-  func_start_pc_vma = func_start_address + sec_addr;
   if (sframe_decoder_get_flags (sfd_ctx) & SFRAME_F_FDE_FUNC_START_PCREL)
     func_start_pc_vma += sframe_decoder_get_offsetof_fde_start_addr (sfd_ctx,
                                                                     funcidx,
@@ -270,12 +284,12 @@ dump_sframe_functions (const sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
 void
 dump_sframe (const sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
 {
-  uint8_t ver;
-
   dump_sframe_header (sfd_ctx);
 
-  ver = sframe_decoder_get_version (sfd_ctx);
-  if (ver == SFRAME_VERSION)
+  uint8_t ver = sframe_decoder_get_version (sfd_ctx);
+  /* Although newer gas and ld do not generate SFrame V2, continue to support
+     textual dump of SFrame V2 sections ATM.  */
+  if (ver == SFRAME_VERSION_3 || ver == SFRAME_VERSION_2)
     dump_sframe_functions (sfd_ctx, sec_addr);
   else
     printf ("\n No further information can be displayed.  %s",
index f4c302643341c4e396baa4e1c73c1bfdfbd8b45f..8d8848fc37f90bcb8ea8b4fc17e99f0f84050a6f 100644 (file)
@@ -507,7 +507,7 @@ sframe_decoder_get_funcdesc_at_index (const sframe_decoder_ctx *ctx,
 
    If FUNC_IDX is not a valid index in the given decoder object, returns 0.  */
 
-static int32_t
+static int64_t
 sframe_decoder_get_secrel_func_start_addr (const sframe_decoder_ctx *dctx,
                                           uint32_t func_idx)
 {
@@ -519,7 +519,7 @@ sframe_decoder_get_secrel_func_start_addr (const sframe_decoder_ctx *dctx,
     return 0;
 
   const sframe_func_desc_entry_int *fdep = &dctx->sfd_funcdesc->entry[func_idx];
-  int32_t func_start_addr = fdep->func_start_addr;
+  int64_t func_start_addr = fdep->func_start_addr;
 
   return func_start_addr + offsetof_fde_in_sec;
 }
@@ -531,10 +531,10 @@ sframe_decoder_get_secrel_func_start_addr (const sframe_decoder_ctx *dctx,
 static bool
 sframe_fre_check_range_p (const sframe_decoder_ctx *dctx, uint32_t func_idx,
                          uint32_t start_ip_offset, uint32_t end_ip_offset,
-                         int32_t pc)
+                         int64_t pc)
 {
   sframe_func_desc_entry_int *fdep;
-  int32_t func_start_addr;
+  int64_t func_start_addr;
   uint8_t rep_block_size;
   uint32_t fde_type;
   uint32_t pc_offset;
@@ -1351,7 +1351,7 @@ sframe_decoder_get_offsetof_fde_start_addr (const sframe_decoder_ctx *dctx,
 
 static sframe_func_desc_entry_int *
 sframe_get_funcdesc_with_addr_internal (const sframe_decoder_ctx *ctx,
-                                       int32_t addr, int *errp,
+                                       int64_t addr, int *errp,
                                        uint32_t *func_idx)
 {
   sframe_func_desc_entry_int *fdp;
@@ -1427,14 +1427,14 @@ sframe_fre_get_end_ip_offset (sframe_func_desc_entry_int *fdep, unsigned int i,
    SFRAME_ERR if failure.  */
 
 int
-sframe_find_fre (const sframe_decoder_ctx *ctx, int32_t pc,
+sframe_find_fre (const sframe_decoder_ctx *ctx, int64_t pc,
                 sframe_frame_row_entry *frep)
 {
   sframe_frame_row_entry cur_fre;
   sframe_func_desc_entry_int *fdep;
   uint32_t func_idx;
   uint32_t fre_type, i;
-  int32_t func_start_addr;
+  int64_t func_start_addr;
   uint32_t start_ip_offset, end_ip_offset;
   const char *fres;
   size_t size = 0;
@@ -1871,7 +1871,7 @@ bad:
 
 static int
 sframe_encoder_add_funcdesc_internal (sframe_encoder_ctx *ectx,
-                                     int32_t start_addr,
+                                     int64_t start_addr,
                                      uint32_t func_size)
 {
   sframe_header *ehp;
@@ -1942,7 +1942,7 @@ bad:
    the encoder context ECTX.  */
 
 int
-sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx, int32_t start_addr,
+sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx, int64_t start_addr,
                             uint32_t func_size)
 {
   int err = 0;
@@ -2128,7 +2128,7 @@ sframe_encoder_write_fde (const sframe_header *sfhp ATTRIBUTE_UNUSED,
 {
   sframe_func_desc_entry_v3 *fdep = (sframe_func_desc_entry_v3 *)contents;
 
-  fdep->sfde_func_start_address = (int32_t)fde->func_start_addr;
+  fdep->sfde_func_start_address = fde->func_start_addr;
   fdep->sfde_func_size = fde->func_size;
   fdep->sfde_func_start_fre_off = fde->func_start_fre_off;
   fdep->sfde_func_num_fres = (uint16_t)fde->func_num_fres;
index b1069c3c4d106a6d6985832fa8c1610548155b90..06fd11bd8bf5423db874283e7a73e2464d981083 100644 (file)
Binary files a/libsframe/testsuite/libsframe.decode/DATA2 and b/libsframe/testsuite/libsframe.decode/DATA2 differ
index 335d3e6861f3077dc3b2770bba5f395c70290188..fe2d2543c79f09d20d20a6b7ecb35609f06c8aa2 100644 (file)
@@ -18,8 +18,8 @@
 #include "sframe-test.h"
 
 static int
-add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
-         uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde1 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+         int64_t sframe_vaddr, int idx, uint32_t *func_size)
 {
 #define FDE1_NUM_FRES    4
   /* A contiguous block containing 4 FREs.  */
@@ -35,11 +35,11 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
-  int32_t func1_start_addr = (start_pc_vaddr
+  int64_t func1_start_addr = (start_pc_vaddr
                              - (sframe_vaddr + offsetof_fde_in_sec));
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
                                                     SFRAME_FDE_TYPE_PCINC);
-  int err = sframe_encoder_add_funcdesc_v2 (encode, func1_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
                                            *func_size, finfo, 0,
                                            FDE1_NUM_FRES);
   if (err == -1)
@@ -53,8 +53,8 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 }
 
 static int
-add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
-         uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde2 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+         int64_t sframe_vaddr, int idx, uint32_t *func_size)
 
 {
   /* A contiguous block containing 4 FREs.  */
@@ -71,11 +71,11 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
-  int32_t func1_start_addr = (start_pc_vaddr
+  int64_t func1_start_addr = (start_pc_vaddr
                              - (sframe_vaddr + offsetof_fde_in_sec));
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
                                                     SFRAME_FDE_TYPE_PCINC);
-  int err = sframe_encoder_add_funcdesc_v2 (encode, func1_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
                                            *func_size, finfo, 0,
                                            FDE1_NUM_FRES);
   if (err == -1)
@@ -140,9 +140,9 @@ int main (void)
 {
   sframe_encoder_ctx *encode;
   sframe_frame_row_entry frep;
-  uint32_t sframe_vaddr;
-  uint32_t func1_start_vaddr;
-  uint32_t func2_start_vaddr;
+  int64_t sframe_vaddr;
+  int64_t func1_start_vaddr;
+  int64_t func2_start_vaddr;
   uint32_t func1_size = 0;
   uint32_t func2_size = 0;
   char *sframe_buf;
index c9048888d6d86495435d7b9f69803aa3c0c50f11..848b399f977f5ef48b20d572bcdf1684fd211dd1 100644 (file)
@@ -18,8 +18,8 @@
 #include "sframe-test.h"
 
 static int
-add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
-         uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde1 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+         int64_t sframe_vaddr, int idx, uint32_t *func_size)
 {
   /* A contiguous block containing 4 FREs.  */
 #define FDE1_NUM_FRES    4
@@ -35,11 +35,11 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
-  int32_t func1_start_addr = (start_pc_vaddr
+  int64_t func1_start_addr = (start_pc_vaddr
                              - (sframe_vaddr + offsetof_fde_in_sec));
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
                                                     SFRAME_FDE_TYPE_PCINC);
-  int err = sframe_encoder_add_funcdesc_v2 (encode, func1_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
                                            *func_size, finfo, 0,
                                            FDE1_NUM_FRES);
   if (err == -1)
@@ -53,8 +53,8 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 }
 
 static int
-add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
-         uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde2 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+         int64_t sframe_vaddr, int idx, uint32_t *func_size)
 {
   /* A contiguous block containing 4 FREs.  */
 #define FDE2_NUM_FRES    4
@@ -70,11 +70,11 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
-  int32_t func2_start_addr = (start_pc_vaddr
+  int64_t func2_start_addr = (start_pc_vaddr
                              - (sframe_vaddr + offsetof_fde_in_sec));
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
                                                     SFRAME_FDE_TYPE_PCINC);
-  int err = sframe_encoder_add_funcdesc_v2 (encode, func2_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (encode, func2_start_addr,
                                            *func_size, finfo, 0,
                                            FDE2_NUM_FRES);
   if (err == -1)
@@ -88,18 +88,18 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 }
 
 static
-void test_text_findfre (const char suffix, uint32_t text_vaddr,
-                       uint32_t sframe_vaddr)
+void test_text_findfre (const char suffix, int64_t text_vaddr,
+                       int64_t sframe_vaddr)
 {
   sframe_encoder_ctx *encode;
   sframe_decoder_ctx *dctx;
   sframe_frame_row_entry frep;
-  uint32_t func1_start_vaddr;
-  uint32_t func2_start_vaddr;
+  int64_t func1_start_vaddr;
+  int64_t func2_start_vaddr;
   uint32_t func1_size = 0;
   uint32_t func2_size = 0;
   uint32_t fde_cnt = 0;
-  int32_t lookup_pc;
+  int64_t lookup_pc;
   char *sframe_buf;
   size_t sf_size;
   int err = 0;
@@ -171,15 +171,15 @@ void test_text_findfre (const char suffix, uint32_t text_vaddr,
 
 int main (void)
 {
-  uint32_t sframe_vaddr = 0x402220;
-  uint32_t text_vaddr = 0x401020;
-  printf ("Testing with text_vaddr = %#x; sframe_vaddr = %#x\n", text_vaddr,
+  int64_t sframe_vaddr = 0x402220;
+  int64_t text_vaddr = 0x401020;
+  printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr,
          sframe_vaddr);
   test_text_findfre ('a', text_vaddr, sframe_vaddr);
 
   sframe_vaddr = 0x401020;
   text_vaddr = 0x402220;
-  printf ("Testing with text_vaddr = %#x; sframe_vaddr = %#x\n", text_vaddr,
+  printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr,
          sframe_vaddr);
   test_text_findfre ('b', text_vaddr, sframe_vaddr);
 }
index 14ff9c51f161b3def263bd6031192d940be467ca..27b902ee087bf4d623bf41e7cb70878b444c1d0c 100644 (file)
@@ -25,8 +25,8 @@
 #include "sframe-test.h"
 
 static int
-add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
-         uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde1 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+         int64_t sframe_vaddr, int idx, uint32_t *func_size)
 {
   /* A contiguous block containing 4 FREs.  */
 #define FDE1_NUM_FRES    4
@@ -42,11 +42,11 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
-  int32_t func1_start_addr = (start_pc_vaddr
+  int64_t func1_start_addr = (start_pc_vaddr
                              - (sframe_vaddr + offsetof_fde_in_sec));
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
                                                     SFRAME_FDE_TYPE_PCINC);
-  int err = sframe_encoder_add_funcdesc_v2 (encode, func1_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
                                            *func_size, finfo, 0,
                                            FDE1_NUM_FRES);
   if (err == -1)
@@ -60,8 +60,8 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 }
 
 static int
-add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
-         uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde2 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+         int64_t sframe_vaddr, int idx, uint32_t *func_size)
 {
   /* A contiguous block containing 4 FREs.  */
 #define FDE2_NUM_FRES    4
@@ -77,11 +77,11 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
-  int32_t func2_start_addr = (start_pc_vaddr
+  int64_t func2_start_addr = (start_pc_vaddr
                              - (sframe_vaddr + offsetof_fde_in_sec));
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
                                                     SFRAME_FDE_TYPE_PCINC);
-  int err = sframe_encoder_add_funcdesc_v2 (encode, func2_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (encode, func2_start_addr,
                                            *func_size, finfo, 0,
                                            FDE2_NUM_FRES);
   if (err == -1)
@@ -95,8 +95,8 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 }
 
 static int
-add_fde3 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
-         uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde3 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+         int64_t sframe_vaddr, int idx, uint32_t *func_size)
 {
   /* A contiguous block containing 4 FREs.  */
 #define FDE3_NUM_FRES    4
@@ -112,11 +112,11 @@ add_fde3 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
-  int32_t func3_start_addr = (start_pc_vaddr
+  int64_t func3_start_addr = (start_pc_vaddr
                              - (sframe_vaddr + offsetof_fde_in_sec));
   unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
                                                     SFRAME_FDE_TYPE_PCINC);
-  int err = sframe_encoder_add_funcdesc_v2 (encode, func3_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (encode, func3_start_addr,
                                            *func_size, finfo, 0,
                                            FDE3_NUM_FRES);
   if (err == -1)
@@ -130,20 +130,20 @@ add_fde3 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
 }
 
 static
-void test_text_findfre (const char suffix, uint32_t text_vaddr,
-                       uint32_t sframe_vaddr)
+void test_text_findfre (const char suffix, int64_t text_vaddr,
+                       int64_t sframe_vaddr)
 {
   sframe_encoder_ctx *encode;
   sframe_decoder_ctx *dctx;
   sframe_frame_row_entry frep;
-  uint32_t func1_start_vaddr;
-  uint32_t func2_start_vaddr;
-  uint32_t func3_start_vaddr;
+  int64_t func1_start_vaddr;
+  int64_t func2_start_vaddr;
+  int64_t func3_start_vaddr;
   uint32_t func1_size = 0;
   uint32_t func2_size = 0;
   uint32_t func3_size = 0;
   uint32_t fde_cnt = 0;
-  int32_t lookup_pc = 0;
+  int64_t lookup_pc = 0;
   char *sframe_buf;
   size_t sf_size;
   int err = 0;
@@ -233,15 +233,15 @@ void test_text_findfre (const char suffix, uint32_t text_vaddr,
 
 int main (void)
 {
-  uint32_t sframe_vaddr = 0x4b5620;
-  uint32_t text_vaddr = 0x4038b0;
-  printf ("Testing with text_vaddr = %#x; sframe_vaddr = %#x\n", text_vaddr,
+  int64_t sframe_vaddr = 0x4b5620;
+  int64_t text_vaddr = 0x4038b0;
+  printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr,
          sframe_vaddr);
   test_text_findfre ('a', text_vaddr, sframe_vaddr);
 
   sframe_vaddr = 0x4038b0;
   text_vaddr = 0x4b5620;
-  printf ("Testing with text_vaddr = %#x; sframe_vaddr = %#x\n", text_vaddr,
+  printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr,
          sframe_vaddr);
   test_text_findfre ('b', text_vaddr, sframe_vaddr);
 }
index f62ca3f84f5452fb759a4c63f84e9f049420955d..eb33b7de5cf14f217da8453042dbd4c380ccb384 100644 (file)
@@ -18,8 +18,8 @@
 #include "sframe-test.h"
 
 static int
-add_plt_fde1 (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
-             uint32_t sframe_vaddr, int idx)
+add_plt_fde1 (sframe_encoder_ctx *ectx, int64_t plt_vaddr,
+             int64_t sframe_vaddr, int idx)
 {
   /* A contiguous block containing 3 FREs.  The start_ip_offset must remain
      less than 16 bytes.  */
@@ -34,11 +34,11 @@ add_plt_fde1 (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
                                                     SFRAME_FDE_TYPE_PCMASK);
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (ectx, idx, NULL);
-  int32_t func_start_addr = (plt_vaddr
+  int64_t func_start_addr = (plt_vaddr
                             - (sframe_vaddr + offsetof_fde_in_sec));
 
   /* 5 pltN entries of 16 bytes each.  */
-  int err = sframe_encoder_add_funcdesc_v2 (ectx, func_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
                                            16 * 5 /* func size in bytes.  */,
                                            finfo,
                                            16 /* rep block size in bytes.  */,
@@ -54,8 +54,8 @@ add_plt_fde1 (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
 }
 
 static
-void test_plt_findfre (const char suffix, uint32_t plt_vaddr,
-                      uint32_t sframe_vaddr)
+void test_plt_findfre (const char suffix, int64_t plt_vaddr,
+                      int64_t sframe_vaddr)
 {
   sframe_encoder_ctx *ectx;
   sframe_decoder_ctx *dctx;
@@ -123,15 +123,15 @@ void test_plt_findfre (const char suffix, uint32_t plt_vaddr,
 
 int main (void)
 {
-  uint32_t sframe_vaddr = 0x402220;
-  uint32_t plt_vaddr = 0x401020;
-  printf ("Testing with plt_vaddr = %#x; sframe_vaddr = %#x\n", plt_vaddr,
+  int64_t sframe_vaddr = 0x402220;
+  int64_t plt_vaddr = 0x401020;
+  printf ("Testing with plt_vaddr = %#lx; sframe_vaddr = %#lx\n", plt_vaddr,
          sframe_vaddr);
   test_plt_findfre ('a', plt_vaddr, sframe_vaddr);
 
   sframe_vaddr = 0x401020;
   plt_vaddr = 0x402220;
-  printf ("Testing with plt_vaddr = %#x; sframe_vaddr = %#x\n", plt_vaddr,
+  printf ("Testing with plt_vaddr = %#lx; sframe_vaddr = %#lx\n", plt_vaddr,
          sframe_vaddr);
   test_plt_findfre ('b', plt_vaddr, sframe_vaddr);
 }
index 097d23bfff07d83b80bbc5ee85a49e2c1aa03fbc..9ed98553ecc8680e496c9018dcc0af6861e611e5 100644 (file)
@@ -27,8 +27,8 @@
 #define PLTN_CFA_OFFSET_MAGIC 8
 
 static int
-add_plt0_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
-             uint32_t sframe_vaddr, int idx)
+add_plt0_fde (sframe_encoder_ctx *ectx, int64_t plt_vaddr,
+             int64_t sframe_vaddr, int idx)
 {
   /* 1 single FRE.  */
   sframe_frame_row_entry fre
@@ -41,11 +41,11 @@ add_plt0_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (ectx, idx, NULL);
 
-  int32_t func_start_addr = (plt_vaddr
+  int64_t func_start_addr = (plt_vaddr
                             - (sframe_vaddr + offsetof_fde_in_sec));
 
   /* 1 PCINC-type FDE for 1 plt0 entry of 32 bytes.  */
-  int err = sframe_encoder_add_funcdesc_v2 (ectx, func_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
                                            PLT_SIZE /* func size.  */,
                                            finfo,
                                            0 /* rep block size.  */,
@@ -60,8 +60,8 @@ add_plt0_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
 }
 
 static int
-add_pltn_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
-             uint32_t sframe_vaddr, int idx)
+add_pltn_fde (sframe_encoder_ctx *ectx, int64_t plt_vaddr,
+             int64_t sframe_vaddr, int idx)
 {
   /* 1 single FRE.  */
   sframe_frame_row_entry fre
@@ -74,11 +74,11 @@ add_pltn_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
   uint32_t offsetof_fde_in_sec
     = sframe_encoder_get_offsetof_fde_start_addr (ectx, idx, NULL);
 
-  int32_t func_start_addr = (plt_vaddr
+  int64_t func_start_addr = (plt_vaddr
                             - (sframe_vaddr + offsetof_fde_in_sec));
 
   /* 1 PCMASK-type FDE for 5 pltN entries of 32 bytes each.  */
-  int err = sframe_encoder_add_funcdesc_v2 (ectx, func_start_addr,
+  int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
                                            5 * PLT_SIZE /* func size.  */,
                                            finfo,
                                            PLT_SIZE /* rep block size.  */,
@@ -93,8 +93,8 @@ add_pltn_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
 }
 
 static
-void test_plt_findfre (const char suffix, const uint32_t plt_vaddr,
-                      const uint32_t sframe_vaddr)
+void test_plt_findfre (const char suffix, const int64_t plt_vaddr,
+                      const int64_t sframe_vaddr)
 {
   sframe_encoder_ctx *ectx;
   sframe_decoder_ctx *dctx;
@@ -165,15 +165,15 @@ void test_plt_findfre (const char suffix, const uint32_t plt_vaddr,
 int
 main (void)
 {
-  uint32_t sframe_vaddr = 0x402220;
-  uint32_t plt_vaddr = 0x401020;
-  printf ("plt-findfre-2a: Testing with plt_vaddr = %#x; sframe_vaddr = %#x\n",
+  int64_t sframe_vaddr = 0x402220;
+  int64_t plt_vaddr = 0x401020;
+  printf ("plt-findfre-2a: Testing with plt_vaddr = %#lx; sframe_vaddr = %#lx\n",
          plt_vaddr, sframe_vaddr);
   test_plt_findfre ('a', plt_vaddr, sframe_vaddr);
 
   sframe_vaddr = 0x401020;
   plt_vaddr = 0x402220;
-  printf ("plt-findfre-2b: Testing with plt_vaddr = %#x; sframe_vaddr = %#x\n",
+  printf ("plt-findfre-2b: Testing with plt_vaddr = %#lx; sframe_vaddr = %#lx\n",
          plt_vaddr, sframe_vaddr);
   test_plt_findfre ('b', plt_vaddr, sframe_vaddr);