diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2014-03-06 05:43:53 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2014-03-06 05:43:53 +0000 |
commit | 186b28a8cf16e8ab92d88bff287773e508b7377c (patch) | |
tree | 4f639b6e6597172d225f039b3120a51c66db4dd0 /clang/lib/Driver/Tools.cpp | |
parent | 90097491ed557b6140dab4d5989beae66d0a9ad1 (diff) | |
download | bcm5719-llvm-186b28a8cf16e8ab92d88bff287773e508b7377c.tar.gz bcm5719-llvm-186b28a8cf16e8ab92d88bff287773e508b7377c.zip |
[OPENMP] Added option -fopenmp=libiomp5|libgomp
llvm-svn: 203081
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index abc8f7dc9af..70c06466bfd 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/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<LibOpenMP>(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<LibOpenMP>(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"); |