Skip to content

Commit 4fffb04

Browse files
authored
Hurd: Add x86_64 support (#78065)
This adds Hurd toolchain support to Clang's driver in addition to handling translating the triple from GCC toolchain-compatible form (x86_64-gnu) to the actual triple registered in LLVM (x86_64-pc-hurd-gnu).
1 parent 987123e commit 4fffb04

File tree

18 files changed

+135
-19
lines changed

18 files changed

+135
-19
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
644644
return std::make_unique<PS4OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
645645
case llvm::Triple::PS5:
646646
return std::make_unique<PS5OSTargetInfo<X86_64TargetInfo>>(Triple, Opts);
647+
case llvm::Triple::Hurd:
648+
return std::make_unique<HurdTargetInfo<X86_64TargetInfo>>(Triple, Opts);
647649
default:
648650
return std::make_unique<X86_64TargetInfo>(Triple, Opts);
649651
}

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2485,7 +2485,7 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
24852485
static const char *const X86Triples[] = {
24862486
"i586-linux-gnu", "i686-linux-gnu", "i686-pc-linux-gnu",
24872487
"i386-redhat-linux6E", "i686-redhat-linux", "i386-redhat-linux",
2488-
"i586-suse-linux", "i686-montavista-linux", "i686-gnu",
2488+
"i586-suse-linux", "i686-montavista-linux",
24892489
};
24902490

24912491
static const char *const LoongArch64LibDirs[] = {"/lib64", "/lib"};
@@ -2652,6 +2652,23 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
26522652
return;
26532653
}
26542654

2655+
if (TargetTriple.isOSHurd()) {
2656+
switch (TargetTriple.getArch()) {
2657+
case llvm::Triple::x86_64:
2658+
LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2659+
TripleAliases.push_back("x86_64-gnu");
2660+
break;
2661+
case llvm::Triple::x86:
2662+
LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2663+
TripleAliases.push_back("i686-gnu");
2664+
break;
2665+
default:
2666+
break;
2667+
}
2668+
2669+
return;
2670+
}
2671+
26552672
switch (TargetTriple.getArch()) {
26562673
case llvm::Triple::aarch64:
26572674
LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));

clang/lib/Driver/ToolChains/Hurd.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,21 @@ using tools::addPathIfExists;
3030
std::string Hurd::getMultiarchTriple(const Driver &D,
3131
const llvm::Triple &TargetTriple,
3232
StringRef SysRoot) const {
33-
if (TargetTriple.getArch() == llvm::Triple::x86) {
33+
switch (TargetTriple.getArch()) {
34+
default:
35+
break;
36+
37+
case llvm::Triple::x86:
3438
// We use the existence of '/lib/<triple>' as a directory to detect some
3539
// common hurd triples that don't quite match the Clang triple for both
3640
// 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3741
// regardless of what the actual target triple is.
3842
if (D.getVFS().exists(SysRoot + "/lib/i386-gnu"))
3943
return "i386-gnu";
44+
break;
45+
46+
case llvm::Triple::x86_64:
47+
return "x86_64-gnu";
4048
}
4149

4250
// For most architectures, just use whatever we have rather than trying to be
@@ -126,8 +134,12 @@ Tool *Hurd::buildAssembler() const {
126134
}
127135

128136
std::string Hurd::getDynamicLinker(const ArgList &Args) const {
129-
if (getArch() == llvm::Triple::x86)
137+
switch (getArch()) {
138+
case llvm::Triple::x86:
130139
return "/lib/ld.so";
140+
case llvm::Triple::x86_64:
141+
return "/lib/ld-x86-64.so.1";
142+
}
131143

132144
llvm_unreachable("unsupported architecture");
133145
}

clang/test/Driver/Inputs/basic_cross_hurd_tree/usr/lib/gcc/x86_64-gnu/10/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/basic_cross_hurd_tree/usr/x86_64-gnu/bin/as

Whitespace-only changes.

clang/test/Driver/Inputs/basic_cross_hurd_tree/usr/x86_64-gnu/bin/ld

Whitespace-only changes.

clang/test/Driver/Inputs/basic_cross_hurd_tree/usr/x86_64-gnu/lib/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/basic_hurd_tree/lib/x86_64-gnu/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/basic_hurd_tree/lib64/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/basic_hurd_tree/usr/include/x86_64-gnu/.keep

Whitespace-only changes.

0 commit comments

Comments
 (0)