Skip to content

Commit d096b17

Browse files
committed
Add LLVM toolchain support to RISC-V build system
This commit introduces initial support for compiling the RISC-V target using the LLVM toolchain.
1 parent ceee53c commit d096b17

File tree

3 files changed

+40
-20
lines changed

3 files changed

+40
-20
lines changed

arch/riscv/build.mk

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,49 @@ DEFINES := -DF_CPU=$(F_CLK) \
1717
-DF_TIMER=$(F_TICK) \
1818
-include config.h
1919

20-
ASFLAGS = -march=rv32imzicsr -mabi=ilp32
21-
CFLAGS += -Wall -Wextra -Wshadow -Wno-unused-parameter -Werror
20+
CROSS_COMPILE ?= riscv32-unknown-elf-
21+
CC_DEFAULT := $(CROSS_COMPILE)gcc
22+
CC_IS_CLANG := $(shell $(CC_DEFAULT) --version 2>/dev/null | grep -qi clang && echo 1)
23+
# Architecture flags
24+
ARCH_FLAGS = -march=rv32imzicsr -mabi=ilp32
25+
26+
# Common compiler flags
27+
CFLAGS += -Wall -Wextra -Werror -Wshadow -Wno-unused-parameter
2228
CFLAGS += -O2 -std=gnu99
23-
CFLAGS += -march=rv32imzicsr -mabi=ilp32
29+
CFLAGS += $(ARCH_FLAGS)
2430
CFLAGS += -mstrict-align -ffreestanding -nostdlib -fomit-frame-pointer
2531
CFLAGS += $(INC_DIRS) $(DEFINES) -fdata-sections -ffunction-sections
26-
ARFLAGS = r
2732

28-
# Linker flags
29-
LDFLAGS = -melf32lriscv --gc-sections
30-
LDSCRIPT = $(ARCH_DIR)/riscv32-qemu.ld
33+
ifeq ($(CC_IS_CLANG),1)
34+
CC = $(CROSS_COMPILE)clang
35+
AS = $(CROSS_COMPILE)clang
36+
LD = $(CROSS_COMPILE)ld.lld
37+
DUMP = $(CROSS_COMPILE)llvm-objdump -M no-aliases
38+
READ = $(CROSS_COMPILE)llvm-readelf
39+
OBJ = $(CROSS_COMPILE)llvm-objcopy
40+
SIZE = $(CROSS_COMPILE)llvm-size
41+
42+
CFLAGS += --target=riscv32-unknown-elf
43+
CFLAGS += -Wno-unused-command-line-argument
44+
ASFLAGS = --target=riscv32-unknown-elf $(ARCH_FLAGS)
45+
LDFLAGS = -m elf32lriscv --gc-sections
46+
else
47+
CC = $(CC_DEFAULT)
48+
AS = $(CROSS_COMPILE)as
49+
LD = $(CROSS_COMPILE)ld
50+
DUMP = $(CROSS_COMPILE)objdump -Mno-aliases
51+
READ = $(CROSS_COMPILE)readelf
52+
OBJ = $(CROSS_COMPILE)objcopy
53+
SIZE = $(CROSS_COMPILE)size
3154

32-
CROSS_COMPILE ?= riscv-none-elf-
33-
CC = $(CROSS_COMPILE)gcc
34-
AS = $(CROSS_COMPILE)as
35-
LD = $(CROSS_COMPILE)ld
36-
DUMP = $(CROSS_COMPILE)objdump -Mno-aliases
37-
READ = $(CROSS_COMPILE)readelf
38-
OBJ = $(CROSS_COMPILE)objcopy
39-
SIZE = $(CROSS_COMPILE)size
40-
AR = $(CROSS_COMPILE)ar
55+
ASFLAGS = $(ARCH_FLAGS)
56+
LDFLAGS = -melf32lriscv --gc-sections
57+
endif
58+
59+
AR = $(CROSS_COMPILE)ar
60+
61+
ARFLAGS = r
62+
LDSCRIPT = $(ARCH_DIR)/riscv32-qemu.ld
4163

4264
HAL_OBJS := boot.o hal.o muldiv.o
4365
HAL_OBJS := $(addprefix $(BUILD_KERNEL_DIR)/,$(HAL_OBJS))

kernel/pipe.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ static inline uint16_t pipe_free_space_internal(const pipe_t *p)
3434
return (p->mask + 1) - p->used;
3535
}
3636

37-
static inline char pipe_get_byte(pipe_t *p)
37+
static inline __attribute__((__unused__)) char pipe_get_byte(pipe_t *p)
3838
{
3939
char val = p->buf[p->head];
4040
p->head = (p->head + 1) & p->mask;
4141
p->used--;
4242
return val;
4343
}
4444

45-
static inline void pipe_put_byte(pipe_t *p, char c)
45+
static inline __attribute__((__unused__)) void pipe_put_byte(pipe_t *p, char c)
4646
{
4747
p->buf[p->tail] = c;
4848
p->tail = (p->tail + 1) & p->mask;

lib/malloc.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,13 @@ void free(void *ptr)
109109
static void selective_coalesce(void)
110110
{
111111
memblock_t *p = first_free;
112-
uint32_t coalesced = 0;
113112

114113
while (p && p->next) {
115114
/* Merge only when blocks are FREE *and* adjacent in memory */
116115
uint8_t *pend = (uint8_t *) p + sizeof(memblock_t) + GET_SIZE(p);
117116
if (!IS_USED(p) && !IS_USED(p->next) && pend == (uint8_t *) p->next) {
118117
p->size = GET_SIZE(p) + sizeof(memblock_t) + GET_SIZE(p->next);
119118
p->next = p->next->next;
120-
coalesced++;
121119
free_blocks_count--;
122120
} else {
123121
p = p->next;

0 commit comments

Comments
 (0)