A couple of AArch64 tests were failing on Solaris, both sparc and x86:
LLVM :: MC/AArch64/SVE/add-diagnostics.s LLVM :: MC/AArch64/SVE/cpy-diagnostics.s LLVM :: MC/AArch64/SVE/cpy.s LLVM :: MC/AArch64/SVE/dup-diagnostics.s LLVM :: MC/AArch64/SVE/dup.s LLVM :: MC/AArch64/SVE/mov-diagnostics.s LLVM :: MC/AArch64/SVE/mov.s LLVM :: MC/AArch64/SVE/sqadd-diagnostics.s LLVM :: MC/AArch64/SVE/sqsub-diagnostics.s LLVM :: MC/AArch64/SVE/sub-diagnostics.s LLVM :: MC/AArch64/SVE/subr-diagnostics.s LLVM :: MC/AArch64/SVE/uqadd-diagnostics.s LLVM :: MC/AArch64/SVE/uqsub-diagnostics.s
For example, reduced from MC/AArch64/SVE/add-diagnostics.s:
add z0.b, z0.b, #0, lsl #8
missed the expected diagnostics
$ ./bin/llvm-mc -triple=aarch64 -show-encoding -mattr=+sve add.s add.s:1:21: error: immediate must be an integer in range [0, 255] with a shift amount of 0 add z0.b, z0.b, #0, lsl #8 ^
The message is Match_InvalidSVEAddSubImm8, emitted in the generated
lib/Target/AArch64/AArch64GenAsmMatcher.inc for MCK_SVEAddSubImm8.
When comparing the call to ::AArch64Operand::isSVEAddSubImm<char> on both
Linux/x86_64 and Solaris, I find
875 bool IsByte = std::is_same<int8_t, std::make_signed_t<T>>::value;
is false on Solaris, unlike Linux.
The problem boils down to the fact that int8_t is plain char on Solaris: both the sparc
and i386 psABIs have char as signed. However, with
9887 DiagnosticPredicate DP(Operand.isSVEAddSubImm<int8_t>());
in lib/Target/AArch64/AArch64GenAsmMatcher.inc, std::make_signed_t<int8_t>
above yieds signed char, so std::is_same<int8_t, char> is false.
This can easily be fixed by also allowing for signed char here and in a few similar places.
Tested on amd64-pc-solaris2.11, sparcv9-sun-solaris2.11, and x86_64-pc-linux-gnu.
Perhaps a naive question but are there any concerns about "signed char" being bigger than a byte on any systems?
The commit message suggests its the make_signed that is the problem so I'm wondering if instead adding "std::is_same<int8_t, T>::value" would also work?