aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/sframe-opt.c12
-rw-r--r--include/sframe-api.h2
-rw-r--r--include/sframe.h9
-rw-r--r--libsframe/sframe.c6
4 files changed, 17 insertions, 12 deletions
diff --git a/gas/sframe-opt.c b/gas/sframe-opt.c
index 01138f28deb..ec0509f8977 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 < SFRAME_FRE_TYPE_ADDR1_LIMIT)
+ if (width < (offsetT) SFRAME_FRE_TYPE_ADDR1_LIMIT)
ret = 1;
- else if (width < SFRAME_FRE_TYPE_ADDR2_LIMIT)
+ else if (width < (offsetT) SFRAME_FRE_TYPE_ADDR2_LIMIT)
ret = 2;
else
ret = 4;
@@ -123,9 +123,9 @@ sframe_convert_frag (fragS *frag)
/* Calculate the applicable fre_type. */
fsizeS = exp->X_op_symbol;
fsize = resolve_symbol_value (fsizeS);
- if (fsize < SFRAME_FRE_TYPE_ADDR1_LIMIT)
+ if (fsize < (offsetT) SFRAME_FRE_TYPE_ADDR1_LIMIT)
fre_type = SFRAME_FRE_TYPE_ADDR1;
- else if (fsize < SFRAME_FRE_TYPE_ADDR2_LIMIT)
+ else if (fsize < (offsetT) SFRAME_FRE_TYPE_ADDR2_LIMIT)
fre_type = SFRAME_FRE_TYPE_ADDR2;
else
fre_type = SFRAME_FRE_TYPE_ADDR4;
@@ -150,11 +150,11 @@ sframe_convert_frag (fragS *frag)
switch (frag->fr_subtype & 7)
{
case 1:
- gas_assert (fsize < SFRAME_FRE_TYPE_ADDR1_LIMIT);
+ gas_assert (fsize < (offsetT) SFRAME_FRE_TYPE_ADDR1_LIMIT);
frag->fr_literal[frag->fr_fix] = diff;
break;
case 2:
- gas_assert (fsize < SFRAME_FRE_TYPE_ADDR2_LIMIT);
+ gas_assert (fsize < (offsetT) 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-api.h b/include/sframe-api.h
index cdffc25d2cd..405e30c27e8 100644
--- a/include/sframe-api.h
+++ b/include/sframe-api.h
@@ -96,7 +96,7 @@ sframe_fde_create_func_info (unsigned int fre_type, unsigned int fde_type);
/* Gather the FRE type given the function size. */
extern unsigned int
-sframe_calc_fre_type (unsigned int func_size);
+sframe_calc_fre_type (size_t func_size);
/* The SFrame Decoder. */
diff --git a/include/sframe.h b/include/sframe.h
index 7e7840b605c..58ef07dcc21 100644
--- a/include/sframe.h
+++ b/include/sframe.h
@@ -304,7 +304,8 @@ typedef struct 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)
+#define SFRAME_FRE_TYPE_ADDR1_LIMIT \
+ (1ULL << ((SFRAME_FRE_TYPE_ADDR1 + 1) * 8))
/* Used when SFRAME_FRE_TYPE_ADDR2 is specified as FRE type. */
typedef struct sframe_frame_row_entry_addr2
@@ -317,7 +318,8 @@ typedef struct 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)
+#define SFRAME_FRE_TYPE_ADDR2_LIMIT \
+ (1ULL << ((SFRAME_FRE_TYPE_ADDR2 * 2) * 8))
/* Used when SFRAME_FRE_TYPE_ADDR4 is specified as FRE type. */
typedef struct sframe_frame_row_entry_addr4
@@ -330,7 +332,8 @@ typedef struct 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)
+#define SFRAME_FRE_TYPE_ADDR4_LIMIT \
+ (1ULL << ((SFRAME_FRE_TYPE_ADDR4 * 2) * 8))
#ifdef __cplusplus
}
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
index d206780289a..ea3169ba7aa 100644
--- a/libsframe/sframe.c
+++ b/libsframe/sframe.c
@@ -584,14 +584,16 @@ sframe_fde_create_func_info (unsigned int fre_type,
/* FIXME API for linker. Revisit if its better placed somewhere else? */
unsigned int
-sframe_calc_fre_type (unsigned int func_size)
+sframe_calc_fre_type (size_t func_size)
{
unsigned int fre_type = 0;
if (func_size < SFRAME_FRE_TYPE_ADDR1_LIMIT)
fre_type = SFRAME_FRE_TYPE_ADDR1;
else if (func_size < SFRAME_FRE_TYPE_ADDR2_LIMIT)
fre_type = SFRAME_FRE_TYPE_ADDR2;
- else if (func_size < SFRAME_FRE_TYPE_ADDR4_LIMIT)
+ /* Adjust the check a bit so that it remains warning-free but meaningful
+ on 32-bit systems. */
+ else if (func_size <= (size_t) (SFRAME_FRE_TYPE_ADDR4_LIMIT - 1))
fre_type = SFRAME_FRE_TYPE_ADDR4;
return fre_type;
}