toolchain: Support KASAN compilation above Clang18

1. When the Clang compiler turns on "-fsanitize=kernel-address", inlining, global variables, and stack detection are enabled by default and must be turned off manually.
2. -mllvm is the parameter passing method of Clang, and --param is the parameter passing method of GCC
After the modification, KASan compilation and operation will be supported for Clang 18 and above

Signed-off-by: wangmingrong1 <wangmingrong1@xiaomi.com>
This commit is contained in:
wangmingrong1 2025-02-25 17:46:55 +08:00 committed by Xiang Xiao
parent 7b902caf94
commit e97e33eadc
11 changed files with 228 additions and 87 deletions

View file

@ -137,18 +137,22 @@ endif()
if(CONFIG_MM_KASAN_INSTRUMENT_ALL)
add_compile_options(-fsanitize=kernel-address)
endif()
add_compile_options(-mllvm=asan-stack=0)
add_compile_options(-mllvm=-asan-instrumentation-with-call-threshold=0)
if(CONFIG_MM_KASAN_GLOBAL)
add_compile_options(--param=asan-globals=1)
endif()
if(CONFIG_MM_KASAN_GLOBAL)
add_compile_options(-mllvm=asan-globals=1)
else()
add_compile_options(-mllvm=asan-globals=0)
endif()
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
add_compile_options(--param=asan-instrument-reads=0)
endif()
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
add_compile_options(-mllvm=asan-instrument-reads=0)
endif()
if(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK)
add_compile_options(--param=asan-instrument-writes=0)
if(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK)
add_compile_options(-mllvm=asan-instrument-writes=0)
endif()
endif()
# Instrumentation options

View file

@ -96,18 +96,28 @@ endif
ifeq ($(CONFIG_MM_KASAN_INSTRUMENT_ALL),y)
ARCHOPTIMIZATION += -fsanitize=kernel-address
endif
KASAN_PARAM += asan-stack=0
KASAN_PARAM += asan-instrumentation-with-call-threshold=0
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
ARCHOPTIMIZATION += --param asan-globals=1
endif
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
KASAN_PARAM += asan-globals=1
else
KASAN_PARAM += asan-globals=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
KASAN_PARAM += asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-writes=0
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
KASAN_PARAM += asan-instrument-writes=0
endif
ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += $(addprefix -mllvm ,$(KASAN_PARAM))
else
ARCHOPTIMIZATION += $(addprefix --param ,$(KASAN_PARAM))
endif
endif
# Instrumentation options

View file

@ -98,18 +98,28 @@ endif
ifeq ($(CONFIG_MM_KASAN_INSTRUMENT_ALL),y)
ARCHOPTIMIZATION += -fsanitize=kernel-address
endif
KASAN_PARAM += asan-stack=0
KASAN_PARAM += asan-instrumentation-with-call-threshold=0
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
ARCHOPTIMIZATION += --param asan-globals=1
endif
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
KASAN_PARAM += asan-globals=1
else
KASAN_PARAM += asan-globals=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
KASAN_PARAM += asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-writes=0
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
KASAN_PARAM += asan-instrument-writes=0
endif
ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += $(addprefix -mllvm ,$(KASAN_PARAM))
else
ARCHOPTIMIZATION += $(addprefix --param ,$(KASAN_PARAM))
endif
endif
# If we don't use MMU, all memory is treated as device memory and can't handle

View file

@ -127,18 +127,34 @@ endif()
if(CONFIG_MM_KASAN_INSTRUMENT_ALL)
add_compile_options(-fsanitize=kernel-address)
endif()
set(KASAN_PARAM "")
list(APPEND KASAN_PARAM "asan-stack=0")
list(APPEND KASAN_PARAM "asan-instrumentation-with-call-threshold=0")
if(CONFIG_MM_KASAN_GLOBAL)
add_compile_options(--param=asan-globals=1)
endif()
if(CONFIG_MM_KASAN_GLOBAL)
list(APPEND KASAN_PARAM "asan-globals=1")
else()
list(APPEND KASAN_PARAM "asan-globals=0")
endif()
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
add_compile_options(--param=asan-instrument-reads=0)
endif()
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
list(APPEND KASAN_PARAM "asan-instrument-reads=0")
endif()
if(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK)
list(APPEND KASAN_PARAM "asan-instrument-writes=0")
endif()
if(CONFIG_ARM_TOOLCHAIN_CLANG)
foreach(param IN LISTS KASAN_PARAM)
add_compile_options("-mllvm=${param}")
endforeach()
else()
foreach(param IN LISTS KASAN_PARAM)
add_compile_options("--param=${param}")
endforeach()
endif()
if(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK)
add_compile_options(--param=asan-instrument-writes=0)
endif()
if(CONFIG_ARCH_INSTRUMENT_ALL)

View file

@ -367,14 +367,34 @@ endif()
if(CONFIG_MM_KASAN_INSTRUMENT_ALL)
add_compile_options(-fsanitize=kernel-address)
endif()
set(KASAN_PARAM "")
list(APPEND KASAN_PARAM "asan-stack=0")
list(APPEND KASAN_PARAM "asan-instrumentation-with-call-threshold=0")
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
add_compile_options(--param=asan-instrument-reads=0)
endif()
if(CONFIG_MM_KASAN_GLOBAL)
list(APPEND KASAN_PARAM "asan-globals=1")
else()
list(APPEND KASAN_PARAM "asan-globals=0")
endif()
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
list(APPEND KASAN_PARAM "asan-instrument-reads=0")
endif()
if(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK)
list(APPEND KASAN_PARAM "asan-instrument-writes=0")
endif()
if(CONFIG_ARM_TOOLCHAIN_CLANG)
foreach(param IN LISTS KASAN_PARAM)
add_compile_options("-mllvm=${param}")
endforeach()
else()
foreach(param IN LISTS KASAN_PARAM)
add_compile_options("--param=${param}")
endforeach()
endif()
if(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK)
add_compile_options(--param=asan-instrument-writes=0)
endif()
if(CONFIG_MM_UBSAN_ALL)

View file

@ -294,18 +294,28 @@ endif
ifeq ($(CONFIG_MM_KASAN_INSTRUMENT_ALL),y)
ARCHOPTIMIZATION += -fsanitize=kernel-address
endif
KASAN_PARAM += asan-stack=0
KASAN_PARAM += asan-instrumentation-with-call-threshold=0
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
ARCHOPTIMIZATION += --param asan-globals=1
endif
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
KASAN_PARAM += asan-globals=1
else
KASAN_PARAM += asan-globals=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
KASAN_PARAM += asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-writes=0
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
KASAN_PARAM += asan-instrument-writes=0
endif
ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += $(addprefix -mllvm ,$(KASAN_PARAM))
else
ARCHOPTIMIZATION += $(addprefix --param ,$(KASAN_PARAM))
endif
endif
ifeq ($(CONFIG_MM_UBSAN_ALL),y)

View file

@ -62,18 +62,28 @@ OBJDUMP = $(CROSSDEV)objdump
ifeq ($(CONFIG_MM_KASAN_INSTRUMENT_ALL),y)
ARCHOPTIMIZATION += -fsanitize=kernel-address
endif
KASAN_PARAM += asan-stack=0
KASAN_PARAM += asan-instrumentation-with-call-threshold=0
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
ARCHOPTIMIZATION += --param asan-globals=1
endif
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
KASAN_PARAM += asan-globals=1
else
KASAN_PARAM += asan-globals=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
KASAN_PARAM += asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-writes=0
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
KASAN_PARAM += asan-instrument-writes=0
endif
ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += $(addprefix -mllvm ,$(KASAN_PARAM))
else
ARCHOPTIMIZATION += $(addprefix --param ,$(KASAN_PARAM))
endif
endif
CFLAGS := $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe

View file

@ -136,15 +136,28 @@ endif
ifeq ($(CONFIG_MM_KASAN_INSTRUMENT_ALL),y)
ARCHOPTIMIZATION += -fsanitize=kernel-address
endif
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
ARCHOPTIMIZATION += --param asan-globals=1
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-writes=0
KASAN_PARAM += asan-stack=0
KASAN_PARAM += asan-instrumentation-with-call-threshold=0
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
KASAN_PARAM += asan-globals=1
else
KASAN_PARAM += asan-globals=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
KASAN_PARAM += asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
KASAN_PARAM += asan-instrument-writes=0
endif
ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += $(addprefix -mllvm ,$(KASAN_PARAM))
else
ARCHOPTIMIZATION += $(addprefix --param ,$(KASAN_PARAM))
endif
endif
CC = $(CROSSDEV)gcc

View file

@ -87,14 +87,34 @@ add_compile_options(-mtext-section-literals)
if(CONFIG_MM_KASAN_INSTRUMENT_ALL)
add_compile_options(-fsanitize=kernel-address)
endif()
set(KASAN_PARAM "")
list(APPEND KASAN_PARAM "asan-stack=0")
list(APPEND KASAN_PARAM "asan-instrumentation-with-call-threshold=0")
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
add_compile_options(--param=asan-instrument-reads=0)
endif()
if(CONFIG_MM_KASAN_GLOBAL)
list(APPEND KASAN_PARAM "asan-globals=1")
else()
list(APPEND KASAN_PARAM "asan-globals=0")
endif()
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
list(APPEND KASAN_PARAM "asan-instrument-reads=0")
endif()
if(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK)
list(APPEND KASAN_PARAM "asan-instrument-writes=0")
endif()
if(CONFIG_ARM_TOOLCHAIN_CLANG)
foreach(param IN LISTS KASAN_PARAM)
add_compile_options("-mllvm=${param}")
endforeach()
else()
foreach(param IN LISTS KASAN_PARAM)
add_compile_options("--param=${param}")
endforeach()
endif()
if(CONFIG_MM_KASAN_DISABLE_READS_CHECK)
add_compile_options(--param=asan-instrument-writes=0)
endif()
if(CONFIG_MM_UBSAN_ALL)

View file

@ -47,14 +47,28 @@ ARCHCPUFLAGS = -mlongcalls
ifeq ($(CONFIG_MM_KASAN_INSTRUMENT_ALL),y)
ARCHOPTIMIZATION += -fsanitize=kernel-address
endif
KASAN_PARAM += asan-stack=0
KASAN_PARAM += asan-instrumentation-with-call-threshold=0
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
KASAN_PARAM += asan-globals=1
else
KASAN_PARAM += asan-globals=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-writes=0
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
KASAN_PARAM += asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
KASAN_PARAM += asan-instrument-writes=0
endif
ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += $(addprefix -mllvm ,$(KASAN_PARAM))
else
ARCHOPTIMIZATION += $(addprefix --param ,$(KASAN_PARAM))
endif
endif
ifeq ($(CONFIG_MM_UBSAN_ALL),y)

View file

@ -47,14 +47,28 @@ ARCHCPUFLAGS = -mlongcalls
ifeq ($(CONFIG_MM_KASAN_INSTRUMENT_ALL),y)
ARCHOPTIMIZATION += -fsanitize=kernel-address
endif
KASAN_PARAM += asan-stack=0
KASAN_PARAM += asan-instrumentation-with-call-threshold=0
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
KASAN_PARAM += asan-globals=1
else
KASAN_PARAM += asan-globals=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
ARCHOPTIMIZATION += --param asan-instrument-writes=0
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
KASAN_PARAM += asan-instrument-reads=0
endif
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
KASAN_PARAM += asan-instrument-writes=0
endif
ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += $(addprefix -mllvm ,$(KASAN_PARAM))
else
ARCHOPTIMIZATION += $(addprefix --param ,$(KASAN_PARAM))
endif
endif
ifeq ($(CONFIG_MM_UBSAN_ALL),y)