From b72c36e115bbe3acf1406efce1f478c0a4d7a411 Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 6 Nov 2017 19:48:42 -0600 Subject: [PATCH 01/20] Add support to set linker flags for flang on windows --- .gitignore | 2 +- lib/Driver/ToolChains/CommonArgs.cpp | 2 +- lib/Driver/ToolChains/CommonArgs.h | 2 + lib/Driver/ToolChains/MSVC.cpp | 56 ++++++++++++++++++++++++++++ lib/Driver/ToolChains/MSVC.h | 3 ++ 5 files changed, 63 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index fc842489a0..67bd957970 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ # See: http://www.kernel.org/pub/software/scm/git/docs/gitignore.html # # This file is intentionally different from the output of `git svn show-ignore`, -# as most of those are useless. +# as most of those are useless. #==============================================================================# #==============================================================================# diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp index fe22b76556..969656b364 100644 --- a/lib/Driver/ToolChains/CommonArgs.cpp +++ b/lib/Driver/ToolChains/CommonArgs.cpp @@ -67,7 +67,7 @@ bool tools::needFortranLibs(const Driver &D, const ArgList &Args) { } /// \brief Determine if Fortran "main" object is needed -static bool needFortranMain(const Driver &D, const ArgList &Args) { +bool tools::needFortranMain(const Driver &D, const ArgList &Args) { return (needFortranLibs(D, Args) && (!Args.hasArg(options::OPT_Mnomain) || !Args.hasArg(options::OPT_no_fortran_main))); diff --git a/lib/Driver/ToolChains/CommonArgs.h b/lib/Driver/ToolChains/CommonArgs.h index 70ac75b2de..8bfdf162b9 100644 --- a/lib/Driver/ToolChains/CommonArgs.h +++ b/lib/Driver/ToolChains/CommonArgs.h @@ -22,6 +22,8 @@ namespace tools { bool needFortranLibs(const Driver &D, const llvm::opt::ArgList &Args); +bool needFortranMain(const Driver &D, const llvm::opt::ArgList &Args); + void addPathIfExists(const Driver &D, const Twine &Path, ToolChain::path_list &Paths); diff --git a/lib/Driver/ToolChains/MSVC.cpp b/lib/Driver/ToolChains/MSVC.cpp index 7978a6941c..e71af6a1e7 100644 --- a/lib/Driver/ToolChains/MSVC.cpp +++ b/lib/Driver/ToolChains/MSVC.cpp @@ -372,6 +372,16 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName)); } + // Add Fortran runtime libraries + if (needFortranLibs(TC.getDriver(), Args)) { + TC.AddFortranStdlibLibArgs(Args, CmdArgs); + } else { + // Claim "no Flang libraries" arguments if any + for (auto Arg : Args.filtered(options::OPT_noFlangLibs)) { + Arg->claim(); + } + } + if (TC.getSanitizerArgs().needsAsanRt()) { CmdArgs.push_back(Args.MakeArgString("-debug")); CmdArgs.push_back(Args.MakeArgString("-incremental:no")); @@ -1255,6 +1265,52 @@ void MSVCToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, // FIXME: There should probably be logic here to find libc++ on Windows. } +void MSVCToolChain::AddFortranStdlibLibArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + bool staticFlangLibs = false; + bool useOpenMP = false; + + const auto &D = getDriver(); + + if (Args.hasArg(options::OPT_staticFlangLibs)) { + for (auto *A: Args.filtered(options::OPT_staticFlangLibs)) { + A->claim(); + staticFlangLibs = true; + } + } + + Arg *A = Args.getLastArg(options::OPT_mp, options::OPT_nomp, + options::OPT_fopenmp, options::OPT_fno_openmp); + if (A && + (A->getOption().matches(options::OPT_mp) || + A->getOption().matches(options::OPT_fopenmp))) { + useOpenMP = true; + } + + CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + + D.Dir + "/../lib")); + + if (needFortranMain(D, Args)) { + CmdArgs.push_back("-defaultlib:flangmain"); + CmdArgs.push_back("-subsystem:console"); + } + + if (staticFlangLibs) { + CmdArgs.push_back("-defaultlib:libflang"); + CmdArgs.push_back("-defaultlib:libflangrti"); + if (!useOpenMP) { + CmdArgs.push_back("-defaultlib:libompstub"); + } + } + else { + CmdArgs.push_back("-defaultlib:flang"); + CmdArgs.push_back("-defaultlib:flangrti"); + if (!useOpenMP) { + CmdArgs.push_back("-defaultlib:ompstub"); + } + } +} + VersionTuple MSVCToolChain::computeMSVCVersion(const Driver *D, const ArgList &Args) const { bool IsWindowsMSVC = getTriple().isWindowsMSVCEnvironment(); diff --git a/lib/Driver/ToolChains/MSVC.h b/lib/Driver/ToolChains/MSVC.h index 854f88a36f..440542743a 100644 --- a/lib/Driver/ToolChains/MSVC.h +++ b/lib/Driver/ToolChains/MSVC.h @@ -106,6 +106,9 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddFortranStdlibLibArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; + void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; From 16eb14d7b5166e7bc903aa2a4667fffb415f18ad Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 6 Nov 2017 19:57:44 -0600 Subject: [PATCH 02/20] BPO 2b0d6a54267f918d76b6f369b730794351b7d108 --- lib/Driver/ToolChains/Flang.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index f142a0aa1e..ed56a490b4 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -726,6 +726,10 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back(Arg->getValue(0)); } + // Add env variables + addDirectoryList(Args, UpperCmdArgs, "-idir", "C_INCLUDE_PATH"); + addDirectoryList(Args, UpperCmdArgs, "-idir", "CPATH"); + // "Define" preprocessor flags for (auto Arg : Args.filtered(options::OPT_D)) { Arg->claim(); From aacc75c2852c044bd908a86d80d7fd2c81c4b40b Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 6 Nov 2017 20:04:15 -0600 Subject: [PATCH 03/20] BPO c82849d6322bfa6c841da58005e353b8f2f68fb0 --- lib/Driver/ToolChains/Flang.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index ed56a490b4..d4deabab0f 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -622,20 +622,37 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, // Add system include arguments. getToolChain().AddFlangSystemIncludeArgs(Args, UpperCmdArgs); + + bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment(); + if (!IsWindowsMSVC) { UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("unix"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__unix"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__unix__"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("linux"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__linux"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__linux__"); - UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__NO_MATH_INLINES"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__LP64__"); - UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__x86_64"); - UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__x86_64__"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__LONG_MAX__=9223372036854775807L"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__SIZE_TYPE__=unsigned long int"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__PTRDIFF_TYPE__=long int"); + } else { + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__LONG_MAX__=2147483647L"); + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__SIZE_TYPE__=unsigned long long int"); + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__PTRDIFF_TYPE__=long long int"); + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("_WIN32"); + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("WIN32"); + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("_WIN64"); + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("WIN64"); + VersionTuple MSVT = + getToolChain().computeMSVCVersion(&getToolChain().getDriver(), Args); + auto msc_ver = MSVT.getMajor() * 100 + MSVT.getMinor().getValueOr(0); + UpperCmdArgs.push_back("-def"); + UpperCmdArgs.push_back(Args.MakeArgString(std::string("_MSC_VER=")+std::to_string(msc_ver))); + } + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__NO_MATH_INLINES"); + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__x86_64"); + UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__x86_64__"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__THROW="); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__extension__="); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__amd_64__amd64__"); From e30d7367e70cb9b9c41ea9920bf4fffff6f9bf83 Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 6 Nov 2017 20:05:54 -0600 Subject: [PATCH 04/20] BPO 96204a920f9f8fe9ea32ff3150c74a20ec8a6a4c --- lib/Driver/ToolChains/Flang.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index d4deabab0f..bbc2d31e7a 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -866,6 +866,11 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, LowerCmdArgs.push_back(STBFile); LowerCmdArgs.push_back("-asm"); LowerCmdArgs.push_back(Args.MakeArgString(OutFile)); + + const llvm::Triple &Triple = getToolChain().getEffectiveTriple(); + const std::string &TripleStr = Triple.getTriple(); + CmdArgs.push_back("-target"); + CmdArgs.push_back(Args.MakeArgString(TripleStr)); C.addCommand(llvm::make_unique(JA, *this, LowerExec, LowerCmdArgs, Inputs)); } From 0ba5a178c1303d7b6afe5c4a62992e701111b888 Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 6 Nov 2017 20:12:45 -0600 Subject: [PATCH 05/20] BPO 34a9da2f9a971770a672725d4a75fbc4dccd7bca --- lib/Driver/ToolChains/MSVC.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/Driver/ToolChains/MSVC.cpp b/lib/Driver/ToolChains/MSVC.cpp index e71af6a1e7..b904fa57ee 100644 --- a/lib/Driver/ToolChains/MSVC.cpp +++ b/lib/Driver/ToolChains/MSVC.cpp @@ -325,9 +325,13 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back( Args.MakeArgString(std::string("-out:") + Output.getFilename())); - if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) && - !C.getDriver().IsCLMode()) - CmdArgs.push_back("-defaultlib:libcmt"); + if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { + if (C.getDriver().IsFortranMode()) { + CmdArgs.push_back("-defaultlib:msvcrt"); + } else if (!C.getDriver().IsCLMode() && !C.getDriver().IsFortranMode()) { + CmdArgs.push_back("-defaultlib:libcmt"); + } + } if (!llvm::sys::Process::GetEnv("LIB")) { // If the VC environment hasn't been configured (perhaps because the user From 2e89d0687bf4e98deb11b0cc28c89df783a2d521 Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 6 Nov 2017 21:03:45 -0600 Subject: [PATCH 06/20] BPO 70a8ae87edf87b6af0bfd543c595547d1032cbf0 --- include/clang/Driver/ToolChain.h | 3 ++- lib/Driver/ToolChain.cpp | 3 ++- lib/Driver/ToolChains/Flang.cpp | 14 +++++++++-- lib/Driver/ToolChains/MSVC.cpp | 43 +++++++++++++++++++++++++------- lib/Driver/ToolChains/MSVC.h | 8 +++++- 5 files changed, 57 insertions(+), 14 deletions(-) diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h index 9ace002b62..214bbe52d0 100644 --- a/include/clang/Driver/ToolChain.h +++ b/include/clang/Driver/ToolChain.h @@ -482,7 +482,8 @@ class ToolChain { /// AddFortranStdlibLibArgs - Add the system specific linker arguments to use /// for the given Fortran runtime library type. virtual void AddFortranStdlibLibArgs(const llvm::opt::ArgList &Args, - llvm::opt::ArgStringList &CmdArgs) const; + llvm::opt::ArgStringList &CmdArgs, + bool AddMLinker=false) const; /// \brief Return sanitizers which are available in this toolchain. virtual SanitizerMask getSupportedSanitizers() const; diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index cd32ba7c75..522ffbca90 100644 --- a/lib/Driver/ToolChain.cpp +++ b/lib/Driver/ToolChain.cpp @@ -687,7 +687,8 @@ void ToolChain::AddCCKextLibArgs(const ArgList &Args, } void ToolChain::AddFortranStdlibLibArgs(const ArgList &Args, - ArgStringList &CmdArgs) const { + ArgStringList &CmdArgs, + bool AddMLinker) const { bool staticFlangLibs = false; bool useOpenMP = false; diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index bbc2d31e7a..39dce6aeb6 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -869,8 +869,18 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, const llvm::Triple &Triple = getToolChain().getEffectiveTriple(); const std::string &TripleStr = Triple.getTriple(); - CmdArgs.push_back("-target"); - CmdArgs.push_back(Args.MakeArgString(TripleStr)); + LowerCmdArgs.push_back("-target"); + LowerCmdArgs.push_back(Args.MakeArgString(TripleStr)); + + if (IsWindowsMSVC) { + getToolChain().AddFortranStdlibLibArgs(Args, LowerCmdArgs, true); + if (needFortranMain(getToolChain().getDriver(), Args)) { + LowerCmdArgs.push_back("-linker"); + LowerCmdArgs.push_back("/subsystem:console"); + LowerCmdArgs.push_back("-linker"); + LowerCmdArgs.push_back("/defaultlib:flangmain"); + } + } C.addCommand(llvm::make_unique(JA, *this, LowerExec, LowerCmdArgs, Inputs)); } diff --git a/lib/Driver/ToolChains/MSVC.cpp b/lib/Driver/ToolChains/MSVC.cpp index b904fa57ee..b376e1fb2c 100644 --- a/lib/Driver/ToolChains/MSVC.cpp +++ b/lib/Driver/ToolChains/MSVC.cpp @@ -1269,8 +1269,21 @@ void MSVCToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, // FIXME: There should probably be logic here to find libc++ on Windows. } +void MSVCToolChain::addLinkerHelper(const ArgList &Args, + ArgStringList &CmdArgs, + bool IsLinker, + StringRef Arg) const { + if (IsLinker) { + CmdArgs.push_back("-linker"); + CmdArgs.push_back(Args.MakeArgString(Arg)); + } else { + CmdArgs.push_back(Args.MakeArgString(Arg)); + } +} + void MSVCToolChain::AddFortranStdlibLibArgs(const ArgList &Args, - ArgStringList &CmdArgs) const { + ArgStringList &CmdArgs, + bool AddMLinker) const { bool staticFlangLibs = false; bool useOpenMP = false; @@ -1291,26 +1304,38 @@ void MSVCToolChain::AddFortranStdlibLibArgs(const ArgList &Args, useOpenMP = true; } + if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { + if (getDriver().IsFortranMode()) { + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:msvcrt"); + } else if (!getDriver().IsCLMode() && !getDriver().IsFortranMode()) { + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:libcmt"); + } + } + CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + D.Dir + "/../lib")); if (needFortranMain(D, Args)) { - CmdArgs.push_back("-defaultlib:flangmain"); - CmdArgs.push_back("-subsystem:console"); + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:flangmain"); + addLinkerHelper(Args, CmdArgs, AddMLinker, "/subsystem:console"); } if (staticFlangLibs) { - CmdArgs.push_back("-defaultlib:libflang"); - CmdArgs.push_back("-defaultlib:libflangrti"); + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:libflang"); + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:libflangrti"); if (!useOpenMP) { - CmdArgs.push_back("-defaultlib:libompstub"); + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:libompstub"); + } else { + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:libomp"); } } else { - CmdArgs.push_back("-defaultlib:flang"); - CmdArgs.push_back("-defaultlib:flangrti"); + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:flang"); + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:flangrti"); if (!useOpenMP) { - CmdArgs.push_back("-defaultlib:ompstub"); + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:ompstub"); + } else { + addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:omp"); } } } diff --git a/lib/Driver/ToolChains/MSVC.h b/lib/Driver/ToolChains/MSVC.h index 440542743a..ce887af204 100644 --- a/lib/Driver/ToolChains/MSVC.h +++ b/lib/Driver/ToolChains/MSVC.h @@ -107,7 +107,8 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { llvm::opt::ArgStringList &CC1Args) const override; void AddFortranStdlibLibArgs(const llvm::opt::ArgList &DriverArgs, - llvm::opt::ArgStringList &CC1Args) const override; + llvm::opt::ArgStringList &CC1Args, + bool AddMLinker=false) const override; void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; @@ -137,6 +138,11 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { Tool *buildLinker() const override; Tool *buildAssembler() const override; private: + void addLinkerHelper(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs, + bool IsLinker, + StringRef Arg) const; + std::string VCToolChainPath; ToolsetLayout VSLayout = ToolsetLayout::OlderVS; CudaInstallationDetector CudaInstallation; From e67ec96560c78519e8d5d79a48a71f3f97b3db98 Mon Sep 17 00:00:00 2001 From: xoviat Date: Tue, 7 Nov 2017 16:26:12 -0600 Subject: [PATCH 07/20] BPO c6e98d6 --- lib/Driver/ToolChains/Flang.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index 39dce6aeb6..5ad8253b28 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -872,7 +872,7 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, LowerCmdArgs.push_back("-target"); LowerCmdArgs.push_back(Args.MakeArgString(TripleStr)); - if (IsWindowsMSVC) { + if (IsWindowsMSVC && !Args.hasArg(options::OPT_noFlangLibs)) { getToolChain().AddFortranStdlibLibArgs(Args, LowerCmdArgs, true); if (needFortranMain(getToolChain().getDriver(), Args)) { LowerCmdArgs.push_back("-linker"); @@ -882,6 +882,10 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, } } + for (auto Arg : Args.filtered(options::OPT_noFlangLibs)) { + Arg->claim(); + } + C.addCommand(llvm::make_unique(JA, *this, LowerExec, LowerCmdArgs, Inputs)); } From e64caf401a718cc7e4ef14f7167e697973db524d Mon Sep 17 00:00:00 2001 From: xoviat Date: Wed, 8 Nov 2017 13:49:03 -0600 Subject: [PATCH 08/20] [toolchains:msvc] check addmlinker --- lib/Driver/ToolChains/MSVC.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/Driver/ToolChains/MSVC.cpp b/lib/Driver/ToolChains/MSVC.cpp index b376e1fb2c..0e5c08b67c 100644 --- a/lib/Driver/ToolChains/MSVC.cpp +++ b/lib/Driver/ToolChains/MSVC.cpp @@ -1312,8 +1312,10 @@ void MSVCToolChain::AddFortranStdlibLibArgs(const ArgList &Args, } } - CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + - D.Dir + "/../lib")); + if (!AddMLinker) { + CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + + D.Dir + "/../lib")); + } if (needFortranMain(D, Args)) { addLinkerHelper(Args, CmdArgs, AddMLinker, "/defaultlib:flangmain"); From 60166dc55acf0f6944e93cadea163695d2254d92 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 09:53:25 -0600 Subject: [PATCH 09/20] Toolschains: flang: fix -Mpreprocess Only run flang1 in preprocessor mode when -Mpreprocess is given. --- lib/Driver/ToolChains/Flang.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index 5ad8253b28..8d1e791fb4 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -660,6 +660,16 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__k8__"); UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__PGLLVM__"); + /* + When the -Mpreprocess option is given, we invoke the + preprocessor in flang1 and then exit. + */ + bool skipLower = false; + if (Args.hasArg(options::OPT_Mpreprocess)) { + UpperCmdArgs.push_back("-es"); + skipLower = true; + } + // Enable preprocessor if (Args.hasArg(options::OPT_Mpreprocess) || Args.hasArg(options::OPT_cpp) || @@ -817,6 +827,9 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, // For -fsyntax-only that is it if (Args.hasArg(options::OPT_fsyntax_only)) return; + // For the -Mpreprocess case; see above + if (skipLower) return; + /***** Lower part of Fortran frontend *****/ const char *LowerExec = Args.MakeArgString(getToolChain().GetProgramPath("flang2")); From 0c5ccbbc9af321ebcef419cd469af75834b12ea6 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 11:00:54 -0600 Subject: [PATCH 10/20] gitignore: add build --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 67bd957970..aed34187bc 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ docs/_build docs/analyzer/_build # debug info testsuite test/debuginfo-tests + +build \ No newline at end of file From 3d3f28173b65a580fe4a6527332732b0428f4a22 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 13:19:28 -0600 Subject: [PATCH 11/20] Driver: dont' use builtin preprocessor in fortran mode --- lib/Driver/Driver.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 283a8823d0..1f92b3bd00 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -216,8 +216,13 @@ phases::ID Driver::getFinalPhase(const DerivedArgList &DAL, Arg *PhaseArg = nullptr; phases::ID FinalPhase; + /* + Note: when passed '-E' and in fortran mode, we do not use the builtin + preprocessor. + */ // -{E,EP,P,M,MM} only run the preprocessor. - if (CCCIsCPP() || (PhaseArg = DAL.getLastArg(options::OPT_E)) || + if (CCCIsCPP() || (!IsFortranMode() && + (PhaseArg = DAL.getLastArg(options::OPT_E))) || (PhaseArg = DAL.getLastArg(options::OPT__SLASH_EP)) || (PhaseArg = DAL.getLastArg(options::OPT_M, options::OPT_MM)) || (PhaseArg = DAL.getLastArg(options::OPT__SLASH_P))) { From dd98a5cea3a9aba96b1a5853e9e8b9e28fccded4 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 13:41:07 -0600 Subject: [PATCH 12/20] Toolchains: flang: standardize preprocessor --- lib/Driver/ToolChains/Flang.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index c9f6861a17..27baa5644d 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -620,17 +620,17 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, preprocessor in flang1 and then exit. */ bool skipLower = false; - if (Args.hasArg(options::OPT_Mpreprocess)) { + if (Args.hasArg(options::OPT_E)) { UpperCmdArgs.push_back("-es"); skipLower = true; } // Enable preprocessor - if (Args.hasArg(options::OPT_Mpreprocess) || + if (Args.hasArg(options::OPT_E) || Args.hasArg(options::OPT_cpp) || types::getPreprocessedType(InputType) != types::TY_INVALID) { UpperCmdArgs.push_back("-preprocess"); - for (auto Arg : Args.filtered(options::OPT_Mpreprocess, options::OPT_cpp)) { + for (auto Arg : Args.filtered(options::OPT_E, options::OPT_cpp)) { Arg->claim(); } } @@ -782,7 +782,7 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, // For -fsyntax-only that is it if (Args.hasArg(options::OPT_fsyntax_only)) return; - // For the -Mpreprocess case; see above + // For the -E case; see above if (skipLower) return; /***** Lower part of Fortran frontend *****/ From 4eba8fbcca22e6572bcc9bbae51b890f7dc36fb0 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 14:08:13 -0600 Subject: [PATCH 13/20] Driver: get -E working with fortran --- lib/Driver/Driver.cpp | 3 ++- lib/Driver/ToolChains/Flang.cpp | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 1f92b3bd00..f4c93438dd 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -2769,7 +2769,8 @@ Action *Driver::ConstructPhaseAction(Compilation &C, const ArgList &Args, return C.MakeAction(Input, OutputTy); } case phases::FortranFrontend: { - if (Args.hasArg(options::OPT_fsyntax_only)) + if (Args.hasArg(options::OPT_fsyntax_only) || + Args.hasArg(options::OPT_E)) return C.MakeAction(Input, types::TY_Nothing); return C.MakeAction(Input, diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index 27baa5644d..bbe055c189 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -775,8 +775,12 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back(ModuleIndexFile); UpperCmdArgs.push_back("-output"); - UpperCmdArgs.push_back(ILMFile); - + if (skipLower) { + Arg *FinalOutput = Args.getLastArg(options::OPT_o); + UpperCmdArgs.push_back(FinalOutput->getValue()); + } else { + UpperCmdArgs.push_back(ILMFile); + } C.addCommand(llvm::make_unique(JA, *this, UpperExec, UpperCmdArgs, Inputs)); // For -fsyntax-only that is it From 59095943a76a2e7790fb98f57e9a734c65688f11 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 14:51:42 -0600 Subject: [PATCH 14/20] Toolchains: flang: claim OPT_E when needed --- lib/Driver/ToolChains/Flang.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index bbe055c189..66fef757a5 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -621,6 +621,9 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, */ bool skipLower = false; if (Args.hasArg(options::OPT_E)) { + for (auto Arg : Args.filtered(options::OPT_E)) { + Arg->claim(); + } UpperCmdArgs.push_back("-es"); skipLower = true; } From 349a06bdee92986fa5740f6a81afa71f9ff74d7b Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 15:55:56 -0600 Subject: [PATCH 15/20] Toolchains: flang: cleanup --- lib/Driver/ToolChains/Flang.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index 66fef757a5..4ff8038ef1 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -616,16 +616,10 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__PGLLVM__"); /* - When the -Mpreprocess option is given, we invoke the - preprocessor in flang1 and then exit. + When the -E option is given, run flang1 in preprocessor mode */ - bool skipLower = false; if (Args.hasArg(options::OPT_E)) { - for (auto Arg : Args.filtered(options::OPT_E)) { - Arg->claim(); - } UpperCmdArgs.push_back("-es"); - skipLower = true; } // Enable preprocessor @@ -778,7 +772,7 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back(ModuleIndexFile); UpperCmdArgs.push_back("-output"); - if (skipLower) { + if (Args.hasArg(options::OPT_E)) { Arg *FinalOutput = Args.getLastArg(options::OPT_o); UpperCmdArgs.push_back(FinalOutput->getValue()); } else { @@ -786,11 +780,9 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, } C.addCommand(llvm::make_unique(JA, *this, UpperExec, UpperCmdArgs, Inputs)); - // For -fsyntax-only that is it - if (Args.hasArg(options::OPT_fsyntax_only)) return; - - // For the -E case; see above - if (skipLower) return; + // For -fsyntax-only or -E that is it + if (Args.hasArg(options::OPT_fsyntax_only) || + Args.hasArg(options::OPT_E)) return; /***** Lower part of Fortran frontend *****/ From 26cd22621ed492bfb612ad1ca873e7464eb57b08 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 16:15:06 -0600 Subject: [PATCH 16/20] Toolchains: flang: check for nullptr --- lib/Driver/ToolChains/Flang.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index 4ff8038ef1..f45ab68728 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -774,7 +774,9 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back("-output"); if (Args.hasArg(options::OPT_E)) { Arg *FinalOutput = Args.getLastArg(options::OPT_o); - UpperCmdArgs.push_back(FinalOutput->getValue()); + if (FinalOutput != NULL) { + UpperCmdArgs.push_back(FinalOutput->getValue()); + } } else { UpperCmdArgs.push_back(ILMFile); } From 172bcaf675c0352ec0235b33ba8adfea47d88eba Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 17:18:01 -0600 Subject: [PATCH 17/20] Toolchains: flang: maybe fix encoding issues --- lib/Driver/ToolChains/Flang.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index f45ab68728..3c3a4aad11 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -773,9 +773,8 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back("-output"); if (Args.hasArg(options::OPT_E)) { - Arg *FinalOutput = Args.getLastArg(options::OPT_o); - if (FinalOutput != NULL) { - UpperCmdArgs.push_back(FinalOutput->getValue()); + if (Arg *A = Args.getLastArg(options::OPT_o)) { + UpperCmdArgs.push_back(Args.MakeArgString(A->getValue())); } } else { UpperCmdArgs.push_back(ILMFile); From 93e2a99dab717ae50b4fcb60bd0285648584ff70 Mon Sep 17 00:00:00 2001 From: xoviat Date: Thu, 28 Dec 2017 17:49:26 -0600 Subject: [PATCH 18/20] Toolchains: flang: fix garbage stem value --- lib/Driver/ToolChains/Flang.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index 3c3a4aad11..877269b827 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -57,7 +57,8 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, // Check file type sanity assert(types::isFortran(InputType) && "Can only accept Fortran"); - if (Args.hasArg(options::OPT_fsyntax_only)) { + if (Args.hasArg(options::OPT_fsyntax_only) || + Args.hasArg(options::OPT_E)) { // For -fsyntax-only produce temp files only Stem = C.getDriver().GetTemporaryPath("", ""); } else { From 16df77081a02cab827416c5996c4b46786dfbbb1 Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Sat, 30 Dec 2017 12:46:08 +0530 Subject: [PATCH 19/20] Restore -Mpreprocess --- lib/Driver/ToolChains/Flang.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index 877269b827..0aab0f56eb 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -57,8 +57,7 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, // Check file type sanity assert(types::isFortran(InputType) && "Can only accept Fortran"); - if (Args.hasArg(options::OPT_fsyntax_only) || - Args.hasArg(options::OPT_E)) { + if (Args.hasArg(options::OPT_fsyntax_only)) { // For -fsyntax-only produce temp files only Stem = C.getDriver().GetTemporaryPath("", ""); } else { @@ -617,7 +616,7 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back("-def"); UpperCmdArgs.push_back("__PGLLVM__"); /* - When the -E option is given, run flang1 in preprocessor mode + When the -E option is given, run flang1 in preprocessor only mode */ if (Args.hasArg(options::OPT_E)) { UpperCmdArgs.push_back("-es"); @@ -625,10 +624,12 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, // Enable preprocessor if (Args.hasArg(options::OPT_E) || + Args.hasArg(options::OPT_Mpreprocess) || Args.hasArg(options::OPT_cpp) || types::getPreprocessedType(InputType) != types::TY_INVALID) { UpperCmdArgs.push_back("-preprocess"); - for (auto Arg : Args.filtered(options::OPT_E, options::OPT_cpp)) { + for (auto Arg : Args.filtered(options::OPT_E, options::OPT_Mpreprocess, + options::OPT_cpp)) { Arg->claim(); } } @@ -774,9 +775,7 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back("-output"); if (Args.hasArg(options::OPT_E)) { - if (Arg *A = Args.getLastArg(options::OPT_o)) { - UpperCmdArgs.push_back(Args.MakeArgString(A->getValue())); - } + UpperCmdArgs.push_back(llvm::sys::path::filename(OutFile)); } else { UpperCmdArgs.push_back(ILMFile); } From 43d10d86f329693831d45f5f3e7d990b4eaf5a79 Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Sat, 30 Dec 2017 20:51:18 +0530 Subject: [PATCH 20/20] revert outfile changes --- lib/Driver/ToolChains/Flang.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/Driver/ToolChains/Flang.cpp b/lib/Driver/ToolChains/Flang.cpp index 0aab0f56eb..f05e49ce03 100644 --- a/lib/Driver/ToolChains/Flang.cpp +++ b/lib/Driver/ToolChains/Flang.cpp @@ -57,7 +57,8 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, // Check file type sanity assert(types::isFortran(InputType) && "Can only accept Fortran"); - if (Args.hasArg(options::OPT_fsyntax_only)) { + if (Args.hasArg(options::OPT_fsyntax_only) || + Args.hasArg(options::OPT_E)) { // For -fsyntax-only produce temp files only Stem = C.getDriver().GetTemporaryPath("", ""); } else { @@ -773,10 +774,13 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA, UpperCmdArgs.push_back("-modindex"); UpperCmdArgs.push_back(ModuleIndexFile); - UpperCmdArgs.push_back("-output"); if (Args.hasArg(options::OPT_E)) { - UpperCmdArgs.push_back(llvm::sys::path::filename(OutFile)); + if (Arg *A = Args.getLastArg(options::OPT_o)) { + UpperCmdArgs.push_back("-output"); + UpperCmdArgs.push_back(Args.MakeArgString(A->getValue())); + } } else { + UpperCmdArgs.push_back("-output"); UpperCmdArgs.push_back(ILMFile); } C.addCommand(llvm::make_unique(JA, *this, UpperExec, UpperCmdArgs, Inputs));