[binutils-gdb] [SFrame-V3] include: libsframe: bfd: gas: testsuite: support for signed 64-bit offset in SFrame FDE
Indu Bhagat
ibhagat@sourceware.org
Fri Jan 16 01:04:05 GMT 2026
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=982b494403c5ec9236920aa81f377658df361cb9
commit 982b494403c5ec9236920aa81f377658df361cb9
Author: Indu Bhagat <indu.bhagat@oracle.com>
Date: Thu Jan 15 16:42:03 2026 -0800
[SFrame-V3] include: libsframe: bfd: gas: testsuite: support for signed 64-bit offset in SFrame FDE
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_offset));
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.
gas/
* sframe.c (output_sframe_funcdesc): Rename to
sfde_func_start_offset.
libsframe/
* libsframe/sframe.c (sframe_fde_tbl_init): Rename to
sfde_func_start_offset.
(flip_fde): Likewise.
(sframe_decoder_get_secrel_func_start_addr): Use int64_t.
(sframe_fre_check_range_p): Likewise.
(sframe_decoder_get_offsetof_fde_start_addr): Rename to
sfde_func_start_offset.
(sframe_get_funcdesc_with_addr_internal): Use int64_t.
(sframe_find_fre): Likewise.
(sframe_encoder_get_offsetof_fde_start_addr): Rename to
sfde_func_start_offset.
(sframe_encoder_add_funcdesc_internal): Use int64_t.
(sframe_encoder_add_funcdesc): Likewise. And rename to
sfde_func_start_offset.
(sframe_encoder_write_fde): Rename to sfde_func_start_offset.
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.
Diff:
---
bfd/elf-sframe.c | 22 ++++++-----
bfd/elf64-s390.c | 6 +--
bfd/elfxx-x86.c | 10 ++---
gas/gen-sframe.c | 2 +-
include/sframe-api.h | 4 +-
include/sframe.h | 6 +--
libsframe/sframe-dump.c | 24 ++++++++---
libsframe/sframe.c | 28 ++++++-------
libsframe/testsuite/libsframe.decode/DATA2 | Bin 90 -> 98 bytes
libsframe/testsuite/libsframe.encode/encode-1.c | 22 +++++------
libsframe/testsuite/libsframe.find/findfre-1.c | 34 ++++++++--------
libsframe/testsuite/libsframe.find/findfunc-1.c | 44 ++++++++++-----------
libsframe/testsuite/libsframe.find/plt-findfre-1.c | 20 +++++-----
libsframe/testsuite/libsframe.find/plt-findfre-2.c | 28 ++++++-------
14 files changed, 133 insertions(+), 117 deletions(-)
diff --git a/bfd/elf-sframe.c b/bfd/elf-sframe.c
index 5a9cc45435f..8842efe6fe6 100644
--- a/bfd/elf-sframe.c
+++ b/bfd/elf-sframe.c
@@ -162,12 +162,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;
}
@@ -479,11 +479,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;
@@ -492,7 +493,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))
{
@@ -536,10 +537,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
@@ -558,7 +560,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++;
diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
index 6bf19c408f4..dbeee7f66e4 100644
--- a/bfd/elf64-s390.c
+++ b/bfd/elf64-s390.c
@@ -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);
}
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index 9e1c6d8a0e0..ae6c96d77df 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -1913,7 +1913,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,
@@ -1942,7 +1942,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,
@@ -2996,7 +2996,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);
}
@@ -3030,7 +3030,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);
}
@@ -3057,7 +3057,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);
}
diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index 0aadaafa1ec..3d87143eb0a 100644
--- a/gas/gen-sframe.c
+++ b/gas/gen-sframe.c
@@ -691,7 +691,7 @@ output_sframe_funcdesc (symbolS *start_of_fre_section,
exp.X_op_symbol = symbol_temp_new_now (); /* from location. */
exp.X_add_number = 0;
emit_expr (&exp, sizeof_member (sframe_func_desc_entry,
- sfde_func_start_address));
+ sfde_func_start_offset));
/* Size of the function in bytes. */
exp.X_op = O_subtract;
diff --git a/include/sframe-api.h b/include/sframe-api.h
index 3bcb92b0664..71130eb12f1 100644
--- a/include/sframe-api.h
+++ b/include/sframe-api.h
@@ -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,
diff --git a/include/sframe.h b/include/sframe.h
index c137b49e806..bda96e8be5b 100644
--- a/include/sframe.h
+++ b/include/sframe.h
@@ -247,9 +247,9 @@ typedef struct sframe_func_desc_entry_v2
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;
+ /* Offset to the function start address. Encoded as a signed offset,
+ relative to the beginning of the current FDE. */
+ int64_t sfde_func_start_offset;
/* 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
diff --git a/libsframe/sframe-dump.c b/libsframe/sframe-dump.c
index 94e5a0a5213..757997608b9 100644
--- a/libsframe/sframe-dump.c
+++ b/libsframe/sframe-dump.c
@@ -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,
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index eb68ddfc1d8..292058f7c17 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -148,7 +148,7 @@ sframe_fde_tbl_init (sf_fde_tbl *fde_tbl, const char *fde_buf,
{
const sframe_func_desc_entry_v3 *fdep
= (sframe_func_desc_entry_v3 *)fde_buf + i;
- fde_tbl->entry[i].func_start_pc_offset = fdep->sfde_func_start_address;
+ fde_tbl->entry[i].func_start_pc_offset = fdep->sfde_func_start_offset;
fde_tbl->entry[i].func_size = fdep->sfde_func_size;
fde_tbl->entry[i].func_start_fre_off = fdep->sfde_func_start_fre_off;
fde_tbl->entry[i].func_num_fres = fdep->sfde_func_num_fres;
@@ -310,7 +310,7 @@ flip_fde (char *buf, size_t buf_size, uint8_t ver, size_t *fde_size)
if (ver == SFRAME_VERSION_3)
{
sframe_func_desc_entry_v3 *fdep = (sframe_func_desc_entry_v3 *) buf;
- swap_thing (fdep->sfde_func_start_address);
+ swap_thing (fdep->sfde_func_start_offset);
swap_thing (fdep->sfde_func_size);
swap_thing (fdep->sfde_func_start_fre_off);
swap_thing (fdep->sfde_func_num_fres);
@@ -517,7 +517,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)
{
@@ -529,7 +529,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_pc_offset = fdep->func_start_pc_offset;
+ int64_t func_start_pc_offset = fdep->func_start_pc_offset;
return func_start_pc_offset + offsetof_fde_in_sec;
}
@@ -541,10 +541,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_pc_offset;
+ int64_t func_start_pc_offset;
uint8_t rep_block_size;
uint32_t pc_type;
uint32_t pc_offset;
@@ -1338,7 +1338,7 @@ sframe_decoder_get_offsetof_fde_start_addr (const sframe_decoder_ctx *dctx,
if (sframe_decoder_get_version (dctx) == SFRAME_VERSION_3)
return (sframe_decoder_get_hdr_size (dctx)
+ func_idx * sizeof (sframe_func_desc_entry_v3)
- + offsetof (sframe_func_desc_entry_v3, sfde_func_start_address));
+ + offsetof (sframe_func_desc_entry_v3, sfde_func_start_offset));
else if (sframe_decoder_get_version (dctx) == SFRAME_VERSION_2)
return (sframe_decoder_get_hdr_size (dctx)
+ func_idx * sizeof (sframe_func_desc_entry_v2)
@@ -1354,7 +1354,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;
@@ -1430,14 +1430,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_pc_offset;
+ int64_t func_start_pc_offset;
uint32_t start_ip_offset, end_ip_offset;
const char *fres;
size_t size = 0;
@@ -1788,7 +1788,7 @@ sframe_encoder_get_offsetof_fde_start_addr (sframe_encoder_ctx *ectx,
return (sframe_encoder_get_hdr_size (ectx)
+ func_idx * sizeof (sframe_func_desc_entry_v3)
- + offsetof (sframe_func_desc_entry_v3, sfde_func_start_address));
+ + offsetof (sframe_func_desc_entry_v3, sfde_func_start_offset));
}
/* Add an SFrame FRE to function at FUNC_IDX'th function descriptor entry in
@@ -1875,7 +1875,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;
@@ -1946,7 +1946,7 @@ bad:
FUNC_SIZE to the encoder context ECTX. */
int
-sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx, int32_t start_pc_offset,
+sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx, int64_t start_pc_offset,
uint32_t func_size)
{
int err = 0;
@@ -2137,7 +2137,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_pc_offset;
+ fdep->sfde_func_start_offset = fde->func_start_pc_offset;
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;
diff --git a/libsframe/testsuite/libsframe.decode/DATA2 b/libsframe/testsuite/libsframe.decode/DATA2
index b1069c3c4d1..06fd11bd8bf 100644
Binary files a/libsframe/testsuite/libsframe.decode/DATA2 and b/libsframe/testsuite/libsframe.decode/DATA2 differ
diff --git a/libsframe/testsuite/libsframe.encode/encode-1.c b/libsframe/testsuite/libsframe.encode/encode-1.c
index 9ced70259e2..284177df805 100644
--- a/libsframe/testsuite/libsframe.encode/encode-1.c
+++ b/libsframe/testsuite/libsframe.encode/encode-1.c
@@ -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;
diff --git a/libsframe/testsuite/libsframe.find/findfre-1.c b/libsframe/testsuite/libsframe.find/findfre-1.c
index cf1475eb74f..996a943e679 100644
--- a/libsframe/testsuite/libsframe.find/findfre-1.c
+++ b/libsframe/testsuite/libsframe.find/findfre-1.c
@@ -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);
}
diff --git a/libsframe/testsuite/libsframe.find/findfunc-1.c b/libsframe/testsuite/libsframe.find/findfunc-1.c
index d5b99a9420e..364c9673ba4 100644
--- a/libsframe/testsuite/libsframe.find/findfunc-1.c
+++ b/libsframe/testsuite/libsframe.find/findfunc-1.c
@@ -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);
}
diff --git a/libsframe/testsuite/libsframe.find/plt-findfre-1.c b/libsframe/testsuite/libsframe.find/plt-findfre-1.c
index e9cb3ac8c4a..c2a5e2f8de9 100644
--- a/libsframe/testsuite/libsframe.find/plt-findfre-1.c
+++ b/libsframe/testsuite/libsframe.find/plt-findfre-1.c
@@ -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);
}
diff --git a/libsframe/testsuite/libsframe.find/plt-findfre-2.c b/libsframe/testsuite/libsframe.find/plt-findfre-2.c
index 25e76a599ce..c1ad7f08505 100644
--- a/libsframe/testsuite/libsframe.find/plt-findfre-2.c
+++ b/libsframe/testsuite/libsframe.find/plt-findfre-2.c
@@ -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);
More information about the Binutils-cvs
mailing list