work in progress: llvm toolchain

This commit is contained in:
darotsr 2024-09-16 17:07:00 +03:00
parent d148a602e7
commit 9359f22b0b
7 changed files with 136 additions and 3 deletions

View file

@ -49,6 +49,29 @@ $(GCC_INSTALL_DIR): vendor/riscv32-elf-gcc.url
mv $(INSTALL_DIR)/riscv $(GCC_INSTALL_DIR)
touch $(GCC_INSTALL_DIR)
riscv32-llvm: $(LLVM_INSTALL_DIR)
vendor/riscv32-llvm.tar.gz:
cd vendor && \
wget https://buildbot.embecosm.com/job/riscv32-clang-ubuntu2004-release/24/artifact/riscv32-embecosm-ubuntu2004-clang16.0.2.tar.gz -O riscv32-llvm.tar.gz
touch riscv32-llvm.tar.gz
$(LLVM_INSTALL_DIR): vendor/riscv32-llvm.tar.gz
rm -fr $(LLVM_INSTALL_DIR)
mkdir -p $(INSTALL_DIR)
cd vendor && \
tar -xzvf riscv32-llvm.tar.gz -C $(INSTALL_DIR)/ riscv32-embecosm-ubuntu2004-clang16.0.2
mv $(INSTALL_DIR)/riscv32-embecosm-ubuntu2004-clang16.0.2 $(LLVM_INSTALL_DIR)
touch $(LLVM_INSTALL_DIR)
riscv32-llvm-patch:
@cd $(prj_path)/util/isolde && \
tar -xzvf tools.tar.gz && \
mv $(prj_path)/util/isolde/riscv32-unknown-elf-objcopy $(LLVM_INSTALL_DIR)/bin && \
mv $(prj_path)/util/isolde/riscv32-unknown-elf-objdump $(LLVM_INSTALL_DIR)/bin && \
echo "REPLACED riscv32-unknown-elf- objcopy/objdump"
dev-dep:
sudo apt-get install libelf-dev
sudo apt-get install srecord

1
eth.sh
View file

@ -18,6 +18,7 @@ export ROOT_DIR=$(git rev-parse --show-toplevel)
export BENDER=~/eth/bin/bender
export PULP_RISCV_GCC_TOOLCHAIN=$ROOT_DIR/install/riscv
export GCC_TOOLCHAIN=$ROOT_DIR/install/riscv-gcc/bin
export LLVM_TOOLCHAIN=$ROOT_DIR/install/riscv-llvm/bin
export CC=gcc-10
export CXX=g++-10

View file

@ -23,6 +23,7 @@ clean-test:
make -C $(dir $(test-program)) clean
run-test:
@rm -f ibex_simple_system.log
./$(BUILD_DIR)/sim-verilator/Vibex_simple_system -t --meminit=ram,$(test-program)
@echo
@echo ibex_simple_system.log

View file

@ -0,0 +1,102 @@
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
COMMON_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
COMMON_SRCS = $(wildcard $(COMMON_DIR)/*.c)
INCS := -I$(COMMON_DIR)
TARGET := riscv32
ARCH := rv32g
RISCV_ABI := ilp32
RISCV_WARNINGS += -Wunused-variable -Wall -Wextra -Wno-unused-command-line-argument # -Werror
LLVM_FLAGS ?= --target=$(TARGET) -march=$(ARCH) -menable-experimental-extensions -mabi=$(RISCV_ABI) -mno-relax
RISCV_FLAGS ?= $(LLVM_FLAGS) -mcmodel=medany -Os -ffast-math -g $(RISCV_WARNINGS)
RISCV_CCFLAGS ?= $(RISCV_FLAGS) -ffunction-sections -fdata-sections -std=gnu99 -nostdlib -nostartfiles
RISCV_CXXFLAGS ?= $(RISCV_FLAGS) -ffunction-sections -fdata-sections
RISCV_LDFLAGS ?= -static -nostdlib
LINKER_SCRIPT ?= $(COMMON_DIR)/link.ld
CFLAGS ?= -march=$(ARCH) -mabi=ilp32 -static -mcmodel=medany -Wall -g -Os\
-fvisibility=hidden -nostdlib -nostartfiles -ffreestanding $(PROGRAM_CFLAGS)
ifdef PROGRAM
PROGRAM_C := $(PROGRAM).c
endif
SRCS = $(COMMON_SRCS) $(PROGRAM_C) $(EXTRA_SRCS)
C_SRCS = $(filter %.c, $(SRCS))
ASM_SRCS = $(filter %.S, $(SRCS))
CC := $(LLVM_TOOLCHAIN)/clang
LD := $(LLVM_TOOLCHAIN)/ld.lld
#LD := $(GCC_TOOLCHAIN)/riscv32-unknown-elf-gcc
#OBJCOPY := $(LLVM_TOOLCHAIN)/llvm-objcopy
OBJDUMP := $(GCC_TOOLCHAIN)/riscv32-unknown-elf-objdump
#OBJDUMP := $(LLVM_TOOLCHAIN)/llvm-objdump
CRT ?= $(COMMON_DIR)/crt0.S
OBJS := ${C_SRCS:.c=.o} ${ASM_SRCS:.S=.o} ${CRT:.S=.o}
DEPS = $(OBJS:%.o=%.d)
ifdef PROGRAM
OUTFILES := $(PROGRAM).elf
else
OUTFILES := $(OBJS)
endif
all: $(OUTFILES)
ifdef PROGRAM
$(PROGRAM).elf: $(OBJS) $(LINKER_SCRIPT)
# $(LD) $(CFLAGS) -T $(LINKER_SCRIPT) $(OBJS) -o $@ $(LIBS)
$(LD) $(RISCV_LDFLAGS) -Map $@.map $(LINKER_SCRIPT) $(OBJS) -o $@ $(LIBS)
$(OBJDUMP) -dh $@ >$@.headers
.PHONY: disassemble
disassemble: $(PROGRAM).dis
endif
%.dis: %.elf
$(OBJDUMP) -fhSD $^ > $@
# Note: this target requires the srecord package to be installed.
# XXX: This could be replaced by objcopy once
# https://sourceware.org/bugzilla/show_bug.cgi?id=19921
# is widely available.
%.vmem: %.bin
srec_cat $^ -binary -offset 0x0000 -byte-swap 4 -o $@ -vmem
%.bin: %.elf
$(OBJCOPY) -O binary $^ $@
%.o: %.c
$(CC) -c $(RISCV_CCFLAGS) $(INCS) -o $@ $<
# Rule to compile C to assembly
%.s: %.c
$(CC) -S $(RISCV_CCFLAGS) $(INCS) -o $@ $<
%.o: %.S
$(CC) -c $(RISCV_CCFLAGS) $(INCS) -o $@ $<
clean:
$(RM) -f $(OBJS) $(DEPS)
rm -f *.bin *.vmem *.elf *.headers
distclean: clean
$(RM) -f $(OUTFILES)

View file

@ -34,7 +34,7 @@ OBJS := ${C_SRCS:.c=.o} ${ASM_SRCS:.S=.o} ${CRT:.S=.o}
DEPS = $(OBJS:%.o=%.d)
ifdef PROGRAM
OUTFILES := $(PROGRAM).elf $(PROGRAM).vmem $(PROGRAM).bin
OUTFILES := $(PROGRAM).elf
else
OUTFILES := $(OBJS)
endif

View file

@ -11,4 +11,10 @@ PROGRAM_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
# extension for assembly files
EXTRA_SRCS :=
include ${PROGRAM_DIR}/../common/common.mk
# Check the COMPILER variable passed via the command line
ifeq ($(COMPILER), llvm)
include $(PROGRAM_DIR)/../common/common-llvm.mk
else
include $(PROGRAM_DIR)/../common/common.mk
endif

View file

@ -138,7 +138,7 @@ void VerilatorSimCtrl::Run() {
std::cout << std::endl
<< "Simulation running, end by pressing CTRL-c." << std::endl;
<< "Simulation running, end by pressing CTRL-z." << std::endl;
time_begin_ = std::chrono::steady_clock::now();
DeassertReset();