* [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic @ 2016-05-12 22:03 Uros Bizjak 2016-05-12 23:19 ` H.J. Lu 0 siblings, 1 reply; 8+ messages in thread From: Uros Bizjak @ 2016-05-12 22:03 UTC (permalink / raw) To: gcc-patches; +Cc: H.J. Lu, Jakub Jelinek [-- Attachment #1: Type: text/plain, Size: 937 bytes --] Hello! testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure with -mcmodel -fpic, where: /tmp/ccfpoxHY.o: In function `bar': pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o collect2: error: ld returned 1 exit status compiler exited with status 1 CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit region, data is unlimited. Based on these assumptions, code should be accessed via R_X86_64_GOT64. Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for CM_MEDIUM_PIC. 2016-05-12 Uros Bizjak <ubizjak@gmail.com> PR target/61599 * config/i386/i386.c (legitimize_pic_address): Do not use UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model. Patch was bootstrapped on x86_64-linux-gnu and regression tested with -mcmodel=medium -fpic. Jakub, H.J., do you have any comments on the patch? Uros. [-- Attachment #2: p.diff.txt --] [-- Type: text/plain, Size: 574 bytes --] Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 236182) +++ config/i386/i386.c (working copy) @@ -15475,7 +15475,7 @@ legitimize_pic_address (rtx orig, rtx reg) new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_PCREL); new_rtx = gen_rtx_CONST (Pmode, new_rtx); } - else if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC) + else if (TARGET_64BIT && ix86_cmodel == CM_SMALL_PIC) { new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL); ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic 2016-05-12 22:03 [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic Uros Bizjak @ 2016-05-12 23:19 ` H.J. Lu 2016-05-12 23:20 ` H.J. Lu 0 siblings, 1 reply; 8+ messages in thread From: H.J. Lu @ 2016-05-12 23:19 UTC (permalink / raw) To: Uros Bizjak; +Cc: gcc-patches, Jakub Jelinek [-- Attachment #1: Type: text/plain, Size: 1084 bytes --] On Thu, May 12, 2016 at 3:02 PM, Uros Bizjak <ubizjak@gmail.com> wrote: > Hello! > > testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure > with -mcmodel -fpic, where: > > /tmp/ccfpoxHY.o: In function `bar': > pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 > against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o > collect2: error: ld returned 1 exit status > compiler exited with status 1 > > CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit > region, data is unlimited. Based on these assumptions, code should be > accessed via R_X86_64_GOT64. > > Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for > CM_MEDIUM_PIC. > > 2016-05-12 Uros Bizjak <ubizjak@gmail.com> > > PR target/61599 > * config/i386/i386.c (legitimize_pic_address): Do not use > UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model. > > Patch was bootstrapped on x86_64-linux-gnu and regression tested with > -mcmodel=medium -fpic. > > Jakub, H.J., do you have any comments on the patch? I prefer this patch. -- H.J. [-- Attachment #2: pr20070.patch --] [-- Type: text/x-patch, Size: 676 bytes --] diff --git a/ld/plugin.c b/ld/plugin.c index bf66f52..01d76dd 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -674,7 +674,21 @@ get_symbols (const void *handle, int nsyms, struct ld_plugin_symbol *syms, syms[n].name, FALSE, FALSE, TRUE); if (!blhe) { - res = LDPR_UNKNOWN; + /* This symbol is defined and referenced only in IR. */ + switch (syms[n].def) + { + default: + abort (); + case LDPK_UNDEF: + case LDPK_WEAKUNDEF: + res = LDPR_UNDEF; + break; + case LDPK_DEF: + case LDPK_WEAKDEF: + case LDPK_COMMON: + res = LDPR_PREVAILING_DEF_IRONLY; + break; + } goto report_symbol; } ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic 2016-05-12 23:19 ` H.J. Lu @ 2016-05-12 23:20 ` H.J. Lu 2016-05-13 7:07 ` Uros Bizjak 0 siblings, 1 reply; 8+ messages in thread From: H.J. Lu @ 2016-05-12 23:20 UTC (permalink / raw) To: Uros Bizjak; +Cc: gcc-patches, Jakub Jelinek [-- Attachment #1: Type: text/plain, Size: 1231 bytes --] On Thu, May 12, 2016 at 4:19 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > On Thu, May 12, 2016 at 3:02 PM, Uros Bizjak <ubizjak@gmail.com> wrote: >> Hello! >> >> testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure >> with -mcmodel -fpic, where: >> >> /tmp/ccfpoxHY.o: In function `bar': >> pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 >> against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o >> collect2: error: ld returned 1 exit status >> compiler exited with status 1 >> >> CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit >> region, data is unlimited. Based on these assumptions, code should be >> accessed via R_X86_64_GOT64. >> >> Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for >> CM_MEDIUM_PIC. >> >> 2016-05-12 Uros Bizjak <ubizjak@gmail.com> >> >> PR target/61599 >> * config/i386/i386.c (legitimize_pic_address): Do not use >> UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model. >> >> Patch was bootstrapped on x86_64-linux-gnu and regression tested with >> -mcmodel=medium -fpic. >> >> Jakub, H.J., do you have any comments on the patch? > > > I prefer this patch. > Oops wrong one. Here is the right one. -- H.J. [-- Attachment #2: large.patch --] [-- Type: text/x-patch, Size: 618 bytes --] diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 8157f9d..a864868 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -15478,7 +15478,9 @@ legitimize_pic_address (rtx orig, rtx reg) new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_PCREL); new_rtx = gen_rtx_CONST (Pmode, new_rtx); } - else if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC) + else if (TARGET_64BIT + && ix86_cmodel != CM_LARGE_PIC + && !ix86_in_large_data_p (SYMBOL_REF_DECL (addr))) { new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL); ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic 2016-05-12 23:20 ` H.J. Lu @ 2016-05-13 7:07 ` Uros Bizjak 2016-05-13 16:51 ` Uros Bizjak 0 siblings, 1 reply; 8+ messages in thread From: Uros Bizjak @ 2016-05-13 7:07 UTC (permalink / raw) To: H.J. Lu; +Cc: gcc-patches, Jakub Jelinek On Fri, May 13, 2016 at 1:20 AM, H.J. Lu <hjl.tools@gmail.com> wrote: >>> testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure >>> with -mcmodel -fpic, where: >>> >>> /tmp/ccfpoxHY.o: In function `bar': >>> pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 >>> against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o >>> collect2: error: ld returned 1 exit status >>> compiler exited with status 1 >>> >>> CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit >>> region, data is unlimited. Based on these assumptions, code should be >>> accessed via R_X86_64_GOT64. >>> >>> Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for >>> CM_MEDIUM_PIC. >>> >>> 2016-05-12 Uros Bizjak <ubizjak@gmail.com> >>> >>> PR target/61599 >>> * config/i386/i386.c (legitimize_pic_address): Do not use >>> UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model. >>> >>> Patch was bootstrapped on x86_64-linux-gnu and regression tested with >>> -mcmodel=medium -fpic. >>> >>> Jakub, H.J., do you have any comments on the patch? >> >> >> I prefer this patch. >> > > Oops wrong one. Here is the right one. Yes, your patch is more precise. Thanks, Uros. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic 2016-05-13 7:07 ` Uros Bizjak @ 2016-05-13 16:51 ` Uros Bizjak 2016-05-13 17:03 ` Uros Bizjak 2016-05-13 17:21 ` H.J. Lu 0 siblings, 2 replies; 8+ messages in thread From: Uros Bizjak @ 2016-05-13 16:51 UTC (permalink / raw) To: H.J. Lu; +Cc: gcc-patches, Jakub Jelinek On Fri, May 13, 2016 at 9:07 AM, Uros Bizjak <ubizjak@gmail.com> wrote: > On Fri, May 13, 2016 at 1:20 AM, H.J. Lu <hjl.tools@gmail.com> wrote: > >>>> testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure >>>> with -mcmodel -fpic, where: >>>> >>>> /tmp/ccfpoxHY.o: In function `bar': >>>> pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 >>>> against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o >>>> collect2: error: ld returned 1 exit status >>>> compiler exited with status 1 >>>> >>>> CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit >>>> region, data is unlimited. Based on these assumptions, code should be >>>> accessed via R_X86_64_GOT64. >>>> >>>> Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for >>>> CM_MEDIUM_PIC. >>>> >>>> 2016-05-12 Uros Bizjak <ubizjak@gmail.com> >>>> >>>> PR target/61599 >>>> * config/i386/i386.c (legitimize_pic_address): Do not use >>>> UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model. >>>> >>>> Patch was bootstrapped on x86_64-linux-gnu and regression tested with >>>> -mcmodel=medium -fpic. >>>> >>>> Jakub, H.J., do you have any comments on the patch? >>> >>> >>> I prefer this patch. > Yes, your patch is more precise. OTOH, are we sure there is no linker bug here? We have: $ objdump -dr pr61599-1a.o pr61599-1a.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <main+0xb> 7: R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_-0x4 b: b8 00 00 00 00 mov $0x0,%eax 10: e8 00 00 00 00 callq 15 <main+0x15> 11: R_X86_64_PLT32 bar-0x4 15: 89 c2 mov %eax,%edx 17: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 1e <main+0x1e> 1a: R_X86_64_GOTPCREL c-0x4 1e: 0f b6 80 e1 00 00 00 movzbl 0xe1(%rax),%eax 25: 0f be c0 movsbl %al,%eax 28: 01 d0 add %edx,%eax 2a: 5d pop %rbp 2b: c3 retq $ objdump -dr pr61599-2a.o pr61599-2a.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <bar>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <bar+0xb> 7: R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_-0x4 b: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 12 <bar+0x12> e: R_X86_64_GOTPCREL a-0x4 12: 0f b6 40 02 movzbl 0x2(%rax),%eax 16: 0f be d0 movsbl %al,%edx 19: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 20 <bar+0x20> 1c: R_X86_64_GOTPCREL b-0x4 20: 0f b6 40 10 movzbl 0x10(%rax),%eax 24: 0f be c0 movsbl %al,%eax 27: 01 c2 add %eax,%edx 29: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 30 <bar+0x30> 2c: R_X86_64_GOTPCREL c-0x4 30: 0f b6 80 00 01 00 00 movzbl 0x100(%rax),%eax 37: 0f be c0 movsbl %al,%eax 3a: 01 d0 add %edx,%eax 3c: 5d pop %rbp 3d: c3 retq $ gcc pr61599-2a.o pr61599-1a.o pr61599-2a.o: In function `bar': pr61599-2a.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 against symbol `a' defined in LARGE_COMMON section in pr61599-1a.o collect2: error: ld returned 1 exit status There is no R_X86_64_PC32 in pr61599-2a.o, only X86_64_GOTPCREL, which according to assumptions, would reach all entries in the GOT table. Uros. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic 2016-05-13 16:51 ` Uros Bizjak @ 2016-05-13 17:03 ` Uros Bizjak 2016-05-13 17:21 ` H.J. Lu 1 sibling, 0 replies; 8+ messages in thread From: Uros Bizjak @ 2016-05-13 17:03 UTC (permalink / raw) To: H.J. Lu; +Cc: gcc-patches, Jakub Jelinek On Fri, May 13, 2016 at 6:51 PM, Uros Bizjak <ubizjak@gmail.com> wrote: > On Fri, May 13, 2016 at 9:07 AM, Uros Bizjak <ubizjak@gmail.com> wrote: >> On Fri, May 13, 2016 at 1:20 AM, H.J. Lu <hjl.tools@gmail.com> wrote: >> >>>>> testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure >>>>> with -mcmodel -fpic, where: >>>>> >>>>> /tmp/ccfpoxHY.o: In function `bar': >>>>> pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 >>>>> against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o >>>>> collect2: error: ld returned 1 exit status >>>>> compiler exited with status 1 >>>>> >>>>> CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit >>>>> region, data is unlimited. Based on these assumptions, code should be >>>>> accessed via R_X86_64_GOT64. >>>>> >>>>> Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for >>>>> CM_MEDIUM_PIC. >>>>> >>>>> 2016-05-12 Uros Bizjak <ubizjak@gmail.com> >>>>> >>>>> PR target/61599 >>>>> * config/i386/i386.c (legitimize_pic_address): Do not use >>>>> UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model. >>>>> >>>>> Patch was bootstrapped on x86_64-linux-gnu and regression tested with >>>>> -mcmodel=medium -fpic. >>>>> >>>>> Jakub, H.J., do you have any comments on the patch? >>>> >>>> >>>> I prefer this patch. > >> Yes, your patch is more precise. > > OTOH, are we sure there is no linker bug here? We have: > > $ objdump -dr pr61599-1a.o > > pr61599-1a.o: file format elf64-x86-64 > > > Disassembly of section .text: > > 0000000000000000 <main>: > 0: 55 push %rbp > 1: 48 89 e5 mov %rsp,%rbp > 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <main+0xb> > 7: R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_-0x4 > b: b8 00 00 00 00 mov $0x0,%eax > 10: e8 00 00 00 00 callq 15 <main+0x15> > 11: R_X86_64_PLT32 bar-0x4 > 15: 89 c2 mov %eax,%edx > 17: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 1e <main+0x1e> > 1a: R_X86_64_GOTPCREL c-0x4 > 1e: 0f b6 80 e1 00 00 00 movzbl 0xe1(%rax),%eax > 25: 0f be c0 movsbl %al,%eax > 28: 01 d0 add %edx,%eax > 2a: 5d pop %rbp > 2b: c3 retq > > $ objdump -dr pr61599-2a.o > > pr61599-2a.o: file format elf64-x86-64 > > > Disassembly of section .text: > > 0000000000000000 <bar>: > 0: 55 push %rbp > 1: 48 89 e5 mov %rsp,%rbp > 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <bar+0xb> > 7: R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_-0x4 > b: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 12 <bar+0x12> > e: R_X86_64_GOTPCREL a-0x4 > 12: 0f b6 40 02 movzbl 0x2(%rax),%eax > 16: 0f be d0 movsbl %al,%edx > 19: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 20 <bar+0x20> > 1c: R_X86_64_GOTPCREL b-0x4 > 20: 0f b6 40 10 movzbl 0x10(%rax),%eax > 24: 0f be c0 movsbl %al,%eax > 27: 01 c2 add %eax,%edx > 29: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 30 <bar+0x30> > 2c: R_X86_64_GOTPCREL c-0x4 > 30: 0f b6 80 00 01 00 00 movzbl 0x100(%rax),%eax > 37: 0f be c0 movsbl %al,%eax > 3a: 01 d0 add %edx,%eax > 3c: 5d pop %rbp > 3d: c3 retq > > $ gcc pr61599-2a.o pr61599-1a.o > pr61599-2a.o: In function `bar': > pr61599-2a.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 > against symbol `a' defined in LARGE_COMMON section in pr61599-1a.o > collect2: error: ld returned 1 exit status > > There is no R_X86_64_PC32 in pr61599-2a.o, only X86_64_GOTPCREL, which > according to assumptions, would reach all entries in the GOT table. It is a bug in GNU linker: $ gcc -fuse-ld=gold pr61599-2a.o pr61599-1a.o $ ./a.out Uros. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic 2016-05-13 16:51 ` Uros Bizjak 2016-05-13 17:03 ` Uros Bizjak @ 2016-05-13 17:21 ` H.J. Lu 2016-05-13 17:22 ` Uros Bizjak 1 sibling, 1 reply; 8+ messages in thread From: H.J. Lu @ 2016-05-13 17:21 UTC (permalink / raw) To: Uros Bizjak; +Cc: gcc-patches, Jakub Jelinek On Fri, May 13, 2016 at 9:51 AM, Uros Bizjak <ubizjak@gmail.com> wrote: > On Fri, May 13, 2016 at 9:07 AM, Uros Bizjak <ubizjak@gmail.com> wrote: >> On Fri, May 13, 2016 at 1:20 AM, H.J. Lu <hjl.tools@gmail.com> wrote: >> >>>>> testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure >>>>> with -mcmodel -fpic, where: >>>>> >>>>> /tmp/ccfpoxHY.o: In function `bar': >>>>> pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 >>>>> against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o >>>>> collect2: error: ld returned 1 exit status >>>>> compiler exited with status 1 >>>>> >>>>> CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit >>>>> region, data is unlimited. Based on these assumptions, code should be >>>>> accessed via R_X86_64_GOT64. >>>>> >>>>> Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for >>>>> CM_MEDIUM_PIC. >>>>> >>>>> 2016-05-12 Uros Bizjak <ubizjak@gmail.com> >>>>> >>>>> PR target/61599 >>>>> * config/i386/i386.c (legitimize_pic_address): Do not use >>>>> UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model. >>>>> >>>>> Patch was bootstrapped on x86_64-linux-gnu and regression tested with >>>>> -mcmodel=medium -fpic. >>>>> >>>>> Jakub, H.J., do you have any comments on the patch? >>>> >>>> >>>> I prefer this patch. > >> Yes, your patch is more precise. > > OTOH, are we sure there is no linker bug here? We have: > > $ objdump -dr pr61599-1a.o > > pr61599-1a.o: file format elf64-x86-64 > > > Disassembly of section .text: > > 0000000000000000 <main>: > 0: 55 push %rbp > 1: 48 89 e5 mov %rsp,%rbp > 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <main+0xb> > 7: R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_-0x4 > b: b8 00 00 00 00 mov $0x0,%eax > 10: e8 00 00 00 00 callq 15 <main+0x15> > 11: R_X86_64_PLT32 bar-0x4 > 15: 89 c2 mov %eax,%edx > 17: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 1e <main+0x1e> > 1a: R_X86_64_GOTPCREL c-0x4 > 1e: 0f b6 80 e1 00 00 00 movzbl 0xe1(%rax),%eax > 25: 0f be c0 movsbl %al,%eax > 28: 01 d0 add %edx,%eax > 2a: 5d pop %rbp > 2b: c3 retq > > $ objdump -dr pr61599-2a.o > > pr61599-2a.o: file format elf64-x86-64 > > > Disassembly of section .text: > > 0000000000000000 <bar>: > 0: 55 push %rbp > 1: 48 89 e5 mov %rsp,%rbp > 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <bar+0xb> > 7: R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_-0x4 > b: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 12 <bar+0x12> > e: R_X86_64_GOTPCREL a-0x4 > 12: 0f b6 40 02 movzbl 0x2(%rax),%eax > 16: 0f be d0 movsbl %al,%edx > 19: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 20 <bar+0x20> > 1c: R_X86_64_GOTPCREL b-0x4 > 20: 0f b6 40 10 movzbl 0x10(%rax),%eax > 24: 0f be c0 movsbl %al,%eax > 27: 01 c2 add %eax,%edx > 29: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 30 <bar+0x30> > 2c: R_X86_64_GOTPCREL c-0x4 > 30: 0f b6 80 00 01 00 00 movzbl 0x100(%rax),%eax > 37: 0f be c0 movsbl %al,%eax > 3a: 01 d0 add %edx,%eax > 3c: 5d pop %rbp > 3d: c3 retq > > $ gcc pr61599-2a.o pr61599-1a.o > pr61599-2a.o: In function `bar': > pr61599-2a.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 > against symbol `a' defined in LARGE_COMMON section in pr61599-1a.o > collect2: error: ld returned 1 exit status > > There is no R_X86_64_PC32 in pr61599-2a.o, only X86_64_GOTPCREL, which > according to assumptions, would reach all entries in the GOT table. I opened: https://sourceware.org/bugzilla/show_bug.cgi?id=20093 -- H.J. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic 2016-05-13 17:21 ` H.J. Lu @ 2016-05-13 17:22 ` Uros Bizjak 0 siblings, 0 replies; 8+ messages in thread From: Uros Bizjak @ 2016-05-13 17:22 UTC (permalink / raw) To: H.J. Lu; +Cc: gcc-patches, Jakub Jelinek On Fri, May 13, 2016 at 7:20 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > On Fri, May 13, 2016 at 9:51 AM, Uros Bizjak <ubizjak@gmail.com> wrote: >> On Fri, May 13, 2016 at 9:07 AM, Uros Bizjak <ubizjak@gmail.com> wrote: >>> On Fri, May 13, 2016 at 1:20 AM, H.J. Lu <hjl.tools@gmail.com> wrote: >>> >>>>>> testsuite/gcc.target/i386/pr61599-{1,2}.c testcases expose a failure >>>>>> with -mcmodel -fpic, where: >>>>>> >>>>>> /tmp/ccfpoxHY.o: In function `bar': >>>>>> pr61599-2.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 >>>>>> against symbol `a' defined in LARGE_COMMON section in /tmp/ccKTKST2.o >>>>>> collect2: error: ld returned 1 exit status >>>>>> compiler exited with status 1 >>>>>> >>>>>> CM_MEDIUM_PIC code model assumes that code+got/plt fits in a 31 bit >>>>>> region, data is unlimited. Based on these assumptions, code should be >>>>>> accessed via R_X86_64_GOT64. >>>>>> >>>>>> Attached patch uses UNSPEC_GOT instead of UNSPEC_GOTPCREL also for >>>>>> CM_MEDIUM_PIC. >>>>>> >>>>>> 2016-05-12 Uros Bizjak <ubizjak@gmail.com> >>>>>> >>>>>> PR target/61599 >>>>>> * config/i386/i386.c (legitimize_pic_address): Do not use >>>>>> UNSPEC_GOTPCREL for CM_MEDIUM_PIC code model. >>>>>> >>>>>> Patch was bootstrapped on x86_64-linux-gnu and regression tested with >>>>>> -mcmodel=medium -fpic. >>>>>> >>>>>> Jakub, H.J., do you have any comments on the patch? >>>>> >>>>> >>>>> I prefer this patch. >> >>> Yes, your patch is more precise. >> >> OTOH, are we sure there is no linker bug here? We have: >> >> $ objdump -dr pr61599-1a.o >> >> pr61599-1a.o: file format elf64-x86-64 >> >> >> Disassembly of section .text: >> >> 0000000000000000 <main>: >> 0: 55 push %rbp >> 1: 48 89 e5 mov %rsp,%rbp >> 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <main+0xb> >> 7: R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_-0x4 >> b: b8 00 00 00 00 mov $0x0,%eax >> 10: e8 00 00 00 00 callq 15 <main+0x15> >> 11: R_X86_64_PLT32 bar-0x4 >> 15: 89 c2 mov %eax,%edx >> 17: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 1e <main+0x1e> >> 1a: R_X86_64_GOTPCREL c-0x4 >> 1e: 0f b6 80 e1 00 00 00 movzbl 0xe1(%rax),%eax >> 25: 0f be c0 movsbl %al,%eax >> 28: 01 d0 add %edx,%eax >> 2a: 5d pop %rbp >> 2b: c3 retq >> >> $ objdump -dr pr61599-2a.o >> >> pr61599-2a.o: file format elf64-x86-64 >> >> >> Disassembly of section .text: >> >> 0000000000000000 <bar>: >> 0: 55 push %rbp >> 1: 48 89 e5 mov %rsp,%rbp >> 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <bar+0xb> >> 7: R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_-0x4 >> b: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 12 <bar+0x12> >> e: R_X86_64_GOTPCREL a-0x4 >> 12: 0f b6 40 02 movzbl 0x2(%rax),%eax >> 16: 0f be d0 movsbl %al,%edx >> 19: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 20 <bar+0x20> >> 1c: R_X86_64_GOTPCREL b-0x4 >> 20: 0f b6 40 10 movzbl 0x10(%rax),%eax >> 24: 0f be c0 movsbl %al,%eax >> 27: 01 c2 add %eax,%edx >> 29: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 30 <bar+0x30> >> 2c: R_X86_64_GOTPCREL c-0x4 >> 30: 0f b6 80 00 01 00 00 movzbl 0x100(%rax),%eax >> 37: 0f be c0 movsbl %al,%eax >> 3a: 01 d0 add %edx,%eax >> 3c: 5d pop %rbp >> 3d: c3 retq >> >> $ gcc pr61599-2a.o pr61599-1a.o >> pr61599-2a.o: In function `bar': >> pr61599-2a.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 >> against symbol `a' defined in LARGE_COMMON section in pr61599-1a.o >> collect2: error: ld returned 1 exit status >> >> There is no R_X86_64_PC32 in pr61599-2a.o, only X86_64_GOTPCREL, which >> according to assumptions, would reach all entries in the GOT table. > > I opened: > > https://sourceware.org/bugzilla/show_bug.cgi?id=20093 I also reported https://sourceware.org/bugzilla/show_bug.cgi?id=20092 Thanks, Uros. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-05-13 17:22 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-05-12 22:03 [PATCH, i386]: Additional fix for PR62599 with -mcmodel=medium -fpic Uros Bizjak 2016-05-12 23:19 ` H.J. Lu 2016-05-12 23:20 ` H.J. Lu 2016-05-13 7:07 ` Uros Bizjak 2016-05-13 16:51 ` Uros Bizjak 2016-05-13 17:03 ` Uros Bizjak 2016-05-13 17:21 ` H.J. Lu 2016-05-13 17:22 ` Uros Bizjak
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).