diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index b0c3e9ce9c97942480bfa2d521ba83643c675090..e861e095754622db4e668ca981e981f0e233a011 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -256,7 +256,12 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::mips: switch (os) { case llvm::Triple::Linux: - return new LinuxTargetInfo(Triple, Opts); + switch (Triple.getEnvironment()) { + default: + return new LinuxTargetInfo(Triple, Opts); + case llvm::Triple::OpenHOS: + return new OHOSTargetInfo(Triple, Opts); + } case llvm::Triple::RTEMS: return new RTEMSTargetInfo(Triple, Opts); case llvm::Triple::FreeBSD: @@ -270,7 +275,12 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::mipsel: switch (os) { case llvm::Triple::Linux: - return new LinuxTargetInfo(Triple, Opts); + switch (Triple.getEnvironment()) { + default: + return new LinuxTargetInfo(Triple, Opts); + case llvm::Triple::OpenHOS: + return new OHOSTargetInfo(Triple, Opts); + } case llvm::Triple::RTEMS: return new RTEMSTargetInfo(Triple, Opts); case llvm::Triple::FreeBSD: diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp index 0c243a1ef723877f4454bb14891e461eb5667d47..9bb0003b91e5a82af3ba9c8c537e5f3149f82b7c 100644 --- a/clang/lib/Driver/ToolChains/OHOS.cpp +++ b/clang/lib/Driver/ToolChains/OHOS.cpp @@ -109,6 +109,8 @@ std::string OHOS::getMultiarchTriple(const llvm::Triple &T) const { return "x86_64-linux-ohos"; case llvm::Triple::aarch64: return "aarch64-linux-ohos"; + case llvm::Triple::mipsel: + return "mipsel-linux-ohos"; } return T.str(); } @@ -350,6 +352,10 @@ std::string OHOS::getDynamicLinker(const ArgList &Args) const { ArchName = "armeb"; IsArm = true; break; + case llvm::Triple::mipsel: + ArchName = "mipsel"; + IsArm = false; + break; default: ArchName = Triple.getArchName().str(); } @@ -385,15 +391,20 @@ std::string OHOS::getCompilerRT(const ArgList &Args, StringRef Component, } void OHOS::addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const { + const llvm::Triple::ArchType Arch = getArch(); CmdArgs.push_back("-z"); CmdArgs.push_back("now"); CmdArgs.push_back("-z"); CmdArgs.push_back("relro"); CmdArgs.push_back("-z"); CmdArgs.push_back("max-page-size=4096"); - CmdArgs.push_back("--hash-style=gnu"); - // FIXME: gnu or both??? - CmdArgs.push_back("--hash-style=both"); + if(Arch==llvm::Triple::mipsel) { + CmdArgs.push_back("--hash-style=sysv"); + } else { + CmdArgs.push_back("--hash-style=gnu"); + // FIXME: gnu or both??? + CmdArgs.push_back("--hash-style=both"); + } #ifdef ENABLE_LINKER_BUILD_ID CmdArgs.push_back("--build-id"); #endif @@ -436,4 +447,4 @@ ToolChain::UnwindLibType OHOS::GetUnwindLibType(const llvm::opt::ArgList &Args) if (const Arg *A = Args.getLastArg(options::OPT_unwindlib_EQ)) return Generic_ELF::GetUnwindLibType(Args); return GetDefaultUnwindLibType(); -} \ No newline at end of file +} diff --git a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake index 00bec8bdb846dcbd35838ff73ea59c82a5a447f3..b0492f7793edf440f4b988dca2be920b61d2276a 100644 --- a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake +++ b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake @@ -180,6 +180,7 @@ macro(detect_target_arch) add_default_target_arch(mips64) elseif(__MIPS) add_default_target_arch(mips) + add_default_target_arch(mipsel) elseif(__PPC64) # must be checked before __PPC add_default_target_arch(powerpc64) elseif(__PPC64LE) diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake index 347de3a08bb69b3f00b2a53a26fd6a8bdf2776cd..c2a92d1ca84bf026e1e29d148f1874e2fd281c5f 100644 --- a/compiler-rt/cmake/config-ix.cmake +++ b/compiler-rt/cmake/config-ix.cmake @@ -162,7 +162,11 @@ check_library_exists(c++ __cxa_throw "" COMPILER_RT_HAS_LIBCXX) check_library_exists(stdc++ __cxa_throw "" COMPILER_RT_HAS_LIBSTDCXX) # Linker flags. +check_symbol_exists(__mips__ "" __MIPS) +if(__MIPS) +else() check_linker_flag("-Wl,-z,text" COMPILER_RT_HAS_Z_TEXT) +endif() check_linker_flag("-fuse-ld=lld" COMPILER_RT_HAS_FUSE_LD_LLD_FLAG) if (NOT OHOS) @@ -308,7 +312,7 @@ set(ALL_SANITIZER_COMMON_SUPPORTED_ARCH ${X86} ${X86_64} ${PPC64} ${RISCV64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} ${S390X} ${SPARC} ${SPARCV9}) set(ALL_ASAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV64} ${MIPS32} ${MIPS64} ${PPC64} ${S390X} ${SPARC} ${SPARCV9}) -set(ALL_CRT_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV32} ${RISCV64} ${VE}) +set(ALL_CRT_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV32} ${RISCV64} ${MIPS32} ${MIPS64} ${VE}) set(ALL_DFSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64}) if(ANDROID) @@ -322,7 +326,7 @@ if(OS_NAME MATCHES "Linux") elseif (OS_NAME MATCHES "Windows") set(ALL_FUZZER_SUPPORTED_ARCH ${X86} ${X86_64}) elseif(OS_NAME MATCHES "Android" OR OS_NAME MATCHES "OHOS") - set(ALL_FUZZER_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64}) + set(ALL_FUZZER_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64}) else () set(ALL_FUZZER_SUPPORTED_ARCH ${X86_64} ${ARM64}) endif() @@ -331,7 +335,7 @@ set(ALL_GWP_ASAN_SUPPORTED_ARCH ${X86} ${X86_64}) if(APPLE) set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64}) else() - set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64} ${ARM32} ${PPC64} ${S390X}) + set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64} ${ARM32} ${PPC64} ${S390X} ${MIPS32} ${MIPS64}) endif() set(ALL_MSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${PPC64} ${S390X}) set(ALL_HWASAN_SUPPORTED_ARCH ${X86_64} ${ARM64}) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h index f4294a74f8e24274f5d1d56927b45f7a52efabda..ec77df6148ad4af8a462a6d36f3fe20230ce7a89 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -593,7 +593,7 @@ struct __sanitizer_sigaction { }; __sanitizer_sigset_t sa_mask; }; -#elif SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32) +#elif (SANITIZER_ANDROID || SANITIZER_OHOS) && (SANITIZER_WORDSIZE == 32) struct __sanitizer_sigaction { union { __sanitizer_sigactionhandler_ptr sigaction; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp index 0735b93c9a23a008918a6ad9f627e3f245e6c649..7ff500c3760f32a1a315a00d15fc17323b57ffce 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp @@ -41,7 +41,8 @@ # include #endif #include // for user_regs_struct -#if SANITIZER_ANDROID && SANITIZER_MIPS +#if (SANITIZER_OHOS || SANITIZER_ANDROID) && SANITIZER_MIPS +# include # include // for mips SP register in sys/user.h #endif #include // for signal-related stuff @@ -507,7 +508,7 @@ typedef pt_regs regs_struct; #elif defined(__mips__) typedef struct user regs_struct; -# if SANITIZER_ANDROID +# if SANITIZER_ANDROID || SANITIZER_OHOS # define REG_SP regs[EF_R29] # else # define REG_SP regs[EF_REG29] diff --git a/llvm-build/Makefile b/llvm-build/Makefile index d6e8933dc328f3e2b417fd98de8ff378089dcd3f..997288ae54b4cf47fda3a13538396b21aa2388f4 100644 --- a/llvm-build/Makefile +++ b/llvm-build/Makefile @@ -76,11 +76,15 @@ else ifeq ($(ARCH),x86_64) ARCH_CFLAGS = else +ifeq ($(ARCH),mips) +ARCH_CFLAGS = +else $(warning *** warning: ARCH $(ARCH) has not been tested yet, use with cautions!) ARCH_CFLAGS = endif endif endif +endif ifeq ($(ARCH),aarch64) CFLAGS = -march=armv8 -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack @@ -88,9 +92,13 @@ 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 else +ifeq ($(ARCH),mips) +CFLAGS = -march=mips32r2 -O2 -mfp64 +else CFLAGS = -march=armv7-a -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack endif endif +endif .PHONY: $(TARGETS:%=musl_copy_for_%) .PHONY: $(TARGETS:%=musl_patch_for_%) diff --git a/llvm-build/build.py b/llvm-build/build.py index a200c11b05c49c4d812b26ca45e75c4eddc78405..18106d372271482afb3c5ae9c8eed0ad83aee1e2 100755 --- a/llvm-build/build.py +++ b/llvm-build/build.py @@ -47,12 +47,13 @@ class BuildConfig(): self.no_build_arm = args.skip_build or args.no_build_arm self.no_build_aarch64 = args.skip_build or args.no_build_aarch64 self.no_build_x86_64 = args.skip_build or args.no_build_x86_64 + self.no_build_mipsel = args.skip_build or args.no_build_mipsel self.CURRENT_DIR = os.path.abspath(os.path.dirname(__file__)) self.REPOROOT_DIR = os.path.abspath(os.path.join(self.CURRENT_DIR, '../../')) self.LLVM_PROJECT_DIR = os.path.abspath(os.path.join(self.REPOROOT_DIR, 'toolchain', 'llvm-project')) self.OUT_PATH = os.path.join(self.REPOROOT_DIR, 'out') - self.TARGETS = 'AArch64;ARM;BPF;X86' + self.TARGETS = 'AArch64;ARM;BPF;X86;Mips' self.ORIG_ENV = dict(os.environ) self.VERSION = None # autodetected @@ -99,6 +100,12 @@ class BuildConfig(): default=False, help='Omit build os target: x86_64.') + parser.add_argument( + '--no-build-mipsel', + action='store_true', + default=False, + help='Omit build os target: mipsel.') + parser.add_argument( '--no-lto', action='store_true', @@ -792,12 +799,13 @@ class LlvmLibs(BuildUtils): '-fuse-ld=lld', '-Wl,--gc-sections', '-Wl,--build-id=sha1', + '-Wl,-z,notext', '-pie', '--rtlib=compiler-rt', '-stdlib=libc++', '-v', ] - ldflags.extend(ldflags) + ldflags.extend(ldflag) cflag = [ '--target=%s' % llvm_triple, @@ -829,7 +837,8 @@ class LlvmLibs(BuildUtils): ('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'), '', ''), - ('x86_64', self.open_ohos_triple('x86_64'), '', ''),] + ('x86_64', self.open_ohos_triple('x86_64'), '', ''), + ('mipsel', self.open_ohos_triple('mipsel'), '-march=mips32r2 -mfp64', ''),] cc = os.path.join(llvm_install, 'bin', 'clang') cxx = os.path.join(llvm_install, 'bin', 'clang++') @@ -850,7 +859,7 @@ class LlvmLibs(BuildUtils): llvm_path = self.merge_out_path('llvm_make') arch_list = [self.liteos_triple('arm'), self.open_ohos_triple('arm'), self.open_ohos_triple('aarch64'), - self.open_ohos_triple('x86_64')] + self.open_ohos_triple('x86_64'), self.open_ohos_triple('mipsel')] if precompilation: self.build_crts(llvm_install, arch, llvm_triple, cflags, ldflags, multilib_suffix, defines) continue @@ -1216,7 +1225,7 @@ class LlvmLibs(BuildUtils): self.logger().info('Building libz for %s ', arch) libz_path = self.merge_out_path('lib', 'libz-%s' % llvm_triple) - if llvm_triple == self.hos_triple('arm'): + if llvm_triple == self.open_ohos_triple('arm'): ldflags.append('-lunwind') @@ -1972,6 +1981,8 @@ def main(): if not build_config.no_build_x86_64: configs.append(('x86_64', build_utils.open_ohos_triple('x86_64'))) + if not build_config.no_build_mipsel: + configs.append(('mipsel', build_utils.open_ohos_triple('mipsel'))) if build_config.do_build and need_host: llvm_core.llvm_compile( diff --git a/llvm-build/build_musl.sh b/llvm-build/build_musl.sh index a05b87229d3c5c4cca5f5e8fad9f180f261d0a06..f97bf6e0f261a1052a715773a9d87afa059e2a45 100755 --- a/llvm-build/build_musl.sh +++ b/llvm-build/build_musl.sh @@ -75,6 +75,10 @@ elif [ $TARGET_TRIPLE == "arm-linux-ohos" ]; then elif [ $TARGET_TRIPLE == "x86_64-linux-ohos" ]; then TARGET_USER="linux_user" TARGETS_PREFIX="x86_64" +elif [ $TARGET_TRIPLE == "mipsel-linux-ohos" ]; then + TARGET_USER="linux_user" + TARGETS_PREFIX="mips" + CFLAGS_FOR_TARGET=("-mfp64") else TARGET_USER="linux_user" TARGETS_PREFIX="aarch64"