diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 1ae244edad878..d9aafc6c75d3b 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -172,6 +172,9 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::OpenBSD: return std::make_unique>(Triple, Opts); + case llvm::Triple::Hurd: + return std::make_unique>(Triple, + Opts); case llvm::Triple::Win32: switch (Triple.getEnvironment()) { case llvm::Triple::GNU: @@ -464,6 +467,8 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::Managarm: return std::make_unique>(Triple, Opts); + case llvm::Triple::Hurd: + return std::make_unique>(Triple, Opts); default: return std::make_unique(Triple, Opts); } diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index 3dade2bdf2277..7616076847a2c 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -2529,6 +2529,14 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( if (TargetTriple.isOSHurd()) { switch (TargetTriple.getArch()) { + case llvm::Triple::aarch64: + LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs)); + TripleAliases.push_back("aarch64-gnu"); + break; + case llvm::Triple::riscv64: + LibDirs.append(begin(RISCV64LibDirs), end(RISCV64LibDirs)); + TripleAliases.push_back("riscv64-gnu"); + break; case llvm::Triple::x86_64: LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); TripleAliases.push_back("x86_64-gnu"); diff --git a/clang/lib/Driver/ToolChains/Hurd.cpp b/clang/lib/Driver/ToolChains/Hurd.cpp index 8bcc7e6d9759e..43121233ea7d0 100644 --- a/clang/lib/Driver/ToolChains/Hurd.cpp +++ b/clang/lib/Driver/ToolChains/Hurd.cpp @@ -34,6 +34,12 @@ std::string Hurd::getMultiarchTriple(const Driver &D, default: break; + case llvm::Triple::aarch64: + return "aarch64-gnu"; + + case llvm::Triple::riscv64: + return "riscv64-gnu"; + case llvm::Triple::x86: // We use the existence of '/lib/' as a directory to detect some // common hurd triples that don't quite match the Clang triple for both @@ -142,6 +148,10 @@ Tool *Hurd::buildAssembler() const { std::string Hurd::getDynamicLinker(const ArgList &Args) const { switch (getArch()) { + case llvm::Triple::aarch64: + return "/lib/ld-aarch64.so.1"; + case llvm::Triple::riscv64: + return "/lib/ld-riscv64-lp64.so.1"; case llvm::Triple::x86: return "/lib/ld.so"; case llvm::Triple::x86_64: diff --git a/clang/lib/Driver/ToolChains/Hurd.h b/clang/lib/Driver/ToolChains/Hurd.h index f301bc5f4269e..c7b72680dcd4b 100644 --- a/clang/lib/Driver/ToolChains/Hurd.h +++ b/clang/lib/Driver/ToolChains/Hurd.h @@ -30,6 +30,11 @@ class LLVM_LIBRARY_VISIBILITY Hurd : public Generic_ELF { addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + bool IsAArch64OutlineAtomicsDefault( + const llvm::opt::ArgList &Args) const override { + return true; + } + std::string getDynamicLinker(const llvm::opt::ArgList &Args) const override; void addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const override; diff --git a/clang/test/Driver/aarch64-features.c b/clang/test/Driver/aarch64-features.c index 2fbb8629997d9..faef3878c0ab0 100644 --- a/clang/test/Driver/aarch64-features.c +++ b/clang/test/Driver/aarch64-features.c @@ -82,6 +82,9 @@ // RUN: --gcc-toolchain=%S/Inputs/aarch64-linux-gnu-tree/gcc-7.5.0 \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-OUTLINE-ATOMICS-ON %s +// RUN: %clang --target=aarch64-unknown-hurd-gnu -rtlib=libgcc \ +// RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-OUTLINE-ATOMICS-ON %s + // RUN: %clang --target=aarch64-unknown-haiku -rtlib=libgcc \ // RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-OUTLINE-ATOMICS-ON %s diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp index 256756650d21f..3e803691cfd1f 100644 --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -139,6 +139,12 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::Linux, T.getOS()); EXPECT_EQ(Triple::Android, T.getEnvironment()); + T = Triple("aarch64-unknown-hurd-gnu"); + EXPECT_EQ(Triple::aarch64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::Hurd, T.getOS()); + EXPECT_EQ(Triple::GNU, T.getEnvironment()); + // PS4 has two spellings for the vendor. T = Triple("x86_64-scei-ps4"); EXPECT_EQ(Triple::x86_64, T.getArch()); @@ -806,6 +812,12 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::Linux, T.getOS()); EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("riscv64-unknown-hurd-gnu"); + EXPECT_EQ(Triple::riscv64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::Hurd, T.getOS()); + EXPECT_EQ(Triple::GNU, T.getEnvironment()); + T = Triple("armv7hl-suse-linux-gnueabi"); EXPECT_EQ(Triple::arm, T.getArch()); EXPECT_EQ(Triple::SUSE, T.getVendor());