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

Reply via email to