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