http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53219

             Bug #: 53219
           Summary: inline function erroneously clobbers %i0 register on
                    64 bit sparc comiple of perls regcomp.c
    Classification: Unclassified
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: mar...@netbsd.org


gcc 4.5.3 on NetBSD/sparc64 miscompiles perl's regcomp.c file.
Inside the big Perl_re_compile() function with %i0 being "my_perl", the context
for the whole function, it inlines this tiny function:

72      PERL_STATIC_INLINE regex_charset
73      get_regex_charset(const U32 flags)
74      {
75          /* Returns the enum corresponding to the character set in 'flags'
*/
76      
77          return (regex_charset) ((flags & RXf_PMf_CHARSET) >>
_RXf_PMf_CHARSET_SHIFT);
78      }

This is the generated assembler code:

   0x4058f560 <Perl_re_compile+128>:    
    brnz  %g1, 0x4058f570 <Perl_re_compile+144>
   0x4058f564 <Perl_re_compile+132>:    add  %l3, %g1, %l5
   0x4058f568 <Perl_re_compile+136>:    clr  [ %fp + 0x66b ]
   0x4058f56c <Perl_re_compile+140>:    clr  [ %fp + 0x88f ], %i0
   0x4058f574 <Perl_re_compile+148>:    and  %i0, 0xe0, %g1
   0x4058f578 <Perl_re_compile+152>:    srl  %g1, 5, %g1
   0x4058f57c <Perl_re_compile+156>:    cmp  %g1, 1
   0x4058f580 <Perl_re_compile+160>:    
    be,pn   %icc, 0x40590ecc <Perl_re_compile+6636>

Note at the ==> marker, %i0 is reloaded without save before nor any restore
later. This causes a crash shortly later.

Simple test:

   perl -e '/(?{"{"})/'

Reply via email to