summaryrefslogtreecommitdiff
path: root/devel/llvm60/files/lld/patch-head-r336972.diff
diff options
context:
space:
mode:
Diffstat (limited to 'devel/llvm60/files/lld/patch-head-r336972.diff')
-rw-r--r--devel/llvm60/files/lld/patch-head-r336972.diff146
1 files changed, 0 insertions, 146 deletions
diff --git a/devel/llvm60/files/lld/patch-head-r336972.diff b/devel/llvm60/files/lld/patch-head-r336972.diff
deleted file mode 100644
index d7497ce5390a..000000000000
--- a/devel/llvm60/files/lld/patch-head-r336972.diff
+++ /dev/null
@@ -1,146 +0,0 @@
-r336972 | emaste | 2018-07-31 17:25:03 +0200 (Tue, 31 Jul 2018) | 37 lines
-
-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
-
-Index: tools/lld/ELF/Arch/ARM.cpp
-===================================================================
---- tools/lld/ELF/Arch/ARM.cpp (revision 336971)
-+++ tools/lld/ELF/Arch/ARM.cpp (revision 336972)
-@@ -97,10 +97,19 @@ ARM::ARM() {
- }
-
- uint32_t ARM::calcEFlags() const {
-+ // The ABIFloatType is used by loaders to detect the floating point calling
-+ // convention.
-+ uint32_t ABIFloatType = 0;
-+ if (Config->ARMVFPArgs == ARMVFPArgKind::Base ||
-+ Config->ARMVFPArgs == ARMVFPArgKind::Default)
-+ ABIFloatType = EF_ARM_ABI_FLOAT_SOFT;
-+ else if (Config->ARMVFPArgs == ARMVFPArgKind::VFP)
-+ ABIFloatType = EF_ARM_ABI_FLOAT_HARD;
-+
- // We don't currently use any features incompatible with EF_ARM_EABI_VER5,
- // but we don't have any firm guarantees of conformance. Linux AArch64
- // kernels (as of 2016) require an EABI version to be set.
-- return EF_ARM_EABI_VER5;
-+ return EF_ARM_EABI_VER5 | ABIFloatType;
- }
-
- RelExpr ARM::getRelExpr(RelType Type, const Symbol &S,
-Index: tools/lld/ELF/Config.h
-===================================================================
---- tools/lld/ELF/Config.h (revision 336971)
-+++ tools/lld/ELF/Config.h (revision 336972)
-@@ -54,6 +54,9 @@ enum class SortSectionPolicy { Default, None, Alig
- // For --target2
- enum class Target2Policy { Abs, Rel, GotRel };
-
-+// For tracking ARM Float Argument PCS
-+enum class ARMVFPArgKind { Default, Base, VFP, ToolChain };
-+
- struct SymbolVersion {
- llvm::StringRef Name;
- bool IsExternCpp;
-@@ -169,6 +172,7 @@ struct Configuration {
- StripPolicy Strip;
- UnresolvedPolicy UnresolvedSymbols;
- Target2Policy Target2;
-+ ARMVFPArgKind ARMVFPArgs = ARMVFPArgKind::Default;
- BuildIdKind BuildId = BuildIdKind::None;
- ELFKind EKind = ELFNoneKind;
- uint16_t DefaultSymbolVersion = llvm::ELF::VER_NDX_GLOBAL;
-Index: tools/lld/ELF/InputFiles.cpp
-===================================================================
---- tools/lld/ELF/InputFiles.cpp (revision 336971)
-+++ tools/lld/ELF/InputFiles.cpp (revision 336972)
-@@ -441,6 +441,46 @@ void ObjFile<ELFT>::initializeSections(
- }
- }
-
-+// For ARM only, to set the EF_ARM_ABI_FLOAT_SOFT or EF_ARM_ABI_FLOAT_HARD
-+// flag in the ELF Header we need to look at Tag_ABI_VFP_args to find out how
-+// the input objects have been compiled.
-+static void updateARMVFPArgs(const ARMAttributeParser &Attributes,
-+ const InputFile *F) {
-+ if (!Attributes.hasAttribute(ARMBuildAttrs::ABI_VFP_args))
-+ // If an ABI tag isn't present then it is implicitly given the value of 0
-+ // which maps to ARMBuildAttrs::BaseAAPCS. However many assembler files,
-+ // including some in glibc that don't use FP args (and should have value 3)
-+ // don't have the attribute so we do not consider an implicit value of 0
-+ // as a clash.
-+ return;
-+
-+ unsigned VFPArgs = Attributes.getAttributeValue(ARMBuildAttrs::ABI_VFP_args);
-+ ARMVFPArgKind Arg;
-+ switch (VFPArgs) {
-+ case ARMBuildAttrs::BaseAAPCS:
-+ Arg = ARMVFPArgKind::Base;
-+ break;
-+ case ARMBuildAttrs::HardFPAAPCS:
-+ Arg = ARMVFPArgKind::VFP;
-+ break;
-+ case ARMBuildAttrs::ToolChainFPPCS:
-+ // Tool chain specific convention that conforms to neither AAPCS variant.
-+ Arg = ARMVFPArgKind::ToolChain;
-+ break;
-+ case ARMBuildAttrs::CompatibleFPAAPCS:
-+ // Object compatible with all conventions.
-+ return;
-+ default:
-+ error(toString(F) + ": unknown Tag_ABI_VFP_args value: " + Twine(VFPArgs));
-+ return;
-+ }
-+ // Follow ld.bfd and error if there is a mix of calling conventions.
-+ if (Config->ARMVFPArgs != Arg && Config->ARMVFPArgs != ARMVFPArgKind::Default)
-+ error(toString(F) + ": incompatible Tag_ABI_VFP_args");
-+ else
-+ Config->ARMVFPArgs = Arg;
-+}
-+
- // The ARM support in lld makes some use of instructions that are not available
- // on all ARM architectures. Namely:
- // - Use of BLX instruction for interworking between ARM and Thumb state.
-@@ -520,6 +560,8 @@ InputSectionBase *ObjFile<ELFT>::createInputSectio
- ArrayRef<uint8_t> Contents = check(this->getObj().getSectionContents(&Sec));
- Attributes.Parse(Contents, /*isLittle*/ Config->EKind == ELF32LEKind);
- updateSupportedARMFeatures(Attributes);
-+ updateARMVFPArgs(Attributes, this);
-+
- // FIXME: Retain the first attribute section we see. The eglibc ARM
- // dynamic loaders require the presence of an attribute section for dlopen
- // to work. In a full implementation we would merge all attribute sections.