]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
lld: [ELF][ARM] Implement support for Tag_ABI_VFP_args
authoremaste <emaste@FreeBSD.org>
Tue, 31 Jul 2018 15:25:03 +0000 (15:25 +0000)
committeremaste <emaste@FreeBSD.org>
Tue, 31 Jul 2018 15:25:03 +0000 (15:25 +0000)
commit930481b8f6c6af391952424d0c94ff30632c8a9b
treedea7536a7dd56baa0cd1bf7b4cbe8a95bcb27d0c
parent3f006c3cbffd64218885e8167846c1bcc6316fb0
lld: [ELF][ARM] Implement support for Tag_ABI_VFP_args

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.

References:
* Addenda to, and Errata in, the ABI for the ARM Architecture for
  Tag_ABI_VFP_args
* Elf for the ARM Architecture for ELF header flags

Fixes LLVM PR36009

PR: 229050
Obtained from: llvm r338377 by Peter Smith
contrib/llvm/tools/lld/ELF/Arch/ARM.cpp
contrib/llvm/tools/lld/ELF/Config.h
contrib/llvm/tools/lld/ELF/InputFiles.cpp