From: Indu Bhagat Date: Fri, 16 Jan 2026 00:42:03 +0000 (-0800) Subject: [SFrame-V3] include: libsframe: bfd: gas: testsuite: support for signed 64-bit offset... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=982b494403c5ec9236920aa81f377658df361cb9;p=thirdparty%2Fbinutils-gdb.git [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 --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);