From 7ee3ea789f6ea373b4b2625b08382ee7af2cf4a8 Mon Sep 17 00:00:00 2001 From: peshkovivan Date: Mon, 2 Oct 2023 13:04:27 +0300 Subject: [PATCH] Replace GCC with LLVM for LiteOS-m Signed-off-by: peshkovivan --- clang/lib/Driver/ToolChains/OHOS.cpp | 19 +++- llvm-build/Makefile | 69 ++++++------- llvm-build/build.py | 9 +- llvm-build/build_musl.py | 142 +++++++++++++++++++++++++++ llvm-build/build_musl.sh | 123 ----------------------- 5 files changed, 197 insertions(+), 165 deletions(-) create mode 100755 llvm-build/build_musl.py delete mode 100755 llvm-build/build_musl.sh diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp index 7afdecefb614..0ead5272e1dd 100644 --- a/clang/lib/Driver/ToolChains/OHOS.cpp +++ b/clang/lib/Driver/ToolChains/OHOS.cpp @@ -36,6 +36,11 @@ static bool findOHOSMuslMultilibs(const Multilib::flags_list &Flags, DetectedMultilibs &Result) { MultilibSet Multilibs; Multilibs.push_back(Multilib()); + + Multilibs.push_back(Multilib("m4_soft", {}, {}, 1) + .flag("+mcpu=cortex-m4") + .flag("+mfloat-abi=soft")); + // -mcpu=cortex-a7 // -mfloat-abi=soft -mfloat-abi=softfp -mfloat-abi=hard // -mfpu=neon-vfpv4 @@ -75,6 +80,11 @@ static bool findOHOSMultilibs(const Driver &D, IsA7 = A->getValue() == StringRef("cortex-a7"); addMultilibFlag(IsA7, "mcpu=cortex-a7", Flags); + bool IsM4 = false; + if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) + IsM4 = A->getValue() == StringRef("cortex-m4"); + addMultilibFlag(IsM4, "mcpu=cortex-m4", Flags); + bool IsMFPU = false; if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) IsMFPU = A->getValue() == StringRef("neon-vfpv4"); @@ -152,8 +162,15 @@ OHOS::OHOS(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) getFilePaths().clear(); std::string CandidateLibPath = getArchSpecificLibPath(); + std::string MultilibSuffix = SelectedMultilib.gccSuffix(); + std::string CPU = getCPUName(D, Args, Triple); + if (getVFS().exists(CandidateLibPath)) - getFilePaths().push_back(CandidateLibPath); + //getFilePaths().push_back(CandidateLibPath); + getFilePaths().push_back( + CPU == "cortex-m4" + ? CandidateLibPath + SelectedMultilib.gccSuffix() + : CandidateLibPath); getLibraryPaths().clear(); for (auto &Path : getRuntimePaths()) diff --git a/llvm-build/Makefile b/llvm-build/Makefile index ecb982228b0e..b0c486cb04c7 100644 --- a/llvm-build/Makefile +++ b/llvm-build/Makefile @@ -52,11 +52,14 @@ LINUXKERNELDIR = $(TOPDIR)/third_party/Linux_Kernel OPTRTDIR = $(TOPDIR)/third_party/optimized-routines NUTTXDIR = $(TOPDIR)/third_party/NuttX SYSROOTDIR = $(TOPDIR)/prebuilts/lite/sysroot +LITEOSMDIR = $(TOPDIR)/kernel/liteos_m LITEOSADIR = $(TOPDIR)/kernel/liteos_a LINUXDIR = $(TOPDIR)/kernel/linux/linux-5.10 MUSLCOPYDIR = $(TOPDIR) TARGETS = $(if $(wildcard $(LITEOSADIR)),liteos_a_user,) +TARGETS += $(if $(wildcard $(LITEOSADIR)),liteos_m_user,) +TARGETS_LITEOS = ${TARGETS} TARGETS += $(if $(wildcard $(LINUXDIR)),linux_user,) define LINUX_TYPES_H @@ -69,7 +72,6 @@ endef export LINUX_TYPES_H ifeq ($(ARCH),arm) -ARCH_CFLAGS = -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 else ifeq ($(ARCH),aarch64) ARCH_CFLAGS = @@ -92,23 +94,23 @@ endif endif ifeq ($(ARCH),aarch64) -CFLAGS = -march=armv8 -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack +CFLAGS = -march=armv8 else ifeq ($(ARCH),riscv64) -CFLAGS = -march=rv64gc -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack +CFLAGS = -march=rv64gc else ifeq ($(ARCH),mips) -CFLAGS = -march=mips32r2 -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack +CFLAGS = -march=mips32r2 else ifeq ($(ARCH),x86_64) -CFLAGS = -march=x86-64 -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack +CFLAGS = -march=x86-64 else -CFLAGS = -march=armv7-a -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack endif endif endif endif +CFLAGS += -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack CFLAGS += -Wno-int-conversion .PHONY: $(TARGETS:%=musl_copy_for_%) @@ -158,44 +160,53 @@ linux_header_install_for_liteos_a_user: musl_copy_for_liteos_a_user musl_patch_for_liteos_a_user: nuttx_header_install_for_liteos_a_user musl_patch_for_liteos_a_user: linux_header_install_for_liteos_a_user musl_patch_for_liteos_a_user: optimized_routines_install_for_liteos_a_user + musl_patch_for_liteos_a_user: musl_copy_for_liteos_a_user $(HIDE) cp -rfp $(MUSLDIR)/porting/liteos_a/user/* $(MUSLCOPYDIR)/$/dev/null && \ - make -sj install-headers + CC="$(CC)" CROSS_COMPILE="$(CROSS_COMPILE)" CFLAGS="$(CFLAGS)" &> ${CURDIR}/musl_header_configure_for_$(TARGETS:%=%).log && \ + make -sj install-headers &> ${CURDIR}/musl_header_install_for_$(TARGETS:%=%).log -musl_install_for_liteos_a_user: musl_patch_for_liteos_a_user - $(HIDE) cd $(MUSLCOPYDIR)/musl_copy_for_liteos_a_user && mkdir -p $(MUSLBUILDDIR) && cd $(MUSLBUILDDIR) && \ +$(TARGETS:%=musl_install_for_%): $(TARGETS:%=musl_patch_for_%) + $(HIDE) echo CC="$(CC)" CFLAGS="$(CFLAGS)" + $(HIDE) cd $(MUSLCOPYDIR)/musl_copy_for_$(TARGETS:%=%) && mkdir -p $(MUSLBUILDDIR) && cd $(MUSLBUILDDIR) && \ ../configure --prefix=$(SYSROOTDIR)/$(TARGET)/usr --target=$(TARGET) \ --includedir=$(SYSROOTDIR)/$(TARGET)/usr/include \ --libdir=$(SYSROOTDIR)/$(TARGET)/usr/lib/$(MULTILIB) \ --syslibdir=$(SYSROOTDIR)/$(TARGET)/usr/lib/$(MULTILIB) \ --build=$(BUILD) \ $(if $(LDFLAGS),LDFLAGS="$(LDFLAGS)",) \ - CC="$(CC)" CROSS_COMPILE="$(CROSS_COMPILE)" CFLAGS="$(CFLAGS)" >/dev/null && \ - make -sj install + CC="$(CC)" CROSS_COMPILE="$(CROSS_COMPILE)" CFLAGS="$(CFLAGS)" &> ${CURDIR}/musl_configure_for_$(TARGETS:%=%).log && \ + make -sj install &> ${CURDIR}/musl_install_for_$(TARGETS:%=%).log musl_patch_for_linux_user: musl_copy_for_linux_user $(HIDE) cp -rfp $(MUSLDIR)/porting/linux/user/* $(MUSLCOPYDIR)/$/dev/null && \ - make -sj install-headers - -musl_install_for_linux_user: musl_patch_for_linux_user - $(HIDE) cd $(MUSLCOPYDIR)/musl_copy_for_linux_user && mkdir -p $(MUSLBUILDDIR) && cd $(MUSLBUILDDIR) && \ - ../configure --prefix=$(SYSROOTDIR)/$(TARGET)/usr --target=$(TARGET) \ - --includedir=$(SYSROOTDIR)/$(TARGET)/usr/include \ - --libdir=$(SYSROOTDIR)/$(TARGET)/usr/lib/$(MULTILIB) \ - --syslibdir=$(SYSROOTDIR)/$(TARGET)/usr/lib/$(MULTILIB) \ - --build=$(BUILD) \ - CC="$(CC)" CROSS_COMPILE="$(CROSS_COMPILE)" CFLAGS="$(CFLAGS)" >/dev/null && \ - make -sj install - clean: $(HIDE) rm -rf musl_copy_for_* linux_header_install_for_* diff --git a/llvm-build/build.py b/llvm-build/build.py index 3f84c5de03df..3106fc604cb5 100755 --- a/llvm-build/build.py +++ b/llvm-build/build.py @@ -923,7 +923,7 @@ class SysrootComposer(BuildUtils): cur_dir = os.getcwd() os.chdir(self.build_config.LLVM_BUILD_DIR) self.logger().info('build musl %s', self.merge_out_path('install')) - args = ['./build_musl.sh', '-t', target, + args = ['python3', '-u', './build_musl.py', '-t', target, '-c', self.merge_out_path(llvm_install, 'bin'), '-o', self.merge_out_path(), '-T', self.build_config.REPOROOT_DIR] + list(extra_args) @@ -1031,6 +1031,8 @@ class LlvmLibs(BuildUtils): def build_libs(self, llvm_install, llvm_build, precompilation=False): configs_list = [ + ('arm', self.liteos_triple('arm'), '-march=armv7-m -mcpu=cortex-m4 -mfloat-abi=soft', 'm4_soft'), + ('arm', self.liteos_triple('arm'), '-march=armv7-a -mfloat-abi=soft', ''), ('arm', self.liteos_triple('arm'), '-march=armv7-a -mcpu=cortex-a7 -mfloat-abi=soft', 'a7_soft'), ('arm', self.liteos_triple('arm'), @@ -1044,11 +1046,13 @@ class LlvmLibs(BuildUtils): '-march=armv7-a -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4', 'a7_softfp_neon-vfpv4'), ('arm', self.open_ohos_triple('arm'), '-march=armv7-a -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4', 'a7_hard_neon-vfpv4'), + ('aarch64', self.open_ohos_triple('aarch64'), '', ''), ('riscv64', self.open_ohos_triple('riscv64'), '', ''), ('mipsel', self.open_ohos_triple('mipsel'), '', ''), ('mipsel', self.open_ohos_triple('mipsel'), '-mnan=legacy', 'nanlegacy'), - ('x86_64', self.open_ohos_triple('x86_64'), '', ''),] + ('x86_64', self.open_ohos_triple('x86_64'), '', ''), + ] cc = os.path.join(llvm_install, 'bin', 'clang') cxx = os.path.join(llvm_install, 'bin', 'clang++') @@ -1081,6 +1085,7 @@ class LlvmLibs(BuildUtils): if precompilation: self.build_crts(llvm_install, arch, llvm_triple, cflags, ldflags, multilib_suffix, defines) continue + # libunwind is added to linker command line by OHOS toolchain, so we have to use two step build self.build_runtimes(llvm_install, "libunwind", ldflags, cflags, llvm_triple, arch, multilib_suffix, defines) self.build_runtimes(llvm_install, "libunwind;libcxxabi;libcxx", ldflags, cflags, llvm_triple, arch, multilib_suffix, defines) diff --git a/llvm-build/build_musl.py b/llvm-build/build_musl.py new file mode 100755 index 000000000000..13a925cecc57 --- /dev/null +++ b/llvm-build/build_musl.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +import argparse +import os +import subprocess + +# default variables +CLANG_BIN_ROOT = os.path.join(os.getcwd(), "../../out/install/linux-x86_64/clang-dev/bin/") +TARGET_TRIPLE = "" +TOPDIR = os.path.join(os.getcwd(), "../..") +OUT = os.path.join(os.getcwd(), "../../out") +make_libs = False + +# argument parser +parser = argparse.ArgumentParser(description='Build C/C++ dynamic libs and runtime object') +parser.add_argument('-c', metavar='path', help='Specify clang bin path') +parser.add_argument('-t', metavar='target', help='Specify target tripple') +parser.add_argument('-T', metavar='dir', help='Specify top of repo tree') +parser.add_argument('-o', metavar='dir', help='Specify the build output directory') +parser.add_argument('-l', action='store_true', help='Install libs') +args = parser.parse_args() + +if args.c: CLANG_BIN_ROOT = args.c +if args.t: TARGET_TRIPLE = args.t +if args.T: TOPDIR = args.T +if args.o: OUT = args.o +if args.l: make_libs = True + +if TARGET_TRIPLE == "": + print("[ERROR] Empty target triple in build_musl.py") + exit(1) + + +# Canonicalize paths +CLANG_BIN_ROOT = os.path.realpath(CLANG_BIN_ROOT) + +CFLAGS_FOR_A = [ + "-mfloat-abi=soft", + "-mfloat-abi=soft -mcpu=cortex-a7", + "-mfloat-abi=softfp -mfpu=neon-vfpv4 -mcpu=cortex-a7", + "-mfloat-abi=hard -mfpu=neon-vfpv4 -mcpu=cortex-a7", +] + +CFLAGS_FOR_M = [ + "-mfloat-abi=soft -mcpu=cortex-m4" +] + +A_USER = "liteos_a_user" +M_USER = "liteos_m_user" + +LITEOS_USERS = [ + A_USER, M_USER, +] + +CFLAGS_FOR_TARGET = CFLAGS_FOR_A +if TARGET_TRIPLE == "arm-liteos-ohos": + TARGET_USER = "" + TARGETS_PREFIX = "arm" +elif TARGET_TRIPLE == "arm-linux-ohos": + TARGET_USER = "linux_user" + TARGETS_PREFIX = "arm" +elif TARGET_TRIPLE == "mipsel-linux-ohos": + TARGET_USER = "linux_user" + TARGETS_PREFIX = "mips" + CFLAGS_FOR_TARGET = [" ", "-mnan=legacy"] +elif TARGET_TRIPLE == "riscv64-linux-ohos": + TARGET_USER = "linux_user" + TARGETS_PREFIX = "riscv64" +elif TARGET_TRIPLE == "x86_64-linux-ohos": + TARGET_USER = "linux_user" + TARGETS_PREFIX = "x86_64" +else: + TARGET_USER = "linux_user" + TARGETS_PREFIX = "aarch64" + +# helpers +def bash(command): + subprocess.run(command, shell=True) + +def install_headers(platform, user): + make_cmd = f'{platform} make musl_header_install_for_{user} CLANG={CLANG_BIN_ROOT}/clang TOPDIR={TOPDIR} SYSROOTDIR={os.path.join(OUT, "sysroot")} TARGETS={user} TARGET={TARGET_TRIPLE} ARCH={TARGETS_PREFIX} -f Makefile' + print(f"Headers: {make_cmd}") + bash(make_cmd) + +def build_library(platform, user): + make_cmd = f'{platform} make CLANG={CLANG_BIN_ROOT}/clang TOPDIR={TOPDIR} SYSROOTDIR={os.path.join(OUT, "sysroot")} TARGETS={user} TARGET={TARGET_TRIPLE} ARCH={TARGETS_PREFIX} -f Makefile' + print(f"Build library: {make_cmd}") + bash(make_cmd) + +def get_platform_flags(arch_cflags, cflags): + return f'ARCH_CFLAGS="{arch_cflags}" CFLAGS="{cflags}"' + +print(f"CLANG_BIN_ROOT={CLANG_BIN_ROOT}") +print(f"ARCH={TARGETS_PREFIX}") +print(f"TARGET={TARGET_TRIPLE}") +print(f"TOPDIR={TOPDIR}") +print(f"TARGETS={TARGET_USER}") +print(f"OUT={OUT}") +print(f"SYSROOTDIR={os.path.join(OUT, 'sysroot')}") + +ARCH_A_CFLAGS = "-mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4" +A_CFLAGS = "-march=armv7-a" +A_PLATFORM = get_platform_flags(ARCH_A_CFLAGS, A_CFLAGS) + +ARCH_M_CFLAGS = CFLAGS_FOR_M[0] +M_CFLAGS = "-march=armv7-m" +M_PLATFORM = get_platform_flags(ARCH_M_CFLAGS, M_CFLAGS) + +# build musl_headers +if TARGET_TRIPLE != "arm-liteos-ohos": + install_headers(A_PLATFORM, TARGET_USER) +else: + for USER in LITEOS_USERS: + install_headers(A_PLATFORM if USER == A_USER else M_PLATFORM, USER) + +# build musl_libs +if make_libs: + if TARGET_TRIPLE in ["aarch64-linux-ohos", "riscv64-linux-ohos", "x86_64-linux-ohos"]: + build_library(A_PLATFORM, TARGET_USER) + + elif TARGET_TRIPLE == "arm-linux-ohos": + for ARCH in CFLAGS_FOR_TARGET: + PLATFORM = get_platform_flags(ARCH, A_CFLAGS) + build_library(PLATFORM, TARGET_USER) + + elif TARGET_TRIPLE == "arm-liteos-ohos": + for USER in LITEOS_USERS: + if USER == A_USER: + CFLAGS_FOR_TARGET = CFLAGS_FOR_A + CFLAGS = A_CFLAGS + else: + CFLAGS_FOR_TARGET = CFLAGS_FOR_M + CFLAGS = M_CFLAGS + + for ARCH in CFLAGS_FOR_TARGET: + PLATFORM = get_platform_flags(ARCH, CFLAGS) + build_library(PLATFORM, USER) + + else: + print("Unknown target! Nothing to build...") + +os.system('make distclean -f Makefile') + diff --git a/llvm-build/build_musl.sh b/llvm-build/build_musl.sh deleted file mode 100755 index 7f7f44c774e2..000000000000 --- a/llvm-build/build_musl.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/bash -# Copyright (C) 2021 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -set -e - -# This script is used to create musl's libc.so. - -#default variables -CLANG_BIN_ROOT="${PWD}/../../out/install/linux-x86_64/clang-dev/bin/" -TARGET_TRIPLE="" -TOPDIR="${PWD}/../.." -OUT="${PWD}/../../out" -make_libs=0 - -#argument parser -while getopts "c:t:T:o:lh" arg -do - case "${arg}" in - "c") - CLANG_BIN_ROOT=${OPTARG} - ;; - "t") - TARGET_TRIPLE=${OPTARG} - ;; - "T") - TOPDIR=${OPTARG} - ;; - "o") - OUT=${OPTARG} - ;; - "l") - make_libs=1 - ;; - "h") - echo "Usage: ./build_musl.sh [OPTION]" - echo " Build C/C++ dynamic libs and runtime object" - echo " Options are:" - echo " -c Specify clang bin path" - echo " -t Specify target tripple" - echo " -T Specify top of repo tree" - echo " -o Specify the build output directory" - echo " -l Install libs" - exit 0 - ;; - ?) - echo "unkown argument" - exit 1 - ;; - esac -done - -if [ -z "${TARGET_TRIPLE}" ] -then - echo "[ERROR] Empty target triple in build_musl.sh" - exit 1 -fi - -# Canonicalize paths -CLANG_BIN_ROOT=$(readlink -f ${CLANG_BIN_ROOT}) - -CFLAGS_FOR_TARGET=("-mfloat-abi=soft" "-mfloat-abi=soft -mcpu=cortex-a7" -"-mfloat-abi=softfp -mfpu=neon-vfpv4 -mcpu=cortex-a7" "-mfloat-abi=hard -mfpu=neon-vfpv4 -mcpu=cortex-a7") - -if [ $TARGET_TRIPLE == "arm-liteos-ohos" ]; then - TARGET_USER="liteos_a_user" - TARGETS_PREFIX="arm" -elif [ $TARGET_TRIPLE == "arm-linux-ohos" ]; then - TARGET_USER="linux_user" - TARGETS_PREFIX="arm" -elif [ $TARGET_TRIPLE == "mipsel-linux-ohos" ]; then - TARGET_USER="linux_user" - TARGETS_PREFIX="mips" - CFLAGS_FOR_TARGET=(" " "-mnan=legacy") -elif [ $TARGET_TRIPLE == "riscv64-linux-ohos" ]; then - TARGET_USER="linux_user" - TARGETS_PREFIX="riscv64" -elif [ $TARGET_TRIPLE == "x86_64-linux-ohos" ]; then - TARGET_USER="linux_user" - TARGETS_PREFIX="x86_64" -else - TARGET_USER="linux_user" - TARGETS_PREFIX="aarch64" -fi - -echo "CLANG_BIN_ROOT=${CLANG_BIN_ROOT}" -echo "ARCH=${TARGETS_PREFIX}" -echo "TARGET=${TARGET_TRIPLE}" -echo "TOPDIR=${TOPDIR}" -echo "TARGETS=${TARGET_USER}" -echo "OUT=${OUT}" -echo "SYSROOTDIR=${OUT}/sysroot" -echo "MUSLCOPYDIR=${OUT}/musl_build" - -# build musl_headers -make musl_header_install_for_${TARGET_USER} CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${TOPDIR} \ - SYSROOTDIR=${OUT}/sysroot TARGETS=${TARGET_USER} MUSLCOPYDIR=${OUT}/musl_build TARGET=${TARGET_TRIPLE} \ - ARCH=${TARGETS_PREFIX} -f Makefile - -# build musl_libs -if ((make_libs == 1)); then - if [ $TARGET_TRIPLE == "aarch64-linux-ohos" ] || [ $TARGET_TRIPLE == "riscv64-linux-ohos" ] || \ - [ $TARGET_TRIPLE == "x86_64-linux-ohos" ]; then - make CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${TOPDIR} SYSROOTDIR=${OUT}/sysroot MUSLCOPYDIR=${OUT}/musl_build \ - TARGETS=${TARGET_USER} TARGET=${TARGET_TRIPLE} ARCH=${TARGETS_PREFIX} -f Makefile - else - for ARCH_CFLAG in "${CFLAGS_FOR_TARGET[@]}" - do - make CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${TOPDIR} SYSROOTDIR=${OUT}/sysroot MUSLCOPYDIR=${OUT}/musl_build \ - TARGETS=${TARGET_USER} TARGET=${TARGET_TRIPLE} ARCH=${TARGETS_PREFIX} ARCH_CFLAGS="${ARCH_CFLAG}" -f Makefile - done - fi -fi -make distclean -f Makefile -- Gitee