diff --git a/clang/cmake/caches/Fuchsia-stage2.cmake b/clang/cmake/caches/Fuchsia-stage2.cmake --- a/clang/cmake/caches/Fuchsia-stage2.cmake +++ b/clang/cmake/caches/Fuchsia-stage2.cmake @@ -1,6 +1,6 @@ # This file sets up a CMakeCache for the second stage of a Fuchsia toolchain build. -set(LLVM_TARGETS_TO_BUILD X86;ARM;AArch64 CACHE STRING "") +set(LLVM_TARGETS_TO_BUILD X86;ARM;AArch64;RISCV CACHE STRING "") set(PACKAGE_VENDOR Fuchsia CACHE STRING "") @@ -106,13 +106,14 @@ if(FUCHSIA_SDK) set(FUCHSIA_aarch64_NAME arm64) set(FUCHSIA_x86_64_NAME x64) - foreach(target x86_64;aarch64) + set(FUCHSIA_riscv64_NAME riscv64) + foreach(target x86_64;aarch64;riscv64) set(FUCHSIA_${target}_COMPILER_FLAGS "-I${FUCHSIA_SDK}/pkg/fdio/include") set(FUCHSIA_${target}_LINKER_FLAGS "-L${FUCHSIA_SDK}/arch/${FUCHSIA_${target}_NAME}/lib") set(FUCHSIA_${target}_SYSROOT "${FUCHSIA_SDK}/arch/${FUCHSIA_${target}_NAME}/sysroot") endforeach() - foreach(target x86_64;aarch64) + foreach(target x86_64;aarch64;riscv64) # Set the per-target builtins options. list(APPEND BUILTIN_TARGETS "${target}-unknown-fuchsia") set(BUILTINS_${target}-unknown-fuchsia_CMAKE_SYSTEM_NAME Fuchsia CACHE STRING "") @@ -124,7 +125,9 @@ set(BUILTINS_${target}-unknown-fuchsia_CMAKE_MODULE_LINKER_FLAGS ${FUCHSIA_${target}_LINKER_FLAGS} CACHE STRING "") set(BUILTINS_${target}-unknown-fuchsia_CMAKE_EXE_LINKER_FLAGS ${FUCHSIA_${target}_LINKER_FLAGS} CACHE STRING "") set(BUILTINS_${target}-unknown-fuchsia_CMAKE_SYSROOT ${FUCHSIA_${target}_SYSROOT} CACHE PATH "") + endforeach() + foreach(target x86_64;aarch64) # Set the per-target runtimes options. list(APPEND RUNTIME_TARGETS "${target}-unknown-fuchsia") set(RUNTIMES_${target}-unknown-fuchsia_CMAKE_SYSTEM_NAME Fuchsia CACHE STRING "") diff --git a/clang/cmake/caches/Fuchsia.cmake b/clang/cmake/caches/Fuchsia.cmake --- a/clang/cmake/caches/Fuchsia.cmake +++ b/clang/cmake/caches/Fuchsia.cmake @@ -1,6 +1,6 @@ # This file sets up a CMakeCache for a Fuchsia toolchain build. -set(LLVM_TARGETS_TO_BUILD X86;ARM;AArch64 CACHE STRING "") +set(LLVM_TARGETS_TO_BUILD X86;ARM;AArch64;RISCV CACHE STRING "") set(PACKAGE_VENDOR Fuchsia CACHE STRING "") diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -383,6 +383,8 @@ switch (os) { case llvm::Triple::FreeBSD: return new FreeBSDTargetInfo(Triple, Opts); + case llvm::Triple::Fuchsia: + return new FuchsiaTargetInfo(Triple, Opts); case llvm::Triple::Linux: return new LinuxTargetInfo(Triple, Opts); default: diff --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp b/clang/lib/Driver/ToolChains/Fuchsia.cpp --- a/clang/lib/Driver/ToolChains/Fuchsia.cpp +++ b/clang/lib/Driver/ToolChains/Fuchsia.cpp @@ -224,7 +224,7 @@ std::string Fuchsia::ComputeEffectiveClangTriple(const ArgList &Args, types::ID InputType) const { llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); - return (Triple.getArchName() + "-" + Triple.getOSName()).str(); + return Triple.str(); } Tool *Fuchsia::buildLinker() const { @@ -344,9 +344,17 @@ SanitizerMask Fuchsia::getDefaultSanitizers() const { SanitizerMask Res; - if (getTriple().getArch() == llvm::Triple::aarch64) + switch (getTriple().getArch()) { + case llvm::Triple::aarch64: Res |= SanitizerKind::ShadowCallStack; - else + break; + case llvm::Triple::x86_64: Res |= SanitizerKind::SafeStack; + break; + case llvm::Triple::riscv64: + break; + default: + llvm_unreachable("invalid architecture"); + } return Res; } diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/riscv64-fuchsia/libclang_rt.builtins.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/riscv64-fuchsia/libclang_rt.builtins.a new file mode 100644 diff --git a/clang/test/Driver/fuchsia.c b/clang/test/Driver/fuchsia.c --- a/clang/test/Driver/fuchsia.c +++ b/clang/test/Driver/fuchsia.c @@ -6,7 +6,14 @@ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ // RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ // RUN: | FileCheck -check-prefixes=CHECK,CHECK-AARCH64 %s +// RUN: %clang %s -### -no-canonical-prefixes --target=riscv64-fuchsia \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK,CHECK-RISCV64 %s // CHECK: {{.*}}clang{{.*}}" "-cc1" +// CHECK-X86_64: "-triple" "x86_64-unknown-fuchsia" +// CHECK-AARCH64: "-triple" "aarch64-unknown-fuchsia" +// CHECK-RISCV64: "-triple" "riscv64-unknown-fuchsia" // CHECK: "--mrelax-relocations" // CHECK: "-munwind-tables" // CHECK: "-fuse-init-array" @@ -29,6 +36,7 @@ // CHECK: "-L[[SYSROOT]]{{/|\\\\}}lib" // CHECK-X86_64: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}libclang_rt.builtins.a" // CHECK-AARCH64: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}aarch64-fuchsia{{/|\\\\}}libclang_rt.builtins.a" +// CHECK-RISCV64: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}riscv64-fuchsia{{/|\\\\}}libclang_rt.builtins.a" // CHECK: "-lc" // CHECK-NOT: crtend.o // CHECK-NOT: crtn.o diff --git a/clang/test/Driver/fuchsia.cpp b/clang/test/Driver/fuchsia.cpp --- a/clang/test/Driver/fuchsia.cpp +++ b/clang/test/Driver/fuchsia.cpp @@ -1,9 +1,22 @@ // RUN: %clangxx %s -### -no-canonical-prefixes --target=x86_64-fuchsia \ // RUN: -ccc-install-dir %S/Inputs/basic_fuchsia_tree/bin \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ -// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 | FileCheck %s +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK,CHECK-X86_64 %s +// RUN: %clangxx %s -### -no-canonical-prefixes --target=aarch64-fuchsia \ +// RUN: -ccc-install-dir %S/Inputs/basic_fuchsia_tree/bin \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK,CHECK-AARCH64 %s +// RUN: %clangxx %s -### -no-canonical-prefixes --target=riscv64-fuchsia \ +// RUN: -ccc-install-dir %S/Inputs/basic_fuchsia_tree/bin \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK,CHECK-RISCV64 %s // CHECK: {{.*}}clang{{.*}}" "-cc1" -// CHECK: "-triple" "x86_64-fuchsia" +// CHECK-X86_64: "-triple" "x86_64-unknown-fuchsia" +// CHECK-AARCH64: "-triple" "aarch64-unknown-fuchsia" +// CHECK-RISCV64: "-triple" "riscv64-unknown-fuchsia" // CHECK: "-fuse-init-array" // CHECK: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK: "-isysroot" "[[SYSROOT:[^"]+]]" @@ -23,7 +36,9 @@ // CHECK: "-lc++" // CHECK: "-lm" // CHECK: "--pop-state" -// CHECK: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}libclang_rt.builtins.a" +// CHECK-X86_64: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}x86_64-fuchsia{{/|\\\\}}libclang_rt.builtins.a" +// CHECK-AARCH64: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}aarch64-fuchsia{{/|\\\\}}libclang_rt.builtins.a" +// CHECK-RISCV64: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}riscv64-fuchsia{{/|\\\\}}libclang_rt.builtins.a" // CHECK: "-lc" // CHECK-NOT: crtend.o // CHECK-NOT: crtn.o