arm-trusted-firmware/include/lib/libc/cdefs.h
Boyan Karatotev 53644fa822 fix(libc): make sure __init functions are garbage collected
RECLAIM_INIT_CODE is useful to remove code that is only necessary during
boot. However, these functions are generally called once and as such
prime candidates for inlining. When building with LTO, the compiler is
pretty good at inlining every single one, making this option pointless.

So tell the compiler to not inline these functions. This ensures they
are kept separate and they can be garbage collected later. This is
expected to cost a little bit of speed due to the extra branching.

Change-Id: Ie83a9ec8db03cb42139742fc6d728d12ce8549d3
Signed-off-by: Boyan Karatotev <boyan.karatotev@arm.com>
2025-04-09 09:39:10 +01:00

49 lines
1.6 KiB
C

/*
* Copyright (c) 2018-2025, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef CDEFS_H
#define CDEFS_H
#define __dead2 __attribute__((__noreturn__))
#define __deprecated __attribute__((__deprecated__))
#define __packed __attribute__((__packed__))
#define __used __attribute__((__used__))
#define __unused __attribute__((__unused__))
#define __maybe_unused __attribute__((__unused__))
#define __aligned(x) __attribute__((__aligned__(x)))
#define __section(x) __attribute__((__section__(x)))
#define __fallthrough __attribute__((__fallthrough__))
#define __noinline __attribute__((__noinline__))
#if RECLAIM_INIT_CODE
/*
* Add each function to a section that is unique so the functions can still
* be garbage collected.
*
* NOTICE: for this to work, these functions will NOT be inlined.
* TODO: the noinline attribute can be removed if RECLAIM_INIT_CODE is made
* platform agnostic and called after bl31_main(). Then, top-level functions
* (those that can't be inlined like bl31_main()) can be annotated with __init
* and noinline can be removed.
*/
#define __init __section(".text.init." __FILE__ "." __XSTRING(__LINE__)) __noinline
#else
#define __init
#endif
#define __printflike(fmtarg, firstvararg) \
__attribute__((__format__ (__printf__, fmtarg, firstvararg)))
#define __weak_reference(sym, alias) \
__asm__(".weak alias"); \
__asm__(".equ alias, sym")
#define __STRING(x) #x
#define __XSTRING(x) __STRING(x)
#define __predict_true(exp) (exp)
#define __predict_false(exp) (exp)
#endif /* CDEFS_H */