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 -#include - -VOID -ArmCallSmc ( - IN OUT ARM_SMC_ARGS *Args - ) -{ -} +// +// Copyright (c) 2016, Linaro Limited. All rights reserved. +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// + +#include +#include + +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 - -/* - * 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 + +/* + * 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.
-// -// 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.
+// +// 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.
-// -// 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.
+// +// 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.
-// -// 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.
+// +// 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 - .