The -msecure-plt ABI requires that -fpic/-fPIC calls via the PLT have the GOT
pointer register valid.  gcc accomplishes this by adding pic_offset_table_rtx
to CALL_INSN_FUNCTION_USAGE for such calls at rtl expansion time.  See
rs6000.md define_expand "call".  Now, indirect calls do *not* need a GOT
pointer since they don't go via the PLT, and we wouldn't want indirect calls to
cause unnecessary code in a function prologue to set up the GOT pointer.  This
is a lurking problem for the RTL combiner if it should happen to see an
opportunity to combine an instruction loading a function pointer followed by an
indirect call, since it will combine them to a PLT call that lacks a use of
pic_offset_table_rtx.

$ cat pr44759.c
#include <stdio.h>
#include <stdlib.h>

extern void first_call (void);

int main (void)
{
  first_call ();
  printf ("All finished\n");
}
$ cat pr44759-1.c
#include <stdio.h>
#include <stdlib.h>

typedef void (*simple) (signed int);
void myprint (unsigned int i)
{
  printf("I am printing\n");
}

static inline void lets_inline (void (*p)(signed int), int v)
{
  (*p)(v);
}

void first_call (void)
{
  lets_inline ((simple)myprint, 0);
}
$ gcc -c pr44759.c -fPIC -O2 -msecure-plt
$ gcc -c pr44759-1.c -fPIC -O2 -msecure-plt
$ gcc -o libpr44759.so pr44759-1.o -fPIC -shared -msecure-plt
$ gcc -o pr44759 pr44759.o libpr44759.so
$ LD_LIBRARY_PATH=. ./pr44759
Segmentation fault

Note that the testcase does not fail on mainline or gcc-4.3, presumably because
combining happens at the tree level there.  I'm also not sure whether the
testcase is completely valid code, but even if not, there may be other ways to
expose the rtl combine error.


-- 
           Summary: -msecure-plt combine gives invalid call insn
           Product: gcc
           Version: 4.1.3
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: amodra at bigpond dot net dot au
GCC target triplet: powerpc-*-*


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

Reply via email to