From 67fafb973cfbd0ac08f3177a344e5cdd4fee4ae6 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Thu, 6 Mar 2014 05:43:53 +0000 Subject: [PATCH] [OPENMP] Added option -fopenmp=libiomp5|libgomp git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203081 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/Options.td | 3 +- lib/Driver/Tools.cpp | 54 ++++++++++++++++-- lib/Frontend/CompilerInvocation.cpp | 8 ++- test/OpenMP/linking.c | 55 ++++++++++++++++++- test/OpenMP/openmp_common.c | 2 +- test/OpenMP/parallel_ast_print.cpp | 6 +- test/OpenMP/parallel_default_messages.cpp | 2 +- .../OpenMP/parallel_firstprivate_messages.cpp | 2 +- test/OpenMP/parallel_if_messages.cpp | 2 +- test/OpenMP/parallel_messages.cpp | 2 +- test/OpenMP/parallel_private_messages.cpp | 2 +- test/OpenMP/parallel_shared_messages.cpp | 2 +- test/OpenMP/predefined_macro.c | 12 ++-- test/OpenMP/simd_ast_print.cpp | 6 +- test/OpenMP/simd_misc_messages.c | 2 +- test/OpenMP/threadprivate_ast_print.cpp | 6 +- test/OpenMP/threadprivate_messages.cpp | 2 +- 17 files changed, 134 insertions(+), 34 deletions(-) diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 4b90e43754..2a48e6f419 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -741,7 +741,8 @@ def fno_objc_nonfragile_abi : Flag<["-"], "fno-objc-nonfragile-abi">, Group, Group; def fomit_frame_pointer : Flag<["-"], "fomit-frame-pointer">, Group; -def fopenmp : Flag<["-"], "fopenmp">, Group, Flags<[CC1Option]>; +def fopenmp : Flag<["-"], "fopenmp">, Group, Flags<[CC1Option, NoArgumentUnused]>; +def fopenmp_EQ : Joined<["-"], "fopenmp=">, Group, Flags<[CC1Option]>; def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group; def foptimize_sibling_calls : Flag<["-"], "foptimize-sibling-calls">, Group; def force__cpusubtype__ALL : Flag<["-"], "force_cpusubtype_ALL">; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index abc8f7dc9a..70c06466bf 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -5190,6 +5190,12 @@ void darwin::Link::AddLinkArgs(Compilation &C, Args.AddLastArg(CmdArgs, options::OPT_Mach); } +enum LibOpenMP { + LibUnknown, + LibGOMP, + LibIOMP5 +}; + void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, @@ -5241,9 +5247,28 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, Args.AddAllArgs(CmdArgs, options::OPT_L); - if (Args.hasArg(options::OPT_fopenmp)) - // This is more complicated in gcc... + LibOpenMP UsedOpenMPLib = LibUnknown; + if (Args.hasArg(options::OPT_fopenmp)) { + UsedOpenMPLib = LibGOMP; + } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) { + UsedOpenMPLib = llvm::StringSwitch(A->getValue()) + .Case("libgomp", LibGOMP) + .Case("libiomp5", LibIOMP5) + .Default(LibUnknown); + if (UsedOpenMPLib == LibUnknown) + getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument) + << A->getOption().getName() << A->getValue(); + } + switch (UsedOpenMPLib) { + case LibGOMP: CmdArgs.push_back("-lgomp"); + break; + case LibIOMP5: + CmdArgs.push_back("-liomp5"); + break; + case LibUnknown: + break; + } AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); @@ -6856,19 +6881,36 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA, if (Args.hasArg(options::OPT_static)) CmdArgs.push_back("--start-group"); - bool OpenMP = Args.hasArg(options::OPT_fopenmp); - if (OpenMP) { + LibOpenMP UsedOpenMPLib = LibUnknown; + if (Args.hasArg(options::OPT_fopenmp)) { + UsedOpenMPLib = LibGOMP; + } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) { + UsedOpenMPLib = llvm::StringSwitch(A->getValue()) + .Case("libgomp", LibGOMP) + .Case("libiomp5", LibIOMP5) + .Default(LibUnknown); + if (UsedOpenMPLib == LibUnknown) + D.Diag(diag::err_drv_unsupported_option_argument) + << A->getOption().getName() << A->getValue(); + } + switch (UsedOpenMPLib) { + case LibGOMP: CmdArgs.push_back("-lgomp"); // FIXME: Exclude this for platforms with libgomp that don't require // librt. Most modern Linux platforms require it, but some may not. CmdArgs.push_back("-lrt"); + break; + case LibIOMP5: + CmdArgs.push_back("-liomp5"); + break; + case LibUnknown: + break; } - AddRunTimeLibs(ToolChain, D, CmdArgs, Args); if (Args.hasArg(options::OPT_pthread) || - Args.hasArg(options::OPT_pthreads) || OpenMP) + Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib == LibGOMP) CmdArgs.push_back("-lpthread"); CmdArgs.push_back("-lc"); diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index f8cb938866..d28af7c469 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1431,8 +1431,12 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel); } - // Check if -fopenmp is specified. - Opts.OpenMP = Args.hasArg(OPT_fopenmp); + // Check if -fopenmp= is specified. + if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) { + Opts.OpenMP = llvm::StringSwitch(A->getValue()) + .Case("libiomp5", true) + .Default(false); + } // Record whether the __DEPRECATED define was requested. Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro, diff --git a/test/OpenMP/linking.c b/test/OpenMP/linking.c index 31fd57de92..586e4606d1 100644 --- a/test/OpenMP/linking.c +++ b/test/OpenMP/linking.c @@ -1,5 +1,5 @@ // Test the that the driver produces reasonable linker invocations with -// -fopenmp. +// -fopenmp or -fopenmp=libiomp5|libgomp. // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -fopenmp -target i386-unknown-linux \ @@ -14,3 +14,56 @@ // CHECK-LD-64: "{{.*}}ld{{(.exe)?}}" // CHECK-LD-64: "-lgomp" "-lrt" "-lgcc" // CHECK-LD-64: "-lpthread" "-lc" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -fopenmp=libgomp -target i386-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-GOMP-LD-32 %s +// CHECK-GOMP-LD-32: "{{.*}}ld{{(.exe)?}}" +// CHECK-GOMP-LD-32: "-lgomp" "-lrt" "-lgcc" +// CHECK-GOMP-LD-32: "-lpthread" "-lc" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -fopenmp=libgomp -target x86_64-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-GOMP-LD-64 %s +// CHECK-GOMP-LD-64: "{{.*}}ld{{(.exe)?}}" +// CHECK-GOMP-LD-64: "-lgomp" "-lrt" "-lgcc" +// CHECK-GOMP-LD-64: "-lpthread" "-lc" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -fopenmp=libiomp5 -target i386-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-IOMP5-LD-32 %s +// CHECK-IOMP5-LD-32: "{{.*}}ld{{(.exe)?}}" +// CHECK-IOMP5-LD-32: "-liomp5" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -fopenmp=libiomp5 -target x86_64-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-IOMP5-LD-64 %s +// CHECK-IOMP5-LD-64: "{{.*}}ld{{(.exe)?}}" +// CHECK-IOMP5-LD-64: "-liomp5" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -fopenmp=lib -target i386-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-LIB-LD-32 %s +// CHECK-LIB-LD-32: error: unsupported argument 'lib' to option 'fopenmp=' +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -fopenmp=lib -target x86_64-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-LIB-LD-64 %s +// CHECK-LIB-LD-64: error: unsupported argument 'lib' to option 'fopenmp=' +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -fopenmp -fopenmp=libiomp5 -target i386-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-LD-WARN-32 %s +// CHECK-LD-WARN-32: warning: argument unused during compilation: '-fopenmp=libiomp5' +// CHECK-LD-WARN-32: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD-WARN-32: "-lgomp" "-lrt" "-lgcc" +// CHECK-LD-WARN-32: "-lpthread" "-lc" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -fopenmp -fopenmp=libiomp5 -target x86_64-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-LD-WARN-64 %s +// CHECK-LD-WARN-64: warning: argument unused during compilation: '-fopenmp=libiomp5' +// CHECK-LD-WARN-64: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD-WARN-64: "-lgomp" "-lrt" "-lgcc" +// CHECK-LD-WARN-64: "-lpthread" "-lc" +// diff --git a/test/OpenMP/openmp_common.c b/test/OpenMP/openmp_common.c index 3765f4c5dc..3131b3045b 100644 --- a/test/OpenMP/openmp_common.c +++ b/test/OpenMP/openmp_common.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 -o - %s #pragma omp // expected-error {{expected an OpenMP directive}} #pragma omp unknown_directive // expected-error {{expected an OpenMP directive}} diff --git a/test/OpenMP/parallel_ast_print.cpp b/test/OpenMP/parallel_ast_print.cpp index e76a410522..bd5171435e 100644 --- a/test/OpenMP/parallel_ast_print.cpp +++ b/test/OpenMP/parallel_ast_print.cpp @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s -// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s -// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s // expected-no-diagnostics #ifndef HEADER diff --git a/test/OpenMP/parallel_default_messages.cpp b/test/OpenMP/parallel_default_messages.cpp index cbc6a73fe3..6014cdfd4b 100644 --- a/test/OpenMP/parallel_default_messages.cpp +++ b/test/OpenMP/parallel_default_messages.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 -o - %s void foo(); diff --git a/test/OpenMP/parallel_firstprivate_messages.cpp b/test/OpenMP/parallel_firstprivate_messages.cpp index 780059e282..9df45c60e7 100644 --- a/test/OpenMP/parallel_firstprivate_messages.cpp +++ b/test/OpenMP/parallel_firstprivate_messages.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 %s void foo() { } diff --git a/test/OpenMP/parallel_if_messages.cpp b/test/OpenMP/parallel_if_messages.cpp index 97096dfae3..1559692a98 100644 --- a/test/OpenMP/parallel_if_messages.cpp +++ b/test/OpenMP/parallel_if_messages.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 %s void foo() { } diff --git a/test/OpenMP/parallel_messages.cpp b/test/OpenMP/parallel_messages.cpp index 8aee8414f0..1e0edbc6f8 100644 --- a/test/OpenMP/parallel_messages.cpp +++ b/test/OpenMP/parallel_messages.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 -std=c++11 -o - %s void foo() { } diff --git a/test/OpenMP/parallel_private_messages.cpp b/test/OpenMP/parallel_private_messages.cpp index 2037d56daf..6dc55e5574 100644 --- a/test/OpenMP/parallel_private_messages.cpp +++ b/test/OpenMP/parallel_private_messages.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 %s void foo() { } diff --git a/test/OpenMP/parallel_shared_messages.cpp b/test/OpenMP/parallel_shared_messages.cpp index 211d392fe0..8363989439 100644 --- a/test/OpenMP/parallel_shared_messages.cpp +++ b/test/OpenMP/parallel_shared_messages.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 %s void foo() { } diff --git a/test/OpenMP/predefined_macro.c b/test/OpenMP/predefined_macro.c index 3a81186209..06f98793fb 100644 --- a/test/OpenMP/predefined_macro.c +++ b/test/OpenMP/predefined_macro.c @@ -1,32 +1,32 @@ -// RUN: %clang_cc1 -fopenmp -verify -DFOPENMP -o - %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -verify -DFOPENMP -o - %s // RUN: %clang_cc1 -verify -o - %s // expected-no-diagnostics #ifdef FOPENMP -// -fopenmp option is specified +// -fopenmp=libiomp5 option is specified #ifndef _OPENMP #error "No _OPENMP macro is defined with -fopenmp option" #elsif _OPENMP != 201107 #error "_OPENMP has incorrect value" #endif //_OPENMP #else -// No -fopenmp option is specified +// No -fopenmp=libiomp5 option is specified #ifdef _OPENMP #error "_OPENMP macro is defined without -fopenmp option" #endif // _OPENMP #endif // FOPENMP -// RUN: %clang_cc1 -fopenmp -verify -DFOPENMP -o - %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -verify -DFOPENMP -o - %s // RUN: %clang_cc1 -verify -o - %s // expected-no-diagnostics #ifdef FOPENMP -// -fopenmp option is specified +// -fopenmp=libiomp5 option is specified #ifndef _OPENMP #error "No _OPENMP macro is defined with -fopenmp option" #elsif _OPENMP != 201107 #error "_OPENMP has incorrect value" #endif // _OPENMP #else -// No -fopenmp option is specified +// No -fopenmp=libiomp5 option is specified #ifdef _OPENMP #error "_OPENMP macro is defined without -fopenmp option" #endif // _OPENMP diff --git a/test/OpenMP/simd_ast_print.cpp b/test/OpenMP/simd_ast_print.cpp index 7cdf131b08..fd9668c436 100644 --- a/test/OpenMP/simd_ast_print.cpp +++ b/test/OpenMP/simd_ast_print.cpp @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s -// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s -// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s // expected-no-diagnostics #ifndef HEADER diff --git a/test/OpenMP/simd_misc_messages.c b/test/OpenMP/simd_misc_messages.c index 90a7bb441e..622c4389b5 100644 --- a/test/OpenMP/simd_misc_messages.c +++ b/test/OpenMP/simd_misc_messages.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s +// RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -verify %s // expected-error@+1 {{unexpected OpenMP directive '#pragma omp simd'}} #pragma omp simd diff --git a/test/OpenMP/threadprivate_ast_print.cpp b/test/OpenMP/threadprivate_ast_print.cpp index 1cbc0165c3..bf3b30550a 100644 --- a/test/OpenMP/threadprivate_ast_print.cpp +++ b/test/OpenMP/threadprivate_ast_print.cpp @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s -// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s -// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print // expected-no-diagnostics #ifndef HEADER diff --git a/test/OpenMP/threadprivate_messages.cpp b/test/OpenMP/threadprivate_messages.cpp index 943fca5105..4e50c6f9d4 100644 --- a/test/OpenMP/threadprivate_messages.cpp +++ b/test/OpenMP/threadprivate_messages.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify -fopenmp -ferror-limit 100 %s +// RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify -fopenmp=libiomp5 -ferror-limit 100 %s #pragma omp threadprivate // expected-error {{expected '(' after 'threadprivate'}} #pragma omp threadprivate( // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}} -- 2.40.0