From 5137aa79b9f66e61c5665fb88f8d2e906496cca9 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Fri, 6 Jul 2018 21:13:41 +0000 Subject: [PATCH] [OPENMP] Fix PR38026: Link -latomic when -fopenmp is used. On Linux atomic constructs in OpenMP require libatomic library. Patch links libatomic when -fopenmp is used. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@336467 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/ToolChains/Gnu.cpp | 6 +++++- test/OpenMP/linking.c | 16 ++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp index 1ecf127c4b..ee3096813e 100644 --- a/lib/Driver/ToolChains/Gnu.cpp +++ b/lib/Driver/ToolChains/Gnu.cpp @@ -479,6 +479,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, bool WantPthread = Args.hasArg(options::OPT_pthread) || Args.hasArg(options::OPT_pthreads); + bool WantAtomic = false; // FIXME: Only pass GompNeedsRT = true for platforms with libgomp that // require librt. Most modern Linux platforms do, but some may not. @@ -487,13 +488,16 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, /* GompNeedsRT= */ true)) // OpenMP runtimes implies pthreads when using the GNU toolchain. // FIXME: Does this really make sense for all GNU toolchains? - WantPthread = true; + WantAtomic = WantPthread = true; AddRunTimeLibs(ToolChain, D, CmdArgs, Args); if (WantPthread && !isAndroid) CmdArgs.push_back("-lpthread"); + if (WantAtomic) + CmdArgs.push_back("-latomic"); + if (Args.hasArg(options::OPT_fsplit_stack)) CmdArgs.push_back("--wrap=pthread_create"); diff --git a/test/OpenMP/linking.c b/test/OpenMP/linking.c index 802553c1be..e2f83f9571 100644 --- a/test/OpenMP/linking.c +++ b/test/OpenMP/linking.c @@ -8,14 +8,14 @@ // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s // CHECK-LD-32: "{{.*}}ld{{(.exe)?}}" // CHECK-LD-32: "-l[[DEFAULT_OPENMP_LIB:[^"]*]]" -// CHECK-LD-32: "-lpthread" "-lc" +// CHECK-LD-32: "-lpthread" "-latomic" "-lc" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -fopenmp -target x86_64-unknown-linux -rtlib=platform \ // RUN: | FileCheck --check-prefix=CHECK-LD-64 %s // CHECK-LD-64: "{{.*}}ld{{(.exe)?}}" // CHECK-LD-64: "-l[[DEFAULT_OPENMP_LIB:[^"]*]]" -// CHECK-LD-64: "-lpthread" "-lc" +// CHECK-LD-64: "-lpthread" "-latomic" "-lc" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -fopenmp=libgomp -target i386-unknown-linux -rtlib=platform \ @@ -27,7 +27,7 @@ // SIMD-ONLY2-NOT: liomp // CHECK-GOMP-LD-32: "{{.*}}ld{{(.exe)?}}" // CHECK-GOMP-LD-32: "-lgomp" "-lrt" -// CHECK-GOMP-LD-32: "-lpthread" "-lc" +// CHECK-GOMP-LD-32: "-lpthread" "-latomic" "-lc" // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 -fopenmp-simd -target i386-unknown-linux -rtlib=platform | FileCheck --check-prefix SIMD-ONLY2 %s // SIMD-ONLY2-NOT: lgomp @@ -39,21 +39,21 @@ // RUN: | FileCheck --check-prefix=CHECK-GOMP-LD-64 %s // CHECK-GOMP-LD-64: "{{.*}}ld{{(.exe)?}}" // CHECK-GOMP-LD-64: "-lgomp" "-lrt" -// CHECK-GOMP-LD-64: "-lpthread" "-lc" +// CHECK-GOMP-LD-64: "-lpthread" "-latomic" "-lc" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -fopenmp -target i386-unknown-linux -rtlib=platform \ // RUN: | FileCheck --check-prefix=CHECK-IOMP5-LD-32 %s // CHECK-IOMP5-LD-32: "{{.*}}ld{{(.exe)?}}" // CHECK-IOMP5-LD-32: "-l[[DEFAULT_OPENMP_LIB:[^"]*]]" -// CHECK-IOMP5-LD-32: "-lpthread" "-lc" +// CHECK-IOMP5-LD-32: "-lpthread" "-latomic" "-lc" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -fopenmp -target x86_64-unknown-linux -rtlib=platform \ // RUN: | FileCheck --check-prefix=CHECK-IOMP5-LD-64 %s // CHECK-IOMP5-LD-64: "{{.*}}ld{{(.exe)?}}" // CHECK-IOMP5-LD-64: "-l[[DEFAULT_OPENMP_LIB:[^"]*]]" -// CHECK-IOMP5-LD-64: "-lpthread" "-lc" +// CHECK-IOMP5-LD-64: "-lpthread" "-latomic" "-lc" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -fopenmp=lib -target i386-unknown-linux \ @@ -71,7 +71,7 @@ // RUN: | FileCheck --check-prefix=CHECK-LD-OVERRIDE-32 %s // CHECK-LD-OVERRIDE-32: "{{.*}}ld{{(.exe)?}}" // CHECK-LD-OVERRIDE-32: "-lgomp" "-lrt" -// CHECK-LD-OVERRIDE-32: "-lpthread" "-lc" +// CHECK-LD-OVERRIDE-32: "-lpthread" "-latomic" "-lc" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -fopenmp -fopenmp=libgomp -target x86_64-unknown-linux \ @@ -79,7 +79,7 @@ // RUN: | FileCheck --check-prefix=CHECK-LD-OVERRIDE-64 %s // CHECK-LD-OVERRIDE-64: "{{.*}}ld{{(.exe)?}}" // CHECK-LD-OVERRIDE-64: "-lgomp" "-lrt" -// CHECK-LD-OVERRIDE-64: "-lpthread" "-lc" +// CHECK-LD-OVERRIDE-64: "-lpthread" "-latomic" "-lc" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -fopenmp=libomp -target x86_64-msvc-win32 -rtlib=platform \ -- 2.40.0