diff --git a/gas/sframe-opt.c b/gas/sframe-opt.c index c17fd6b83324db787af2ae0a0fe2ce5e1c7d0fd8..6901aa82a7732be8f2ea9967b7093f0418f5918b 100644 --- a/gas/sframe-opt.c +++ b/gas/sframe-opt.c @@ -53,9 +53,9 @@ sframe_estimate_size_before_relax (fragS *frag) widthS = exp->X_op_symbol; width = resolve_symbol_value (widthS); - if (width < 0x100) + if (width < SFRAME_FRE_TYPE_ADDR1_LIMIT) ret = 1; - else if (width < 0x10000) + else if (width < SFRAME_FRE_TYPE_ADDR2_LIMIT) ret = 2; else ret = 4; @@ -109,9 +109,9 @@ sframe_convert_frag (fragS *frag) { fsizeS = frag->fr_symbol; fsize = resolve_symbol_value (fsizeS); - if (fsize < 0x100) + if (fsize < SFRAME_FRE_TYPE_ADDR1_LIMIT) func_info = SFRAME_FRE_TYPE_ADDR1; - else if (fsize < 0x10000) + else if (fsize < SFRAME_FRE_TYPE_ADDR2_LIMIT) func_info = SFRAME_FRE_TYPE_ADDR2; else func_info = SFRAME_FRE_TYPE_ADDR4; @@ -133,11 +133,11 @@ sframe_convert_frag (fragS *frag) switch (frag->fr_subtype & 7) { case 1: - gas_assert (fsize < 0x100); + gas_assert (fsize < SFRAME_FRE_TYPE_ADDR1_LIMIT); frag->fr_literal[frag->fr_fix] = diff; break; case 2: - gas_assert (fsize < 0x10000); + gas_assert (fsize < SFRAME_FRE_TYPE_ADDR2_LIMIT); md_number_to_chars (frag->fr_literal + frag->fr_fix, diff, 2); break; case 4: diff --git a/include/sframe.h b/include/sframe.h index 7e167bf4dbec39e8cf8b70cb2d7a4ccda0071178..03a2d75dfd3db8d3f31972fe2540c61c9f760283 100644 --- a/include/sframe.h +++ b/include/sframe.h @@ -273,6 +273,7 @@ typedef struct sframe_fre_info fi */ +/* Used when SFRAME_FRE_TYPE_ADDR1 is specified as FRE type. */ typedef struct sframe_frame_row_entry_addr1 { /* Start address of the frame row entry. Encoded as an 1-byte unsigned @@ -281,6 +282,11 @@ typedef struct sframe_frame_row_entry_addr1 sframe_fre_info sfre_info; } ATTRIBUTE_PACKED sframe_frame_row_entry_addr1; +/* Upper limit of start address in sframe_frame_row_entry_addr1 + is 0x100 (not inclusive). */ +#define SFRAME_FRE_TYPE_ADDR1_LIMIT ((SFRAME_FRE_TYPE_ADDR1 + 1) * 8) + +/* Used when SFRAME_FRE_TYPE_ADDR2 is specified as FRE type. */ typedef struct sframe_frame_row_entry_addr2 { /* Start address of the frame row entry. Encoded as an 2-byte unsigned @@ -289,6 +295,11 @@ typedef struct sframe_frame_row_entry_addr2 sframe_fre_info sfre_info; } ATTRIBUTE_PACKED sframe_frame_row_entry_addr2; +/* Upper limit of start address in sframe_frame_row_entry_addr2 + is 0x10000 (not inclusive). */ +#define SFRAME_FRE_TYPE_ADDR2_LIMIT ((SFRAME_FRE_TYPE_ADDR2 * 2) * 8) + +/* Used when SFRAME_FRE_TYPE_ADDR4 is specified as FRE type. */ typedef struct sframe_frame_row_entry_addr4 { /* Start address of the frame row entry. Encoded as a 4-byte unsigned @@ -297,6 +308,10 @@ typedef struct sframe_frame_row_entry_addr4 sframe_fre_info sfre_info; } ATTRIBUTE_PACKED sframe_frame_row_entry_addr4; +/* Upper limit of start address in sframe_frame_row_entry_addr2 + is 0x100000000 (not inclusive). */ +#define SFRAME_FRE_TYPE_ADDR4_LIMIT ((SFRAME_FRE_TYPE_ADDR4 * 2) * 8) + #ifdef __cplusplus } #endif diff --git a/libsframe/sframe.c b/libsframe/sframe.c index 6e0eb7b6511f6a3fbcdd4d37aeb1b2dbeedd26a3..64fa9078d627f48953ff4bc4473f80b676e7ff4e 100644 --- a/libsframe/sframe.c +++ b/libsframe/sframe.c @@ -572,11 +572,11 @@ unsigned int sframe_calc_fre_type (unsigned int func_size) { unsigned int fre_type = 0; - if (func_size <= 0xff) + if (func_size < SFRAME_FRE_TYPE_ADDR1_LIMIT) fre_type = SFRAME_FRE_TYPE_ADDR1; - else if (func_size <= 0xffff) + else if (func_size < SFRAME_FRE_TYPE_ADDR2_LIMIT) fre_type = SFRAME_FRE_TYPE_ADDR2; - else if (func_size <= 0xffffffff) + else if (func_size < SFRAME_FRE_TYPE_ADDR4_LIMIT) fre_type = SFRAME_FRE_TYPE_ADDR4; return fre_type; }