bfd_vma address;
uint32_t func_size = 0;
unsigned char func_info = 0;
+ unsigned char func_info2 = 0;
unsigned int r_offset = 0;
bool pltn_reloc_by_hand = false;
unsigned int pltn_r_offset = 0;
if (!sframe_decoder_get_funcdesc_v3 (sfd_ctx, i, &num_fres, &func_size,
&func_start_addr, &func_info,
- &rep_block_size))
+ &func_info2, &rep_block_size))
{
/* If function belongs to a deleted section, skip editing the
function descriptor entry. */
/* Update the encoder context with updated content. */
int err = sframe_encoder_add_funcdesc_v3 (sfe_ctx, func_start_addr,
func_size, func_info,
- rep_block_size, num_fres);
+ func_info2, rep_block_size,
+ num_fres);
cur_fidx++;
BFD_ASSERT (!err);
}
0, /* func start addr. */
plt0_entry_size,
func_info,
+ 0, /* func_info2. */
0, /* Rep block size. */
0 /* Num FREs. */);
sframe_frame_row_entry plt0_fre;
plt0_entry_size, /* func start addr. */
dpltsec->size - plt0_entry_size,
func_info,
+ 0, /* func_info2. */
plt_entry_size,
0 /* Num FREs. */);
0, /* func start addr. */
plt0_entry_size,
func_info,
+ 0, /* func_info2. */
0,
0 /* Num FREs. */);
sframe_frame_row_entry plt0_fre;
plt0_entry_size, /* func start addr. */
dpltsec->size - plt0_entry_size,
func_info,
+ 0, /* func_info2. */
plt_entry_size,
0 /* Num FREs. */);
else
out_one (func_info);
out_one (0);
+ out_one (0);
}
static void
uint8_t *rep_block_size);
/* Get the data (NUM_FRES, FUNC_SIZE, FUNC_START_ADDRESS, FUNC_INFO,
- REP_BLOCK_SIZE) from the SFrame function descriptor entry at the I'th index
- in the decoder object DCTX. If failed, return SFRAME_ERR. */
+ FUNC_INFO2, REP_BLOCK_SIZE) from the SFrame function descriptor entry at the
+ I'th index in the decoder object DCTX. If failed, return SFRAME_ERR. */
extern int
sframe_decoder_get_funcdesc_v3 (const sframe_decoder_ctx *dctx,
unsigned int i,
uint32_t *func_size,
int64_t *func_start_address,
unsigned char *func_info,
+ unsigned char *func_info2,
uint8_t *rep_block_size);
/* SFrame textual dump. */
uint32_t num_fres);
/* Add a new SFrame function descriptor entry with START_ADDR, FUNC_SIZE,
- FUNC_INFO and REP_BLOCK_SIZE to the encoder context ECTX. */
+ FUNC_INFO, FUNC_INFO2 and REP_BLOCK_SIZE to the encoder context ECTX. */
extern int
sframe_encoder_add_funcdesc_v3 (sframe_encoder_ctx *ectx,
int64_t start_addr,
uint32_t func_size,
unsigned char func_info,
+ unsigned char func_info2,
uint8_t rep_block_size,
uint32_t num_fres);
---------------------------------------------------------------------------------
8 7 6 5 4 0 */
uint8_t sfde_func_info;
+ /* Additional information for stack tracing from the function:
+ - 8-bits: Unused.
+ -------------------------------------------------------------------------
+ | Unused |
+ -------------------------------------------------------------------------
+ 8 7 6 5 4 0 */
+ uint8_t sfde_func_info2;
/* Size of the block of repeating insns. Used for SFrame FDEs of type
SFRAME_FDE_TYPE_PCMASK. */
uint8_t sfde_func_rep_size;
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_info, NULL,
+ &rep_block_size);
func_start_pc_vma = func_start_addr + sec_addr;
}
else
uint32_t func_start_fre_off;
uint32_t func_num_fres;
uint8_t func_info;
+ uint8_t func_info2;
uint8_t func_rep_size;
} ATTRIBUTE_PACKED sframe_func_desc_entry_int;
fde_tbl->entry[i].func_start_fre_off = fdep->sfde_func_start_fre_off;
fde_tbl->entry[i].func_num_fres = (uint16_t)fdep->sfde_func_num_fres;
fde_tbl->entry[i].func_info = fdep->sfde_func_info;
+ fde_tbl->entry[i].func_info2 = fdep->sfde_func_info2;
fde_tbl->entry[i].func_rep_size = fdep->sfde_func_rep_size;
}
fde_tbl->count = num_fdes;
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;
fde_tbl->entry[i].func_info = fdep->sfde_func_info;
+ fde_tbl->entry[i].func_info2 = 0;
fde_tbl->entry[i].func_rep_size = fdep->sfde_func_rep_size;
}
fde_tbl->count = num_fdes;
uint32_t *func_size,
int64_t *func_start_address,
unsigned char *func_info,
+ unsigned char *func_info2,
uint8_t *rep_block_size)
{
int err = 0;
*func_size = fdp->func_size;
if (func_info)
*func_info = fdp->func_info;
+ if (func_info2)
+ *func_info2 = fdp->func_info2;
if (rep_block_size)
*rep_block_size = fdp->func_rep_size;
int64_t start_addr,
uint32_t func_size,
unsigned char func_info,
+ unsigned char func_info2,
uint8_t rep_block_size,
uint32_t num_fres ATTRIBUTE_UNUSED)
{
sf_fde_tbl *fd_info = ectx->sfe_funcdesc;
fd_info->entry[fd_info->count-1].func_info = func_info;
+ fd_info->entry[fd_info->count-1].func_info2 = func_info2;
fd_info->entry[fd_info->count-1].func_rep_size = rep_block_size;
return 0;
fdep->sfde_func_start_fre_off = fde->func_start_fre_off;
fdep->sfde_func_num_fres = (uint16_t)fde->func_num_fres;
fdep->sfde_func_info = fde->func_info;
+ fdep->sfde_func_info2 = fde->func_info2;
fdep->sfde_func_rep_size = fde->func_rep_size;
*fde_write_size = sizeof (sframe_func_desc_entry_v3);
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
- *func_size, finfo, 0,
+ *func_size, finfo, 0, 0,
FDE1_NUM_FRES);
if (err == -1)
return err;
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
- *func_size, finfo, 0,
+ *func_size, finfo, 0, 0,
FDE1_NUM_FRES);
if (err == -1)
return err;
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
- *func_size, finfo, 0,
+ *func_size, finfo, 0, 0,
FDE1_NUM_FRES);
if (err == -1)
return err;
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
int err = sframe_encoder_add_funcdesc_v3 (encode, func2_start_addr,
- *func_size, finfo, 0,
+ *func_size, finfo, 0, 0,
FDE2_NUM_FRES);
if (err == -1)
return err;
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
- *func_size, finfo, 0,
+ *func_size, finfo, 0, 0,
FDE1_NUM_FRES);
if (err == -1)
return err;
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
int err = sframe_encoder_add_funcdesc_v3 (encode, func2_start_addr,
- *func_size, finfo, 0,
+ *func_size, finfo, 0, 0,
FDE2_NUM_FRES);
if (err == -1)
return err;
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
int err = sframe_encoder_add_funcdesc_v3 (encode, func3_start_addr,
- *func_size, finfo, 0,
+ *func_size, finfo, 0, 0,
FDE3_NUM_FRES);
if (err == -1)
return err;
int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
16 * 5 /* func size in bytes. */,
finfo,
+ 0, /* func_info2. */
16 /* rep block size in bytes. */,
PLT1_NUM_FRES);
if (err == -1)
int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
PLT_SIZE /* func size. */,
finfo,
+ 0, /* func_info2. */
0 /* rep block size. */,
1 /* num FREs. */);
if (err == -1)
int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
5 * PLT_SIZE /* func size. */,
finfo,
+ 0, /* func_info2. */
PLT_SIZE /* rep block size. */,
1 /* num FREs. */);
if (err == -1)