This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/77300] New: [MIPS] incorrectly moves instruction containing local GOT16 relocation into a delay slot
- From: "james410 at cowgill dot org.uk" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 19 Aug 2016 16:34:38 +0000
- Subject: [Bug target/77300] New: [MIPS] incorrectly moves instruction containing local GOT16 relocation into a delay slot
- Authentication-results: sourceware.org; auth=none
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77300
Bug ID: 77300
Summary: [MIPS] incorrectly moves instruction containing local
GOT16 relocation into a delay slot
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: james410 at cowgill dot org.uk
Target Milestone: ---
Created attachment 39474
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=39474&action=edit
reduced testcase
Debian bug: https://bugs.debian.org/834147
While I'm not sure about the exact conditions this bug occurs, I have managed
to get GCC to produce an object with a dangling GOT16 relocation (ie one
without a LO16) using the attached source. The bug was originally found in
blender, but I've managed to reduce it to something reasonably small.
Compile with:
mipsel-linux-gnu-g++-6 -O2 -fPIC -c src.cpp
You can tell the bug occurs because attempting to link it gives this error:
mipsel-linux-gnu-g++-6 src.o
/usr/lib/gcc-cross/mipsel-linux-gnu/6/../../../../mipsel-linux-gnu/bin/ld:
src.o: Can't find matching LO16 reloc against `_ZN1HIiE5m_fn4ERK1G.isra.1' for
R_MIPS_GOT16 at 0xcc in section
`.text._ZN1HIiE5m_fn5ERK1G[_ZN1HIiE5m_fn5ERK1G]'
The offending assembly contains this:
===========
$L5:
lw $16,%got(_ZN1HIiE5m_fn4ERK1G.isra.1)($28)
$L17:
addiu $16,$16,%lo(_ZN1HIiE5m_fn4ERK1G.isra.1)
move $25,$16
.reloc 1f,R_MIPS_JALR,_ZN1HIiE5m_fn4ERK1G.isra.1
1: jalr $25
move $4,$17
move $25,$16
.reloc 1f,R_MIPS_JALR,_ZN1HIiE5m_fn4ERK1G.isra.1
1: jalr $25
move $4,$17
[...]
$L15:
lw $2,28($sp)
beq $2,$0,$L17
lw $16,%got(_ZN1HIiE5m_fn4ERK1G.isra.1)($28)
b $L16
lw $25,%call16(_ZN1HIiE5m_fn1Ev)($28)
===========
The error is that the bottommost %got relocation does not have a corresponding
%lo relocation. It seems that GCC has "optimized" the function by moving the lw
into the delay slot of the 'beq $2,$0,$L17' instruction, but this unfortunately
doesn't work because the corresponding %lo at $L17 also would need to be
copied.
My compiler is:
mipsel-linux-gnu-g++-6 (Debian 6.1.1-9) 6.1.1 20160705