mirror of https://github.com/OpenIPC/firmware.git
197 lines
7.2 KiB
Diff
197 lines
7.2 KiB
Diff
diff -drupN a/Makefile b/Makefile
|
|
--- a/Makefile 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/Makefile 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -303,7 +303,7 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH"
|
|
|
|
HOSTCC = gcc
|
|
HOSTCXX = g++
|
|
-HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89
|
|
+HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89
|
|
HOSTCXXFLAGS = -O2
|
|
|
|
ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1)
|
|
@@ -348,6 +348,7 @@ include scripts/Kbuild.include
|
|
# Make variables (CC, etc...)
|
|
AS = $(CROSS_COMPILE)as
|
|
LD = $(CROSS_COMPILE)ld
|
|
+LDGOLD = $(CROSS_COMPILE)ld.gold
|
|
CC = $(CROSS_COMPILE)gcc
|
|
CPP = $(CC) -E
|
|
AR = $(CROSS_COMPILE)ar
|
|
@@ -623,6 +624,20 @@ CFLAGS_GCOV := -fprofile-arcs -ftest-cov
|
|
CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,)
|
|
export CFLAGS_GCOV CFLAGS_KCOV
|
|
|
|
+# Make toolchain changes before including arch/$(SRCARCH)/Makefile to ensure
|
|
+# ar/cc/ld-* macros return correct values.
|
|
+ifdef CONFIG_LTO_CLANG
|
|
+# use GNU gold with LLVMgold for LTO linking, and LD for vmlinux_link
|
|
+LDFINAL_vmlinux := $(LD)
|
|
+LD := $(LDGOLD)
|
|
+LDFLAGS += -plugin LLVMgold.so
|
|
+# use llvm-ar for building symbol tables from IR files, and llvm-dis instead
|
|
+# of objdump for processing symbol versions and exports
|
|
+LLVM_AR := llvm-ar
|
|
+LLVM_DIS := llvm-dis
|
|
+export LLVM_AR LLVM_DIS
|
|
+endif
|
|
+
|
|
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
|
|
# values of the respective KBUILD_* variables
|
|
ARCH_CPPFLAGS :=
|
|
@@ -642,8 +657,56 @@ KBUILD_CFLAGS += $(call cc-option,-ffunc
|
|
KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
|
|
endif
|
|
|
|
+ifdef CONFIG_LTO_CLANG
|
|
+lto-clang-flags := -flto -fvisibility=hidden
|
|
+
|
|
+# allow disabling only clang LTO where needed
|
|
+DISABLE_LTO_CLANG := -fno-lto -fvisibility=default
|
|
+export DISABLE_LTO_CLANG
|
|
+endif
|
|
+
|
|
+ifdef CONFIG_LTO
|
|
+lto-flags := $(lto-clang-flags)
|
|
+KBUILD_CFLAGS += $(lto-flags)
|
|
+
|
|
+DISABLE_LTO := $(DISABLE_LTO_CLANG)
|
|
+export DISABLE_LTO
|
|
+
|
|
+# LDFINAL_vmlinux and LDFLAGS_FINAL_vmlinux can be set to override
|
|
+# the linker and flags for vmlinux_link.
|
|
+export LDFINAL_vmlinux LDFLAGS_FINAL_vmlinux
|
|
+endif
|
|
+
|
|
+ifdef CONFIG_CFI_CLANG
|
|
+cfi-clang-flags += -fsanitize=cfi
|
|
+DISABLE_CFI_CLANG := -fno-sanitize=cfi
|
|
+ifdef CONFIG_MODULES
|
|
+cfi-clang-flags += -fsanitize-cfi-cross-dso
|
|
+DISABLE_CFI_CLANG += -fno-sanitize-cfi-cross-dso
|
|
+endif
|
|
+ifdef CONFIG_CFI_PERMISSIVE
|
|
+cfi-clang-flags += -fsanitize-recover=cfi -fno-sanitize-trap=cfi
|
|
+endif
|
|
+
|
|
+# also disable CFI when LTO is disabled
|
|
+DISABLE_LTO_CLANG += $(DISABLE_CFI_CLANG)
|
|
+# allow disabling only clang CFI where needed
|
|
+export DISABLE_CFI_CLANG
|
|
+endif
|
|
+
|
|
+ifdef CONFIG_CFI
|
|
+# cfi-flags are re-tested in prepare-compiler-check
|
|
+cfi-flags := $(cfi-clang-flags)
|
|
+KBUILD_CFLAGS += $(cfi-flags)
|
|
+
|
|
+DISABLE_CFI := $(DISABLE_CFI_CLANG)
|
|
+DISABLE_LTO += $(DISABLE_CFI)
|
|
+export DISABLE_CFI
|
|
+endif
|
|
+
|
|
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
|
-KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
|
|
+KBUILD_CFLAGS += $(call cc-option,-Oz,-Os)
|
|
+KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,)
|
|
else
|
|
ifdef CONFIG_PROFILE_ALL_BRANCHES
|
|
KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,)
|
|
@@ -703,11 +766,22 @@ endif
|
|
KBUILD_CFLAGS += $(stackp-flag)
|
|
|
|
ifeq ($(cc-name),clang)
|
|
+ifneq ($(CROSS_COMPILE),)
|
|
+CLANG_TRIPLE ?= $(CROSS_COMPILE)
|
|
+CLANG_TARGET := --target=$(notdir $(CLANG_TRIPLE:%-=%))
|
|
+GCC_TOOLCHAIN := $(realpath $(dir $(shell which $(LD)))/..)
|
|
+endif
|
|
+ifneq ($(GCC_TOOLCHAIN),)
|
|
+CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN)
|
|
+endif
|
|
+KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC)
|
|
+KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC)
|
|
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
|
-KBUILD_CPPFLAGS += $(call cc-option,-Wno-unknown-warning-option,)
|
|
KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
|
|
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
|
|
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
|
+KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
|
+KBUILD_CFLAGS += $(call cc-disable-warning, duplicate-decl-specifier)
|
|
# Quiet clang warning: comparison of unsigned expression < 0 is always false
|
|
KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
|
|
# CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
|
|
@@ -715,6 +789,8 @@ KBUILD_CFLAGS += $(call cc-disable-warni
|
|
# See modpost pattern 2
|
|
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
|
|
KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
|
|
+KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
|
|
+KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
|
|
else
|
|
|
|
# These warnings generated too much noise in a regular build.
|
|
@@ -1079,6 +1155,22 @@ prepare-objtool: $(objtool_target)
|
|
# CC_STACKPROTECTOR_STRONG! Why did it build with _REGULAR?!")
|
|
PHONY += prepare-compiler-check
|
|
prepare-compiler-check: FORCE
|
|
+# Make sure we're using a supported toolchain with LTO_CLANG
|
|
+ifdef CONFIG_LTO_CLANG
|
|
+ ifneq ($(call clang-ifversion, -ge, 0500, y), y)
|
|
+ @echo Cannot use CONFIG_LTO_CLANG: requires clang 5.0 or later >&2 && exit 1
|
|
+ endif
|
|
+ ifneq ($(call gold-ifversion, -ge, 112000000, y), y)
|
|
+ @echo Cannot use CONFIG_LTO_CLANG: requires GNU gold 1.12 or later >&2 && exit 1
|
|
+ endif
|
|
+endif
|
|
+# Make sure compiler supports LTO flags
|
|
+ifdef lto-flags
|
|
+ ifeq ($(call cc-option, $(lto-flags)),)
|
|
+ @echo Cannot use CONFIG_LTO: $(lto-flags) not supported by compiler \
|
|
+ >&2 && exit 1
|
|
+ endif
|
|
+endif
|
|
# Make sure compiler supports requested stack protector flag.
|
|
ifdef stackp-name
|
|
ifeq ($(call cc-option, $(stackp-flag)),)
|
|
@@ -1093,6 +1185,11 @@ ifdef stackp-check
|
|
$(stackp-flag) available but compiler is broken >&2 && exit 1
|
|
endif
|
|
endif
|
|
+ifdef cfi-flags
|
|
+ ifeq ($(call cc-option, $(cfi-flags)),)
|
|
+ @echo Cannot use CONFIG_CFI: $(cfi-flags) not supported by compiler >&2 && exit 1
|
|
+ endif
|
|
+endif
|
|
@:
|
|
|
|
# Generate some files
|
|
@@ -1378,6 +1475,8 @@ help:
|
|
@echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
|
|
@echo ' dir/ - Build all files in dir and below'
|
|
@echo ' dir/file.[ois] - Build specified target only'
|
|
+ @echo ' dir/file.ll - Build the LLVM assembly file'
|
|
+ @echo ' (requires compiler support for LLVM assembly generation)'
|
|
@echo ' dir/file.lst - Build specified mixed source/assembly target only'
|
|
@echo ' (requires a recent binutils and recent build (System.map))'
|
|
@echo ' dir/file.ko - Build module including final link'
|
|
@@ -1562,7 +1661,9 @@ clean: $(clean-dirs)
|
|
-o -name '*.symtypes' -o -name 'modules.order' \
|
|
-o -name modules.builtin -o -name '.tmp_*.o.*' \
|
|
-o -name '*.c.[012]*.*' \
|
|
- -o -name '*.gcno' \) -type f -print | xargs rm -f
|
|
+ -o -name '*.ll' \
|
|
+ -o -name '*.gcno' \
|
|
+ -o -name '*.*.symversions' \) -type f -print | xargs rm -f
|
|
|
|
# Generate tags for editors
|
|
# ---------------------------------------------------------------------------
|
|
@@ -1665,6 +1766,8 @@ endif
|
|
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
|
%.symtypes: %.c prepare scripts FORCE
|
|
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
|
+%.ll: %.c prepare scripts FORCE
|
|
+ $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
|
|
|
# Modules
|
|
/: prepare scripts FORCE
|