Browse Source

gcc15 AVR compilation fixes (#25238)

Nick Brassel 1 year ago
parent
commit
a4ef1ae736
5 changed files with 22 additions and 5 deletions
  1. 1 0
      Makefile
  2. 1 0
      builddefs/build_keyboard.mk
  3. 1 0
      builddefs/build_test.mk
  4. 11 0
      builddefs/support.mk
  5. 8 5
      platforms/avr/platform.mk

+ 1 - 0
Makefile

@@ -59,6 +59,7 @@ ifeq ($(ROOT_DIR),)
 endif
 
 include paths.mk
+include $(BUILDDEFS_PATH)/support.mk
 
 TEST_OUTPUT_DIR := $(BUILD_DIR)/test
 ERROR_FILE := $(BUILD_DIR)/error_occurred

+ 1 - 0
builddefs/build_keyboard.mk

@@ -11,6 +11,7 @@ endif
 .DEFAULT_GOAL := all
 
 include paths.mk
+include $(BUILDDEFS_PATH)/support.mk
 include $(BUILDDEFS_PATH)/message.mk
 
 # Helper to add defines with a 'QMK_' prefix

+ 1 - 0
builddefs/build_test.mk

@@ -7,6 +7,7 @@ endif
 OPT = g
 
 include paths.mk
+include $(BUILDDEFS_PATH)/support.mk
 include $(BUILDDEFS_PATH)/message.mk
 
 TARGET=test/$(TEST_OUTPUT)

+ 11 - 0
builddefs/support.mk

@@ -0,0 +1,11 @@
+# Helper to determine if a compiler option is supported
+# Args:
+#   $(1) = option to test, if successful will be output
+#   $(2) = option to use if $(1) is not supported
+#   $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
+cc-option = $(shell \
+	if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
+	then echo "$(1)"; else echo "$(2)"; fi)
+
+# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
+, := ,

+ 8 - 5
platforms/avr/platform.mk

@@ -12,9 +12,10 @@ HEX = $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature
 EEP = $(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT)
 BIN =
 
-ifeq ("$(shell echo "int main(){}" | $(CC) --param=min-pagesize=0 -x c - -o /dev/null 2>&1)", "")
-COMPILEFLAGS += --param=min-pagesize=0
-endif
+COMPILEFLAGS += $(call cc-option,--param=min-pagesize=0)
+
+# Fix ICE's: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116389
+COMPILEFLAGS += $(call cc-option,-mlra)
 
 COMPILEFLAGS += -funsigned-char
 COMPILEFLAGS += -funsigned-bitfields
@@ -25,10 +26,12 @@ COMPILEFLAGS += -fshort-enums
 COMPILEFLAGS += -mcall-prologues
 COMPILEFLAGS += -fno-builtin-printf
 
-# Linker relaxation is only possible if
-# link time optimizations are not enabled.
+# On older compilers, linker relaxation is only possible if link time optimizations are not enabled.
 ifeq ($(strip $(LTO_ENABLE)), no)
 	COMPILEFLAGS += -mrelax
+else
+	# Newer compilers may support both, so quickly check before adding `-mrelax`.
+	COMPILEFLAGS += $(call cc-option,-mrelax,,-flto=auto)
 endif
 
 ASFLAGS += $(AVR_ASFLAGS)