OSDN Git Service

[x86] Fix nasty bug in the x86 backend that is essentially impossible to
authorChandler Carruth <chandlerc@gmail.com>
Wed, 7 Feb 2018 23:59:14 +0000 (23:59 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Wed, 7 Feb 2018 23:59:14 +0000 (23:59 +0000)
commit6e5a6506b1b6657b5a6f042caada486d19cf06a5
tree709ca5725dba4dbaf75442b8c2ae6a58ae0c77eb
parent19265c931f26b1fe94b92e8295b6028a15926575
[x86] Fix nasty bug in the x86 backend that is essentially impossible to
hit from IR but creates a minefield for MI passes.

The x86 backend has fairly powerful logic to try and fold loads that
feed register operands to instructions into a memory operand on the
instruction. This is almost always a good thing, but there are specific
relocated loads that are only allowed to appear in specific
instructions. Notably, R_X86_64_GOTTPOFF is only allowed in `movq` and
`addq`. This patch blocks folding of memory operands using this
relocation unless the target is in fact `addq`.

The particular relocation indicates why we simply don't hit this under
normal circumstances. This relocation is only used for TLS, and it gets
used in very specific ways in conjunction with %fs-relative addressing.
The result is that loads using this relocation are essentially never
eligible for folding into an instruction's memory operands. Unless, of
course, you have an MI pass that inserts usage of such a load. I have
exactly such an MI pass and was greeted by truly mysterious miscompiles
where the linker replaced my instruction with a completely garbage byte
sequence. Go team.

This is the only such relocation I'm aware of in x86, but there may be
others that need to be similarly restricted.

Fixes PR36165.

Differential Revision: https://reviews.llvm.org/D42732

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@324546 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86InstrInfo.cpp
test/CodeGen/X86/bad-tls-fold.mir [new file with mode: 0644]