Skip to content

Commit 455fb6c

Browse files
author
Joakim Nohlgård
authored
Merge pull request RIOT-OS#5742 from kaspar030/fix_lto
LTO fixes
2 parents 0703d80 + d1198b4 commit 455fb6c

37 files changed

+127
-34
lines changed

Makefile.base

+9-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ ${DIRS:%=CLEAN--%}:
2323
"$(MAKE)" -C ${@:CLEAN--%=%} clean
2424

2525
ifeq ($(strip $(SRC)),)
26-
SRC := $(wildcard *.c)
26+
SRC := $(filter-out $(SRC_NOLTO), $(wildcard *.c))
2727
endif
2828
ifeq ($(strip $(SRCXX)),)
2929
SRCXX := $(wildcard *.cpp)
@@ -35,10 +35,12 @@ ifeq ($(strip $(ASSMSRC)),)
3535
ASSMSRC := $(wildcard *.S)
3636
endif
3737

38-
OBJC := $(SRC:%.c=$(BINDIR)$(MODULE)/%.o)
39-
OBJCXX := $(SRCXX:%.cpp=$(BINDIR)$(MODULE)/%.o)
40-
ASMOBJ := $(ASMSRC:%.s=$(BINDIR)$(MODULE)/%.o)
41-
ASSMOBJ := $(ASSMSRC:%.S=$(BINDIR)$(MODULE)/%.o)
38+
OBJC_LTO := $(SRC:%.c=$(BINDIR)$(MODULE)/%.o)
39+
OBJC_NOLTO := $(SRC_NOLTO:%.c=$(BINDIR)$(MODULE)/%.o)
40+
OBJC := $(OBJC_NOLTO) $(OBJC_LTO)
41+
OBJCXX := $(SRCXX:%.cpp=$(BINDIR)$(MODULE)/%.o)
42+
ASMOBJ := $(ASMSRC:%.s=$(BINDIR)$(MODULE)/%.o)
43+
ASSMOBJ := $(ASSMSRC:%.S=$(BINDIR)$(MODULE)/%.o)
4244

4345
OBJ := $(OBJC) $(OBJCXX) $(ASMOBJ) $(ASSMOBJ)
4446
DEP := $(OBJC:.o=.d) $(OBJCXX:.o=.d) $(ASSMOBJ:.o=.d)
@@ -56,6 +58,8 @@ CXXFLAGS = $(filter-out $(CXXUWFLAGS), $(CFLAGS)) $(CXXEXFLAGS)
5658

5759
# compile and generate dependency info
5860

61+
$(OBJC_LTO): CFLAGS+=$(LTOFLAGS)
62+
5963
$(OBJC): $(BINDIR)$(MODULE)/%.o: %.c $(RIOTBUILD_CONFIG_HEADER_C)
6064
$(AD)$(CCACHE) $(CC) \
6165
-DRIOT_FILE_RELATIVE=\"$(patsubst $(RIOTBASE)/%,%,$(abspath $<))\" \

Makefile.cflags

+3-4
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,9 @@ endif
4242
# Unwanted flags for c++
4343
CXXUWFLAGS += -std=%
4444

45-
ifeq ($(LTO),yes)
46-
$(info Building with Link-Time-Optimizations is currently an experimental feature. Expect broken binaries.)
47-
LTOFLAGS = -flto -ffat-lto-objects
48-
CFLAGS += ${LTOFLAGS}
45+
ifeq ($(LTO),1)
46+
$(warning Building with Link-Time-Optimizations is currently an experimental feature. Expect broken binaries.)
47+
LTOFLAGS = -flto
4948
LINKFLAGS += ${LTOFLAGS}
5049
endif
5150

Makefile.vars

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export AS # The assembler.
3535
export ASFLAGS # Flags for the assembler.
3636
export LINK # The command used to link the files. Must take the same parameters as GCC, i.e. "ld" won't work.
3737
export LINKFLAGS # Flags to supply in the linking step.
38+
export LTOFLAGS # extra CFLAGS for compiling with link time optimization
3839
export OBJCOPY # The command used to create the HEXFILE.
3940
export OFLAGS # The parameter for OBJCOPY, e.g. to strip the debug information.
4041
export OBJDUMP # The command used to create the assembly listing.

boards/arduino-mega2560/Makefile.include

+7
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,10 @@ export ASFLAGS += $(CFLAGS_CPU) $(CFLAGS_DBG)
4444
export LINKFLAGS += $(CFLAGS_CPU) $(CFLAGS_DBG) $(CFLAGS_OPT) -Wl,--gc-sections -static -lgcc -e reset_handler
4545
export OFLAGS += -j .text -j .data -O ihex
4646
export FFLAGS += -p m2560 -c $(PROGRAMMER) $(PROGRAMMER_FLAGS) -F -D -U flash:w:bin/$(BOARD)/$(PROJECT)$(APPLICATION).hex
47+
48+
ifeq ($(LTO),1)
49+
# avr-gcc <4.8.3 has a bug when using LTO which causes a warning to be printed always:
50+
# '_vector_25' appears to be a misspelled signal handler [enabled by default]
51+
# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59396
52+
export LINKFLAGS += -Wno-error
53+
endif

boards/native/Makefile.include

+9-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ USEMODULE += native-drivers
1414
export PREFIX =
1515
export CC ?= $(PREFIX)gcc
1616
export CXX ?= $(PREFIX)g++
17-
export AR ?= $(PREFIX)ar
17+
ifeq ($(LTO),1)
18+
export AR = $(PREFIX)gcc-ar
19+
else
20+
export AR = $(PREFIX)ar
21+
endif
1822
export AS ?= $(PREFIX)as
1923
export LINK ?= $(PREFIX)gcc
2024
export SIZE ?= $(PREFIX)size
@@ -41,7 +45,6 @@ export GPROF ?= gprof
4145

4246
# basic cflags:
4347
export CFLAGS += -Wall -Wextra -pedantic
44-
export CFLAGS += -ffunction-sections -fdata-sections
4548
ifeq ($(shell uname -m),x86_64)
4649
export CFLAGS += -m32
4750
endif
@@ -73,6 +76,10 @@ else
7376
export LINKFLAGS += -ldl
7477
endif
7578

79+
# clean up unused functions
80+
export CFLAGS += -ffunction-sections -fdata-sections
81+
export LINKFLAGS += -Wl,--gc-sections
82+
7683
# set the tap interface for term/valgrind
7784
ifneq (,$(filter netdev2_tap,$(USEMODULE)))
7885
export PORT ?= tap0

boards/x86-multiboot-common/Makefile.include

+10-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ export CPU = x86
3232

3333
# toolchain config
3434
export CC ?= $(PREFIX)gcc
35-
export AR ?= $(PREFIX)ar
35+
ifeq ($(LTO),1)
36+
export AR = $(PREFIX)gcc-ar
37+
else
38+
export AR = $(PREFIX)ar
39+
endif
3640
export AS ?= $(PREFIX)as
3741
export RANLIB ?= $(PREFIX)ranlib
3842
export LINK ?= $(RIOTBASE)/boards/x86-multiboot-common/dist/link $(PREFIX)gcc
@@ -46,6 +50,11 @@ LINKFLAGS += -m32 -nostdlib -nostdinc -nostartfiles -nodefaultlibs \
4650
--prefix=$(NEWLIB_BASE) \
4751
-Wl,-rpath,$(NEWLIB_BASE)/lib \
4852
-T$(RIOTBASE)/boards/x86-multiboot-common/linker.ld
53+
54+
# clean up unused functions
55+
export CFLAGS += -ffunction-sections -fdata-sections
56+
export LINKFLAGS += -Wl,--gc-sections
57+
4958
UNDEF += $(BINDIR)x86-multiboot-common/startup.o
5059

5160
BASELIBS += $(NEWLIB_BASE)/lib/libc.a \

core/sched.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ static void (*sched_cb) (uint32_t timestamp, uint32_t value) = NULL;
5858
schedstat sched_pidlist[KERNEL_PID_LAST + 1];
5959
#endif
6060

61-
int sched_run(void)
61+
int __attribute__((used)) sched_run(void)
6262
{
6363
sched_context_switch_request = 0;
6464

cpu/Makefile.include.gnu

+4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
export GDBPREFIX ?= $(PREFIX)
22
export CC = $(PREFIX)gcc
33
export CXX = $(PREFIX)g++
4+
ifeq ($(LTO),1)
5+
export AR = $(PREFIX)gcc-ar
6+
else
47
export AR = $(PREFIX)ar
8+
endif
59
export AS = $(PREFIX)as
610
export LINK = $(PREFIX)gcc
711
export SIZE = $(PREFIX)size

cpu/atmega2560/startup.c

+6-5
Original file line numberDiff line numberDiff line change
@@ -43,27 +43,28 @@ extern void __libc_init_array(void);
4343
* which should never be reached but just in case jumps to exit.
4444
* This way there should be no way to call main directly.
4545
*/
46-
void init7_ovr(void) __attribute__((naked)) __attribute__((section(".init7")));
47-
void init8_ovr(void) __attribute__((naked)) __attribute__((section(".init8")));
46+
void init7_ovr(void) __attribute__((section(".init7")));
47+
void init8_ovr(void) __attribute__((section(".init8")));
4848

4949

50-
void init7_ovr(void)
50+
__attribute__((used,naked)) void init7_ovr(void)
5151
{
5252
__asm__("call reset_handler");
5353
}
5454

55-
void init8_ovr(void)
55+
__attribute__((used,naked)) void init8_ovr(void)
5656
{
5757
__asm__("jmp exit");
5858
}
59+
5960
/**
6061
* @brief This function is the entry point after a system reset
6162
*
6263
* After a system reset, the following steps are necessary and carried out:
6364
* 1. initialize the board (sync clock, setup std-IO)
6465
* 2. initialize and start RIOTs kernel
6566
*/
66-
void reset_handler(void)
67+
__attribute__((used)) void reset_handler(void)
6768
{
6869
/* initialize the board and startup the kernel */
6970
board_init();

cpu/cc2538/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ ifneq (,$(filter cc2538_rf,$(USEMODULE)))
99
DIRS += radio
1010
endif
1111

12+
# (file triggers compiler bug. see #5775)
13+
SRC_NOLTO += vectors.c
14+
1215
include $(RIOTBASE)/Makefile.base

cpu/cc26x0/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# Add a list of subdirectories, that should also be built:
55
DIRS = periph $(RIOTCPU)/cortexm_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/cortexm_common/Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1+
# thread_arch.c's inline assembler breaks when compiling with link time
2+
# optimization. see #5774.
3+
SRC_NOLTO += thread_arch.c
4+
15
include $(RIOTBASE)/Makefile.base

cpu/cortexm_common/thread_arch.c

+8-9
Original file line numberDiff line numberDiff line change
@@ -296,17 +296,12 @@ void thread_arch_yield(void)
296296
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
297297
}
298298

299-
__attribute__((naked)) void arch_context_switch(void)
300-
{
299+
void __attribute__((naked)) __attribute__((used)) isr_pendsv(void) {
301300
__asm__ volatile (
302301
/* PendSV handler entry point */
303-
".global isr_pendsv \n"
304-
".thumb_func \n"
305-
"isr_pendsv: \n"
306302
/* save context by pushing unsaved registers to the stack */
307303
/* {r0-r3,r12,LR,PC,xPSR} are saved automatically on exception entry */
308304
".thumb_func \n"
309-
"context_save:"
310305
"mrs r0, psp \n" /* get stack pointer from user mode */
311306
#if defined(CPU_ARCH_CORTEX_M0) || defined(CPU_ARCH_CORTEX_M0PLUS)
312307
"mov r12, sp \n" /* remember the exception SP */
@@ -332,11 +327,15 @@ __attribute__((naked)) void arch_context_switch(void)
332327
"ldr r1, =sched_active_thread \n" /* load address of current tcb */
333328
"ldr r1, [r1] \n" /* dereference pdc */
334329
"str r0, [r1] \n" /* write r0 to pdc->sp */
330+
"bl isr_svc \n" /* continue with svc */
331+
);
332+
}
333+
334+
void __attribute__((naked)) __attribute__((used)) isr_svc(void) {
335+
__asm__ volatile (
335336
/* SVC handler entry point */
336-
/* PendSV will continue from above and through this part as well */
337-
".global isr_svc \n"
337+
/* PendSV will continue here as well (via jump) */
338338
".thumb_func \n"
339-
"isr_svc: \n"
340339
/* perform scheduling */
341340
"bl sched_run \n"
342341
/* restore context and return from exception */

cpu/ezr32wg/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/k60/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(KINETIS_COMMON)
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/k60/Makefile.include

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export CFLAGS += -DCPU_ARCH_$(ARCH)
1919
export COMMON_STARTUP = $(KINETIS_COMMON)
2020

2121
# add the CPU specific system calls implementations for the linker
22-
export UNDEF += $(BINDIR)cpu/vector.o
22+
export UNDEF += $(BINDIR)cpu/vectors.o
2323
export UNDEF += $(BINDIR)cpu/ssp.o
2424

2525
include $(RIOTCPU)/Makefile.include.cortexm_common

cpu/k60/vector.c cpu/k60/vectors.c

File renamed without changes.

cpu/k64f/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(KINETIS_COMMON)
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/kw2x/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(KINETIS_COMMON)
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/kw2x/Makefile.include

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ export CFLAGS += -DCPU_ARCH_$(ARCH)
1919
export COMMON_STARTUP = $(KINETIS_COMMON)
2020

2121
# add the CPU specific system calls implementations for the linker
22-
export UNDEF += $(BINDIR)cpu/vector.o
22+
export UNDEF += $(BINDIR)cpu/vectors.o
2323

2424
include $(RIOTCPU)/Makefile.include.cortexm_common
File renamed without changes.

cpu/lm4f120/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/lpc11u34/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/lpc1768/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/lpc1768/vectors.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ WEAK_DEFAULT void isr_qei(void);
7070
WEAK_DEFAULT void isr_pll1(void);
7171

7272
/* interrupt vector table */
73-
__attribute__ ((section(".vectors")))
73+
__attribute__ ((used,section(".vectors")))
7474
const void *interrupt_vector[] = {
7575
/* Exception stack pointer */
7676
(void*) (&_estack), /* pointer to the top of the stack */

cpu/nrf51/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ ifneq (,$(filter radio_nrfmin,$(USEMODULE)))
99
DIRS += radio/nrfmin
1010
endif
1111

12+
# (file triggers compiler bug. see #5775)
13+
SRC_NOLTO += vectors.c
14+
1215
include $(RIOTBASE)/Makefile.base

cpu/nrf52/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(RIOTCPU)/nrf5x_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/sam3/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/samd21/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(RIOTCPU)/sam21_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/saml21/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(RIOTCPU)/sam21_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/stm32f0/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(RIOTCPU)/stm32_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/stm32f1/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS += periph $(RIOTCPU)/cortexm_common $(RIOTCPU)/stm32_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/stm32f3/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(RIOTCPU)/stm32_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

cpu/stm32f4/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ MODULE = cpu
44
# add a list of subdirectories, that should also be build
55
DIRS = periph $(RIOTCPU)/cortexm_common $(RIOTCPU)/stm32_common
66

7+
# (file triggers compiler bug. see #5775)
8+
SRC_NOLTO += vectors.c
9+
710
include $(RIOTBASE)/Makefile.base

0 commit comments

Comments
 (0)