Skip to content

[Driver] Enable LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON on AIX. #132821

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 28, 2025

Conversation

DanielCChen
Copy link
Contributor

@DanielCChen DanielCChen commented Mar 24, 2025

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.

@DanielCChen DanielCChen force-pushed the daniel_enable_per_target branch from de66d3f to be03d5c Compare March 25, 2025 12:49
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' labels Mar 25, 2025
@llvmbot
Copy link
Member

llvmbot commented Mar 25, 2025

@llvm/pr-subscribers-clang

Author: Daniel Chen (DanielCChen)

Changes

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.


Full diff: https://github.com/llvm/llvm-project/pull/132821.diff

9 Files Affected:

  • (modified) clang/include/clang/Driver/ToolChain.h (+3)
  • (modified) clang/lib/Driver/ToolChain.cpp (+22-12)
  • (added) clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc.a ()
  • (added) clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc64.a ()
  • (added) clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.builtins.a ()
  • (added) clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.builtins.a ()
  • (modified) clang/test/Driver/aix-ld.c (+52)
  • (modified) clang/test/Driver/aix-print-runtime-dir.c (+10)
  • (modified) clang/test/Driver/aix-rtlib.c (+8)
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index 90004c64a694a..f2e8fa306e3a5 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -519,6 +519,9 @@ class ToolChain {
                                     StringRef Component,
                                     FileType Type = ToolChain::FT_Static) const;
 
+  // Returns Triple without the OSs version.
+  llvm::Triple getTripleWithoutOSVersion() const;
+
   // Returns the target specific runtime path if it exists.
   std::optional<std::string> getRuntimePath() const;
 
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 5f75d004eede0..8a922b283daf5 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -779,8 +779,6 @@ std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
     if (Path.empty())
       Path = P;
   }
-  if (getTriple().isOSAIX())
-    Path.clear();
 
   // Check the filename for the old layout if the new one does not exist.
   CRTBasename =
@@ -846,6 +844,16 @@ ToolChain::getFallbackAndroidTargetPath(StringRef BaseDir) const {
   return std::string(P);
 }
 
+llvm::Triple ToolChain::getTripleWithoutOSVersion() const {
+  return (Triple.hasEnvironment()
+              ? llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
+                             llvm::Triple::getOSTypeName(Triple.getOS()),
+                             llvm::Triple::getEnvironmentTypeName(
+                                 Triple.getEnvironment()))
+              : llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
+                             llvm::Triple::getOSTypeName(Triple.getOS())));
+}
+
 std::optional<std::string>
 ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
   auto getPathForTriple =
@@ -864,14 +872,7 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
   if (T.isOSzOS() &&
       (!T.getOSVersion().empty() || !T.getEnvironmentVersion().empty())) {
     // Build the triple without version information
-    const llvm::Triple &TripleWithoutVersion =
-        (T.hasEnvironment()
-             ? llvm::Triple(
-                   T.getArchName(), T.getVendorName(),
-                   llvm::Triple::getOSTypeName(T.getOS()),
-                   llvm::Triple::getEnvironmentTypeName(T.getEnvironment()))
-             : llvm::Triple(T.getArchName(), T.getVendorName(),
-                            llvm::Triple::getOSTypeName(T.getOS())));
+    const llvm::Triple &TripleWithoutVersion = getTripleWithoutOSVersion();
     if (auto Path = getPathForTriple(TripleWithoutVersion))
       return *Path;
   }
@@ -909,9 +910,18 @@ std::optional<std::string> ToolChain::getRuntimePath() const {
   llvm::sys::path::append(P, "lib");
   if (auto Ret = getTargetSubDirPath(P))
     return Ret;
-  // Darwin and AIX does not use per-target runtime directory.
-  if (Triple.isOSDarwin() || Triple.isOSAIX())
+  // Darwin does not use per-target runtime directory.
+  if (Triple.isOSDarwin())
+    return {};
+
+  // For AIX, get the triple without the OS version.
+  if (Triple.isOSAIX()) {
+    const llvm::Triple &TripleWithoutVersion = getTripleWithoutOSVersion();
+    llvm::sys::path::append(P, TripleWithoutVersion.str());
+    if (getVFS().exists(P))
+      return std::string(P);
     return {};
+  }
   llvm::sys::path::append(P, Triple.str());
   return std::string(P);
 }
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc.a b/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc64.a b/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc64.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.builtins.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.builtins.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.builtins.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.builtins.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/aix-ld.c b/clang/test/Driver/aix-ld.c
index 7e0f2bf91e06e..1dae61d91c4e3 100644
--- a/clang/test/Driver/aix-ld.c
+++ b/clang/test/Driver/aix-ld.c
@@ -1070,6 +1070,58 @@
 // CHECK-FOPENMP-GOMP:    "-lgomp"
 // CHECK-FOPENMP:     "-lc"
 
+// Check powerpc-ibm-aix7.1.0.0, 32-bit per_target_runtime_dir.
+// RUN: %clang %s -### 2>&1 \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN:        --target=powerpc-ibm-aix7.1.0.0 \
+// RUN:        --sysroot %S/Inputs/aix_ppc_tree \
+// RUN:        --unwindlib=libunwind \
+// RUN:   | FileCheck --check-prefix=CHECK-LD32-PER-TARGET %s
+// CHECK-LD32-PER-TARGET-NOT: warning:
+// CHECK-LD32-PER-TARGET:     "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0"
+// CHECK-LD32-PER-TARGET:     "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
+// CHECK-LD32-PER-TARGET:     "-isysroot" "[[SYSROOT:[^"]+]]"
+// CHECK-LD32-PER-TARGET:     "{{.*}}ld{{(.exe)?}}"
+// CHECK-LD32-PER-TARGET-NOT: "-bnso"
+// CHECK-LD32-PER-TARGET:     "-b32"
+// CHECK-LD32-PER-TARGET:     "-bpT:0x10000000" "-bpD:0x20000000"
+// CHECK-LD32-PER-TARGET:     "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o"
+// CHECK-LD32-PER-TARGET:     "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o"
+// CHECK-LD32-PER-TARGET-NOT: "-lc++"
+// CHECK-LD32-PER-TARGET-NOT: "-lc++abi"
+// CHECK-LD32-PER-TARGET:     "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}powerpc-ibm-aix{{/|\\\\}}libclang_rt.builtins.a"
+// CHECK-LD32-PER-TARGET-NOT: "--as-needed"
+// CHECK-LD32-PER-TARGET:     "-lunwind"
+// CHECK-LD32-PER-TARGET-NOT: "--no-as-needed"
+// CHECK-LD32-PER-TARGET-NOT: "-lm"
+// CHECK-LD32-PER-TARGET:     "-lc"
+
+// Check powerpc64-ibm-aix7.1.0.0, 64-bit.
+// RUN: %clang %s -### 2>&1 \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN:        --target=powerpc64-ibm-aix7.1.0.0 \
+// RUN:        --sysroot %S/Inputs/aix_ppc_tree \
+// RUN:        --unwindlib=libunwind \
+// RUN:   | FileCheck --check-prefix=CHECK-LD64-PER-TARGET %s
+// CHECK-LD64-PER-TARGET-NOT: warning:
+// CHECK-LD64-PER-TARGET:     "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0"
+// CHECK-LD64-PER-TARGET:     "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
+// CHECK-LD64-PER-TARGET:     "-isysroot" "[[SYSROOT:[^"]+]]"
+// CHECK-LD64-PER-TARGET:     "{{.*}}ld{{(.exe)?}}"
+// CHECK-LD64-PER-TARGET-NOT: "-bnso"
+// CHECK-LD64-PER-TARGET:     "-b64"
+// CHECK-LD64-PER-TARGET:     "-bpT:0x100000000" "-bpD:0x110000000"
+// CHECK-LD64-PER-TARGET:     "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o"
+// CHECK-LD64-PER-TARGET:     "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o"
+// CHECK-LD64-PER-TARGET-NOT: "-lc++"
+// CHECK-LD64-PER-TARGET-NOT: "-lc++abi"
+// CHECK-LD64-PER-TARGET:     "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}powerpc64-ibm-aix{{/|\\\\}}libclang_rt.builtins.a"
+// CHECK-LD64-PER-TARGET-NOT: "--as-needed"
+// CHECK-LD64-PER-TARGET:     "-lunwind"
+// CHECK-LD64-PER-TARGET-NOT: "--no-as-needed"
+// CHECK-LD64-PER-TARGET-NOT: "-lm"
+// CHECK-LD64-PER-TARGET:     "-lc"
+
 // Check powerpc-ibm-aix7.1.0.0, 32-bit. -fopenmp=libfoo results an error.
 // RUN: not %clang %s 2>&1 -### \
 // RUN:        --target=powerpc-ibm-aix7.1.0.0 \
diff --git a/clang/test/Driver/aix-print-runtime-dir.c b/clang/test/Driver/aix-print-runtime-dir.c
index 0d68ad6fee005..ffa4d15c21208 100644
--- a/clang/test/Driver/aix-print-runtime-dir.c
+++ b/clang/test/Driver/aix-print-runtime-dir.c
@@ -8,4 +8,14 @@
 // RUN:        -resource-dir=%S/Inputs/resource_dir \
 // RUN:      | FileCheck --check-prefix=PRINT-RUNTIME-DIR %s
 
+// RUN: %clang -print-runtime-dir --target=powerpc-ibm-aix \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir\
+// RUN:      | FileCheck --check-prefix=PRINT-RUNTIME-DIR32-PER-TARGET %s
+
+// RUN: %clang -print-runtime-dir --target=powerpc64-ibm-aix \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir\
+// RUN:      | FileCheck --check-prefix=PRINT-RUNTIME-DIR64-PER-TARGET %s
+
 // PRINT-RUNTIME-DIR: lib{{/|\\}}aix{{$}}
+// PRINT-RUNTIME-DIR32-PER-TARGET: lib{{/|\\}}powerpc-ibm-aix{{$}}
+// PRINT-RUNTIME-DIR64-PER-TARGET: lib{{/|\\}}powerpc64-ibm-aix{{$}}
diff --git a/clang/test/Driver/aix-rtlib.c b/clang/test/Driver/aix-rtlib.c
index e0466b166bb78..82ab857984af1 100644
--- a/clang/test/Driver/aix-rtlib.c
+++ b/clang/test/Driver/aix-rtlib.c
@@ -5,6 +5,14 @@
 // RUN: %clang --target=powerpc64-ibm-aix -print-libgcc-file-name \
 // RUN:        -resource-dir=%S/Inputs/resource_dir \
 // RUN:   | FileCheck -check-prefix=CHECK64 %s
+// RUN: %clang --target=powerpc-ibm-aix -print-libgcc-file-name \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN:   | FileCheck -check-prefix=CHECK32-PER-TARGET %s
+// RUN: %clang --target=powerpc64-ibm-aix -print-libgcc-file-name \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN:   | FileCheck -check-prefix=CHECK64-PER-TARGET %s
 
 // CHECK32: resource_dir{{/|\\}}lib{{/|\\}}aix{{/|\\}}libclang_rt.builtins-powerpc.a
 // CHECK64: resource_dir{{/|\\}}lib{{/|\\}}aix{{/|\\}}libclang_rt.builtins-powerpc64.a
+// CHECK32-PER-TARGET: resource_dir_with_per_target_subdir{{/|\\}}lib{{/|\\}}powerpc-ibm-aix{{/|\\}}libclang_rt.builtins.a
+// CHECK64-PER-TARGET: resource_dir_with_per_target_subdir{{/|\\}}lib{{/|\\}}powerpc64-ibm-aix{{/|\\}}libclang_rt.builtins.a

@llvmbot
Copy link
Member

llvmbot commented Mar 25, 2025

@llvm/pr-subscribers-clang-driver

Author: Daniel Chen (DanielCChen)

Changes

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.


Full diff: https://github.com/llvm/llvm-project/pull/132821.diff

9 Files Affected:

  • (modified) clang/include/clang/Driver/ToolChain.h (+3)
  • (modified) clang/lib/Driver/ToolChain.cpp (+22-12)
  • (added) clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc.a ()
  • (added) clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc64.a ()
  • (added) clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.builtins.a ()
  • (added) clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.builtins.a ()
  • (modified) clang/test/Driver/aix-ld.c (+52)
  • (modified) clang/test/Driver/aix-print-runtime-dir.c (+10)
  • (modified) clang/test/Driver/aix-rtlib.c (+8)
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index 90004c64a694a..f2e8fa306e3a5 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -519,6 +519,9 @@ class ToolChain {
                                     StringRef Component,
                                     FileType Type = ToolChain::FT_Static) const;
 
+  // Returns Triple without the OSs version.
+  llvm::Triple getTripleWithoutOSVersion() const;
+
   // Returns the target specific runtime path if it exists.
   std::optional<std::string> getRuntimePath() const;
 
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 5f75d004eede0..8a922b283daf5 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -779,8 +779,6 @@ std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
     if (Path.empty())
       Path = P;
   }
-  if (getTriple().isOSAIX())
-    Path.clear();
 
   // Check the filename for the old layout if the new one does not exist.
   CRTBasename =
@@ -846,6 +844,16 @@ ToolChain::getFallbackAndroidTargetPath(StringRef BaseDir) const {
   return std::string(P);
 }
 
+llvm::Triple ToolChain::getTripleWithoutOSVersion() const {
+  return (Triple.hasEnvironment()
+              ? llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
+                             llvm::Triple::getOSTypeName(Triple.getOS()),
+                             llvm::Triple::getEnvironmentTypeName(
+                                 Triple.getEnvironment()))
+              : llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
+                             llvm::Triple::getOSTypeName(Triple.getOS())));
+}
+
 std::optional<std::string>
 ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
   auto getPathForTriple =
@@ -864,14 +872,7 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
   if (T.isOSzOS() &&
       (!T.getOSVersion().empty() || !T.getEnvironmentVersion().empty())) {
     // Build the triple without version information
-    const llvm::Triple &TripleWithoutVersion =
-        (T.hasEnvironment()
-             ? llvm::Triple(
-                   T.getArchName(), T.getVendorName(),
-                   llvm::Triple::getOSTypeName(T.getOS()),
-                   llvm::Triple::getEnvironmentTypeName(T.getEnvironment()))
-             : llvm::Triple(T.getArchName(), T.getVendorName(),
-                            llvm::Triple::getOSTypeName(T.getOS())));
+    const llvm::Triple &TripleWithoutVersion = getTripleWithoutOSVersion();
     if (auto Path = getPathForTriple(TripleWithoutVersion))
       return *Path;
   }
@@ -909,9 +910,18 @@ std::optional<std::string> ToolChain::getRuntimePath() const {
   llvm::sys::path::append(P, "lib");
   if (auto Ret = getTargetSubDirPath(P))
     return Ret;
-  // Darwin and AIX does not use per-target runtime directory.
-  if (Triple.isOSDarwin() || Triple.isOSAIX())
+  // Darwin does not use per-target runtime directory.
+  if (Triple.isOSDarwin())
+    return {};
+
+  // For AIX, get the triple without the OS version.
+  if (Triple.isOSAIX()) {
+    const llvm::Triple &TripleWithoutVersion = getTripleWithoutOSVersion();
+    llvm::sys::path::append(P, TripleWithoutVersion.str());
+    if (getVFS().exists(P))
+      return std::string(P);
     return {};
+  }
   llvm::sys::path::append(P, Triple.str());
   return std::string(P);
 }
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc.a b/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc64.a b/clang/test/Driver/Inputs/resource_dir/lib/aix/libclang_rt.builtins-powerpc64.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.builtins.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc-ibm-aix/libclang_rt.builtins.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.builtins.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/powerpc64-ibm-aix/libclang_rt.builtins.a
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/aix-ld.c b/clang/test/Driver/aix-ld.c
index 7e0f2bf91e06e..1dae61d91c4e3 100644
--- a/clang/test/Driver/aix-ld.c
+++ b/clang/test/Driver/aix-ld.c
@@ -1070,6 +1070,58 @@
 // CHECK-FOPENMP-GOMP:    "-lgomp"
 // CHECK-FOPENMP:     "-lc"
 
+// Check powerpc-ibm-aix7.1.0.0, 32-bit per_target_runtime_dir.
+// RUN: %clang %s -### 2>&1 \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN:        --target=powerpc-ibm-aix7.1.0.0 \
+// RUN:        --sysroot %S/Inputs/aix_ppc_tree \
+// RUN:        --unwindlib=libunwind \
+// RUN:   | FileCheck --check-prefix=CHECK-LD32-PER-TARGET %s
+// CHECK-LD32-PER-TARGET-NOT: warning:
+// CHECK-LD32-PER-TARGET:     "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0"
+// CHECK-LD32-PER-TARGET:     "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
+// CHECK-LD32-PER-TARGET:     "-isysroot" "[[SYSROOT:[^"]+]]"
+// CHECK-LD32-PER-TARGET:     "{{.*}}ld{{(.exe)?}}"
+// CHECK-LD32-PER-TARGET-NOT: "-bnso"
+// CHECK-LD32-PER-TARGET:     "-b32"
+// CHECK-LD32-PER-TARGET:     "-bpT:0x10000000" "-bpD:0x20000000"
+// CHECK-LD32-PER-TARGET:     "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o"
+// CHECK-LD32-PER-TARGET:     "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o"
+// CHECK-LD32-PER-TARGET-NOT: "-lc++"
+// CHECK-LD32-PER-TARGET-NOT: "-lc++abi"
+// CHECK-LD32-PER-TARGET:     "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}powerpc-ibm-aix{{/|\\\\}}libclang_rt.builtins.a"
+// CHECK-LD32-PER-TARGET-NOT: "--as-needed"
+// CHECK-LD32-PER-TARGET:     "-lunwind"
+// CHECK-LD32-PER-TARGET-NOT: "--no-as-needed"
+// CHECK-LD32-PER-TARGET-NOT: "-lm"
+// CHECK-LD32-PER-TARGET:     "-lc"
+
+// Check powerpc64-ibm-aix7.1.0.0, 64-bit.
+// RUN: %clang %s -### 2>&1 \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN:        --target=powerpc64-ibm-aix7.1.0.0 \
+// RUN:        --sysroot %S/Inputs/aix_ppc_tree \
+// RUN:        --unwindlib=libunwind \
+// RUN:   | FileCheck --check-prefix=CHECK-LD64-PER-TARGET %s
+// CHECK-LD64-PER-TARGET-NOT: warning:
+// CHECK-LD64-PER-TARGET:     "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0"
+// CHECK-LD64-PER-TARGET:     "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
+// CHECK-LD64-PER-TARGET:     "-isysroot" "[[SYSROOT:[^"]+]]"
+// CHECK-LD64-PER-TARGET:     "{{.*}}ld{{(.exe)?}}"
+// CHECK-LD64-PER-TARGET-NOT: "-bnso"
+// CHECK-LD64-PER-TARGET:     "-b64"
+// CHECK-LD64-PER-TARGET:     "-bpT:0x100000000" "-bpD:0x110000000"
+// CHECK-LD64-PER-TARGET:     "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o"
+// CHECK-LD64-PER-TARGET:     "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o"
+// CHECK-LD64-PER-TARGET-NOT: "-lc++"
+// CHECK-LD64-PER-TARGET-NOT: "-lc++abi"
+// CHECK-LD64-PER-TARGET:     "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}powerpc64-ibm-aix{{/|\\\\}}libclang_rt.builtins.a"
+// CHECK-LD64-PER-TARGET-NOT: "--as-needed"
+// CHECK-LD64-PER-TARGET:     "-lunwind"
+// CHECK-LD64-PER-TARGET-NOT: "--no-as-needed"
+// CHECK-LD64-PER-TARGET-NOT: "-lm"
+// CHECK-LD64-PER-TARGET:     "-lc"
+
 // Check powerpc-ibm-aix7.1.0.0, 32-bit. -fopenmp=libfoo results an error.
 // RUN: not %clang %s 2>&1 -### \
 // RUN:        --target=powerpc-ibm-aix7.1.0.0 \
diff --git a/clang/test/Driver/aix-print-runtime-dir.c b/clang/test/Driver/aix-print-runtime-dir.c
index 0d68ad6fee005..ffa4d15c21208 100644
--- a/clang/test/Driver/aix-print-runtime-dir.c
+++ b/clang/test/Driver/aix-print-runtime-dir.c
@@ -8,4 +8,14 @@
 // RUN:        -resource-dir=%S/Inputs/resource_dir \
 // RUN:      | FileCheck --check-prefix=PRINT-RUNTIME-DIR %s
 
+// RUN: %clang -print-runtime-dir --target=powerpc-ibm-aix \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir\
+// RUN:      | FileCheck --check-prefix=PRINT-RUNTIME-DIR32-PER-TARGET %s
+
+// RUN: %clang -print-runtime-dir --target=powerpc64-ibm-aix \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir\
+// RUN:      | FileCheck --check-prefix=PRINT-RUNTIME-DIR64-PER-TARGET %s
+
 // PRINT-RUNTIME-DIR: lib{{/|\\}}aix{{$}}
+// PRINT-RUNTIME-DIR32-PER-TARGET: lib{{/|\\}}powerpc-ibm-aix{{$}}
+// PRINT-RUNTIME-DIR64-PER-TARGET: lib{{/|\\}}powerpc64-ibm-aix{{$}}
diff --git a/clang/test/Driver/aix-rtlib.c b/clang/test/Driver/aix-rtlib.c
index e0466b166bb78..82ab857984af1 100644
--- a/clang/test/Driver/aix-rtlib.c
+++ b/clang/test/Driver/aix-rtlib.c
@@ -5,6 +5,14 @@
 // RUN: %clang --target=powerpc64-ibm-aix -print-libgcc-file-name \
 // RUN:        -resource-dir=%S/Inputs/resource_dir \
 // RUN:   | FileCheck -check-prefix=CHECK64 %s
+// RUN: %clang --target=powerpc-ibm-aix -print-libgcc-file-name \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN:   | FileCheck -check-prefix=CHECK32-PER-TARGET %s
+// RUN: %clang --target=powerpc64-ibm-aix -print-libgcc-file-name \
+// RUN:        -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \
+// RUN:   | FileCheck -check-prefix=CHECK64-PER-TARGET %s
 
 // CHECK32: resource_dir{{/|\\}}lib{{/|\\}}aix{{/|\\}}libclang_rt.builtins-powerpc.a
 // CHECK64: resource_dir{{/|\\}}lib{{/|\\}}aix{{/|\\}}libclang_rt.builtins-powerpc64.a
+// CHECK32-PER-TARGET: resource_dir_with_per_target_subdir{{/|\\}}lib{{/|\\}}powerpc-ibm-aix{{/|\\}}libclang_rt.builtins.a
+// CHECK64-PER-TARGET: resource_dir_with_per_target_subdir{{/|\\}}lib{{/|\\}}powerpc64-ibm-aix{{/|\\}}libclang_rt.builtins.a

@DanielCChen DanielCChen force-pushed the daniel_enable_per_target branch from be03d5c to 52f9503 Compare March 25, 2025 16:37
Copy link
Member

@ldionne ldionne left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't have comment on the diff but I think it's great that AIX is moving towards the mechanism that we want to use for all targets!

Copy link
Member

@ldionne ldionne left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should also impact the set of headers being searched. On per-target runtimes, I think we look for libc++ headers under include/c++/v1/<target> in addition to include/c++/v1 (since that's where __config_site ends up)? I'm not super familiar with that configuration since we don't use it yet on Apple platforms, but I think it's worth checking that you're doing the right thing here.

@DanielCChen
Copy link
Contributor Author

I think this should also impact the set of headers being searched. On per-target runtimes, I think we look for libc++ headers under include/c++/v1/<target> in addition to include/c++/v1 (since that's where __config_site ends up)? I'm not super familiar with that configuration since we don't use it yet on Apple platforms, but I think it's worth checking that you're doing the right thing here.

Thanks for the comment!
It doesn't seem there is any AIX specific configuration there. @daltenty Do you know if we need to do anything?

@DanielCChen
Copy link
Contributor Author

@ldionne I have checked that on AIX, clang uses the configuration from the system include as -internal-isystem /opt/IBM/openxlCSDK/include/c++/v1. There is already a test in aix-toolchain-include.cpp for that.

@daltenty
Copy link
Member

@ldionne I have checked that on AIX, clang uses the configuration from the system include as -internal-isystem /opt/IBM/openxlCSDK/include/c++/v1. There is already a test in aix-toolchain-include.cpp for that.

Yeah, I don't think we implemented the resource directory based include path logic in the driver for AIX, though we should.

I think it makes sense to put that in a separate follow on PR, as that wasn't supported for either setting of LLVM_ENABLE_PER_TARGET_RUNTIME_DIR so it's not really specific to this change.

@DanielCChen
Copy link
Contributor Author

DanielCChen commented Mar 27, 2025

Thanks to @MaskRay for reviewing the PR and @ldionne for the comments that led us to find another issue that will be tracked separately.
Would the reviewers please let me know if you are still reviewing the change? I am planning to merge it if you have no further comments.

@DanielCChen DanielCChen merged commit 316bb89 into llvm:main Mar 28, 2025
11 checks passed
@DanielCChen DanielCChen deleted the daniel_enable_per_target branch March 28, 2025 13:22
@llvm-ci
Copy link
Collaborator

llvm-ci commented Mar 28, 2025

LLVM Buildbot has detected a new failure on builder lldb-aarch64-ubuntu running on linaro-lldb-aarch64-ubuntu while building clang at step 6 "test".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/59/builds/15082

Here is the relevant piece of the build log for the reference
Step 6 (test) failure: build (failure)
...
XFAIL: lldb-api :: lang/cpp/thread_local/TestThreadLocal.py (863 of 2112)
PASS: lldb-api :: lang/cpp/type_lookup_duplicate/TestCppTypeLookupDuplicate.py (864 of 2112)
PASS: lldb-api :: lang/cpp/stl/TestSTL.py (865 of 2112)
PASS: lldb-api :: lang/cpp/typedef-to-outer-fwd/TestTypedefToOuterFwd.py (866 of 2112)
XFAIL: lldb-api :: lang/cpp/trivial_abi/TestTrivialABI.py (867 of 2112)
PASS: lldb-api :: lang/cpp/type_lookup/TestCppTypeLookup.py (868 of 2112)
PASS: lldb-api :: lang/cpp/typeof/TestTypeOfDeclTypeExpr.py (869 of 2112)
PASS: lldb-api :: lang/cpp/thunk/TestThunk.py (870 of 2112)
PASS: lldb-api :: lang/cpp/typedef/TestCppTypedef.py (871 of 2112)
PASS: lldb-api :: lang/cpp/template/TestTemplateArgs.py (872 of 2112)
FAIL: lldb-api :: lang/cpp/unique-types/TestUniqueTypes.py (873 of 2112)
******************** TEST 'lldb-api :: lang/cpp/unique-types/TestUniqueTypes.py' FAILED ********************
Script:
--
/usr/bin/python3.10 /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/llvm-project/lldb/test/API/dotest.py -u CXXFLAGS -u CFLAGS --env LLVM_LIBS_DIR=/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./lib --env LLVM_INCLUDE_DIR=/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/include --env LLVM_TOOLS_DIR=/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin --arch aarch64 --build-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex --lldb-module-cache-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex/module-cache-lldb/lldb-api --clang-module-cache-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/lldb-test-build.noindex/module-cache-clang/lldb-api --executable /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin/lldb --compiler /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin/clang --dsymutil /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin/dsymutil --make /usr/bin/gmake --llvm-tools-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./bin --lldb-obj-root /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/tools/lldb --lldb-libs-dir /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/./lib /home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/llvm-project/lldb/test/API/lang/cpp/unique-types -p TestUniqueTypes.py
--
Exit Code: -11

Command Output (stdout):
--
lldb version 21.0.0git (https://github.com/llvm/llvm-project.git revision 316bb89c942c1a1cf61d3e673030f82d6f0b8acf)
  clang revision 316bb89c942c1a1cf61d3e673030f82d6f0b8acf
  llvm revision 316bb89c942c1a1cf61d3e673030f82d6f0b8acf
Skipping the following test categories: ['libc++', 'dsym', 'gmodules', 'debugserver', 'objc']

--
Command Output (stderr):
--
UNSUPPORTED: LLDB (/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/bin/clang-aarch64) :: test_dsym (TestUniqueTypes.UniqueTypesTestCase) (test case does not fall in any category of interest for this run) 
PASS: LLDB (/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/bin/clang-aarch64) :: test_dwarf (TestUniqueTypes.UniqueTypesTestCase)
PASS: LLDB (/home/tcwg-buildbot/worker/lldb-aarch64-ubuntu/build/bin/clang-aarch64) :: test_dwo (TestUniqueTypes.UniqueTypesTestCase)
----------------------------------------------------------------------
Ran 3 tests in 0.956s

OK (skipped=1)

--

********************
PASS: lldb-api :: lang/cpp/unsigned_types/TestUnsignedTypes.py (874 of 2112)
PASS: lldb-api :: lang/cpp/unique-types2/TestUniqueTypes2.py (875 of 2112)
PASS: lldb-api :: lang/cpp/unique-types3/TestUniqueTypes3.py (876 of 2112)
PASS: lldb-api :: lang/cpp/unique-types4/TestUniqueTypes4.py (877 of 2112)
PASS: lldb-api :: lang/cpp/union-static-data-members/TestCppUnionStaticMembers.py (878 of 2112)
PASS: lldb-api :: lang/cpp/unicode-literals/TestUnicodeLiterals.py (879 of 2112)
PASS: lldb-api :: lang/cpp/virtual-overload/TestVirtualOverload.py (880 of 2112)
UNSUPPORTED: lldb-api :: lang/objc/charstar_dyntype/TestCharStarDynType.py (881 of 2112)
UNSUPPORTED: lldb-api :: lang/objc/bitfield_ivars/TestBitfieldIvars.py (882 of 2112)
UNSUPPORTED: lldb-api :: lang/objc/blocks/TestObjCIvarsInBlocks.py (883 of 2112)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants