-
Notifications
You must be signed in to change notification settings - Fork 8.2k
kernel: Add Kconfig option to disable LTO for kernel sources #99124
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1138,6 +1138,28 @@ endif # BOOTARGS | |
|
|
||
| endmenu | ||
|
|
||
| config KERNEL_NO_LTO | ||
| bool "Build selected kernel core files without LTO" | ||
| depends on LTO | ||
| help | ||
| Some SoCs require kernel code to be placed in RAM, which makes link-time | ||
| optimization (LTO) unsuitable for these files (-fno-lto). Disabling LTO | ||
| allows the affected code to be linked as separate objects and placed in | ||
| specific memory regions. | ||
|
|
||
| Running kernel code from RAM can improve execution performance, especially | ||
| for timing-critical routines or context switch paths. | ||
|
|
||
| if KERNEL_NO_LTO | ||
| config KERNEL_LTO_ALLOWLIST | ||
| string "List of kernel source files to keep LTO" | ||
| help | ||
| List of kernel source filenames that should retain LTO even when | ||
| CONFIG_KERNEL_NO_LTO is enabled. | ||
| Example: CONFIG_KERNEL_LTO_ALLOWLIST="init.c errno.c fatal.c" | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Did you want to make these files the default setting? Otherwise you could expand the help text to suggest this list as a good default as these features don't benefit from the performance gain of running in RAM.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we set default "init.c errno.c fatal.c" for CONFIG_KERNEL_LTO_ALLOWLIST, users would still need to override the entire string when adding more files. Kconfig does not support appending to the default value, so it cannot be extended incrementally.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Acknowledged. As a follow up PR, you could enable CONFIG_KERNEL_NO_LTO on the ITE eval board so that there is a reference implementation for users to copy. |
||
|
|
||
| endif # KERNEL_NO_LTO | ||
|
|
||
| rsource "Kconfig.device" | ||
| rsource "Kconfig.vm" | ||
| rsource "Kconfig.init" | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| # SPDX-License-Identifier: Apache-2.0 | ||
|
|
||
| # Optional script to disable LTO for kernel files | ||
|
|
||
| message(STATUS "[no-LTO] Building kernel files without LTO") | ||
|
|
||
| # Retrieve all source files from the kernel library target | ||
| if(TARGET kernel) | ||
| get_property(KERNEL_SRCS TARGET kernel PROPERTY SOURCES) | ||
| else() | ||
| message(WARNING "[no-LTO] kernel target not found, skipping") | ||
| return() | ||
| endif() | ||
|
|
||
| # Split allowlist string into list | ||
| if(DEFINED CONFIG_KERNEL_LTO_ALLOWLIST) | ||
| separate_arguments(LTO_ALLOWLIST NATIVE_COMMAND "${CONFIG_KERNEL_LTO_ALLOWLIST}") | ||
| endif() | ||
|
|
||
| # Apply -fno-lto to all C source files, except for some initialization files | ||
| # (e.g. init.c, errno.c, fatal.c) and those that are less critical to be | ||
| # placed in RAM. These files can be excluded from -fno-lto by using | ||
| # CONFIG_KERNEL_LTO_ALLOWLIST. | ||
| foreach(src ${KERNEL_SRCS}) | ||
| if(src MATCHES "\\.c$") | ||
|
|
||
| # Skip if filename matches any in allowlist | ||
| set(skip FALSE) | ||
| foreach(allow ${LTO_ALLOWLIST}) | ||
| get_filename_component(basename ${src} NAME) | ||
| if("${basename}" STREQUAL "${allow}") | ||
| set(skip TRUE) | ||
| break() | ||
| endif() | ||
| endforeach() | ||
|
|
||
| if(NOT skip) | ||
| set_source_files_properties(${src} PROPERTIES COMPILE_FLAGS "-fno-lto -g") | ||
| endif() | ||
|
|
||
| endif() | ||
| endforeach() |
Uh oh!
There was an error while loading. Please reload this page.