The Tag_ABI_VFP_args build attribute controls the procedure call standard used for floating point parameters on ARM. The values are:
0 - Base AAPCS (FP Parameters passed in Core (Integer) registers 1 - VFP AAPCS (FP Parameters passed in FP registers) 2 - Toolchain specific (Neither Base or VFP) 3 - Compatible with all (No use of floating point parameters)
If the Tag_ABI_VFP_args build attribute is missing it has an implicit value of 0.
We use the attribute in two ways:
- Detect a clash in calling convention between Base, VFP and Toolchain. We follow ld.bfd's lead and do not error if there is a clash between an implicit Base AAPCS caused by a missing attribute. Many projects including the hard-float (VFP AAPCS) version of glibc contain assembler files that do not use floating point but do not have Tag_ABI_VFP_args.
- Set the EF_ARM_ABI_FLOAT_SOFT or EF_ARM_ABI_FLOAT_HARD ELF header flag for Base or VFP AAPCS respectively. This flag is used by some ELF loaders.
The patch is based on the patch posted by Mark Kettenis to llvm-dev http://lists.llvm.org/pipermail/llvm-dev/2018-July/124876.html . It is dependent on D49992 to add the EF_ARM_ABI_FLOAT_SOFT and EF_ARM_ABI_FLOAT_HARD ELF header flags.
References:
- Addenda to, and Errata in, the ABI for the ARM Architecture for Tag_ABI_VFP_args http://infocenter.arm.com/help/topic/com.arm.doc.ihi0045e/IHI0045E_ABI_addenda.pdf
- Elf for the ARM Architecture for ELF header flags http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044f/IHI0044F_aaelf.pdf
Fixes PR36009 (https://bugs.llvm.org/show_bug.cgi?id=36009)
I'd start this comment with "This is ARM only" to make it clear that this is ARM only.