diff options
-rw-r--r-- | ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c | 32 | ||||
-rw-r--r-- | ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.c | 566 | ||||
-rw-r--r-- | ArmPkg/Library/CompilerIntrinsicsLib/memset.c | 110 | ||||
-rw-r--r-- | ArmPkg/Library/GccLto/liblto-aarch64.s | 42 | ||||
-rw-r--r-- | ArmPkg/Library/GccLto/liblto-arm.s | 110 |
5 files changed, 430 insertions, 430 deletions
diff --git a/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c b/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c index 2cd292aabf..2d79aadaf1 100644 --- a/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c +++ b/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c @@ -1,16 +1,16 @@ -// -// Copyright (c) 2016, Linaro Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -#include <Base.h> -#include <Library/ArmSmcLib.h> - -VOID -ArmCallSmc ( - IN OUT ARM_SMC_ARGS *Args - ) -{ -} +//
+// Copyright (c) 2016, Linaro Limited. All rights reserved.
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+//
+
+#include <Base.h>
+#include <Library/ArmSmcLib.h>
+
+VOID
+ArmCallSmc (
+ IN OUT ARM_SMC_ARGS *Args
+ )
+{
+}
diff --git a/ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.c b/ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.c index 42bed7700c..77e2473678 100644 --- a/ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.c +++ b/ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.c @@ -1,283 +1,283 @@ -/* - * Copyright (c) 2015 - 2019, Linaro Limited - * - * SPDX-License-Identifier: BSD-2-Clause-Patent - */ - -#include "platform.h" -#include <softfloat.h> - -/* - * On ARM32 EABI defines both a soft-float ABI and a hard-float ABI, - * hard-float is basically a super set of soft-float. Hard-float requires - * all the support routines provided for soft-float, but the compiler may - * choose to optimize to not use some of them. - * - * The AEABI functions uses soft-float calling convention even if the - * functions are compiled for hard-float. So where float and double would - * have been expected we use aeabi_float_t and aeabi_double_t respectively - * instead. - */ -typedef uint32_t aeabi_float_t; -typedef uint64_t aeabi_double_t; - -/* - * Helpers to convert between float32 and aeabi_float_t, and float64 and - * aeabi_double_t used by the AEABI functions below. - */ -static aeabi_float_t f32_to_f(float32_t val) -{ - return val.v; -} - -static float32_t f32_from_f(aeabi_float_t val) -{ - float32_t res; - - res.v = val; - - return res; -} - -static aeabi_double_t f64_to_d(float64_t val) -{ - return val.v; -} - -static float64_t f64_from_d(aeabi_double_t val) -{ - float64_t res; - - res.v = val; - - return res; -} - -/* - * From ARM Run-time ABI for ARM Architecture - * ARM IHI 0043D, current through ABI release 2.09 - * - * 4.1.2 The floating-point helper functions - */ - -/* - * Table 2, Standard aeabi_double_t precision floating-point arithmetic helper - * functions - */ - -aeabi_double_t __aeabi_dadd(aeabi_double_t a, aeabi_double_t b) -{ - return f64_to_d(f64_add(f64_from_d(a), f64_from_d(b))); -} - -aeabi_double_t __aeabi_ddiv(aeabi_double_t a, aeabi_double_t b) -{ - return f64_to_d(f64_div(f64_from_d(a), f64_from_d(b))); -} - -aeabi_double_t __aeabi_dmul(aeabi_double_t a, aeabi_double_t b) -{ - return f64_to_d(f64_mul(f64_from_d(a), f64_from_d(b))); -} - - -aeabi_double_t __aeabi_drsub(aeabi_double_t a, aeabi_double_t b) -{ - return f64_to_d(f64_sub(f64_from_d(b), f64_from_d(a))); -} - -aeabi_double_t __aeabi_dsub(aeabi_double_t a, aeabi_double_t b) -{ - return f64_to_d(f64_sub(f64_from_d(a), f64_from_d(b))); -} - -/* - * Table 3, double precision floating-point comparison helper functions - */ - -int __aeabi_dcmpeq(aeabi_double_t a, aeabi_double_t b) -{ - return f64_eq(f64_from_d(a), f64_from_d(b)); -} - -int __aeabi_dcmplt(aeabi_double_t a, aeabi_double_t b) -{ - return f64_lt(f64_from_d(a), f64_from_d(b)); -} - -int __aeabi_dcmple(aeabi_double_t a, aeabi_double_t b) -{ - return f64_le(f64_from_d(a), f64_from_d(b)); -} - -int __aeabi_dcmpge(aeabi_double_t a, aeabi_double_t b) -{ - return f64_le(f64_from_d(b), f64_from_d(a)); -} - -int __aeabi_dcmpgt(aeabi_double_t a, aeabi_double_t b) -{ - return f64_lt(f64_from_d(b), f64_from_d(a)); -} - -/* - * Table 4, Standard single precision floating-point arithmetic helper - * functions - */ - -aeabi_float_t __aeabi_fadd(aeabi_float_t a, aeabi_float_t b) -{ - return f32_to_f(f32_add(f32_from_f(a), f32_from_f(b))); -} - -aeabi_float_t __aeabi_fdiv(aeabi_float_t a, aeabi_float_t b) -{ - return f32_to_f(f32_div(f32_from_f(a), f32_from_f(b))); -} - -aeabi_float_t __aeabi_fmul(aeabi_float_t a, aeabi_float_t b) -{ - return f32_to_f(f32_mul(f32_from_f(a), f32_from_f(b))); -} - -aeabi_float_t __aeabi_frsub(aeabi_float_t a, aeabi_float_t b) -{ - return f32_to_f(f32_sub(f32_from_f(b), f32_from_f(a))); -} - -aeabi_float_t __aeabi_fsub(aeabi_float_t a, aeabi_float_t b) -{ - return f32_to_f(f32_sub(f32_from_f(a), f32_from_f(b))); -} - -/* - * Table 5, Standard single precision floating-point comparison helper - * functions - */ - -int __aeabi_fcmpeq(aeabi_float_t a, aeabi_float_t b) -{ - return f32_eq(f32_from_f(a), f32_from_f(b)); -} - -int __aeabi_fcmplt(aeabi_float_t a, aeabi_float_t b) -{ - return f32_lt(f32_from_f(a), f32_from_f(b)); -} - -int __aeabi_fcmple(aeabi_float_t a, aeabi_float_t b) -{ - return f32_le(f32_from_f(a), f32_from_f(b)); -} - -int __aeabi_fcmpge(aeabi_float_t a, aeabi_float_t b) -{ - return f32_le(f32_from_f(b), f32_from_f(a)); -} - -int __aeabi_fcmpgt(aeabi_float_t a, aeabi_float_t b) -{ - return f32_lt(f32_from_f(b), f32_from_f(a)); -} - -/* - * Table 6, Standard floating-point to integer conversions - */ - -int __aeabi_d2iz(aeabi_double_t a) -{ - return f64_to_i32_r_minMag(f64_from_d(a), false); -} - -unsigned __aeabi_d2uiz(aeabi_double_t a) -{ - return f64_to_ui32_r_minMag(f64_from_d(a), false); -} - -long long __aeabi_d2lz(aeabi_double_t a) -{ - return f64_to_i64_r_minMag(f64_from_d(a), false); -} - -unsigned long long __aeabi_d2ulz(aeabi_double_t a) -{ - return f64_to_ui64_r_minMag(f64_from_d(a), false); -} - -int __aeabi_f2iz(aeabi_float_t a) -{ - return f32_to_i32_r_minMag(f32_from_f(a), false); -} - -unsigned __aeabi_f2uiz(aeabi_float_t a) -{ - return f32_to_ui32_r_minMag(f32_from_f(a), false); -} - -long long __aeabi_f2lz(aeabi_float_t a) -{ - return f32_to_i64_r_minMag(f32_from_f(a), false); -} - -unsigned long long __aeabi_f2ulz(aeabi_float_t a) -{ - return f32_to_ui64_r_minMag(f32_from_f(a), false); -} - -/* - * Table 7, Standard conversions between floating types - */ - -aeabi_float_t __aeabi_d2f(aeabi_double_t a) -{ - return f32_to_f(f64_to_f32(f64_from_d(a))); -} - -aeabi_double_t __aeabi_f2d(aeabi_float_t a) -{ - return f64_to_d(f32_to_f64(f32_from_f(a))); -} - -/* - * Table 8, Standard integer to floating-point conversions - */ - -aeabi_double_t __aeabi_i2d(int a) -{ - return f64_to_d(i32_to_f64(a)); -} - -aeabi_double_t __aeabi_ui2d(unsigned a) -{ - return f64_to_d(ui32_to_f64(a)); -} - -aeabi_double_t __aeabi_l2d(long long a) -{ - return f64_to_d(i64_to_f64(a)); -} - -aeabi_double_t __aeabi_ul2d(unsigned long long a) -{ - return f64_to_d(ui64_to_f64(a)); -} - -aeabi_float_t __aeabi_i2f(int a) -{ - return f32_to_f(i32_to_f32(a)); -} - -aeabi_float_t __aeabi_ui2f(unsigned a) -{ - return f32_to_f(ui32_to_f32(a)); -} - -aeabi_float_t __aeabi_l2f(long long a) -{ - return f32_to_f(i64_to_f32(a)); -} - -aeabi_float_t __aeabi_ul2f(unsigned long long a) -{ - return f32_to_f(ui64_to_f32(a)); -} +/*
+ * Copyright (c) 2015 - 2019, Linaro Limited
+ *
+ * SPDX-License-Identifier: BSD-2-Clause-Patent
+ */
+
+#include "platform.h"
+#include <softfloat.h>
+
+/*
+ * On ARM32 EABI defines both a soft-float ABI and a hard-float ABI,
+ * hard-float is basically a super set of soft-float. Hard-float requires
+ * all the support routines provided for soft-float, but the compiler may
+ * choose to optimize to not use some of them.
+ *
+ * The AEABI functions uses soft-float calling convention even if the
+ * functions are compiled for hard-float. So where float and double would
+ * have been expected we use aeabi_float_t and aeabi_double_t respectively
+ * instead.
+ */
+typedef uint32_t aeabi_float_t;
+typedef uint64_t aeabi_double_t;
+
+/*
+ * Helpers to convert between float32 and aeabi_float_t, and float64 and
+ * aeabi_double_t used by the AEABI functions below.
+ */
+static aeabi_float_t f32_to_f(float32_t val)
+{
+ return val.v;
+}
+
+static float32_t f32_from_f(aeabi_float_t val)
+{
+ float32_t res;
+
+ res.v = val;
+
+ return res;
+}
+
+static aeabi_double_t f64_to_d(float64_t val)
+{
+ return val.v;
+}
+
+static float64_t f64_from_d(aeabi_double_t val)
+{
+ float64_t res;
+
+ res.v = val;
+
+ return res;
+}
+
+/*
+ * From ARM Run-time ABI for ARM Architecture
+ * ARM IHI 0043D, current through ABI release 2.09
+ *
+ * 4.1.2 The floating-point helper functions
+ */
+
+/*
+ * Table 2, Standard aeabi_double_t precision floating-point arithmetic helper
+ * functions
+ */
+
+aeabi_double_t __aeabi_dadd(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_to_d(f64_add(f64_from_d(a), f64_from_d(b)));
+}
+
+aeabi_double_t __aeabi_ddiv(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_to_d(f64_div(f64_from_d(a), f64_from_d(b)));
+}
+
+aeabi_double_t __aeabi_dmul(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_to_d(f64_mul(f64_from_d(a), f64_from_d(b)));
+}
+
+
+aeabi_double_t __aeabi_drsub(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_to_d(f64_sub(f64_from_d(b), f64_from_d(a)));
+}
+
+aeabi_double_t __aeabi_dsub(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_to_d(f64_sub(f64_from_d(a), f64_from_d(b)));
+}
+
+/*
+ * Table 3, double precision floating-point comparison helper functions
+ */
+
+int __aeabi_dcmpeq(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_eq(f64_from_d(a), f64_from_d(b));
+}
+
+int __aeabi_dcmplt(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_lt(f64_from_d(a), f64_from_d(b));
+}
+
+int __aeabi_dcmple(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_le(f64_from_d(a), f64_from_d(b));
+}
+
+int __aeabi_dcmpge(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_le(f64_from_d(b), f64_from_d(a));
+}
+
+int __aeabi_dcmpgt(aeabi_double_t a, aeabi_double_t b)
+{
+ return f64_lt(f64_from_d(b), f64_from_d(a));
+}
+
+/*
+ * Table 4, Standard single precision floating-point arithmetic helper
+ * functions
+ */
+
+aeabi_float_t __aeabi_fadd(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_to_f(f32_add(f32_from_f(a), f32_from_f(b)));
+}
+
+aeabi_float_t __aeabi_fdiv(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_to_f(f32_div(f32_from_f(a), f32_from_f(b)));
+}
+
+aeabi_float_t __aeabi_fmul(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_to_f(f32_mul(f32_from_f(a), f32_from_f(b)));
+}
+
+aeabi_float_t __aeabi_frsub(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_to_f(f32_sub(f32_from_f(b), f32_from_f(a)));
+}
+
+aeabi_float_t __aeabi_fsub(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_to_f(f32_sub(f32_from_f(a), f32_from_f(b)));
+}
+
+/*
+ * Table 5, Standard single precision floating-point comparison helper
+ * functions
+ */
+
+int __aeabi_fcmpeq(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_eq(f32_from_f(a), f32_from_f(b));
+}
+
+int __aeabi_fcmplt(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_lt(f32_from_f(a), f32_from_f(b));
+}
+
+int __aeabi_fcmple(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_le(f32_from_f(a), f32_from_f(b));
+}
+
+int __aeabi_fcmpge(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_le(f32_from_f(b), f32_from_f(a));
+}
+
+int __aeabi_fcmpgt(aeabi_float_t a, aeabi_float_t b)
+{
+ return f32_lt(f32_from_f(b), f32_from_f(a));
+}
+
+/*
+ * Table 6, Standard floating-point to integer conversions
+ */
+
+int __aeabi_d2iz(aeabi_double_t a)
+{
+ return f64_to_i32_r_minMag(f64_from_d(a), false);
+}
+
+unsigned __aeabi_d2uiz(aeabi_double_t a)
+{
+ return f64_to_ui32_r_minMag(f64_from_d(a), false);
+}
+
+long long __aeabi_d2lz(aeabi_double_t a)
+{
+ return f64_to_i64_r_minMag(f64_from_d(a), false);
+}
+
+unsigned long long __aeabi_d2ulz(aeabi_double_t a)
+{
+ return f64_to_ui64_r_minMag(f64_from_d(a), false);
+}
+
+int __aeabi_f2iz(aeabi_float_t a)
+{
+ return f32_to_i32_r_minMag(f32_from_f(a), false);
+}
+
+unsigned __aeabi_f2uiz(aeabi_float_t a)
+{
+ return f32_to_ui32_r_minMag(f32_from_f(a), false);
+}
+
+long long __aeabi_f2lz(aeabi_float_t a)
+{
+ return f32_to_i64_r_minMag(f32_from_f(a), false);
+}
+
+unsigned long long __aeabi_f2ulz(aeabi_float_t a)
+{
+ return f32_to_ui64_r_minMag(f32_from_f(a), false);
+}
+
+/*
+ * Table 7, Standard conversions between floating types
+ */
+
+aeabi_float_t __aeabi_d2f(aeabi_double_t a)
+{
+ return f32_to_f(f64_to_f32(f64_from_d(a)));
+}
+
+aeabi_double_t __aeabi_f2d(aeabi_float_t a)
+{
+ return f64_to_d(f32_to_f64(f32_from_f(a)));
+}
+
+/*
+ * Table 8, Standard integer to floating-point conversions
+ */
+
+aeabi_double_t __aeabi_i2d(int a)
+{
+ return f64_to_d(i32_to_f64(a));
+}
+
+aeabi_double_t __aeabi_ui2d(unsigned a)
+{
+ return f64_to_d(ui32_to_f64(a));
+}
+
+aeabi_double_t __aeabi_l2d(long long a)
+{
+ return f64_to_d(i64_to_f64(a));
+}
+
+aeabi_double_t __aeabi_ul2d(unsigned long long a)
+{
+ return f64_to_d(ui64_to_f64(a));
+}
+
+aeabi_float_t __aeabi_i2f(int a)
+{
+ return f32_to_f(i32_to_f32(a));
+}
+
+aeabi_float_t __aeabi_ui2f(unsigned a)
+{
+ return f32_to_f(ui32_to_f32(a));
+}
+
+aeabi_float_t __aeabi_l2f(long long a)
+{
+ return f32_to_f(i64_to_f32(a));
+}
+
+aeabi_float_t __aeabi_ul2f(unsigned long long a)
+{
+ return f32_to_f(ui64_to_f32(a));
+}
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memset.c b/ArmPkg/Library/CompilerIntrinsicsLib/memset.c index c5ae32e5ee..24398d591f 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/memset.c +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset.c @@ -1,55 +1,55 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -//------------------------------------------------------------------------------ - -typedef __SIZE_TYPE__ size_t; - -static __attribute__((__used__)) -void *__memset(void *s, int c, size_t n) -{ - unsigned char *d = s; - - while (n--) - *d++ = c; - - return s; -} - -// -// Other modules (such as CryptoPkg/IntrinsicLib) may provide another -// implementation of memset(), which may conflict with this one if this -// object was pulled into the link due to the definitions below. So make -// our memset() 'weak' to let the other implementation take precedence. -// -__attribute__((__weak__, __alias__("__memset"))) -void *memset(void *dest, int c, size_t n); - -#ifdef __arm__ - -void __aeabi_memset(void *dest, size_t n, int c) -{ - __memset(dest, c, n); -} - -__attribute__((__alias__("__aeabi_memset"))) -void __aeabi_memset4(void *dest, size_t n, int c); - -__attribute__((__alias__("__aeabi_memset"))) -void __aeabi_memset8(void *dest, size_t n, int c); - -void __aeabi_memclr(void *dest, size_t n) -{ - __memset(dest, 0, n); -} - -__attribute__((__alias__("__aeabi_memclr"))) -void __aeabi_memclr4(void *dest, size_t n); - -__attribute__((__alias__("__aeabi_memclr"))) -void __aeabi_memclr8(void *dest, size_t n); - -#endif +//------------------------------------------------------------------------------
+//
+// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+//------------------------------------------------------------------------------
+
+typedef __SIZE_TYPE__ size_t;
+
+static __attribute__((__used__))
+void *__memset(void *s, int c, size_t n)
+{
+ unsigned char *d = s;
+
+ while (n--)
+ *d++ = c;
+
+ return s;
+}
+
+//
+// Other modules (such as CryptoPkg/IntrinsicLib) may provide another
+// implementation of memset(), which may conflict with this one if this
+// object was pulled into the link due to the definitions below. So make
+// our memset() 'weak' to let the other implementation take precedence.
+//
+__attribute__((__weak__, __alias__("__memset")))
+void *memset(void *dest, int c, size_t n);
+
+#ifdef __arm__
+
+void __aeabi_memset(void *dest, size_t n, int c)
+{
+ __memset(dest, c, n);
+}
+
+__attribute__((__alias__("__aeabi_memset")))
+void __aeabi_memset4(void *dest, size_t n, int c);
+
+__attribute__((__alias__("__aeabi_memset")))
+void __aeabi_memset8(void *dest, size_t n, int c);
+
+void __aeabi_memclr(void *dest, size_t n)
+{
+ __memset(dest, 0, n);
+}
+
+__attribute__((__alias__("__aeabi_memclr")))
+void __aeabi_memclr4(void *dest, size_t n);
+
+__attribute__((__alias__("__aeabi_memclr")))
+void __aeabi_memclr8(void *dest, size_t n);
+
+#endif
diff --git a/ArmPkg/Library/GccLto/liblto-aarch64.s b/ArmPkg/Library/GccLto/liblto-aarch64.s index 66819534a0..02a55ef445 100644 --- a/ArmPkg/Library/GccLto/liblto-aarch64.s +++ b/ArmPkg/Library/GccLto/liblto-aarch64.s @@ -1,21 +1,21 @@ -// -// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// - -// -// GCC in LTO mode interoperates poorly with non-standard libraries that -// provide implementations of compiler intrinsics such as memcpy/memset -// or the stack protector entry points. -// -// By referencing these functions from a non-LTO object that can be passed -// to the linker via the -plugin-opt=-pass-through=-lxxx options, the -// intrinsics are included in the link in a way that allows them to be -// pruned again if no other references to them exist. -// - - .long memcpy - . - .long memset - . - .long __stack_chk_fail - . - .long __stack_chk_guard - . +//
+// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+//
+// GCC in LTO mode interoperates poorly with non-standard libraries that
+// provide implementations of compiler intrinsics such as memcpy/memset
+// or the stack protector entry points.
+//
+// By referencing these functions from a non-LTO object that can be passed
+// to the linker via the -plugin-opt=-pass-through=-lxxx options, the
+// intrinsics are included in the link in a way that allows them to be
+// pruned again if no other references to them exist.
+//
+
+ .long memcpy - .
+ .long memset - .
+ .long __stack_chk_fail - .
+ .long __stack_chk_guard - .
diff --git a/ArmPkg/Library/GccLto/liblto-arm.s b/ArmPkg/Library/GccLto/liblto-arm.s index 4b26d4320d..f19fb45551 100644 --- a/ArmPkg/Library/GccLto/liblto-arm.s +++ b/ArmPkg/Library/GccLto/liblto-arm.s @@ -1,55 +1,55 @@ -// -// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// - -// -// GCC in LTO mode interoperates poorly with non-standard libraries that -// provide implementations of compiler intrinsics such as memcpy/memset -// or the stack protector entry points. -// -// By referencing these functions from a non-LTO object that can be passed -// to the linker via the -plugin-opt=-pass-through=-lxxx options, the -// intrinsics are included in the link in a way that allows them to be -// pruned again if no other references to them exist. -// - - .long memcpy - . - .long memset - . - .long __stack_chk_fail - . - .long __stack_chk_guard - . - .long __ashrdi3 - . - .long __ashldi3 - . - .long __aeabi_idiv - . - .long __aeabi_idivmod - . - .long __aeabi_uidiv - . - .long __aeabi_uidivmod - . - .long __divdi3 - . - .long __divsi3 - . - .long __lshrdi3 - . - .long __aeabi_memcpy - . - .long __aeabi_memset - . - .long memmove - . - .long __modsi3 - . - .long __moddi3 - . - .long __muldi3 - . - .long __aeabi_lmul - . - .long __ARM_ll_mullu - . - .long __udivsi3 - . - .long __umodsi3 - . - .long __udivdi3 - . - .long __umoddi3 - . - .long __udivmoddi4 - . - .long __clzsi2 - . - .long __ctzsi2 - . - .long __ucmpdi2 - . - .long __switch8 - . - .long __switchu8 - . - .long __switch16 - . - .long __switch32 - . - .long __aeabi_ulcmp - . - .long __aeabi_uldivmod - . - .long __aeabi_ldivmod - . - .long __aeabi_llsr - . - .long __aeabi_llsl - . +//
+// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+
+//
+// GCC in LTO mode interoperates poorly with non-standard libraries that
+// provide implementations of compiler intrinsics such as memcpy/memset
+// or the stack protector entry points.
+//
+// By referencing these functions from a non-LTO object that can be passed
+// to the linker via the -plugin-opt=-pass-through=-lxxx options, the
+// intrinsics are included in the link in a way that allows them to be
+// pruned again if no other references to them exist.
+//
+
+ .long memcpy - .
+ .long memset - .
+ .long __stack_chk_fail - .
+ .long __stack_chk_guard - .
+ .long __ashrdi3 - .
+ .long __ashldi3 - .
+ .long __aeabi_idiv - .
+ .long __aeabi_idivmod - .
+ .long __aeabi_uidiv - .
+ .long __aeabi_uidivmod - .
+ .long __divdi3 - .
+ .long __divsi3 - .
+ .long __lshrdi3 - .
+ .long __aeabi_memcpy - .
+ .long __aeabi_memset - .
+ .long memmove - .
+ .long __modsi3 - .
+ .long __moddi3 - .
+ .long __muldi3 - .
+ .long __aeabi_lmul - .
+ .long __ARM_ll_mullu - .
+ .long __udivsi3 - .
+ .long __umodsi3 - .
+ .long __udivdi3 - .
+ .long __umoddi3 - .
+ .long __udivmoddi4 - .
+ .long __clzsi2 - .
+ .long __ctzsi2 - .
+ .long __ucmpdi2 - .
+ .long __switch8 - .
+ .long __switchu8 - .
+ .long __switch16 - .
+ .long __switch32 - .
+ .long __aeabi_ulcmp - .
+ .long __aeabi_uldivmod - .
+ .long __aeabi_ldivmod - .
+ .long __aeabi_llsr - .
+ .long __aeabi_llsl - .
|