On Wed, Nov 12, 2014 at 2:00 PM, Jakub Jelinek <ja...@redhat.com> wrote: > On Wed, Nov 12, 2014 at 01:51:01PM -0800, H.J. Lu wrote: >> > So, all in all, SET_REGNO sounds inappropriate to me, everywhere else >> > gen_raw_REG or gen_rtx_REG is used instead, so IMNSHO you should do the >> > same. >> > >> > Jakub >> >> It makes sense. I checked in the following patch. > > gen_raw_REG would be better, the difference is that gen_rtx_REG might > in theory return you pic_offset_table_rtx again.
The whole x86_output_mi_thunk function uses gen_rtx_REG. Using gen_raw_REG is out of space. > Anyway, I don't think anything is needed for release branches, > pic_offset_table_rtx should be initialized there just once and not changed > afterwards. Try this with released GCC: [hjl@gnu-6 tmp]$ cat foo.h struct ICCStringClass { virtual int CreateString (int) = 0; }; struct AGSCCDynamicObject { virtual void Unserialize () = 0; }; struct ScriptString:AGSCCDynamicObject, ICCStringClass { virtual int CreateString (int); virtual void Unserialize (); }; [hjl@gnu-6 tmp]$ cat foo1.cc #include "foo.h" int __attribute__ ((noinline)) CreateNewScriptString (int fromText, bool reAllocate = true) { return fromText; } int __attribute__ ((noinline)) ScriptString::CreateString (int fromText) { return CreateNewScriptString (fromText); } void __attribute__ ((noinline)) ScriptString::Unserialize () { } [hjl@gnu-6 tmp]$ cat foo2.cc #include "foo.h" int main () { ICCStringClass *x = new ScriptString; if (x->CreateString (1) != 1) __builtin_abort (); return 0; } [hjl@gnu-6 tmp]$ g++ -shared -fpic -O2 -mcmodel=large -o libfoo.so foo1.cc [hjl@gnu-6 tmp]$ g++ foo2.cc ./libfoo.so [hjl@gnu-6 tmp]$ ./a.out Segmentation fault [hjl@gnu-6 tmp]$ -- H.J.