Skip to content

Commit 309b4f3

Browse files
committed
Hurd: Add x86_64 support
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 9f03f0a commit 309b4f3

File tree

18 files changed

+119
-3
lines changed

18 files changed

+119
-3
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.

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

Whitespace-only changes.

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

Whitespace-only changes.

clang/test/Driver/Inputs/basic_hurd_tree/usr/lib/gcc/x86_64-gnu/10/crtbeginS.o

Whitespace-only changes.

clang/test/Driver/Inputs/basic_hurd_tree/usr/lib/gcc/x86_64-gnu/10/crtbeginT.o

Whitespace-only changes.

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

Whitespace-only changes.

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

Whitespace-only changes.

clang/test/Driver/hurd.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,82 @@
7878
// CHECK-CROSS: "{{.*}}/Inputs/basic_cross_hurd_tree/usr/lib/gcc/i686-gnu/10/../../../../i686-gnu/bin/ld" {{.*}} "-m" "elf_i386"
7979
// CHECK-CROSS: "{{.*}}/Inputs/basic_cross_hurd_tree/usr/lib/gcc/i686-gnu/10/crtbegin.o"
8080
// CHECK-CROSS: "-L{{.*}}/Inputs/basic_cross_hurd_tree/usr/lib/gcc/i686-gnu/10/../../../../i686-gnu/lib"
81+
82+
// RUN: %clang -### %s --target=x86_64-pc-hurd-gnu --sysroot=%S/Inputs/basic_hurd_tree \
83+
// RUN: --stdlib=platform 2>&1 | FileCheck --check-prefix=CHECK-64 %s
84+
// CHECK-64: "-cc1"
85+
// CHECK-64-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
86+
// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../include/c++/10"
87+
/// Debian specific - the path component after 'include' is x86_64-gnu even
88+
/// though the installation is x86_64-gnu.
89+
// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../include/x86_64-gnu/c++/10"
90+
// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../include/c++/10/backward"
91+
// CHECK-64-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/local/include"
92+
// CHECK-64-SAME: "-internal-externc-isystem"
93+
// CHECK-64-SAME: {{^}} "[[SYSROOT]]/usr/include/x86_64-gnu"
94+
// CHECK-64-SAME: {{^}} "-internal-externc-isystem" "[[SYSROOT]]/include"
95+
// CHECK-64-SAME: {{^}} "-internal-externc-isystem" "[[SYSROOT]]/usr/include"
96+
// CHECK-64: "{{.*}}ld" "--sysroot=[[SYSROOT:[^"]+]]"
97+
// CHECK-64-SAME: "-dynamic-linker" "/lib/ld-x86-64.so.1"
98+
// CHECK-64-SAME: "{{.*}}/usr/lib/gcc/x86_64-gnu/10/crtbegin.o"
99+
// CHECK-64-SAME: "-L
100+
// CHECK-64-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10"
101+
// CHECK-64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../lib64"
102+
// CHECK-64-SAME: {{^}} "-L[[SYSROOT]]/lib/x86_64-gnu"
103+
// CHECK-64-SAME: {{^}} "-L[[SYSROOT]]/lib/../lib64"
104+
// CHECK-64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/x86_64-gnu"
105+
// CHECK-64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/../lib64"
106+
// CHECK-64-SAME: {{^}} "-L[[SYSROOT]]/lib"
107+
// CHECK-64-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
108+
109+
// RUN: %clang -### %s --target=x86_64-pc-hurd-gnu --sysroot=%S/Inputs/basic_hurd_tree \
110+
// RUN: --stdlib=platform -static 2>&1 | FileCheck --check-prefix=CHECK-64-STATIC %s
111+
// CHECK-64-STATIC: "-cc1"
112+
// CHECK-64-STATIC-SAME: "-static-define"
113+
// CHECK-64-STATIC-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
114+
// CHECK-64-STATIC-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../include/c++/10"
115+
/// Debian specific - the path component after 'include' is x86_64-gnu even
116+
/// though the installation is x86_64-gnu.
117+
// CHECK-64-STATIC-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../include/x86_64-gnu/c++/10"
118+
// CHECK-64-STATIC-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../include/c++/10/backward"
119+
// CHECK-64-STATIC-SAME: {{^}} "-internal-isystem" "[[SYSROOT]]/usr/local/include"
120+
// CHECK-64-STATIC-SAME: "-internal-externc-isystem"
121+
// CHECK-64-STATIC-SAME: {{^}} "[[SYSROOT]]/usr/include/x86_64-gnu"
122+
// CHECK-64-STATIC-SAME: {{^}} "-internal-externc-isystem" "[[SYSROOT]]/include"
123+
// CHECK-64-STATIC-SAME: {{^}} "-internal-externc-isystem" "[[SYSROOT]]/usr/include"
124+
// CHECK-64-STATIC: "{{.*}}ld" "--sysroot=[[SYSROOT:[^"]+]]"
125+
// CHECK-64-STATIC-SAME: "-static"
126+
// CHECK-64-STATIC-SAME: "{{.*}}/usr/lib/gcc/x86_64-gnu/10/crtbeginT.o"
127+
// CHECK-64-STATIC-SAME: "-L
128+
// CHECK-64-STATIC-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10"
129+
// CHECK-64-STATIC-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../lib64"
130+
// CHECK-64-STATIC-SAME: {{^}} "-L[[SYSROOT]]/lib/x86_64-gnu"
131+
// CHECK-64-STATIC-SAME: {{^}} "-L[[SYSROOT]]/lib/../lib64"
132+
// CHECK-64-STATIC-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/x86_64-gnu"
133+
// CHECK-64-STATIC-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/../lib64"
134+
// CHECK-64-STATIC-SAME: {{^}} "-L[[SYSROOT]]/lib"
135+
// CHECK-64-STATIC-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
136+
137+
// RUN: %clang -### %s --target=x86_64-pc-hurd-gnu --sysroot=%S/Inputs/basic_hurd_tree \
138+
// RUN: -shared 2>&1 | FileCheck --check-prefix=CHECK-64-SHARED %s
139+
// CHECK-64-SHARED: "{{.*}}ld" "--sysroot=[[SYSROOT:[^"]+]]"
140+
// CHECK-64-SHARED-SAME: "{{.*}}/usr/lib/gcc/x86_64-gnu/10/crtbeginS.o"
141+
// CHECK-64-SHARED-SAME: "-L
142+
// CHECK-64-SHARED-SAME: {{^}}[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10"
143+
// CHECK-64-SHARED-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/gcc/x86_64-gnu/10/../../../../lib64"
144+
// CHECK-64-SHARED-SAME: {{^}} "-L[[SYSROOT]]/lib/x86_64-gnu"
145+
// CHECK-64-SHARED-SAME: {{^}} "-L[[SYSROOT]]/lib/../lib64"
146+
// CHECK-64-SHARED-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/x86_64-gnu"
147+
// CHECK-64-SHARED-SAME: {{^}} "-L[[SYSROOT]]/usr/lib/../lib64"
148+
// CHECK-64-SHARED-SAME: {{^}} "-L[[SYSROOT]]/lib"
149+
// CHECK-64-SHARED-SAME: {{^}} "-L[[SYSROOT]]/usr/lib"
150+
151+
// RUN: %clang -### -o %t %s 2>&1 -no-integrated-as -fuse-ld=ld \
152+
// RUN: --gcc-toolchain=%S/Inputs/basic_cross_hurd_tree/usr \
153+
// RUN: --target=x86_64-pc-gnu \
154+
// RUN: | FileCheck --check-prefix=CHECK-64-CROSS %s
155+
// CHECK-64-CROSS: "-cc1" "-triple" "x86_64-pc-hurd-gnu"
156+
// CHECK-64-CROSS: "{{.*}}/Inputs/basic_cross_hurd_tree/usr/lib/gcc/x86_64-gnu/10/../../../../x86_64-gnu/bin/as" "--64"
157+
// CHECK-64-CROSS: "{{.*}}/Inputs/basic_cross_hurd_tree/usr/lib/gcc/x86_64-gnu/10/../../../../x86_64-gnu/bin/ld" {{.*}} "-m" "elf_x86_64"
158+
// CHECK-64-CROSS: "{{.*}}/Inputs/basic_cross_hurd_tree/usr/lib/gcc/x86_64-gnu/10/crtbegin.o"
159+
// CHECK-64-CROSS: "-L{{.*}}/Inputs/basic_cross_hurd_tree/usr/lib/gcc/x86_64-gnu/10/../../../../x86_64-gnu/lib"

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ TEST(TripleTest, ParsedIDs) {
111111
EXPECT_EQ(Triple::Linux, T.getOS());
112112
EXPECT_EQ(Triple::MuslX32, T.getEnvironment());
113113

114+
T = Triple("x86_64-pc-hurd-gnu");
115+
EXPECT_EQ(Triple::x86_64, T.getArch());
116+
EXPECT_EQ(Triple::PC, T.getVendor());
117+
EXPECT_EQ(Triple::Hurd, T.getOS());
118+
EXPECT_EQ(Triple::GNU, T.getEnvironment());
119+
114120
T = Triple("arm-unknown-linux-android16");
115121
EXPECT_EQ(Triple::arm, T.getArch());
116122
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());

0 commit comments

Comments
 (0)