// REQUIRES:arm
// RUN: rm -rf %t
// RUN: split-file %s %t
// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %S/Inputs/arm-vfp-arg-base.s -o %t/base.o
// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %S/Inputs/arm-vfp-arg-vfp.s -o %t/vfp.o
// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %S/Inputs/arm-vfp-arg-toolchain.s -o %t/toolchain.o
// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %t/main.s -o %t/main.o
// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %t/vendor.s -o %t/vendor.o
// RUN: not ld.lld %t/main.o %t/base.o %t/vfp.o -o%t/a.out 2>&1 | FileCheck %s
// RUN: not ld.lld %t/main.o %t/base.o %t/vendor.o -o%t/a.out 2>&1 | FileCheck %s
// RUN: not ld.lld %t/main.o %t/base.o %t/toolchain.o -o%t/a.out 2>&1 | FileCheck %s
// RUN: not ld.lld %t/main.o %t/vfp.o %t/base.o -o%t/a.out 2>&1 | FileCheck %s
// RUN: not ld.lld %t/main.o %t/vfp.o %t/toolchain.o -o%t/a.out 2>&1 | FileCheck %s
// RUN: not ld.lld %t/main.o %t/toolchain.o %t/base.o -o%t/a.out 2>&1 | FileCheck %s
// RUN: not ld.lld %t/main.o %t/toolchain.o %t/vfp.o -o%t/a.out 2>&1 | FileCheck %s
// CHECK: incompatible Tag_ABI_VFP_args
//--- main.s
.arch armv7-a
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 1
.eabi_attribute 18, 4
.eabi_attribute 28, 3 // Tag_ABI_VFP_args = 3 (Compatible with all)
.syntax unified
.globl _start
.type _start, %function
_start: bx lr
//--- vendor.s
.syntax unified
// Manually construct a custom .ARM.attributes section
.section .ARM.attributes,"",%0x70000003 // SHT_ARM_ATTRIBUTES
// Initial byte giving the section format version
.byte 'A'
// Subsection with a name that won't be recognised as a known vendor
vendor_subsect_start:
.word vendor_subsect_end - vendor_subsect_start // subsection length
.asciz "ShouldBeIgnored" // vendor name
.dcb.b 64, 0xff // dummy vendor section contents
vendor_subsect_end:
// Subsection that should be identical to the attributes defined by
// Inputs/arm-vfp-arg-vfp.s
aeabi_subsect_start:
.word aeabi_subsect_end - aeabi_subsect_start
.asciz "aeabi" // vendor name indicating the standard subsection
file_subsubsect_start:
.byte 1 // introduce sub-subsection of attributes for the whole file
.word file_subsubsect_end - file_subsubsect_start // sub-subsection len
.byte 5 // CPU_name
.asciz "7-A"
.byte 6, 10 // CPU_arch = ARM v7
.byte 7, 'A' // CPU_arch_profile = Application
.byte 8, 1 // ARM_ISA_use = Permitted
.byte 9, 2 // THUMB_ISA_use = Thumb-2
.byte 18, 4 // ABI_PCS_wchar_t = 4-byte
.byte 20, 1 // ABI_FP_denormal = IEEE-754
.byte 21, 1 // ABI_FP_exceptions = IEEE-754
.byte 23, 3 // ABI_FP_number_model = IEEE-754
.byte 24, 1 // ABI_align_needed = 8-byte alignment
.byte 25, 1 // ABI_align_preserved = 8-byte data alignment
.byte 26, 2 // ABI_enum_size = Int32
.byte 28, 1 // ABI_VFP_args = AAPCS VFP
.byte 30, 6 // ABI_optimization_goals = Best Debugging
.byte 34, 1 // CPU_unaligned_access = v6-style
file_subsubsect_end:
aeabi_subsect_end:
.text
.global f1
.type f1, %function
f1: bx lr