glibc compiled with current gcc-7 fails one test due to strcmp and
strncmp appearing in the PLT. This is because the inline expansion of
those functions falls back to a function call, but not using the asm
name for the call. Fixed by retrieving the asm name from the builtin
decl. I used the builtin decl simply because it is in a handy table.
Bootstrapped and regression tested powerpc64le-linux. OK to apply?
* config/rs6000/rs6000.c (expand_strn_compare): Get the asm name
for strcmp and strncmp from corresponding builtin decl.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 44d18e9..4c6bada 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -19869,10 +19869,13 @@ expand_strn_compare (rtx operands[], int no_length)
}
if (no_length)
- emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strcmp"),
- target, LCT_NORMAL, GET_MODE (target), 2,
- force_reg (Pmode, XEXP (src1, 0)), Pmode,
- force_reg (Pmode, XEXP (src2, 0)), Pmode);
+ {
+ tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
+ emit_library_call_value (XEXP (DECL_RTL (fun), 0),
+ target, LCT_NORMAL, GET_MODE (target), 2,
+ force_reg (Pmode, XEXP (src1, 0)), Pmode,
+ force_reg (Pmode, XEXP (src2, 0)), Pmode);
+ }
else
{
/* -m32 -mpowerpc64 results in word_mode being DImode even
@@ -19886,7 +19889,8 @@ expand_strn_compare (rtx operands[], int no_length)
emit_move_insn (len_rtx, bytes_rtx);
- emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strncmp"),
+ tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
+ emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 3,
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode,
@@ -20131,10 +20135,13 @@ expand_strn_compare (rtx operands[], int no_length)
/* Construct call to strcmp/strncmp to compare the rest of the string.
*/
if (no_length)
- emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strcmp"),
- target, LCT_NORMAL, GET_MODE (target), 2,
- force_reg (Pmode, XEXP (src1, 0)), Pmode,
- force_reg (Pmode, XEXP (src2, 0)), Pmode);
+ {
+ tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
+ emit_library_call_value (XEXP (DECL_RTL (fun), 0),
+ target, LCT_NORMAL, GET_MODE (target), 2,
+ force_reg (Pmode, XEXP (src1, 0)), Pmode,
+ force_reg (Pmode, XEXP (src2, 0)), Pmode);
+ }
else
{
rtx len_rtx;
@@ -20144,7 +20151,8 @@ expand_strn_compare (rtx operands[], int no_length)
len_rtx = gen_reg_rtx (SImode);
emit_move_insn (len_rtx, GEN_INT (bytes - compare_length));
- emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "strncmp"),
+ tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
+ emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 3,
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode,
--
Alan Modra
Australia Development Lab, IBM