r336467 - [OPENMP] Fix PR38026: Link -latomic when -fopenmp is used.

Hal Finkel via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 19 06:43:41 PDT 2018


On 07/16/2018 01:19 PM, Jonas Hahnfeld wrote:
> [ Moving discussion from https://reviews.llvm.org/D49386 to the
> relevant comment on cfe-commits, CC'ing Hal who commented on the
> original issue ]
>
> Is this change really a good idea? It always requires libatomic for
> all OpenMP applications, even if there is no 'omp atomic' directive or
> all of them can be lowered to atomic instructions that don't require a
> runtime library. I'd argue that it's a larger restriction than the
> problem it solves.

Can you please elaborate on why you feel that this is problematic?

> Per https://clang.llvm.org/docs/Toolchain.html#libatomic-gnu the user
> is expected to manually link -latomic whenever Clang can't lower
> atomic instructions - including C11 atomics and C++ atomics. In my
> opinion OpenMP is just another abstraction that doesn't require a
> special treatment.

>From my perspective, because we instruct our users that all you need to
do in order to enable OpenMP is pass -fopenmp flags during compiling and
linking. The user should not need to know or care about how atomics are
implemented.

It's not clear to me that our behavior for C++ atomics is good either.
>From the documentation, it looks like the rationale is to avoid choosing
between the GNU libatomic implementation and the compiler-rt
implementation? We should probably make a default choice and provide a
flag to override. That would seem more user-friendly to me.

 -Hal

>
> Thoughts?
> Jonas
>
> On 2018-07-06 23:13, Alexey Bataev via cfe-commits wrote:
>> Author: abataev
>> Date: Fri Jul  6 14:13:41 2018
>> New Revision: 336467
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=336467&view=rev
>> Log:
>> [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.
>>
>> Modified:
>>     cfe/trunk/lib/Driver/ToolChains/Gnu.cpp
>>     cfe/trunk/test/OpenMP/linking.c
>>
>> Modified: cfe/trunk/lib/Driver/ToolChains/Gnu.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Gnu.cpp?rev=336467&r1=336466&r2=336467&view=diff
>>
>> ==============================================================================
>>
>> --- cfe/trunk/lib/Driver/ToolChains/Gnu.cpp (original)
>> +++ cfe/trunk/lib/Driver/ToolChains/Gnu.cpp Fri Jul  6 14:13:41 2018
>> @@ -479,6 +479,7 @@ void tools::gnutools::Linker::ConstructJ
>>
>>        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::ConstructJ
>>                             /* 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");
>>
>>
>> Modified: cfe/trunk/test/OpenMP/linking.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/linking.c?rev=336467&r1=336466&r2=336467&view=diff
>>
>> ==============================================================================
>>
>> --- cfe/trunk/test/OpenMP/linking.c (original)
>> +++ cfe/trunk/test/OpenMP/linking.c Fri Jul  6 14:13:41 2018
>> @@ -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 \
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory



More information about the cfe-commits mailing list