https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83775
Bug ID: 83775
Summary: Segfault in arm_declare_function_name()
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: prathamesh3492 at gcc dot gnu.org
Target Milestone: ---
Hi,
For the following test-case:
#define STR "1234567"
const char str[] = STR;
char dst[10];
void copy_from_global_str (void)
{
__builtin_strcpy (dst, str);
if (__builtin_strlen (dst) != sizeof str - 1)
__builtin_abort ();
}
With arm-linux-gnueabihf-gcc -O2 I get the following ICE:
strlenopt-39.c: In function 'copy_from_global_str':
strlenopt-39.c:13:1: internal compiler error: Segmentation fault
}
^
0xbc1f1f crash_signal
../../gcc/gcc/toplev.c:325
0xf4a5bb std::char_traits<char>::length(char const*)
/usr/include/c++/6/bits/char_traits.h:267
0xf4a5bb std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >::assign(char const*)
/usr/include/c++/6/bits/basic_string.h:1268
0xf4a5bb std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >::operator=(char const*)
/usr/include/c++/6/bits/basic_string.h:605
0xf4a5bb arm_declare_function_name(_IO_FILE*, char const*, tree_node*)
../../gcc/gcc/config/arm/arm.c:30958
0xf4ad2d arm_asm_declare_function_name(_IO_FILE*, char const*, tree_node*)
../../gcc/gcc/config/arm/arm.c:19899
0xefd8fc assemble_start_function(tree_node*, char const*)
../../gcc/gcc/varasm.c:1880
0x87929f rest_of_handle_final
../../gcc/gcc/final.c:4549
0x87929f execute
../../gcc/gcc/final.c:4625
This happens because of following in arm_declare_function_name():
/* Only update the assembler .arch string if it is distinct from the last
such string we printed. */
std::string arch_to_print = targ_options->x_arm_arch_string;
In this case, targ_options->x_arm_arch_string is NULL and hence the above
error.
Does the following (untested) fix look OK ?
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 196aa6de1ac..868251a154c 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -30954,7 +30954,10 @@ arm_declare_function_name (FILE *stream, const char
*name, tree decl)
/* Only update the assembler .arch string if it is distinct from the last
such string we printed. */
- std::string arch_to_print = targ_options->x_arm_arch_string;
+ std::string arch_to_print;
+ if (targ_options->x_arm_arch_string)
+ arch_to_print = targ_options->x_arm_arch_string;
+
if (arch_to_print != arm_last_printed_arch_string)
{
std::string arch_name
Thanks,
Prathamesh