Skip to content

Commit fe5d1f9

Browse files
authored
[ARM] Fix missing ELF FPU attributes for fp-armv8-fullfp16-d16 (llvm#105677)
An assembly input with > .fpu fp-armv8-fullfp16-d16 crashes the compiler because the ELF FPU attribute emitter misses the respective entry. This patch fixes this. Interestingly, compiling with -mfpu=fp-armv8-fullfp16-d16 does not cause the crash because FPv5_D16 is an alias in the compiler and > .fpu fpv5-d16 is emitted instead, which does not crash. The existing .fpu directive test with multiple FPUs serves the purpose of verifying that each possible FPU option is defined, but does not trigger the crash because only the last .fpu directive goes effectively down the code path. Therefore one test for each FPU is required. Fixes llvm#105674.
1 parent 9f41805 commit fe5d1f9

24 files changed

+331
-0
lines changed

llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,10 @@ void ARMTargetELFStreamer::emitFPUDefaultAttributes() {
992992
// uses the FP_ARMV8_D16 build attribute.
993993
case ARM::FK_FPV5_SP_D16:
994994
case ARM::FK_FPV5_D16:
995+
// FPv5 and FP-ARMv8 have the same instructions, so are modeled as one
996+
// FPU, but there are two different names for it depending on the CPU.
997+
case ARM::FK_FP_ARMV8_FULLFP16_SP_D16:
998+
case ARM::FK_FP_ARMV8_FULLFP16_D16:
995999
S.setAttributeItem(ARMBuildAttrs::FP_arch, ARMBuildAttrs::AllowFPARMv8B,
9961000
/* OverwriteExisting= */ false);
9971001
break;

llvm/test/MC/ARM/directive-fpu-multiple.s

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
.fpu fpv5-d16
2323
.fpu fpv5-sp-d16
2424
.fpu fp-armv8
25+
.fpu fp-armv8-fullfp16-d16
26+
.fpu fp-armv8-fullfp16-sp-d16
2527
.fpu neon
2628
.fpu neon-fp16
2729
.fpu neon-vfpv4
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu crypto-neon-fp-armv8
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: ARMv8-a FP
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu fp-armv8-fullfp16-d16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: ARMv8-a FP-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu fp-armv8-fullfp16-sp-d16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: ARMv8-a FP-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu fp-armv8
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: ARMv8-a FP
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu fpv4-sp-d16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv4-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu fpv5-d16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: ARMv8-a FP-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu fpv5-sp-d16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: ARMv8-a FP-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu neon-fp-armv8
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: ARMv8-a FP
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu neon-fp16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv3
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu neon-vfpv4
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv4
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu neon
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv3
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu none
8+
9+
@ CHECK-ATTR-NOT: TagName: FP_arch
10+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfp
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv2
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfp2
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv2
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfpv3-d16-fp16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv3-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfp3-d16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv3-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfpv3-fp16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv3
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfp3
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv3
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfpv3xd-fp16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv3-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfpv3xd
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv3-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfpv4-d16
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv4-D16
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@ Check a single .fpu directive.
2+
3+
@ RUN: llvm-mc -triple arm-eabi -filetype obj %s \
4+
@ RUN: | llvm-readobj --arch-specific - \
5+
@ RUN: | FileCheck %s -check-prefix CHECK-ATTR
6+
7+
.fpu vfpv4
8+
9+
@ CHECK-ATTR: FileAttributes {
10+
@ CHECK-ATTR: Attribute {
11+
@ CHECK-ATTR: TagName: FP_arch
12+
@ CHECK-ATTR: Description: VFPv4
13+
@ CHECK-ATTR: }
14+
@ CHECK-ATTR: }
15+

0 commit comments

Comments
 (0)