Skip to content

Commit 092bc04

Browse files
authored
[Driver][Hurd] Add AArch64 and RISCV64 support (llvm#157212)
1 parent 4efbbe1 commit 092bc04

File tree

6 files changed

+43
-0
lines changed

6 files changed

+43
-0
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
172172
case llvm::Triple::OpenBSD:
173173
return std::make_unique<OpenBSDTargetInfo<AArch64leTargetInfo>>(Triple,
174174
Opts);
175+
case llvm::Triple::Hurd:
176+
return std::make_unique<HurdTargetInfo<AArch64leTargetInfo>>(Triple,
177+
Opts);
175178
case llvm::Triple::Win32:
176179
switch (Triple.getEnvironment()) {
177180
case llvm::Triple::GNU:
@@ -464,6 +467,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
464467
case llvm::Triple::Managarm:
465468
return std::make_unique<ManagarmTargetInfo<RISCV64TargetInfo>>(Triple,
466469
Opts);
470+
case llvm::Triple::Hurd:
471+
return std::make_unique<HurdTargetInfo<RISCV64TargetInfo>>(Triple, Opts);
467472
default:
468473
return std::make_unique<RISCV64TargetInfo>(Triple, Opts);
469474
}

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2529,6 +2529,14 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
25292529

25302530
if (TargetTriple.isOSHurd()) {
25312531
switch (TargetTriple.getArch()) {
2532+
case llvm::Triple::aarch64:
2533+
LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
2534+
TripleAliases.push_back("aarch64-gnu");
2535+
break;
2536+
case llvm::Triple::riscv64:
2537+
LibDirs.append(begin(RISCV64LibDirs), end(RISCV64LibDirs));
2538+
TripleAliases.push_back("riscv64-gnu");
2539+
break;
25322540
case llvm::Triple::x86_64:
25332541
LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
25342542
TripleAliases.push_back("x86_64-gnu");

clang/lib/Driver/ToolChains/Hurd.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ std::string Hurd::getMultiarchTriple(const Driver &D,
3434
default:
3535
break;
3636

37+
case llvm::Triple::aarch64:
38+
return "aarch64-gnu";
39+
40+
case llvm::Triple::riscv64:
41+
return "riscv64-gnu";
42+
3743
case llvm::Triple::x86:
3844
// We use the existence of '/lib/<triple>' as a directory to detect some
3945
// common hurd triples that don't quite match the Clang triple for both
@@ -142,6 +148,10 @@ Tool *Hurd::buildAssembler() const {
142148

143149
std::string Hurd::getDynamicLinker(const ArgList &Args) const {
144150
switch (getArch()) {
151+
case llvm::Triple::aarch64:
152+
return "/lib/ld-aarch64.so.1";
153+
case llvm::Triple::riscv64:
154+
return "/lib/ld-riscv64-lp64.so.1";
145155
case llvm::Triple::x86:
146156
return "/lib/ld.so";
147157
case llvm::Triple::x86_64:

clang/lib/Driver/ToolChains/Hurd.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ class LLVM_LIBRARY_VISIBILITY Hurd : public Generic_ELF {
3030
addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
3131
llvm::opt::ArgStringList &CC1Args) const override;
3232

33+
bool IsAArch64OutlineAtomicsDefault(
34+
const llvm::opt::ArgList &Args) const override {
35+
return true;
36+
}
37+
3338
std::string getDynamicLinker(const llvm::opt::ArgList &Args) const override;
3439

3540
void addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const override;

clang/test/Driver/aarch64-features.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@
8282
// RUN: --gcc-toolchain=%S/Inputs/aarch64-linux-gnu-tree/gcc-7.5.0 \
8383
// RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-OUTLINE-ATOMICS-ON %s
8484

85+
// RUN: %clang --target=aarch64-unknown-hurd-gnu -rtlib=libgcc \
86+
// RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-OUTLINE-ATOMICS-ON %s
87+
8588
// RUN: %clang --target=aarch64-unknown-haiku -rtlib=libgcc \
8689
// RUN: -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-OUTLINE-ATOMICS-ON %s
8790

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ TEST(TripleTest, ParsedIDs) {
139139
EXPECT_EQ(Triple::Linux, T.getOS());
140140
EXPECT_EQ(Triple::Android, T.getEnvironment());
141141

142+
T = Triple("aarch64-unknown-hurd-gnu");
143+
EXPECT_EQ(Triple::aarch64, T.getArch());
144+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
145+
EXPECT_EQ(Triple::Hurd, T.getOS());
146+
EXPECT_EQ(Triple::GNU, T.getEnvironment());
147+
142148
// PS4 has two spellings for the vendor.
143149
T = Triple("x86_64-scei-ps4");
144150
EXPECT_EQ(Triple::x86_64, T.getArch());
@@ -806,6 +812,12 @@ TEST(TripleTest, ParsedIDs) {
806812
EXPECT_EQ(Triple::Linux, T.getOS());
807813
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
808814

815+
T = Triple("riscv64-unknown-hurd-gnu");
816+
EXPECT_EQ(Triple::riscv64, T.getArch());
817+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
818+
EXPECT_EQ(Triple::Hurd, T.getOS());
819+
EXPECT_EQ(Triple::GNU, T.getEnvironment());
820+
809821
T = Triple("armv7hl-suse-linux-gnueabi");
810822
EXPECT_EQ(Triple::arm, T.getArch());
811823
EXPECT_EQ(Triple::SUSE, T.getVendor());

0 commit comments

Comments
 (0)