[X86][clang] Disable long double type for -mno-x87 option
authorAndrew Savonichev <andrew.savonichev@gmail.com>
Wed, 3 Nov 2021 09:08:39 +0000 (12:08 +0300)
committerAndrew Savonichev <andrew.savonichev@gmail.com>
Wed, 3 Nov 2021 09:08:39 +0000 (12:08 +0300)
commita8083d42b1c346e21623a1d36d1f0cadd7801d83
treeb61ce62f2907bdc5b1868efc727d99c86eef9dc3
parent3d32218d1af29a86389357b75af31af36dec051a
[X86][clang] Disable long double type for -mno-x87 option

This patch attempts to fix a compiler crash that occurs when long
double type is used with -mno-x87 compiler option.

The option disables x87 target feature, which in turn disables x87
registers, so CG cannot select them for x86_fp80 LLVM IR type. Long
double is lowered as x86_fp80 for some targets, so it leads to a
crash.

The option seems to contradict the SystemV ABI, which requires long
double to be represented as a 80-bit floating point, and it also
requires to use x87 registers.

To avoid that, `long double` type is disabled when -mno-x87 option is
set. In addition to that, `float` and `double` also use x87 registers
for return values on 32-bit x86, so they are disabled as well.

Differential Revision: https://reviews.llvm.org/D98895
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/include/clang/Basic/TargetInfo.h
clang/lib/Basic/TargetInfo.cpp
clang/lib/Basic/Targets/X86.cpp
clang/lib/Basic/Targets/X86.h
clang/lib/Sema/Sema.cpp
clang/lib/Sema/SemaDecl.cpp
clang/test/Sema/x86-no-x87.cpp [new file with mode: 0644]
clang/test/Sema/x86_64-no-x87.cpp [new file with mode: 0644]
clang/test/SemaSYCL/float128.cpp