diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -429,11 +429,19 @@ void AIX::addProfileRTLibs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const { - // Add linker option -u__llvm_profile_runtime to cause runtime - // initialization to occur. - if (needsProfileRT(Args)) + if (needsProfileRT(Args)) { + // Add linker option -u__llvm_profile_runtime to cause runtime + // initialization to occur. CmdArgs.push_back(Args.MakeArgString( Twine("-u", llvm::getInstrProfRuntimeHookVarName()))); + + if (const auto *A = Args.getLastArg(options::OPT_fprofile_update_EQ)) { + StringRef Val = A->getValue(); + if (Val == "atomic" || Val == "prefer-atomic") + CmdArgs.push_back("-latomic"); + } + } + ToolChain::addProfileRTLibs(Args, CmdArgs); } diff --git a/clang/test/Driver/fprofile-update.c b/clang/test/Driver/fprofile-update.c --- a/clang/test/Driver/fprofile-update.c +++ b/clang/test/Driver/fprofile-update.c @@ -12,3 +12,8 @@ // RUN: not %clang %s -c -fprofile-update=unknown 2>&1 | FileCheck %s --check-prefix=ERROR // ERROR: error: unsupported argument 'unknown' to option '-fprofile-update=' + +// AIX specific tests +// RUN: %if system-aix %{ %clang -### %s -fprofile-generate -fprofile-update=atomic 2>&1 | FileCheck %s --check-prefix=AIX %} +// RUN: %if system-aix %{ %clang -### %s -fprofile-generate -fprofile-update=prefer-atomic 2>&1 | FileCheck %s --check-prefix=AIX %} +// AIX: "-latomic"