Skip to content

Commit 316bb89

Browse files
authored
[Driver] Enable LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON on AIX. (#132821)
In the wake of discussion in PR #131200 and internal discussion after, we will add support for `LLVM_ENABLE_PER_TARGET_RUNTIME=ON` for AIX instead of disable it. I already reverted the change in PR #131200. The default value of the option is still OFF on AIX.
1 parent 4abff4d commit 316bb89

File tree

9 files changed

+95
-12
lines changed

9 files changed

+95
-12
lines changed

clang/include/clang/Driver/ToolChain.h

+3
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,9 @@ class ToolChain {
519519
StringRef Component,
520520
FileType Type = ToolChain::FT_Static) const;
521521

522+
// Returns Triple without the OSs version.
523+
llvm::Triple getTripleWithoutOSVersion() const;
524+
522525
// Returns the target specific runtime path if it exists.
523526
std::optional<std::string> getRuntimePath() const;
524527

clang/lib/Driver/ToolChain.cpp

+22-12
Original file line numberDiff line numberDiff line change
@@ -779,8 +779,6 @@ std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
779779
if (Path.empty())
780780
Path = P;
781781
}
782-
if (getTriple().isOSAIX())
783-
Path.clear();
784782

785783
// Check the filename for the old layout if the new one does not exist.
786784
CRTBasename =
@@ -846,6 +844,16 @@ ToolChain::getFallbackAndroidTargetPath(StringRef BaseDir) const {
846844
return std::string(P);
847845
}
848846

847+
llvm::Triple ToolChain::getTripleWithoutOSVersion() const {
848+
return (Triple.hasEnvironment()
849+
? llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
850+
llvm::Triple::getOSTypeName(Triple.getOS()),
851+
llvm::Triple::getEnvironmentTypeName(
852+
Triple.getEnvironment()))
853+
: llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
854+
llvm::Triple::getOSTypeName(Triple.getOS())));
855+
}
856+
849857
std::optional<std::string>
850858
ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
851859
auto getPathForTriple =
@@ -864,14 +872,7 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
864872
if (T.isOSzOS() &&
865873
(!T.getOSVersion().empty() || !T.getEnvironmentVersion().empty())) {
866874
// Build the triple without version information
867-
const llvm::Triple &TripleWithoutVersion =
868-
(T.hasEnvironment()
869-
? llvm::Triple(
870-
T.getArchName(), T.getVendorName(),
871-
llvm::Triple::getOSTypeName(T.getOS()),
872-
llvm::Triple::getEnvironmentTypeName(T.getEnvironment()))
873-
: llvm::Triple(T.getArchName(), T.getVendorName(),
874-
llvm::Triple::getOSTypeName(T.getOS())));
875+
const llvm::Triple &TripleWithoutVersion = getTripleWithoutOSVersion();
875876
if (auto Path = getPathForTriple(TripleWithoutVersion))
876877
return *Path;
877878
}
@@ -909,9 +910,18 @@ std::optional<std::string> ToolChain::getRuntimePath() const {
909910
llvm::sys::path::append(P, "lib");
910911
if (auto Ret = getTargetSubDirPath(P))
911912
return Ret;
912-
// Darwin and AIX does not use per-target runtime directory.
913-
if (Triple.isOSDarwin() || Triple.isOSAIX())
913+
// Darwin does not use per-target runtime directory.
914+
if (Triple.isOSDarwin())
915+
return {};
916+
917+
// For AIX, get the triple without the OS version.
918+
if (Triple.isOSAIX()) {
919+
const llvm::Triple &TripleWithoutVersion = getTripleWithoutOSVersion();
920+
llvm::sys::path::append(P, TripleWithoutVersion.str());
921+
if (getVFS().exists(P))
922+
return std::string(P);
914923
return {};
924+
}
915925
llvm::sys::path::append(P, Triple.str());
916926
return std::string(P);
917927
}

clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc.a

Whitespace-only changes.

clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc64.a

Whitespace-only changes.

clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.builtins.a

Whitespace-only changes.

clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.builtins.a

Whitespace-only changes.

clang/test/Driver/aix-ld.c

+52
Original file line numberDiff line numberDiff line change
@@ -1070,6 +1070,58 @@
10701070
// CHECK-FOPENMP-GOMP: "-lgomp"
10711071
// CHECK-FOPENMP: "-lc"
10721072

1073+
// Check powerpc-ibm-aix7.1.0.0, 32-bit per_target_runtime_dir.
1074+
// RUN: %clang %s -### 2>&1 \
1075+
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
1076+
// RUN: --target=powerpc-ibm-aix7.1.0.0 \
1077+
// RUN: --sysroot %S/Inputs/aix_ppc_tree \
1078+
// RUN: --unwindlib=libunwind \
1079+
// RUN: | FileCheck --check-prefix=CHECK-LD32-PER-TARGET %s
1080+
// CHECK-LD32-PER-TARGET-NOT: warning:
1081+
// CHECK-LD32-PER-TARGET: "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0"
1082+
// CHECK-LD32-PER-TARGET: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
1083+
// CHECK-LD32-PER-TARGET: "-isysroot" "[[SYSROOT:[^"]+]]"
1084+
// CHECK-LD32-PER-TARGET: "{{.*}}ld{{(.exe)?}}"
1085+
// CHECK-LD32-PER-TARGET-NOT: "-bnso"
1086+
// CHECK-LD32-PER-TARGET: "-b32"
1087+
// CHECK-LD32-PER-TARGET: "-bpT:0x10000000" "-bpD:0x20000000"
1088+
// CHECK-LD32-PER-TARGET: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o"
1089+
// CHECK-LD32-PER-TARGET: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o"
1090+
// CHECK-LD32-PER-TARGET-NOT: "-lc++"
1091+
// CHECK-LD32-PER-TARGET-NOT: "-lc++abi"
1092+
// CHECK-LD32-PER-TARGET: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}powerpc-ibm-aix{{/|\\\\}}libclang_rt.builtins.a"
1093+
// CHECK-LD32-PER-TARGET-NOT: "--as-needed"
1094+
// CHECK-LD32-PER-TARGET: "-lunwind"
1095+
// CHECK-LD32-PER-TARGET-NOT: "--no-as-needed"
1096+
// CHECK-LD32-PER-TARGET-NOT: "-lm"
1097+
// CHECK-LD32-PER-TARGET: "-lc"
1098+
1099+
// Check powerpc64-ibm-aix7.1.0.0, 64-bit.
1100+
// RUN: %clang %s -### 2>&1 \
1101+
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
1102+
// RUN: --target=powerpc64-ibm-aix7.1.0.0 \
1103+
// RUN: --sysroot %S/Inputs/aix_ppc_tree \
1104+
// RUN: --unwindlib=libunwind \
1105+
// RUN: | FileCheck --check-prefix=CHECK-LD64-PER-TARGET %s
1106+
// CHECK-LD64-PER-TARGET-NOT: warning:
1107+
// CHECK-LD64-PER-TARGET: "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0"
1108+
// CHECK-LD64-PER-TARGET: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
1109+
// CHECK-LD64-PER-TARGET: "-isysroot" "[[SYSROOT:[^"]+]]"
1110+
// CHECK-LD64-PER-TARGET: "{{.*}}ld{{(.exe)?}}"
1111+
// CHECK-LD64-PER-TARGET-NOT: "-bnso"
1112+
// CHECK-LD64-PER-TARGET: "-b64"
1113+
// CHECK-LD64-PER-TARGET: "-bpT:0x100000000" "-bpD:0x110000000"
1114+
// CHECK-LD64-PER-TARGET: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o"
1115+
// CHECK-LD64-PER-TARGET: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o"
1116+
// CHECK-LD64-PER-TARGET-NOT: "-lc++"
1117+
// CHECK-LD64-PER-TARGET-NOT: "-lc++abi"
1118+
// CHECK-LD64-PER-TARGET: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}powerpc64-ibm-aix{{/|\\\\}}libclang_rt.builtins.a"
1119+
// CHECK-LD64-PER-TARGET-NOT: "--as-needed"
1120+
// CHECK-LD64-PER-TARGET: "-lunwind"
1121+
// CHECK-LD64-PER-TARGET-NOT: "--no-as-needed"
1122+
// CHECK-LD64-PER-TARGET-NOT: "-lm"
1123+
// CHECK-LD64-PER-TARGET: "-lc"
1124+
10731125
// Check powerpc-ibm-aix7.1.0.0, 32-bit. -fopenmp=libfoo results an error.
10741126
// RUN: not %clang %s 2>&1 -### \
10751127
// RUN: --target=powerpc-ibm-aix7.1.0.0 \

clang/test/Driver/aix-print-runtime-dir.c

+10
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,14 @@
88
// RUN: -resource-dir=%S/Inputs/resource_dir \
99
// RUN: | FileCheck --check-prefix=PRINT-RUNTIME-DIR %s
1010

11+
// RUN: %clang -print-runtime-dir --target=powerpc-ibm-aix \
12+
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir\
13+
// RUN: | FileCheck --check-prefix=PRINT-RUNTIME-DIR32-PER-TARGET %s
14+
15+
// RUN: %clang -print-runtime-dir --target=powerpc64-ibm-aix \
16+
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir\
17+
// RUN: | FileCheck --check-prefix=PRINT-RUNTIME-DIR64-PER-TARGET %s
18+
1119
// PRINT-RUNTIME-DIR: lib{{/|\\}}aix{{$}}
20+
// PRINT-RUNTIME-DIR32-PER-TARGET: lib{{/|\\}}powerpc-ibm-aix{{$}}
21+
// PRINT-RUNTIME-DIR64-PER-TARGET: lib{{/|\\}}powerpc64-ibm-aix{{$}}

clang/test/Driver/aix-rtlib.c

+8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
// RUN: %clang --target=powerpc64-ibm-aix -print-libgcc-file-name \
66
// RUN: -resource-dir=%S/Inputs/resource_dir \
77
// RUN: | FileCheck -check-prefix=CHECK64 %s
8+
// RUN: %clang --target=powerpc-ibm-aix -print-libgcc-file-name \
9+
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
10+
// RUN: | FileCheck -check-prefix=CHECK32-PER-TARGET %s
11+
// RUN: %clang --target=powerpc64-ibm-aix -print-libgcc-file-name \
12+
// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
13+
// RUN: | FileCheck -check-prefix=CHECK64-PER-TARGET %s
814

915
// CHECK32: resource_dir{{/|\\}}lib{{/|\\}}aix{{/|\\}}libclang_rt.builtins-powerpc.a
1016
// CHECK64: resource_dir{{/|\\}}lib{{/|\\}}aix{{/|\\}}libclang_rt.builtins-powerpc64.a
17+
// CHECK32-PER-TARGET: resource_dir_with_per_target_subdir{{/|\\}}lib{{/|\\}}powerpc-ibm-aix{{/|\\}}libclang_rt.builtins.a
18+
// CHECK64-PER-TARGET: resource_dir_with_per_target_subdir{{/|\\}}lib{{/|\\}}powerpc64-ibm-aix{{/|\\}}libclang_rt.builtins.a

0 commit comments

Comments
 (0)