From e23c89533d4da85b10cf038fa2b296d6ce9ac2f4 Mon Sep 17 00:00:00 2001 From: Kelvin Li Date: Wed, 12 Nov 2025 10:07:28 -0500 Subject: [PATCH 1/2] [OpenMP][AIX] Add pthreads and perfstat libraries for linking static libomp --- clang/lib/Driver/ToolChains/AIX.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp index a8acf9cfc44c9..ad32b4f5b16b6 100644 --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -309,8 +309,10 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, AddRunTimeLibs(ToolChain, D, CmdArgs, Args); // Add OpenMP runtime if -fopenmp is specified. - if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, - options::OPT_fno_openmp, false)) { + const bool hasFOpenMP = + Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, + options::OPT_fno_openmp, false); + if (hasFOpenMP) { switch (ToolChain.getDriver().getOpenMPRuntime(Args)) { case Driver::OMPRT_OMP: CmdArgs.push_back("-lomp"); @@ -325,10 +327,13 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, // Already diagnosed. break; } + + CmdArgs.push_back("-lperfstat"); } // Support POSIX threads if "-pthreads" or "-pthread" is present. - if (Args.hasArg(options::OPT_pthreads, options::OPT_pthread)) + if (hasFOpenMP || + Args.hasArg(options::OPT_pthreads, options::OPT_pthread)) CmdArgs.push_back("-lpthreads"); if (D.CCCIsCXX()) From 6f8ea425781348bb8cf106c2f6854877b46b4c62 Mon Sep 17 00:00:00 2001 From: Kelvin Li Date: Thu, 13 Nov 2025 13:05:41 -0500 Subject: [PATCH 2/2] avoid duplication of -lpthreads in flang --- clang/lib/Driver/ToolChains/AIX.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp index ad32b4f5b16b6..03f12f7e6d690 100644 --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -297,6 +297,7 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, } // Add directory to library search path. + bool hasFOpenMP = false; Args.AddAllArgs(CmdArgs, options::OPT_L); if (!Args.hasArg(options::OPT_r)) { ToolChain.AddFilePathLibArgs(Args, CmdArgs); @@ -309,9 +310,8 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, AddRunTimeLibs(ToolChain, D, CmdArgs, Args); // Add OpenMP runtime if -fopenmp is specified. - const bool hasFOpenMP = - Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, - options::OPT_fno_openmp, false); + hasFOpenMP = Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, + options::OPT_fno_openmp, false); if (hasFOpenMP) { switch (ToolChain.getDriver().getOpenMPRuntime(Args)) { case Driver::OMPRT_OMP: @@ -355,7 +355,9 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, ToolChain.addFortranRuntimeLibraryPath(Args, CmdArgs); ToolChain.addFortranRuntimeLibs(Args, CmdArgs); CmdArgs.push_back("-lm"); - CmdArgs.push_back("-lpthread"); + // If the -fopenmp option is specified, no need to add it again. + if (!hasFOpenMP) + CmdArgs.push_back("-lpthreads"); } const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); C.addCommand(std::make_unique(JA, *this, ResponseFileSupport::None(),