[clang-tools-extra] 35bee35 - [clang-tidy] prevent generated checks from triggering assertions on anonymous functions
Author: Bogdan Serea Date: 2020-08-12T12:43:40+01:00 New Revision: 35bee3503f4c33d92434a314e49e3e6f4f7419bc URL: https://github.com/llvm/llvm-project/commit/35bee3503f4c33d92434a314e49e3e6f4f7419bc DIFF: https://github.com/llvm/llvm-project/commit/35bee3503f4c33d92434a314e49e3e6f4f7419bc.diff LOG: [clang-tidy] prevent generated checks from triggering assertions on anonymous functions Skeleton checks generated by clang-tidy add_check.py cause assertions to fail when run over anonymous functions(lambda functions). This patch introduces an additional check to verify that the target function is not anonymous before calling getName(). The code snippet from the [[ https://clang.llvm.org/extra/clang-tidy/Contributing.html | clang-tidy tutorial ]]is also updated. Reviewed By: alexfh, DavidTruby Differential Revision: https://reviews.llvm.org/D85218 Added: Modified: clang-tools-extra/clang-tidy/add_new_check.py clang-tools-extra/docs/clang-tidy/Contributing.rst Removed: diff --git a/clang-tools-extra/clang-tidy/add_new_check.py b/clang-tools-extra/clang-tidy/add_new_check.py index 231f43c0b8f3..14fcfe8d49ff 100755 --- a/clang-tools-extra/clang-tidy/add_new_check.py +++ b/clang-tools-extra/clang-tidy/add_new_check.py @@ -136,7 +136,7 @@ def write_implementation(module_path, module, namespace, check_name_camel): void %(check_name)s::check(const MatchFinder::MatchResult &Result) { // FIXME: Add callback implementation. const auto *MatchedDecl = Result.Nodes.getNodeAs("x"); - if (MatchedDecl->getName().startswith("awesome_")) + if (!MatchedDecl->getIdentifier() || MatchedDecl->getName().startswith("awesome_")) return; diag(MatchedDecl->getLocation(), "function %%0 is insufficiently awesome") << MatchedDecl; diff --git a/clang-tools-extra/docs/clang-tidy/Contributing.rst b/clang-tools-extra/docs/clang-tidy/Contributing.rst index 3ed6dadb5e8b..6b7af479804d 100644 --- a/clang-tools-extra/docs/clang-tidy/Contributing.rst +++ b/clang-tools-extra/docs/clang-tidy/Contributing.rst @@ -202,7 +202,7 @@ can further inspect them and report diagnostics. void AwesomeFunctionNamesCheck::check(const MatchFinder::MatchResult &Result) { const auto *MatchedDecl = Result.Nodes.getNodeAs("x"); -if (MatchedDecl->getName().startswith("awesome_")) +if (!MatchedDecl->getIdentifier() || MatchedDecl->getName().startswith("awesome_")) return; diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome") << MatchedDecl ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
DavidTruby wrote: @bradking do you think this is ok to merge now? https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
DavidTruby wrote: > @DavidTruby please see my above retraction of the suggestion to rename > `.dynamic.lib` to `.dll.lib`. Ah, I missed that, I'll make that change back https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/70833 >From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH 1/8] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 2 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 23 +++ flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 157 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8b730e0f7ecd84..66d4794714c9529 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2842,7 +2842,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ad012d3d0d4b46f..1cac9a179eb960f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch(RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_debug.lib"); + CmdArgs.push_back("FortranRuntime.dynamic_debug.lib"); + CmdArgs.push_back("FortranDecimal.dynamic_debug.lib"); + break; +} } else { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.
[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
DavidTruby wrote: I've also started the work to get linker option directives (like "/DEFAULTLIB") added to MLIR's LLVMIR dialect so that we can do this the correct way: see #71720. I'd still like to merge this patch first though for the incremental improvement it does provide. Then once the MLIR support is merged I can switch over to using that and this should be resolved in the way that would help CMake's support for flang. https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/70833 >From 46057145d229e5b6ee7e6891f34d47b0d2aa818d Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 4 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 40 +++--- flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 169 insertions(+), 31 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 3409ce29ac56302..dacc4442b338a29 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2858,7 +2858,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index e19f1829c9fa82b..a81c9b6201f8158 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch (RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_dbg.lib"); + CmdArgs.push_back("FortranRuntime.static_dbg.lib"); + CmdArgs.push_back("FortranDecimal.static_dbg.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_dbg.lib"); + CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib"); + CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib"); + break; +} } else { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clan
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby closed https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)
https://github.com/DavidTruby created https://github.com/llvm/llvm-project/pull/72121 This patch adds a --depdendent-lib option to flang -fc1 on Windows to embed library link options into the object file. This is needed to properly select the Windows CRT to link against. >From cfd46a8825aa34b3e513d898ceb57f4e48e78faf Mon Sep 17 00:00:00 2001 From: David Truby Date: Mon, 13 Nov 2023 14:48:44 + Subject: [PATCH] [flang] Add depdendent-lib option to flang -fc1 on Windows This patch adds a --depdendent-lib option to flang -fc1 on Windows to embed library link options into the object file. This is needed to properly select the Windows CRT to link against. --- clang/include/clang/Driver/Options.td | 8 --- flang/include/flang/Frontend/CodeGenOptions.h | 3 +++ flang/lib/Frontend/CompilerInvocation.cpp | 23 +++ flang/lib/Frontend/FrontendActions.cpp| 23 +++ flang/test/Driver/dependent-lib.f90 | 7 ++ flang/test/Driver/driver-help.f90 | 1 + 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 flang/test/Driver/dependent-lib.f90 diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index d1b67a448b2a59b..c7eb52145f614b4 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">, def vectorize_slp : Flag<["-"], "vectorize-slp">, HelpText<"Run the SLP vectorization passes">, MarshallingInfoFlag>; -def dependent_lib : Joined<["--"], "dependent-lib=">, - HelpText<"Add dependent library">, - MarshallingInfoStringVector>; def linker_option : Joined<["--"], "linker-option=">, HelpText<"Add linker option">, MarshallingInfoStringVector>; @@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">, HelpText<"File is for a position independent executable">, MarshallingInfoFlag>; + +def dependent_lib : Joined<["--"], "dependent-lib=">, + HelpText<"Add dependent library">, + MarshallingInfoStringVector>; + } // let Visibility = [CC1Option, FC1Option] let Visibility = [CC1Option] in { diff --git a/flang/include/flang/Frontend/CodeGenOptions.h b/flang/include/flang/Frontend/CodeGenOptions.h index a3c39bda10667be..b86bb88610a9a4a 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.h +++ b/flang/include/flang/Frontend/CodeGenOptions.h @@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase { /// The format used for serializing remarks (default: YAML) std::string OptRecordFormat; + /// Options to add to the linker for the object file + std::vector DependentLibs; + // The RemarkKind enum class and OptRemark struct are identical to what Clang // has // TODO: Share with clang instead of re-implementing here diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 334da3ac287e3bf..cb4f2d6a6225205 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation &invoc, llvm::opt::ArgList &args, return true; } +static bool parseLinkerOptionsArgs(CompilerInvocation &invoc, + llvm::opt::ArgList &args, + clang::DiagnosticsEngine &diags) { + llvm::Triple triple = llvm::Triple(invoc.getTargetOpts().triple); + + // TODO: support --dependent-lib on other platforms when MLIR supports + // !llvm.dependent.lib + if (args.hasArg(clang::driver::options::OPT_dependent_lib) && + !triple.isOSWindows()) { +const unsigned diagID = +diags.getCustomDiagID(clang::DiagnosticsEngine::Error, + "--dependent-lib is only supported on Windows"); +diags.Report(diagID); +return false; + } + + invoc.getCodeGenOpts().DependentLibs = + args.getAllArgValues(clang::driver::options::OPT_dependent_lib); + return true; +} + bool CompilerInvocation::createFromArgs( CompilerInvocation &res, llvm::ArrayRef commandLineArgs, clang::DiagnosticsEngine &diags, const char *argv0) { @@ -1163,6 +1184,8 @@ bool CompilerInvocation::createFromArgs( success &= parseVScaleArgs(res, args, diags); + success &= parseLinkerOptionsArgs(res, args, diags); + // Set the string to be used as the return value of the COMPILER_OPTIONS // intrinsic of iso_fortran_env. This is either passed in from the parent // compiler driver invocation with an environment variable, or failing that diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index d7ca7b66584dd52..8df966571bc39ab 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -203,6 +203,26 @@ static void setMLIRDataLayout(mlir::ModuleOp &mlirModule, mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName
[clang] [flang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)
@@ -303,6 +323,9 @@ bool CodeGenAction::beginSourceFileAction() { Fortran::parser::Program &parseTree{*ci.getParsing().parseTree()}; lb.lower(parseTree, ci.getInvocation().getSemanticsContext()); + // Add dependent libraries + addDepdendentLibs(*mlirModule, ci); DavidTruby wrote: The consumer is that an LLVMIR dialect operation should be added to the MLIR module (in the global module scope) that will eventually get lowered by the standard MLIR LLVM dialect to LLVM ir transform. I don’t think it particularly matters where in the compilation flow that gets added as it doesn’t affect or get affected by any other transformation. I’m happy to add it later if you have a suggestion where it should be done, I mostly did it here because you still have all the information to construct the list of linker options without needing to pass any information further on. https://github.com/llvm/llvm-project/pull/72121 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/72121 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [clang-tools-extra] [llvm] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)
https://github.com/DavidTruby approved this pull request. LGTM with a few small comments. Please wait for @jeanPerier to approve before merging. https://github.com/llvm/llvm-project/pull/70917 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [flang] [clang-tools-extra] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)
@@ -13,6 +13,44 @@ #include "flang/Runtime/command.h" #include "flang/Runtime/descriptor.h" #include "flang/Runtime/io-api.h" +#include DavidTruby wrote: We should use `cstring` instead of `string.h` and make sure all C standard functions are prefixed with `std::` since this is a C++ file https://github.com/llvm/llvm-project/pull/70917 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [llvm] [clang-tools-extra] [clang] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)
@@ -13,6 +13,44 @@ #include "flang/Runtime/command.h" #include "flang/Runtime/descriptor.h" #include "flang/Runtime/io-api.h" +#include + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include + +#include // UNLEN=256 +#include // wcstombs_s DavidTruby wrote: `cstdlib` instead of `stdlib.h` https://github.com/llvm/llvm-project/pull/70917 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [llvm] [clang-tools-extra] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)
@@ -37,5 +75,19 @@ void FORTRAN_PROCEDURE_NAME(getarg)( (void)RTNAME(GetCommandArgument)( n, &value, nullptr, nullptr, __FILE__, __LINE__); } + +void FORTRAN_PROCEDURE_NAME(getlog)(std::int8_t *arg, std::int64_t length) { + std::array str; + int error = getlogin_r(str.data(), str.size()); + assert(error == 0 && "getlogin_r returned an error"); + + // Trim space from right/end + int i = str.size(); + while (' ' == str[--i]) { +str[i] = 0; + } DavidTruby wrote: `std::replace(str.rbegin(), str.rend(), ' ', '\0');` would be clearer I think? https://github.com/llvm/llvm-project/pull/70917 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [flang] [clang] [llvm] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)
@@ -37,5 +75,19 @@ void FORTRAN_PROCEDURE_NAME(getarg)( (void)RTNAME(GetCommandArgument)( n, &value, nullptr, nullptr, __FILE__, __LINE__); } + +void FORTRAN_PROCEDURE_NAME(getlog)(std::int8_t *arg, std::int64_t length) { + std::array str; + int error = getlogin_r(str.data(), str.size()); + assert(error == 0 && "getlogin_r returned an error"); + + // Trim space from right/end + int i = str.size(); + while (' ' == str[--i]) { +str[i] = 0; + } + strncpy(reinterpret_cast(arg), str.data(), length); DavidTruby wrote: `std::strncpy` https://github.com/llvm/llvm-project/pull/70917 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [flang] [clang] [llvm] [flang ]GETLOG runtime and extension implementation: get login username (PR #70917)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/70917 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [flang] [clang] [llvm] [flang] FDATE extension implementation: get date and time in ctime format (PR #71222)
https://github.com/DavidTruby approved this pull request. LGTM, maybe wait for @jeanPerier to check as well though. Thanks! https://github.com/llvm/llvm-project/pull/71222 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/72121 >From cfd46a8825aa34b3e513d898ceb57f4e48e78faf Mon Sep 17 00:00:00 2001 From: David Truby Date: Mon, 13 Nov 2023 14:48:44 + Subject: [PATCH 1/2] [flang] Add depdendent-lib option to flang -fc1 on Windows This patch adds a --depdendent-lib option to flang -fc1 on Windows to embed library link options into the object file. This is needed to properly select the Windows CRT to link against. --- clang/include/clang/Driver/Options.td | 8 --- flang/include/flang/Frontend/CodeGenOptions.h | 3 +++ flang/lib/Frontend/CompilerInvocation.cpp | 23 +++ flang/lib/Frontend/FrontendActions.cpp| 23 +++ flang/test/Driver/dependent-lib.f90 | 7 ++ flang/test/Driver/driver-help.f90 | 1 + 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 flang/test/Driver/dependent-lib.f90 diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index d1b67a448b2a59b..c7eb52145f614b4 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">, def vectorize_slp : Flag<["-"], "vectorize-slp">, HelpText<"Run the SLP vectorization passes">, MarshallingInfoFlag>; -def dependent_lib : Joined<["--"], "dependent-lib=">, - HelpText<"Add dependent library">, - MarshallingInfoStringVector>; def linker_option : Joined<["--"], "linker-option=">, HelpText<"Add linker option">, MarshallingInfoStringVector>; @@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">, HelpText<"File is for a position independent executable">, MarshallingInfoFlag>; + +def dependent_lib : Joined<["--"], "dependent-lib=">, + HelpText<"Add dependent library">, + MarshallingInfoStringVector>; + } // let Visibility = [CC1Option, FC1Option] let Visibility = [CC1Option] in { diff --git a/flang/include/flang/Frontend/CodeGenOptions.h b/flang/include/flang/Frontend/CodeGenOptions.h index a3c39bda10667be..b86bb88610a9a4a 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.h +++ b/flang/include/flang/Frontend/CodeGenOptions.h @@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase { /// The format used for serializing remarks (default: YAML) std::string OptRecordFormat; + /// Options to add to the linker for the object file + std::vector DependentLibs; + // The RemarkKind enum class and OptRemark struct are identical to what Clang // has // TODO: Share with clang instead of re-implementing here diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 334da3ac287e3bf..cb4f2d6a6225205 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation &invoc, llvm::opt::ArgList &args, return true; } +static bool parseLinkerOptionsArgs(CompilerInvocation &invoc, + llvm::opt::ArgList &args, + clang::DiagnosticsEngine &diags) { + llvm::Triple triple = llvm::Triple(invoc.getTargetOpts().triple); + + // TODO: support --dependent-lib on other platforms when MLIR supports + // !llvm.dependent.lib + if (args.hasArg(clang::driver::options::OPT_dependent_lib) && + !triple.isOSWindows()) { +const unsigned diagID = +diags.getCustomDiagID(clang::DiagnosticsEngine::Error, + "--dependent-lib is only supported on Windows"); +diags.Report(diagID); +return false; + } + + invoc.getCodeGenOpts().DependentLibs = + args.getAllArgValues(clang::driver::options::OPT_dependent_lib); + return true; +} + bool CompilerInvocation::createFromArgs( CompilerInvocation &res, llvm::ArrayRef commandLineArgs, clang::DiagnosticsEngine &diags, const char *argv0) { @@ -1163,6 +1184,8 @@ bool CompilerInvocation::createFromArgs( success &= parseVScaleArgs(res, args, diags); + success &= parseLinkerOptionsArgs(res, args, diags); + // Set the string to be used as the return value of the COMPILER_OPTIONS // intrinsic of iso_fortran_env. This is either passed in from the parent // compiler driver invocation with an environment variable, or failing that diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index d7ca7b66584dd52..8df966571bc39ab 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -203,6 +203,26 @@ static void setMLIRDataLayout(mlir::ModuleOp &mlirModule, mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec); } +static void addDepdendentLibs(mlir::ModuleOp &mlirModule, + CompilerInstance &ci) { + const std::vector &libs = + ci.getInvocation
[clang] [flang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/72121 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)
@@ -0,0 +1,7 @@ + +! RUN: %flang_fc1 -emit-mlir -triple aarch64-pc-windows-msvc --dependent-lib=libtest %s -o - 2>&1 | FileCheck %s +! RUN: %flang_fc1 -emit-mlir -triple x86_64-pc-windows-msvc --dependent-lib=libtest %s -o - 2>&1 | FileCheck %s DavidTruby wrote: I changed to use this but I'm not sure it's actually any clearer than just listing the run lines. Let me know what you think now that I've put it in 👍 https://github.com/llvm/llvm-project/pull/72121 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)
https://github.com/DavidTruby approved this pull request. LGTM sorry sometimes reviews get lost in the noise on GitHub... https://github.com/llvm/llvm-project/pull/74139 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [flang] [llvm] [clang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)
@@ -37,5 +77,30 @@ void FORTRAN_PROCEDURE_NAME(getarg)( (void)RTNAME(GetCommandArgument)( n, &value, nullptr, nullptr, __FILE__, __LINE__); } + +// CALL GETLOG(USRNAME) +void FORTRAN_PROCEDURE_NAME(getlog)(std::int8_t *arg, std::int64_t length) { DavidTruby wrote: nit: I think we should use `std::byte` instead of `std::int8_t`, while they're functionally going to be the same here since you're just casting it around it would be more clear that that's the intention for the type https://github.com/llvm/llvm-project/pull/74628 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang-tools-extra] [flang] [clang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)
@@ -6,6 +6,37 @@ // //===--===// +// character.h DavidTruby wrote: nit: `string.h` instead? This is really dealing with c-style strings rather than characters https://github.com/llvm/llvm-project/pull/74628 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [flang] [clang] [clang-tools-extra] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/74628 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [clang-tools-extra] [flang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)
https://github.com/DavidTruby approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/74628 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [clang-tools-extra] [flang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)
@@ -10,10 +10,50 @@ // extensions that will eventually be implemented in Fortran. #include "flang/Runtime/extensions.h" +#include "flang/Runtime/character.h" #include "flang/Runtime/command.h" #include "flang/Runtime/descriptor.h" #include "flang/Runtime/io-api.h" +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include + +#include // wcstombs_s +#include // UNLEN=256 +#include // wchar_t cast to LPWSTR +#pragma comment(lib, "Advapi32.lib") // Link Advapi32.lib for GetUserName DavidTruby wrote: This library will always be there on Windows so I don't know how much of an issue this is. We could avoid it by only getting from the environment variable on Windows? https://github.com/llvm/llvm-project/pull/74628 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add depdendent-lib option to flang -fc1 on Windows (PR #72121)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/72121 >From cfd46a8825aa34b3e513d898ceb57f4e48e78faf Mon Sep 17 00:00:00 2001 From: David Truby Date: Mon, 13 Nov 2023 14:48:44 + Subject: [PATCH 1/3] [flang] Add depdendent-lib option to flang -fc1 on Windows This patch adds a --depdendent-lib option to flang -fc1 on Windows to embed library link options into the object file. This is needed to properly select the Windows CRT to link against. --- clang/include/clang/Driver/Options.td | 8 --- flang/include/flang/Frontend/CodeGenOptions.h | 3 +++ flang/lib/Frontend/CompilerInvocation.cpp | 23 +++ flang/lib/Frontend/FrontendActions.cpp| 23 +++ flang/test/Driver/dependent-lib.f90 | 7 ++ flang/test/Driver/driver-help.f90 | 1 + 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 flang/test/Driver/dependent-lib.f90 diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index d1b67a448b2a59b..c7eb52145f614b4 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6796,9 +6796,6 @@ def vectorize_loops : Flag<["-"], "vectorize-loops">, def vectorize_slp : Flag<["-"], "vectorize-slp">, HelpText<"Run the SLP vectorization passes">, MarshallingInfoFlag>; -def dependent_lib : Joined<["--"], "dependent-lib=">, - HelpText<"Add dependent library">, - MarshallingInfoStringVector>; def linker_option : Joined<["--"], "linker-option=">, HelpText<"Add linker option">, MarshallingInfoStringVector>; @@ -7369,6 +7366,11 @@ def pic_is_pie : Flag<["-"], "pic-is-pie">, HelpText<"File is for a position independent executable">, MarshallingInfoFlag>; + +def dependent_lib : Joined<["--"], "dependent-lib=">, + HelpText<"Add dependent library">, + MarshallingInfoStringVector>; + } // let Visibility = [CC1Option, FC1Option] let Visibility = [CC1Option] in { diff --git a/flang/include/flang/Frontend/CodeGenOptions.h b/flang/include/flang/Frontend/CodeGenOptions.h index a3c39bda10667be..b86bb88610a9a4a 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.h +++ b/flang/include/flang/Frontend/CodeGenOptions.h @@ -70,6 +70,9 @@ class CodeGenOptions : public CodeGenOptionsBase { /// The format used for serializing remarks (default: YAML) std::string OptRecordFormat; + /// Options to add to the linker for the object file + std::vector DependentLibs; + // The RemarkKind enum class and OptRemark struct are identical to what Clang // has // TODO: Share with clang instead of re-implementing here diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 334da3ac287e3bf..cb4f2d6a6225205 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1054,6 +1054,27 @@ static bool parseVScaleArgs(CompilerInvocation &invoc, llvm::opt::ArgList &args, return true; } +static bool parseLinkerOptionsArgs(CompilerInvocation &invoc, + llvm::opt::ArgList &args, + clang::DiagnosticsEngine &diags) { + llvm::Triple triple = llvm::Triple(invoc.getTargetOpts().triple); + + // TODO: support --dependent-lib on other platforms when MLIR supports + // !llvm.dependent.lib + if (args.hasArg(clang::driver::options::OPT_dependent_lib) && + !triple.isOSWindows()) { +const unsigned diagID = +diags.getCustomDiagID(clang::DiagnosticsEngine::Error, + "--dependent-lib is only supported on Windows"); +diags.Report(diagID); +return false; + } + + invoc.getCodeGenOpts().DependentLibs = + args.getAllArgValues(clang::driver::options::OPT_dependent_lib); + return true; +} + bool CompilerInvocation::createFromArgs( CompilerInvocation &res, llvm::ArrayRef commandLineArgs, clang::DiagnosticsEngine &diags, const char *argv0) { @@ -1163,6 +1184,8 @@ bool CompilerInvocation::createFromArgs( success &= parseVScaleArgs(res, args, diags); + success &= parseLinkerOptionsArgs(res, args, diags); + // Set the string to be used as the return value of the COMPILER_OPTIONS // intrinsic of iso_fortran_env. This is either passed in from the parent // compiler driver invocation with an environment variable, or failing that diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index d7ca7b66584dd52..8df966571bc39ab 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -203,6 +203,26 @@ static void setMLIRDataLayout(mlir::ModuleOp &mlirModule, mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec); } +static void addDepdendentLibs(mlir::ModuleOp &mlirModule, + CompilerInstance &ci) { + const std::vector &libs = + ci.getInvocation
[flang] [clang] [flang] Add dependent-lib option to flang -fc1 on Windows (PR #72121)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/72121 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add dependent-lib option to flang -fc1 on Windows (PR #72121)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/72121 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add dependent-lib option to flang -fc1 on Windows (PR #72121)
https://github.com/DavidTruby closed https://github.com/llvm/llvm-project/pull/72121 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [coroutines] Introduce [[clang::coro_return_type]] and [[clang::coro_wrapper]] (PR #71945)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/71945 >From 89a2d60fc012742a74a008fb77213bcd47734503 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Fri, 10 Nov 2023 15:10:44 +0100 Subject: [PATCH 1/7] [coroutines] Introduce [[clang::coro_return_type]] and [[clang::co ro_wrapper]] --- clang/include/clang/Basic/Attr.td | 16 + clang/include/clang/Basic/AttrDocs.td | 67 +++ .../clang/Basic/DiagnosticSemaKinds.td| 4 ++ clang/include/clang/Sema/Sema.h | 1 + clang/lib/Sema/SemaDecl.cpp | 25 ++- ...a-attribute-supported-attributes-list.test | 2 + .../SemaCXX/coro-return-type-and-wrapper.cpp | 56 7 files changed, 169 insertions(+), 2 deletions(-) create mode 100644 clang/test/SemaCXX/coro-return-type-and-wrapper.cpp diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 31434565becaec6..f7a2b83b15ef5bc 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1094,6 +1094,22 @@ def CoroOnlyDestroyWhenComplete : InheritableAttr { let SimpleHandler = 1; } +def CoroReturnType : InheritableAttr { + let Spellings = [Clang<"coro_return_type">]; + let Subjects = SubjectList<[CXXRecord]>; + let LangOpts = [CPlusPlus]; + let Documentation = [CoroReturnTypeAndWrapperDoc]; + let SimpleHandler = 1; +} + +def CoroWrapper : InheritableAttr { + let Spellings = [Clang<"coro_wrapper">]; + let Subjects = SubjectList<[Function]>; + let LangOpts = [CPlusPlus]; + let Documentation = [CoroReturnTypeAndWrapperDoc]; + let SimpleHandler = 1; +} + // OSObject-based attributes. def OSConsumed : InheritableParamAttr { let Spellings = [Clang<"os_consumed">]; diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index fa6f6acd0c30e88..66c92bcaa2d4a4a 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -7482,3 +7482,70 @@ generation of the other destruction cases, optimizing the above `foo.destroy` to }]; } + + +def CoroReturnTypeAndWrapperDoc : Documentation { + let Category = DocCatDecl; + let Content = [{ +The `coro_only_destroy_when_complete` attribute should be marked on a C++ class. The coroutines +whose return type is marked with the attribute are assumed to be destroyed only after the coroutine has +reached the final suspend point. + +This is helpful for the optimizers to reduce the size of the destroy function for the coroutines. + +For example, + +.. code-block:: c++ + + A foo() { +dtor d; +co_await something(); +dtor d1; +co_await something(); +dtor d2; +co_return 43; + } + +The compiler may generate the following pseudocode: + +.. code-block:: c++ + + void foo.destroy(foo.Frame *frame) { +switch(frame->suspend_index()) { + case 1: +frame->d.~dtor(); +break; + case 2: +frame->d.~dtor(); +frame->d1.~dtor(); +break; + case 3: +frame->d.~dtor(); +frame->d1.~dtor(); +frame->d2.~dtor(); +break; + default: // coroutine completed or haven't started +break; +} + +frame->promise.~promise_type(); +delete frame; + } + +The `foo.destroy()` function's purpose is to release all of the resources +initialized for the coroutine when it is destroyed in a suspended state. +However, if the coroutine is only ever destroyed at the final suspend state, +the rest of the conditions are superfluous. + +The user can use the `coro_only_destroy_when_complete` attributo suppress +generation of the other destruction cases, optimizing the above `foo.destroy` to: + +.. code-block:: c++ + + void foo.destroy(foo.Frame *frame) { +frame->promise.~promise_type(); +delete frame; + } + + }]; +} diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4614324babb1c91..0200457b39ce5eb 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11591,6 +11591,10 @@ def err_conflicting_aligned_options : Error < def err_coro_invalid_addr_of_label : Error< "the GNU address of label extension is not allowed in coroutines." >; +def err_coroutine_return_type : Error< + "function returns a coroutine return type %0 but is neither a coroutine nor a coroutine wrapper; " + "non-coroutines should be marked with [[clang::coro_wrapper]] to allow returning coroutine return type" +>; } // end of coroutines issue category let CategoryName = "Documentation Issue" in { diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index f69f366c1750918..4d45698e5786740 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11183,6 +11183,7 @@ class Sema final { bool buildCoroutineParameterMoves(SourceLocation Loc); Var
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby created https://github.com/llvm/llvm-project/pull/72519 This patch uses the added --dependent-lib support to add the relevant runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file rather than on the link line. This should help CMake support for flang on Windows. >From b58c339f7e8fb4cefbe3bad36bb40518beecf864 Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 16 Nov 2023 14:32:27 + Subject: [PATCH] [flang] Add runtimes using --dependent-lib on MSVC targets This patch uses the added --dependent-lib support to add the relevant runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file rather than on the link line. This should help CMake support for flang on Windows. --- clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp| 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/Flang.cpp | 58 +++ clang/lib/Driver/ToolChains/FreeBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Gnu.cpp | 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp| 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Solaris.cpp | 2 +- flang/test/Driver/linker-flags.f90| 35 --- .../test/Driver/msvc-dependent-lib-flags.f90 | 36 15 files changed, 108 insertions(+), 86 deletions(-) create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90 diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 5d2cd1959b06925..55951162df50a75 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, +void tools::addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs) { - if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back(Args.MakeArgString( -"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); -unsigned RTOptionID = options::OPT__SLASH_MT; -if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { - RTOptionID = llvm::StringSwitch(rtl->getValue()) - .Case("static", options::OPT__SLASH_MT) - .Case("static_dbg", options::OPT__SLASH_MTd) - .Case("dll", options::OPT__SLASH_MD) - .Case("dll_dbg", options::OPT__SLASH_MDd) - .Default(options::OPT__SLASH_MT); -} -switch (RTOptionID) { -case options::OPT__SLASH_MT: - CmdArgs.push_back("/DEFAULTLIB:libcmt"); - CmdArgs.push_back("Fortran_main.static.lib"); - CmdArgs.push_back("FortranRuntime.static.lib"); - CmdArgs.push_back("FortranDecimal.static.lib"); - break; -case options::OPT__SLASH_MTd: - CmdArgs.push_back("/DEFAULTLIB:libcmtd"); - CmdArgs.push_back("Fortran_main.static_dbg.lib"); - CmdArgs.push_back("FortranRuntime.static_dbg.lib"); - CmdArgs.push_back("FortranDecimal.static_dbg.lib"); - break; -case options::OPT__SLASH_MD: - CmdArgs.push_back("/DEFAULTLIB:msvcrt"); - CmdArgs.push_back("Fortran_main.dynamic.lib"); - CmdArgs.push_back("FortranRuntime.dynamic.lib"); - CmdArgs.push_back("FortranDecimal.dynamic.lib"); - break; -case options::OPT__SLASH_MDd: - CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); - CmdArgs.push_back("Fortran_main.dynamic_dbg.lib"); - CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib"); - CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib"); - break; -} - } else { + // These are handled by adding link options to the object file on Windows + if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); CmdArgs.push_back("-lFortranDecimal"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 0a0951c5386e601..f364c9793c9be62 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, bool IsOffloadingHost = false, bool GompNeedsRT = false); /// Adds Fortran runtime libraries to \p CmdArgs. -void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args, +void addFortranRuntimeLibs(const ToolChain &TC,
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
DavidTruby wrote: @bradking I'm hoping this finally fixes this issue in a way that is more helpful to you, could you confirm that for me? Thanks! https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/72519 >From b58c339f7e8fb4cefbe3bad36bb40518beecf864 Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 16 Nov 2023 14:32:27 + Subject: [PATCH 1/2] [flang] Add runtimes using --dependent-lib on MSVC targets This patch uses the added --dependent-lib support to add the relevant runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file rather than on the link line. This should help CMake support for flang on Windows. --- clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp| 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/Flang.cpp | 58 +++ clang/lib/Driver/ToolChains/FreeBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Gnu.cpp | 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp| 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Solaris.cpp | 2 +- flang/test/Driver/linker-flags.f90| 35 --- .../test/Driver/msvc-dependent-lib-flags.f90 | 36 15 files changed, 108 insertions(+), 86 deletions(-) create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90 diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 5d2cd1959b06925c..55951162df50a758 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, +void tools::addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs) { - if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back(Args.MakeArgString( -"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); -unsigned RTOptionID = options::OPT__SLASH_MT; -if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { - RTOptionID = llvm::StringSwitch(rtl->getValue()) - .Case("static", options::OPT__SLASH_MT) - .Case("static_dbg", options::OPT__SLASH_MTd) - .Case("dll", options::OPT__SLASH_MD) - .Case("dll_dbg", options::OPT__SLASH_MDd) - .Default(options::OPT__SLASH_MT); -} -switch (RTOptionID) { -case options::OPT__SLASH_MT: - CmdArgs.push_back("/DEFAULTLIB:libcmt"); - CmdArgs.push_back("Fortran_main.static.lib"); - CmdArgs.push_back("FortranRuntime.static.lib"); - CmdArgs.push_back("FortranDecimal.static.lib"); - break; -case options::OPT__SLASH_MTd: - CmdArgs.push_back("/DEFAULTLIB:libcmtd"); - CmdArgs.push_back("Fortran_main.static_dbg.lib"); - CmdArgs.push_back("FortranRuntime.static_dbg.lib"); - CmdArgs.push_back("FortranDecimal.static_dbg.lib"); - break; -case options::OPT__SLASH_MD: - CmdArgs.push_back("/DEFAULTLIB:msvcrt"); - CmdArgs.push_back("Fortran_main.dynamic.lib"); - CmdArgs.push_back("FortranRuntime.dynamic.lib"); - CmdArgs.push_back("FortranDecimal.dynamic.lib"); - break; -case options::OPT__SLASH_MDd: - CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); - CmdArgs.push_back("Fortran_main.dynamic_dbg.lib"); - CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib"); - CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib"); - break; -} - } else { + // These are handled by adding link options to the object file on Windows + if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); CmdArgs.push_back("-lFortranDecimal"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 0a0951c5386e6013..f364c9793c9be62d 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, bool IsOffloadingHost = false, bool GompNeedsRT = false); /// Adds Fortran runtime libraries to \p CmdArgs. -void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args, +void addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs); /// Adds the path for the Fortran runtime libraries to \p CmdArgs. diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 7481f6cab9
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
DavidTruby wrote: > I tried this locally, but it doesn't quite work: > > ``` > >flang-new foo.f90 > ... fatal error LNK1276: invalid directive 'clang_rt.builtins-x86_64.lib' > found; does not start with '/' > ``` > > The directives appear in the object file with an extra space: > > ``` > >flang-new -c foo.f90 > >grep -ai defaultlib foo.o > /DEFAULTLIB: clang_rt.builtins-x86_64.lib /DEFAULTLIB: libcmt /DEFAULTLIB: > Fortran_main.static.lib /DEFAULTLIB: FortranRuntime.static.lib /DEFAULTLIB: > FortranDecimal.static.lib.text > ``` > > There should not be a space after `/DEFAULTLIB:` before the library name. This looks like a small bug in the previous patch in this series due to a misunderstanding by me of how `llvm.linker.options` works. I'll push a quick fix for that and then rebase this patch on that which should fix the issue https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/72519 >From eeb1e7c7b7905d541c9359bd1800fdfb70f0219e Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 16 Nov 2023 14:32:27 + Subject: [PATCH] [flang] Add runtimes using --dependent-lib on MSVC targets This patch uses the added --dependent-lib support to add the relevant runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file rather than on the link line. This should help CMake support for flang on Windows. --- clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp| 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/Flang.cpp | 57 +++ clang/lib/Driver/ToolChains/FreeBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Gnu.cpp | 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp| 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Solaris.cpp | 2 +- flang/test/Driver/linker-flags.f90| 35 .../test/Driver/msvc-dependent-lib-flags.f90 | 36 15 files changed, 107 insertions(+), 86 deletions(-) create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90 diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 5d2cd1959b06925..55951162df50a75 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, +void tools::addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs) { - if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back(Args.MakeArgString( -"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); -unsigned RTOptionID = options::OPT__SLASH_MT; -if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { - RTOptionID = llvm::StringSwitch(rtl->getValue()) - .Case("static", options::OPT__SLASH_MT) - .Case("static_dbg", options::OPT__SLASH_MTd) - .Case("dll", options::OPT__SLASH_MD) - .Case("dll_dbg", options::OPT__SLASH_MDd) - .Default(options::OPT__SLASH_MT); -} -switch (RTOptionID) { -case options::OPT__SLASH_MT: - CmdArgs.push_back("/DEFAULTLIB:libcmt"); - CmdArgs.push_back("Fortran_main.static.lib"); - CmdArgs.push_back("FortranRuntime.static.lib"); - CmdArgs.push_back("FortranDecimal.static.lib"); - break; -case options::OPT__SLASH_MTd: - CmdArgs.push_back("/DEFAULTLIB:libcmtd"); - CmdArgs.push_back("Fortran_main.static_dbg.lib"); - CmdArgs.push_back("FortranRuntime.static_dbg.lib"); - CmdArgs.push_back("FortranDecimal.static_dbg.lib"); - break; -case options::OPT__SLASH_MD: - CmdArgs.push_back("/DEFAULTLIB:msvcrt"); - CmdArgs.push_back("Fortran_main.dynamic.lib"); - CmdArgs.push_back("FortranRuntime.dynamic.lib"); - CmdArgs.push_back("FortranDecimal.dynamic.lib"); - break; -case options::OPT__SLASH_MDd: - CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); - CmdArgs.push_back("Fortran_main.dynamic_dbg.lib"); - CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib"); - CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib"); - break; -} - } else { + // These are handled by adding link options to the object file on Windows + if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); CmdArgs.push_back("-lFortranDecimal"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 0a0951c5386e601..f364c9793c9be62 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, bool IsOffloadingHost = false, bool GompNeedsRT = false); /// Adds Fortran runtime libraries to \p CmdArgs. -void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args, +void addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs); /// Adds the path for the Fortran runtime libraries to \p CmdArgs. diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 7c3d4982d8f6a8c..1
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
DavidTruby wrote: @bradking this now works for me at least locally, sorry for the confusion https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
DavidTruby wrote: > Could you remind the rationale behind an empty `-fuse-ld=`? I don't know that there is one honestly, I copied these build lines from another file! Happy to remove it https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
@@ -0,0 +1,36 @@ +! RUN: %flang -### --target=aarch64-windows-msvc -fuse-ld= %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC DavidTruby wrote: I don't know that there is one honestly, I copied these build lines from another file! Happy to remove it https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
@@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, +void tools::addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs) { - if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back(Args.MakeArgString( -"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); -unsigned RTOptionID = options::OPT__SLASH_MT; -if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { - RTOptionID = llvm::StringSwitch(rtl->getValue()) - .Case("static", options::OPT__SLASH_MT) - .Case("static_dbg", options::OPT__SLASH_MTd) - .Case("dll", options::OPT__SLASH_MD) - .Case("dll_dbg", options::OPT__SLASH_MDd) - .Default(options::OPT__SLASH_MT); -} -switch (RTOptionID) { -case options::OPT__SLASH_MT: - CmdArgs.push_back("/DEFAULTLIB:libcmt"); - CmdArgs.push_back("Fortran_main.static.lib"); - CmdArgs.push_back("FortranRuntime.static.lib"); - CmdArgs.push_back("FortranDecimal.static.lib"); - break; -case options::OPT__SLASH_MTd: - CmdArgs.push_back("/DEFAULTLIB:libcmtd"); - CmdArgs.push_back("Fortran_main.static_dbg.lib"); - CmdArgs.push_back("FortranRuntime.static_dbg.lib"); - CmdArgs.push_back("FortranDecimal.static_dbg.lib"); - break; -case options::OPT__SLASH_MD: - CmdArgs.push_back("/DEFAULTLIB:msvcrt"); - CmdArgs.push_back("Fortran_main.dynamic.lib"); - CmdArgs.push_back("FortranRuntime.dynamic.lib"); - CmdArgs.push_back("FortranDecimal.dynamic.lib"); - break; -case options::OPT__SLASH_MDd: - CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); - CmdArgs.push_back("Fortran_main.dynamic_dbg.lib"); - CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib"); - CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib"); - break; -} - } else { + // These are handled by adding link options to the object file on Windows + if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) { DavidTruby wrote: No, these are added automatically. They're just added at a different place, because they aren't added to the link line but rather added as link directives in the object file, matching what cl.exe and clang do and therefore what link.exe expects. https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
DavidTruby wrote: the new file (msvc-dependent-lib-flags) just tests this specific feature; I can probably just put that in the other linker flags file but that's getting rather big anyway and doesn't necessarily need yet more run lines added to it! https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
DavidTruby wrote: Yes, these are checking the invocation of the frontend driver https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/72519 >From eeb1e7c7b7905d541c9359bd1800fdfb70f0219e Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 16 Nov 2023 14:32:27 + Subject: [PATCH 1/2] [flang] Add runtimes using --dependent-lib on MSVC targets This patch uses the added --dependent-lib support to add the relevant runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file rather than on the link line. This should help CMake support for flang on Windows. --- clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp| 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/Flang.cpp | 57 +++ clang/lib/Driver/ToolChains/FreeBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Gnu.cpp | 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp| 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Solaris.cpp | 2 +- flang/test/Driver/linker-flags.f90| 35 .../test/Driver/msvc-dependent-lib-flags.f90 | 36 15 files changed, 107 insertions(+), 86 deletions(-) create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90 diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 5d2cd1959b06925..55951162df50a75 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, +void tools::addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs) { - if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back(Args.MakeArgString( -"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); -unsigned RTOptionID = options::OPT__SLASH_MT; -if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { - RTOptionID = llvm::StringSwitch(rtl->getValue()) - .Case("static", options::OPT__SLASH_MT) - .Case("static_dbg", options::OPT__SLASH_MTd) - .Case("dll", options::OPT__SLASH_MD) - .Case("dll_dbg", options::OPT__SLASH_MDd) - .Default(options::OPT__SLASH_MT); -} -switch (RTOptionID) { -case options::OPT__SLASH_MT: - CmdArgs.push_back("/DEFAULTLIB:libcmt"); - CmdArgs.push_back("Fortran_main.static.lib"); - CmdArgs.push_back("FortranRuntime.static.lib"); - CmdArgs.push_back("FortranDecimal.static.lib"); - break; -case options::OPT__SLASH_MTd: - CmdArgs.push_back("/DEFAULTLIB:libcmtd"); - CmdArgs.push_back("Fortran_main.static_dbg.lib"); - CmdArgs.push_back("FortranRuntime.static_dbg.lib"); - CmdArgs.push_back("FortranDecimal.static_dbg.lib"); - break; -case options::OPT__SLASH_MD: - CmdArgs.push_back("/DEFAULTLIB:msvcrt"); - CmdArgs.push_back("Fortran_main.dynamic.lib"); - CmdArgs.push_back("FortranRuntime.dynamic.lib"); - CmdArgs.push_back("FortranDecimal.dynamic.lib"); - break; -case options::OPT__SLASH_MDd: - CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); - CmdArgs.push_back("Fortran_main.dynamic_dbg.lib"); - CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib"); - CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib"); - break; -} - } else { + // These are handled by adding link options to the object file on Windows + if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); CmdArgs.push_back("-lFortranDecimal"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 0a0951c5386e601..f364c9793c9be62 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, bool IsOffloadingHost = false, bool GompNeedsRT = false); /// Adds Fortran runtime libraries to \p CmdArgs. -void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args, +void addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs); /// Adds the path for the Fortran runtime libraries to \p CmdArgs. diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 7c3d4982d8f6a
[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby created https://github.com/llvm/llvm-project/pull/70833 Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. >From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 2 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 23 +++ flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 157 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8b730e0f7ecd84..66d4794714c9529 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2842,7 +2842,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ad012d3d0d4b46f..1cac9a179eb960f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch(RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_debug.lib"); + CmdArgs.push_back("Fortra
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
DavidTruby wrote: @bradking I don't appear to be able to add you as a reviewer but it might be worth you having a look at this too, thanks! https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/70833 >From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH 1/2] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 2 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 23 +++ flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 157 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8b730e0f7ecd84..66d4794714c9529 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2842,7 +2842,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ad012d3d0d4b46f..1cac9a179eb960f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch(RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_debug.lib"); + CmdArgs.push_back("FortranRuntime.dynamic_debug.lib"); + CmdArgs.push_back("FortranDecimal.dynamic_debug.lib"); + break; +} } else { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.
[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
@@ -53,3 +53,26 @@ add_flang_library(FortranDecimal INSTALL_WITH_TOOLCHAIN binary-to-decimal.cpp decimal-to-binary.cpp ) + +if (DEFINED MSVC) + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded) DavidTruby wrote: Yeah I tried this but inside add_flang_library these are made into custom targets (meaning the target property doesn’t do anything) and I’m not entirely sure why so I didn’t want to mess with it too much. I’ll give it another try https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/70833 >From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH 1/3] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 2 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 23 +++ flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 157 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8b730e0f7ecd84..66d4794714c9529 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2842,7 +2842,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ad012d3d0d4b46f..1cac9a179eb960f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch(RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_debug.lib"); + CmdArgs.push_back("FortranRuntime.dynamic_debug.lib"); + CmdArgs.push_back("FortranDecimal.dynamic_debug.lib"); + break; +} } else { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.
[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch (RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; DavidTruby wrote: Is there a way to add defaultlib directives using a CLI tool, or do they _have_ to be added when the compiler creates the object file? The main issue is we have an MLIR step in between flang and LLVM IR and I don't believe MLIR supports the attributes for setting these defaultlib directives yet, so implimenting that might be quite a lot of work... It's not so much that we would have difficulty adding the specific defaultlib directive we need, as that we'd have an issue adding any of them. https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; DavidTruby wrote: I think we should take the opportunity to match what clang's default behaviour is here, which is to pass `/MT`. I think having the two do something different is surprising at the moment and should be changed. https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch (RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; DavidTruby wrote: Having had a look, I think we can replicate what clang -cc1's `--dependent-lib=` setting does possibly https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
DavidTruby wrote: > > Do we really need to have all 4 variants of the 3 fortran runtime > > libraries? That's a lot of complexity. Can we pare it down to just > > static/dynamic? It's also sometimes possible to generate code that works in > > both the static and dynamic context, depending on what is in those > > libraries. We don't create 4 variants of clang_rt.builtins, for examle. > > From glancing at the fortran runtime code, I think the answer is probably > "no". There is too much C++ standard library usage. If you wish to avoid this > build complexity, you may consider writing code in the STL-less style that is > used for C++ code in the sanitizers in compiler-rt. I don't think we can avoid it if we want to allow anyone to link flang-generated object files into a C/C++ application. I don't think we could even get it down to static/dynamic reliably without committing to not only not using the STL but not using any C/C++ functions that might call into the runtime (as compiler-rt builtins does). I don't think that's a route we want to go down with the flang runtime; I think we'd generally put build complexity secondary to code complexity in here ( https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
@@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; DavidTruby wrote: I should be adding the missing compiler-rt libs in this patch too. I don’t see any missing symbols in any of the configurations when testing an empty program locally. Could you share the error you’re seeing? https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/70833 >From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH 1/5] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 2 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 23 +++ flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 157 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8b730e0f7ecd84..66d4794714c9529 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2842,7 +2842,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ad012d3d0d4b46f..1cac9a179eb960f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch(RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_debug.lib"); + CmdArgs.push_back("FortranRuntime.dynamic_debug.lib"); + CmdArgs.push_back("FortranDecimal.dynamic_debug.lib"); + break; +} } else { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/70833 >From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH 1/4] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 2 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 23 +++ flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 157 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8b730e0f7ecd84..66d4794714c9529 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2842,7 +2842,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ad012d3d0d4b46f..1cac9a179eb960f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch(RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_debug.lib"); + CmdArgs.push_back("FortranRuntime.dynamic_debug.lib"); + CmdArgs.push_back("FortranDecimal.dynamic_debug.lib"); + break; +} } else { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.
[flang] [clang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/70833 >From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH 1/6] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 2 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 23 +++ flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 157 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8b730e0f7ecd84..66d4794714c9529 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2842,7 +2842,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ad012d3d0d4b46f..1cac9a179eb960f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch(RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_debug.lib"); + CmdArgs.push_back("FortranRuntime.dynamic_debug.lib"); + CmdArgs.push_back("FortranDecimal.dynamic_debug.lib"); + break; +} } else { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
@@ -281,3 +281,26 @@ add_flang_library(FortranRuntime INSTALL_WITH_TOOLCHAIN ) + +if (DEFINED MSVC) + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded) + add_flang_library(FortranRuntime.static ${sources} DavidTruby wrote: The plain FortranRuntime library is linked by the Runtime tests, which need to be built against whatever the user built LLVM with, which we can't necessarily find out that easily I think. It should not have INSTALL_WITH_TOOLCHAIN set though, I'll remove that https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/70833 >From 9e84729cada6c032c64934ee519e605407aab049 Mon Sep 17 00:00:00 2001 From: David Truby Date: Tue, 31 Oct 2023 15:07:13 + Subject: [PATCH 1/7] [flang][windows] Add option to link against specific MSVC CRT Currently flang's runtime libraries are only built for the specific CRT that LLVM itself was built against. This patch adds the cmake logic for building a separate runtime for each CRT configuration and adds a flag for selecting a CRT configuration to link against. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 42 +-- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/FreeBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Gnu.cpp| 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp | 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp| 2 +- clang/lib/Driver/ToolChains/Solaris.cpp| 2 +- flang/lib/Decimal/CMakeLists.txt | 23 +++ flang/runtime/CMakeLists.txt | 23 +++ flang/runtime/FortranMain/CMakeLists.txt | 18 + flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 2 + flang/test/Driver/linker-flags.f90 | 47 ++ 19 files changed, 157 insertions(+), 24 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8b730e0f7ecd84..66d4794714c9529 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2842,7 +2842,7 @@ def fms_compatibility_version "version number to report in _MSC_VER (0 = don't define it " "(default))">; def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group, - Flags<[]>, Visibility<[ClangOption, CLOption]>, + Flags<[]>, Visibility<[ClangOption, CLOption, FlangOption]>, Values<"static,static_dbg,dll,dll_dbg">, HelpText<"Select Windows run-time library">, DocBrief<[{ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index ad012d3d0d4b46f..1cac9a179eb960f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -976,12 +976,46 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, +void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back("Fortran_main.lib"); -CmdArgs.push_back("FortranRuntime.lib"); -CmdArgs.push_back("FortranDecimal.lib"); +CmdArgs.push_back(Args.MakeArgString( +"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); +unsigned RTOptionID = options::OPT__SLASH_MT; +if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { + RTOptionID = llvm::StringSwitch(rtl->getValue()) + .Case("static", options::OPT__SLASH_MT) + .Case("static_dbg", options::OPT__SLASH_MTd) + .Case("dll", options::OPT__SLASH_MD) + .Case("dll_dbg", options::OPT__SLASH_MDd) + .Default(options::OPT__SLASH_MT); +} +switch(RTOptionID) { +case options::OPT__SLASH_MT: + CmdArgs.push_back("/DEFAULTLIB:libcmt"); + CmdArgs.push_back("Fortran_main.static.lib"); + CmdArgs.push_back("FortranRuntime.static.lib"); + CmdArgs.push_back("FortranDecimal.static.lib"); + break; +case options::OPT__SLASH_MTd: + CmdArgs.push_back("/DEFAULTLIB:libcmtd"); + CmdArgs.push_back("Fortran_main.static_debug.lib"); + CmdArgs.push_back("FortranRuntime.static_debug.lib"); + CmdArgs.push_back("FortranDecimal.static_debug.lib"); + break; +case options::OPT__SLASH_MD: + CmdArgs.push_back("/DEFAULTLIB:msvcrt"); + CmdArgs.push_back("Fortran_main.dynamic.lib"); + CmdArgs.push_back("FortranRuntime.dynamic.lib"); + CmdArgs.push_back("FortranDecimal.dynamic.lib"); + break; +case options::OPT__SLASH_MDd: + CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); + CmdArgs.push_back("Fortran_main.dynamic_debug.lib"); + CmdArgs.push_back("FortranRuntime.dynamic_debug.lib"); + CmdArgs.push_back("FortranDecimal.dynamic_debug.lib"); + break; +} } else { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.
[clang] [flang] [flang][windows] Add option to link against specific MSVC CRT (PR #70833)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/70833 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
DavidTruby wrote: I've had to add it as just `-fc1` because of the way lit does argument passing on Windows (it puts the "flang-new" and "-fc1" in quotes, but only sometimes :)) https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/72519 >From eeb1e7c7b7905d541c9359bd1800fdfb70f0219e Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 16 Nov 2023 14:32:27 + Subject: [PATCH 1/3] [flang] Add runtimes using --dependent-lib on MSVC targets This patch uses the added --dependent-lib support to add the relevant runtimes on MSVC targets as `/DEFAULTLIB:` sections in the object file rather than on the link line. This should help CMake support for flang on Windows. --- clang/lib/Driver/ToolChains/CommonArgs.cpp| 43 +- clang/lib/Driver/ToolChains/CommonArgs.h | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp| 2 +- clang/lib/Driver/ToolChains/DragonFly.cpp | 2 +- clang/lib/Driver/ToolChains/Flang.cpp | 57 +++ clang/lib/Driver/ToolChains/FreeBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Gnu.cpp | 2 +- clang/lib/Driver/ToolChains/Haiku.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 2 +- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/NetBSD.cpp| 2 +- clang/lib/Driver/ToolChains/OpenBSD.cpp | 2 +- clang/lib/Driver/ToolChains/Solaris.cpp | 2 +- flang/test/Driver/linker-flags.f90| 35 .../test/Driver/msvc-dependent-lib-flags.f90 | 36 15 files changed, 107 insertions(+), 86 deletions(-) create mode 100644 flang/test/Driver/msvc-dependent-lib-flags.f90 diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 5d2cd1959b06925..55951162df50a75 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -977,47 +977,10 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, return true; } -void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, +void tools::addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs) { - if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { -CmdArgs.push_back(Args.MakeArgString( -"/DEFAULTLIB:" + TC.getCompilerRTBasename(Args, "builtins"))); -unsigned RTOptionID = options::OPT__SLASH_MT; -if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { - RTOptionID = llvm::StringSwitch(rtl->getValue()) - .Case("static", options::OPT__SLASH_MT) - .Case("static_dbg", options::OPT__SLASH_MTd) - .Case("dll", options::OPT__SLASH_MD) - .Case("dll_dbg", options::OPT__SLASH_MDd) - .Default(options::OPT__SLASH_MT); -} -switch (RTOptionID) { -case options::OPT__SLASH_MT: - CmdArgs.push_back("/DEFAULTLIB:libcmt"); - CmdArgs.push_back("Fortran_main.static.lib"); - CmdArgs.push_back("FortranRuntime.static.lib"); - CmdArgs.push_back("FortranDecimal.static.lib"); - break; -case options::OPT__SLASH_MTd: - CmdArgs.push_back("/DEFAULTLIB:libcmtd"); - CmdArgs.push_back("Fortran_main.static_dbg.lib"); - CmdArgs.push_back("FortranRuntime.static_dbg.lib"); - CmdArgs.push_back("FortranDecimal.static_dbg.lib"); - break; -case options::OPT__SLASH_MD: - CmdArgs.push_back("/DEFAULTLIB:msvcrt"); - CmdArgs.push_back("Fortran_main.dynamic.lib"); - CmdArgs.push_back("FortranRuntime.dynamic.lib"); - CmdArgs.push_back("FortranDecimal.dynamic.lib"); - break; -case options::OPT__SLASH_MDd: - CmdArgs.push_back("/DEFAULTLIB:msvcrtd"); - CmdArgs.push_back("Fortran_main.dynamic_dbg.lib"); - CmdArgs.push_back("FortranRuntime.dynamic_dbg.lib"); - CmdArgs.push_back("FortranDecimal.dynamic_dbg.lib"); - break; -} - } else { + // These are handled by adding link options to the object file on Windows + if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) { CmdArgs.push_back("-lFortran_main"); CmdArgs.push_back("-lFortranRuntime"); CmdArgs.push_back("-lFortranDecimal"); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 0a0951c5386e601..f364c9793c9be62 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -116,7 +116,7 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, bool IsOffloadingHost = false, bool GompNeedsRT = false); /// Adds Fortran runtime libraries to \p CmdArgs. -void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args, +void addFortranRuntimeLibs(const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs); /// Adds the path for the Fortran runtime libraries to \p CmdArgs. diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 7c3d4982d8f6a
[clang] [flang] [flang] Add runtimes using --dependent-lib on MSVC targets (PR #72519)
https://github.com/DavidTruby closed https://github.com/llvm/llvm-project/pull/72519 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
https://github.com/DavidTruby created https://github.com/llvm/llvm-project/pull/73250 None >From 656463c6298b981cbd43d1d5042438eab700143b Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 23 Nov 2023 15:32:57 + Subject: [PATCH] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI --- clang/lib/Driver/ToolChains/Flang.cpp | 24 flang/test/Driver/msvc-defines.f90| 10 ++ 2 files changed, 34 insertions(+) create mode 100644 flang/test/Driver/msvc-defines.f90 diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 01f07b9228256cf..87aa546e5549423 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args, } } +static void addVSDefines(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + + unsigned ver = 0; + const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args); + ver = vt.getMajor() * 1000 + vt.getMinor().value_or(0) * 10 + +vt.getSubminor().value_or(0); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10))); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver))); + + llvm::Triple triple = TC.getTriple(); + if (triple.isAArch64()) { +CmdArgs.push_back("-D_M_ARM64=1"); + } else if (triple.isX86() && triple.isArch32Bit()) { +CmdArgs.push_back("-D_M_IX86=600"); + } else if (triple.isX86() && triple.isArch64Bit()) { +CmdArgs.push_back("-D_M_X64=100"); + } else { +llvm_unreachable( +"Flang on Windows only supports X86_32, X86_64 and AArch64"); + } +} + static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { assert(TC.getTriple().isKnownWindowsMSVCEnvironment() && @@ -322,6 +345,7 @@ void Flang::addTargetOptions(const ArgList &Args, if (Triple.isKnownWindowsMSVCEnvironment()) { processVSRuntimeLibrary(TC, Args, CmdArgs); +addVSDefines(TC, Args, CmdArgs); } // TODO: Add target specific flags, ABI, mtune option etc. diff --git a/flang/test/Driver/msvc-defines.f90 b/flang/test/Driver/msvc-defines.f90 new file mode 100644 index 000..97a6ce888d7f579 --- /dev/null +++ b/flang/test/Driver/msvc-defines.f90 @@ -0,0 +1,10 @@ +! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64 +! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_32 +! RUN: %flang -### --target=x86_64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_64 + +! MSVC: -fc1 +! MSVC-SAME: -D_MSC_VER={{[0-9]*}} +! MSVC-SAME: -D_MSC_FULL_VER={{[0-9]*}} +! MSVC-AARCH64-SAME: -D_M_ARM64=1 +! MSVC-X86_32-SAME: -D_M_IX86=600 +! MSVC-X86_64-SAME: -D_M_X64=100 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/73250 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
DavidTruby wrote: @pbo-linaro @bradking I think this fixes the linked issue, could someone confirm that for me? Thanks! https://github.com/llvm/llvm-project/pull/73250 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][Driver] Let the linker fail on multiple definitions of main() (PR #73124)
DavidTruby wrote: I think for Windows the easy thing to do here is just to add `/WHOLEARCHIVE:...` here anyway, using the same logic as in processVSRuntimeLibrary(); E.g ``` void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, //need to add args here so we can search it llvm::opt::ArgStringList &CmdArgs) { if (!TC.getTriple().isKnownWindowsMSVCEnvironment()) { // non-windows stuff } else { if (auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) { RTOptionID = llvm::StringSwitch(rtl->getValue()) .Case("static", options::OPT__SLASH_MT) .Case("static_dbg", options::OPT__SLASH_MTd) .Case("dll", options::OPT__SLASH_MD) .Case("dll_dbg", options::OPT__SLASH_MDd) .Default(options::OPT__SLASH_MT); switch (RTOptionID) { case options::OPT__SLASH_MT: CmdArgs.push_back("/WHOLEARCHIVE:Fortran_main.static.lib"); ///etc } ``` I haven't actually tested this code but it maybe gives an idea of what needs doing? The "correct" thing to do would probably be to add the /WHOLEARCHIVE directive as a linker directive in the object file (like we do for /DEFAULTLIB:Fortran_main) but that would require a bit more hooking up to pass that all the way through to creating an `llvm.linker_options` MLIR operation. I think the above should probably suffice at least for now. https://github.com/llvm/llvm-project/pull/73124 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang][Driver] Let the linker fail on multiple definitions of main() (PR #73124)
DavidTruby wrote: I think so yes. The issue is that Windows really wants these things to be in the object files rather than passed on the link line, which is what the patch you're referencing changed for linking the runtimes at least. Doing that for this as well is a little more complex though, so I suggest just passing the `/WHOLEARCHIVE` on the link line as the runtimes were also being passed before (you won't need to pass Fortran_main like it was before though, as the directive to link that is now in every object file). https://github.com/llvm/llvm-project/pull/73124 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args, } } +static void addVSDefines(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + + unsigned ver = 0; + const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args); + ver = vt.getMajor() * 1000 + vt.getMinor().value_or(0) * 10 + +vt.getSubminor().value_or(0); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10))); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver))); + + llvm::Triple triple = TC.getTriple(); + if (triple.isAArch64()) { +CmdArgs.push_back("-D_M_ARM64=1"); + } else if (triple.isX86() && triple.isArch32Bit()) { +CmdArgs.push_back("-D_M_IX86=600"); + } else if (triple.isX86() && triple.isArch64Bit()) { +CmdArgs.push_back("-D_M_X64=100"); + } else { +llvm_unreachable( +"Flang on Windows only supports X86_32, X86_64 and AArch64"); + } DavidTruby wrote: We don't support 32 bit _hosts_ but I think we do support 32 bit _targets_ https://github.com/llvm/llvm-project/pull/73250 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args, } } +static void addVSDefines(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + + unsigned ver = 0; + const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args); + ver = vt.getMajor() * 1000 + vt.getMinor().value_or(0) * 10 + +vt.getSubminor().value_or(0); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10))); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver))); + + llvm::Triple triple = TC.getTriple(); + if (triple.isAArch64()) { +CmdArgs.push_back("-D_M_ARM64=1"); DavidTruby wrote: I don't believe so. It's not tested at all if it does as far as I can tell! https://github.com/llvm/llvm-project/pull/73250 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
@@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args, } } +static void addVSDefines(const ToolChain &TC, const ArgList &Args, DavidTruby wrote: I named it this way to match processVSRuntimeLibs which I stole from clang :) https://github.com/llvm/llvm-project/pull/73250 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/73250 >From 656463c6298b981cbd43d1d5042438eab700143b Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 23 Nov 2023 15:32:57 + Subject: [PATCH 1/2] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI --- clang/lib/Driver/ToolChains/Flang.cpp | 24 flang/test/Driver/msvc-defines.f90| 10 ++ 2 files changed, 34 insertions(+) create mode 100644 flang/test/Driver/msvc-defines.f90 diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 01f07b9228256cf..87aa546e5549423 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -204,6 +204,29 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args, } } +static void addVSDefines(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + + unsigned ver = 0; + const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args); + ver = vt.getMajor() * 1000 + vt.getMinor().value_or(0) * 10 + +vt.getSubminor().value_or(0); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10))); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver))); + + llvm::Triple triple = TC.getTriple(); + if (triple.isAArch64()) { +CmdArgs.push_back("-D_M_ARM64=1"); + } else if (triple.isX86() && triple.isArch32Bit()) { +CmdArgs.push_back("-D_M_IX86=600"); + } else if (triple.isX86() && triple.isArch64Bit()) { +CmdArgs.push_back("-D_M_X64=100"); + } else { +llvm_unreachable( +"Flang on Windows only supports X86_32, X86_64 and AArch64"); + } +} + static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { assert(TC.getTriple().isKnownWindowsMSVCEnvironment() && @@ -322,6 +345,7 @@ void Flang::addTargetOptions(const ArgList &Args, if (Triple.isKnownWindowsMSVCEnvironment()) { processVSRuntimeLibrary(TC, Args, CmdArgs); +addVSDefines(TC, Args, CmdArgs); } // TODO: Add target specific flags, ABI, mtune option etc. diff --git a/flang/test/Driver/msvc-defines.f90 b/flang/test/Driver/msvc-defines.f90 new file mode 100644 index 000..97a6ce888d7f579 --- /dev/null +++ b/flang/test/Driver/msvc-defines.f90 @@ -0,0 +1,10 @@ +! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64 +! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_32 +! RUN: %flang -### --target=x86_64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_64 + +! MSVC: -fc1 +! MSVC-SAME: -D_MSC_VER={{[0-9]*}} +! MSVC-SAME: -D_MSC_FULL_VER={{[0-9]*}} +! MSVC-AARCH64-SAME: -D_M_ARM64=1 +! MSVC-X86_32-SAME: -D_M_IX86=600 +! MSVC-X86_64-SAME: -D_M_X64=100 >From 50833e29971704db234fc8a88ba4032517b4cfdb Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 30 Nov 2023 16:24:58 + Subject: [PATCH 2/2] Changes for review --- clang/lib/Driver/ToolChains/Flang.cpp | 1 + flang/test/Driver/msvc-defines.f90| 20 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 87aa546e5549423..1b199704a372083 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -213,6 +213,7 @@ static void addVSDefines(const ToolChain &TC, const ArgList &Args, vt.getSubminor().value_or(0); CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 10))); CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver))); + CmdArgs.push_back(Args.MakeArgString("-D_WIN32")); llvm::Triple triple = TC.getTriple(); if (triple.isAArch64()) { diff --git a/flang/test/Driver/msvc-defines.f90 b/flang/test/Driver/msvc-defines.f90 index 97a6ce888d7f579..a05df666ac09a6a 100644 --- a/flang/test/Driver/msvc-defines.f90 +++ b/flang/test/Driver/msvc-defines.f90 @@ -1,10 +1,10 @@ -! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64 -! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_32 -! RUN: %flang -### --target=x86_64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_64 - -! MSVC: -fc1 -! MSVC-SAME: -D_MSC_VER={{[0-9]*}} -! MSVC-SAME: -D_MSC_FULL_VER={{[0-9]*}} -! MSVC-AARCH64-SAME: -D_M_ARM64=1 -! MSVC-X86_32-SAME: -D_M_IX86=600 -! MSVC-X86_64-SAME: -D_M_X64=100 +! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64 +! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1
[flang] [clang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
DavidTruby wrote: It wasn't, I think I have replaced this https://github.com/llvm/llvm-project/pull/73250 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (PR #73250)
https://github.com/DavidTruby closed https://github.com/llvm/llvm-project/pull/73250 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang][driver] Add -fno-fortran-main (link time) option to remove Fortran_main from link line (PR #74139)
DavidTruby wrote: I think this solution is fine, at least in the short term. I had a think after reviewing the initial patch and looking at the failure that @tblah showed in #73124; my thoughts are that the “correct” way of doing this would be instead of linking Fortran_main all the time, we could insert a linker directive in the object file containing the program statement. That way we would only link Fortran_main when there is actually a program statement in the Fortran. However that’s more work and would need a bit more thought anyway so we at least need something like this or the revert in the interim. https://github.com/llvm/llvm-project/pull/74139 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 4be1ec9 - [clang][AArc64][SVE] Add support for comparison operators on SVE types
Author: David Truby Date: 2022-04-05T13:56:27+01:00 New Revision: 4be1ec9fb5ca59fce923d8a5a3fcb3c40a2884de URL: https://github.com/llvm/llvm-project/commit/4be1ec9fb5ca59fce923d8a5a3fcb3c40a2884de DIFF: https://github.com/llvm/llvm-project/commit/4be1ec9fb5ca59fce923d8a5a3fcb3c40a2884de.diff LOG: [clang][AArc64][SVE] Add support for comparison operators on SVE types Comparison operators on SVE types return a signed integer vector of the same width as the incoming SVE type. This matches the existing behaviour for NEON types. Differential Revision: https://reviews.llvm.org/D122404 Added: clang/test/CodeGen/aarch64-sve-vector-compare-ops.c clang/test/Sema/aarch64-sve-vector-compare-ops.c Modified: clang/include/clang/Sema/Sema.h clang/lib/CodeGen/CGExprScalar.cpp clang/lib/Sema/SemaExpr.cpp clang/test/Sema/sizeless-1.c clang/test/SemaCXX/sizeless-1.cpp Removed: diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index c0ad55d52bb31..5ec03391e287b 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11976,9 +11976,13 @@ class Sema final { bool AllowBothBool, bool AllowBoolConversion, bool AllowBoolOperation, bool ReportInvalid); QualType GetSignedVectorType(QualType V); + QualType GetSignedSizelessVectorType(QualType V); QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc); + QualType CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, + SourceLocation Loc, + BinaryOperatorKind Opc); QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc); diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index ec9da20f0fbf7..0711c993088bc 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -1390,8 +1390,8 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType, if (isa(SrcTy) || isa(DstTy)) { // Allow bitcast from vector to integer/fp of the same size. -unsigned SrcSize = SrcTy->getPrimitiveSizeInBits(); -unsigned DstSize = DstTy->getPrimitiveSizeInBits(); +llvm::TypeSize SrcSize = SrcTy->getPrimitiveSizeInBits(); +llvm::TypeSize DstSize = DstTy->getPrimitiveSizeInBits(); if (SrcSize == DstSize) return Builder.CreateBitCast(Src, DstTy, "conv"); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index c0a1ffcdb1b44..375bd2ec59c26 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -50,8 +50,10 @@ #include "clang/Sema/Template.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/SaveAndRestore.h" +#include "llvm/Support/TypeSize.h" using namespace clang; using namespace sema; @@ -12153,6 +12155,10 @@ QualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, RHS.get()->getType()->isVectorType()) return CheckVectorCompareOperands(LHS, RHS, Loc, Opc); + if (LHS.get()->getType()->isVLSTBuiltinType() || + RHS.get()->getType()->isVLSTBuiltinType()) +return CheckSizelessVectorCompareOperands(LHS, RHS, Loc, Opc); + diagnoseLogicalNotOnLHSofCheck(*this, LHS, RHS, Loc, Opc); diagnoseTautologicalComparison(*this, Loc, LHS.get(), RHS.get(), Opc); @@ -12614,6 +12620,18 @@ QualType Sema::GetSignedVectorType(QualType V) { VectorType::GenericVector); } +QualType Sema::GetSignedSizelessVectorType(QualType V) { + const BuiltinType *VTy = V->castAs(); + assert(VTy->isSizelessBuiltinType() && "expected sizeless type"); + + const QualType ETy = V->getSveEltType(Context); + const auto TypeSize = Context.getTypeSize(ETy); + + const QualType IntTy = Context.getIntTypeForBitwidth(TypeSize, true); + const llvm::ElementCount VecSize = Context.getBuiltinVectorTypeInfo(VTy).EC; + return Context.getScalableVectorType(IntTy, VecSize.getKnownMinValue()); +} + /// CheckVectorCompareOperands - vector comparisons are a clang extension that /// operates on extended vector types. Instead of producing an IntTy result, /// like a scalar comparison, a vector comparison produces a vector of integer @@ -12680,6 +12698,48 @@ QualType Sema::CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, return GetSignedVectorType(vType); } +QualType Sema::CheckSizelessVectorCompareOperands(ExprResult &LHS, + ExprResult &RHS, +
[clang] 286d59e - [clang][AArch64][SVE] Add unary +/- operators for SVE types
Author: David Truby Date: 2022-08-10T10:32:43Z New Revision: 286d59ef6f7118c8a0600f3d281593700528a5d3 URL: https://github.com/llvm/llvm-project/commit/286d59ef6f7118c8a0600f3d281593700528a5d3 DIFF: https://github.com/llvm/llvm-project/commit/286d59ef6f7118c8a0600f3d281593700528a5d3.diff LOG: [clang][AArch64][SVE] Add unary +/- operators for SVE types This patch enables the unary promotion and negation operators on SVE types. Differential Revision: https://reviews.llvm.org/D130984 Added: Modified: clang/lib/Sema/SemaExpr.cpp clang/test/CodeGen/aarch64-sve-vector-arith-ops.c clang/test/Sema/sizeless-1.c clang/test/SemaCXX/sizeless-1.cpp Removed: diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 9b686b8ff2a30..03f5ec9848e1f 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -15596,6 +15596,8 @@ ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, resultType->castAs()->getVectorKind() != VectorType::AltiVecBool)) break; +else if (resultType->isVLSTBuiltinType()) // SVE vectors allow + and - + break; else if (getLangOpts().CPlusPlus && // C++ [expr.unary.op]p6 Opc == UO_Plus && resultType->isPointerType()) diff --git a/clang/test/CodeGen/aarch64-sve-vector-arith-ops.c b/clang/test/CodeGen/aarch64-sve-vector-arith-ops.c index c57c476032025..d7c79d7a44220 100644 --- a/clang/test/CodeGen/aarch64-sve-vector-arith-ops.c +++ b/clang/test/CodeGen/aarch64-sve-vector-arith-ops.c @@ -1650,3 +1650,143 @@ svuint32_t rem_scalar_u32(svuint32_t a, uint32_t b) { svuint64_t rem_scalar_u64(svuint64_t a, uint64_t b) { return a % b; } + +// UNARY PROMOTION + +// CHECK-LABEL: @prom_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint8_t prom_i8(svint8_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint16_t prom_i16(svint16_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint32_t prom_i32(svint32_t a) { + return +a; +} + +// CHECK-LABEL: @prom_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svint64_t prom_i64(svint64_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint8_t prom_u8(svuint8_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint16_t prom_u16(svuint16_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint32_t prom_u32(svuint32_t a) { + return +a; +} + +// CHECK-LABEL: @prom_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT:ret [[A:%.*]] +// +svuint64_t prom_u64(svuint64_t a) { + return +a; +} + +// UNARY NEGATION + +// CHECK-LABEL: @neg_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint8_t neg_i8(svint8_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint16_t neg_i16(svint16_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint32_t neg_i32(svint32_t a) { + return -a; +} + +// CHECK-LABEL: @neg_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svint64_t neg_i64(svint64_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svuint8_t neg_u8(svuint8_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svuint16_t neg_u16(svuint16_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svuint32_t neg_u32(svuint32_t a) { + return -a; +} + +// CHECK-LABEL: @neg_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[SUB:%.*]] = sub zeroinitializer, [[A:%.*]] +// CHECK-NEXT:ret [[SUB]] +// +svuint64_t neg_u64(svuint64_t a) { + return -a; +} diff --git a/clang/test/Sema/sizeless-1.c b/clang/test/Sema/sizeless-1.c index 5e7e3be772e8c..64af214d206b9 100644 --- a/clang/test/Sema/sizeless-1.c +++ b/clang/test/Sema/sizeless-1.c @@ -187,10 +187,8 @@ void func(int sel) { global_int8_ptr -= 1; // expected-error {{arithmetic on a pointer to sizeless type}} global_int8_pt
[clang] e4642d7 - [clang] Correct documentation for NEON and SVE operator support
Author: David Truby Date: 2022-08-10T15:16:38+01:00 New Revision: e4642d78a89930720bc84a4775614c45327bc0dc URL: https://github.com/llvm/llvm-project/commit/e4642d78a89930720bc84a4775614c45327bc0dc DIFF: https://github.com/llvm/llvm-project/commit/e4642d78a89930720bc84a4775614c45327bc0dc.diff LOG: [clang] Correct documentation for NEON and SVE operator support Previously the language extension documentation didn't mention SVE and was incomplete in listing the C/C++ operators supported on NEON. This corrects the documentation to be in line with the implementation. Added: Modified: clang/docs/LanguageExtensions.rst Removed: diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst index a6d02b2e02c15..3b80289fd5fe9 100644 --- a/clang/docs/LanguageExtensions.rst +++ b/clang/docs/LanguageExtensions.rst @@ -400,7 +400,7 @@ Builtin Macros Vectors and Extended Vectors -Supports the GCC, OpenCL, AltiVec and NEON vector extensions. +Supports the GCC, OpenCL, AltiVec, NEON and SVE vector extensions. OpenCL vector types are created using the ``ext_vector_type`` attribute. It supports the ``V.xyzw`` syntax and other tidbits as seen in OpenCL. An example @@ -539,32 +539,33 @@ The table below shows the support for each operation by vector extension. A dash indicates that an operation is not accepted according to a corresponding specification. -== === === = === - Operator OpenCL AltiVec GCCNEON -== === === = === -[] yes yes yes -- -unary operators +, --yes yes yes -- -++, -- --yes yes yes -- -+,--,*,/,% yes yes yes -- -bitwise operators &,|,^,~yes yes yes -- ->>,<, <, >=, <= yes yes yes -- -=yes yes yes yes -?: [#]_ yes --yes -- -sizeof yes yes yes yes -C-style cast yes yes yes no -reinterpret_cast yes noyes no -static_cast yes noyes no -const_cast no nono no -address &v[i]no nono [#]_ no -== === === = === +== === === = === = + Operator OpenCL AltiVec GCCNEONSVE +== === === = === = +[] yes yes yes yesyes +unary operators +, --yes yes yes yesyes +++, -- --yes yes yes no no ++,--,*,/,% yes yes yes yesyes +bitwise operators &,|,^,~yes yes yes yesyes +>>,< , <, >=, <= yes yes yes yesyes +=yes yes yes yesyes +?: [#]_ yes --yes yesyes +sizeof yes yes yes yesyes +C-style cast yes yes yes no no +reinterpret_cast yes noyes no no +static_cast yes noyes no no +const_cast no nono no no +address &v[i]no nono [#]_ no no +== === === = === = See also :ref:`langext-__builtin_shufflevector`, :ref:`langext-__builtin_convertvector`. .. [#] ternary operator(?:) has diff erent behaviors depending on condition operand's vector type. If the condition is a GNU vector (i.e. __vector_size__), - it's only available in C++ and uses normal bool conversions (that is, != 0). + a NEON vector or an SVE vector, it's only available in C++ and uses normal bool + conversions (that is, != 0). If it's an extension (OpenCL) vector, it's only available in C and OpenCL C. And it selects base on signedness of the condition operands (OpenCL v1.1 s6.3.9).
[clang] 3aca0ff - [clang][SVE] Add support for arithmetic operators on SVE types
Author: David Truby Date: 2022-03-11T15:39:44Z New Revision: 3aca0ffd5092e37590bbee7e0fcd2b1b5780024c URL: https://github.com/llvm/llvm-project/commit/3aca0ffd5092e37590bbee7e0fcd2b1b5780024c DIFF: https://github.com/llvm/llvm-project/commit/3aca0ffd5092e37590bbee7e0fcd2b1b5780024c.diff LOG: [clang][SVE] Add support for arithmetic operators on SVE types This patch implements support for the +, -, *, / and % operators on sizeless SVE types. Support for these operators on svbool_t is excluded. Differential Revision: https://reviews.llvm.org/D120323 Added: clang/test/CodeGen/aarch64-sve-vector-ops.c clang/test/Sema/aarch64-sve-vector-ops.c Modified: clang/include/clang/AST/Type.h clang/include/clang/Sema/Sema.h clang/lib/AST/Type.cpp clang/lib/Sema/SemaExpr.cpp clang/test/Sema/sizeless-1.c clang/test/SemaCXX/sizeless-1.cpp Removed: diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 3c71cbbb9c8f3..76e4474b1b303 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -2557,6 +2557,8 @@ class BuiltinType : public Type { return getKind() >= Half && getKind() <= Ibm128; } + bool isSVEBool() const { return getKind() == Kind::SveBool; } + /// Determines whether the given kind corresponds to a placeholder type. static bool isPlaceholderTypeKind(Kind K) { return K >= Overload; diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index d072cf9223f7d..4c5666f290141 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11940,6 +11940,10 @@ class Sema final { QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc); + // type checking for sizeless vector binary operators. + QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, + SourceLocation Loc); + /// Type checking for matrix binary operators. QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 1c7499c3c237e..8579d697868fd 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -2105,6 +2105,11 @@ bool Type::hasUnsignedIntegerRepresentation() const { return VT->getElementType()->isUnsignedIntegerOrEnumerationType(); if (const auto *VT = dyn_cast(CanonicalType)) return VT->getElementType()->isUnsignedIntegerOrEnumerationType(); + if (CanonicalType->isVLSTBuiltinType()) { +const auto *VT = cast(CanonicalType); +return VT->getKind() >= BuiltinType::SveUint8 && + VT->getKind() <= BuiltinType::SveUint64; + } return isUnsignedIntegerOrEnumerationType(); } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index ca5e206f8933d..96471f6c5fb1f 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -10403,6 +10403,29 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, return QualType(); } +QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, + SourceLocation Loc) { + QualType LHSType = LHS.get()->getType().getUnqualifiedType(); + QualType RHSType = RHS.get()->getType().getUnqualifiedType(); + + const BuiltinType *LHSVecType = LHSType->getAs(); + const BuiltinType *RHSVecType = RHSType->getAs(); + + unsigned DiagID = diag::err_typecheck_invalid_operands; + if (LHSVecType->isSVEBool() || RHSVecType->isSVEBool()) { +Diag(Loc, DiagID) << LHSType << RHSType << LHS.get()->getSourceRange() + << RHS.get()->getSourceRange(); +return QualType(); + } + + if (Context.hasSameType(LHSType, RHSType)) +return LHSType; + + Diag(Loc, DiagID) << LHSType << RHSType << LHS.get()->getSourceRange() +<< RHS.get()->getSourceRange(); + return QualType(); +} + // checkArithmeticNull - Detect when a NULL constant is used improperly in an // expression. These are mainly cases where the null pointer is used as an // integer instead of a pointer. @@ -10512,8 +10535,10 @@ QualType Sema::CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, QualType RHSTy = RHS.get()->getType(); if (LHSTy->isVectorType() || RHSTy->isVectorType()) return CheckVectorOperands(LHS, RHS, Loc, IsCompAssign, - /*AllowBothBool*/getLangOpts().AltiVec, - /*AllowBoolConversions*/false); + /*AllowBothBool*/ getLangOpts().AltiVec, + /*AllowBoolConversions*/ false); + if (LHSTy->isVLSTBuiltinType() || RHSTy->isVLSTBuiltinType()) +return CheckSizelessVectorOperands(LHS, RHS, Loc); if (!
[clang] 058c92f - [clang][SVE] Add aarch64-registered-target to sve vector op tests
Author: David Truby Date: 2022-03-11T16:01:00Z New Revision: 058c92f2a4e865d478b29035c207ec0744229d6a URL: https://github.com/llvm/llvm-project/commit/058c92f2a4e865d478b29035c207ec0744229d6a DIFF: https://github.com/llvm/llvm-project/commit/058c92f2a4e865d478b29035c207ec0744229d6a.diff LOG: [clang][SVE] Add aarch64-registered-target to sve vector op tests This fixes failing tests where aarch64 isn't available. Added: Modified: clang/test/CodeGen/aarch64-sve-vector-ops.c Removed: diff --git a/clang/test/CodeGen/aarch64-sve-vector-ops.c b/clang/test/CodeGen/aarch64-sve-vector-ops.c index 15a05e940d981..7fb307cb497b0 100644 --- a/clang/test/CodeGen/aarch64-sve-vector-ops.c +++ b/clang/test/CodeGen/aarch64-sve-vector-ops.c @@ -2,6 +2,8 @@ // RUN: -fallow-half-arguments-and-returns \ // RUN: -O1 -emit-llvm -o - %s 2>&1 | FileCheck %s +// REQUIRES: aarch64-registered-target + #include // ADDITION ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] d38c9d3 - [NFC][clang][SVE] Auto-generate SVE operator tests.
Author: David Truby Date: 2022-03-16T16:39:27Z New Revision: d38c9d38348fa84042e272803a91c098483a3132 URL: https://github.com/llvm/llvm-project/commit/d38c9d38348fa84042e272803a91c098483a3132 DIFF: https://github.com/llvm/llvm-project/commit/d38c9d38348fa84042e272803a91c098483a3132.diff LOG: [NFC][clang][SVE] Auto-generate SVE operator tests. Added: Modified: clang/test/CodeGen/aarch64-sve-vector-ops.c Removed: diff --git a/clang/test/CodeGen/aarch64-sve-vector-ops.c b/clang/test/CodeGen/aarch64-sve-vector-ops.c index 7fb307cb497b0..57d943ec7891d 100644 --- a/clang/test/CodeGen/aarch64-sve-vector-ops.c +++ b/clang/test/CodeGen/aarch64-sve-vector-ops.c @@ -1,6 +1,7 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \ -// RUN: -fallow-half-arguments-and-returns \ -// RUN: -O1 -emit-llvm -o - %s 2>&1 | FileCheck %s +// RUN: -fallow-half-arguments-and-returns -disable-O0-optnone \ +// RUN: -emit-llvm -o - %s | opt -S -sroa | FileCheck %s // REQUIRES: aarch64-registered-target @@ -8,738 +9,946 @@ // ADDITION +// CHECK-LABEL: @add_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svint8_t add_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: add_i8 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svint16_t add_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: add_i16 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svint32_t add_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: add_i32 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svint64_t add_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: add_i64 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svuint8_t add_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: add_u8 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svuint16_t add_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: add_u16 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svuint32_t add_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: add_u32 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svuint64_t add_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: add_u64 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svfloat16_t add_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: add_f16 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svfloat32_t add_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: add_f32 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svfloat64_t add_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: add_f64 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_inplace_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT:ret [[ADD]] +// svint8_t add_inplace_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: add_inplace_i8 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT:[[ADD:%.*]
[clang] f47e7e4 - [clang][SVE] Add support for bitwise operators on SVE types
Author: David Truby Date: 2022-03-18T14:06:47Z New Revision: f47e7e4a3480707f124db9622001d3a05a777d5d URL: https://github.com/llvm/llvm-project/commit/f47e7e4a3480707f124db9622001d3a05a777d5d DIFF: https://github.com/llvm/llvm-project/commit/f47e7e4a3480707f124db9622001d3a05a777d5d.diff LOG: [clang][SVE] Add support for bitwise operators on SVE types This patch implements support for the &, |, ^, and ~ operators on sizeless SVE types. Differential Revision: https://reviews.llvm.org/D121119 Added: clang/test/CodeGen/aarch64-sve-vector-arith-ops.c clang/test/CodeGen/aarch64-sve-vector-bitwise-ops.c clang/test/Sema/aarch64-sve-vector-arith-ops.c clang/test/Sema/aarch64-sve-vector-bitwise-ops.c Modified: clang/include/clang/Sema/Sema.h clang/lib/AST/Type.cpp clang/lib/Sema/SemaExpr.cpp clang/test/Sema/attr-arm-sve-vector-bits.c clang/test/Sema/sizeless-1.c clang/test/SemaCXX/sizeless-1.cpp Removed: clang/test/CodeGen/aarch64-sve-vector-ops.c clang/test/Sema/aarch64-sve-vector-ops.c diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index fe8a1f371fe74..32a8ffdc8df92 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11948,7 +11948,8 @@ class Sema final { // type checking for sizeless vector binary operators. QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, - SourceLocation Loc); + SourceLocation Loc, + ArithConvKind OperationKind); /// Type checking for matrix binary operators. QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS, diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 08a95669ac9fd..1803fe12d69c8 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -1899,8 +1899,14 @@ bool Type::hasAutoForTrailingReturnType() const { bool Type::hasIntegerRepresentation() const { if (const auto *VT = dyn_cast(CanonicalType)) return VT->getElementType()->isIntegerType(); - else -return isIntegerType(); + if (CanonicalType->isVLSTBuiltinType()) { +const auto *VT = cast(CanonicalType); +return VT->getKind() == BuiltinType::SveBool || + (VT->getKind() >= BuiltinType::SveInt8 && +VT->getKind() <= BuiltinType::SveUint64); + } + + return isIntegerType(); } /// Determine whether this type is an integral type. diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 635721b4cc3b3..be90c58e066d8 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -10464,7 +10464,8 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, } QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, - SourceLocation Loc) { + SourceLocation Loc, + ArithConvKind OperationKind) { QualType LHSType = LHS.get()->getType().getUnqualifiedType(); QualType RHSType = RHS.get()->getType().getUnqualifiedType(); @@ -10472,7 +10473,8 @@ QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, const BuiltinType *RHSVecType = RHSType->getAs(); unsigned DiagID = diag::err_typecheck_invalid_operands; - if (LHSVecType->isSVEBool() || RHSVecType->isSVEBool()) { + if ((OperationKind == ACK_Arithmetic) && + (LHSVecType->isSVEBool() || RHSVecType->isSVEBool())) { Diag(Loc, DiagID) << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); return QualType(); @@ -10600,7 +10602,7 @@ QualType Sema::CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, /*AllowBooleanOperation*/ false, /*ReportInvalid*/ true); if (LHSTy->isVLSTBuiltinType() || RHSTy->isVLSTBuiltinType()) -return CheckSizelessVectorOperands(LHS, RHS, Loc); +return CheckSizelessVectorOperands(LHS, RHS, Loc, ACK_Arithmetic); if (!IsDiv && (LHSTy->isConstantMatrixType() || RHSTy->isConstantMatrixType())) return CheckMatrixMultiplyOperands(LHS, RHS, Loc, IsCompAssign); @@ -10650,7 +10652,7 @@ QualType Sema::CheckRemainderOperands( ->getType() ->getSveEltType(Context) ->hasIntegerRepresentation()) - return CheckSizelessVectorOperands(LHS, RHS, Loc); + return CheckSizelessVectorOperands(LHS, RHS, Loc, ACK_Arithmetic); return InvalidOperands(Loc, LHS, RHS); } @@ -10964,7 +10966,8 @@ QualType Sema::CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS, if (LHS.get()->getType()->isVLSTBuiltinType() || RHS.get()->getType()->isVLSTBuiltinType()) { -QualType compType = CheckSizeles
[clang] 683fc62 - [clang][AArc64][SVE] Implement vector-scalar operators
Author: David Truby Date: 2022-03-23T14:20:48Z New Revision: 683fc6203cfa3f604df5f59cef714568cba2daac URL: https://github.com/llvm/llvm-project/commit/683fc6203cfa3f604df5f59cef714568cba2daac DIFF: https://github.com/llvm/llvm-project/commit/683fc6203cfa3f604df5f59cef714568cba2daac.diff LOG: [clang][AArc64][SVE] Implement vector-scalar operators This patch extends the support for C/C++ operators for SVE types to allow one of the arguments to be a scalar, in which case a vector splat is performed. Differential Revision: https://reviews.llvm.org/D121829 Added: Modified: clang/include/clang/Sema/Sema.h clang/lib/CodeGen/CGExprScalar.cpp clang/lib/Sema/SemaExpr.cpp clang/test/CodeGen/aarch64-sve-vector-arith-ops.c clang/test/Sema/aarch64-sve-vector-arith-ops.c Removed: diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index f0e33f8b1b728..25cd747cbec96 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11958,7 +11958,7 @@ class Sema final { // type checking for sizeless vector binary operators. QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, - SourceLocation Loc, + SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind); /// Type checking for matrix binary operators. diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index cdd4302dc9711..ec9da20f0fbf7 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -32,6 +32,7 @@ #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" +#include "llvm/IR/DerivedTypes.h" #include "llvm/IR/FixedPointBuilder.h" #include "llvm/IR/Function.h" #include "llvm/IR/GetElementPtrTypeIterator.h" @@ -40,6 +41,7 @@ #include "llvm/IR/IntrinsicsPowerPC.h" #include "llvm/IR/MatrixBuilder.h" #include "llvm/IR/Module.h" +#include "llvm/Support/TypeSize.h" #include using namespace clang; @@ -2330,9 +2332,10 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) { } case CK_VectorSplat: { llvm::Type *DstTy = ConvertType(DestTy); -Value *Elt = Visit(const_cast(E)); +Value *Elt = Visit(const_cast(E)); // Splat the element across to all elements -unsigned NumElements = cast(DstTy)->getNumElements(); +llvm::ElementCount NumElements = +cast(DstTy)->getElementCount(); return Builder.CreateVectorSplat(NumElements, Elt, "splat"); } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 7fdeb7a8e30be..23f7625f1c969 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -10465,7 +10465,17 @@ QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, + bool IsCompAssign, ArithConvKind OperationKind) { + if (!IsCompAssign) { +LHS = DefaultFunctionArrayLvalueConversion(LHS.get()); +if (LHS.isInvalid()) + return QualType(); + } + RHS = DefaultFunctionArrayLvalueConversion(RHS.get()); + if (RHS.isInvalid()) +return QualType(); + QualType LHSType = LHS.get()->getType().getUnqualifiedType(); QualType RHSType = RHS.get()->getType().getUnqualifiedType(); @@ -10483,6 +10493,34 @@ QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, if (Context.hasSameType(LHSType, RHSType)) return LHSType; + auto tryScalableVectorConvert = [this](ExprResult *Src, QualType SrcType, + QualType DestType) { +const QualType DestBaseType = DestType->getSveEltType(Context); +if (DestBaseType->getUnqualifiedDesugaredType() == +SrcType->getUnqualifiedDesugaredType()) { + unsigned DiagID = diag::err_typecheck_invalid_operands; + if (!tryVectorConvertAndSplat(*this, Src, SrcType, DestBaseType, DestType, +DiagID)) +return DestType; +} +return QualType(); + }; + + if (LHSType->isVLSTBuiltinType() && !RHSType->isVLSTBuiltinType()) { +auto DestType = tryScalableVectorConvert(&RHS, RHSType, LHSType); +if (DestType == QualType()) + return InvalidOperands(Loc, LHS, RHS); +return DestType; + } + + if (RHSType->isVLSTBuiltinType() && !LHSType->isVLSTBuiltinType()) { +auto DestType = tryScalableVectorConvert((IsCompAssign ? nullptr : &LHS), + LHSType, RHSType); +if (DestType == QualType()) + return InvalidOperands(Loc, LHS, RHS); +return DestType; + } + Diag(Loc, DiagID) << LHSType
[clang] 53fd8db - [Clang][AArch64][SVE] Allow subscript operator for SVE types
Author: David Truby Date: 2022-04-14T13:20:50+01:00 New Revision: 53fd8db79192f38feaec11c761e0d0fbdf1516b0 URL: https://github.com/llvm/llvm-project/commit/53fd8db79192f38feaec11c761e0d0fbdf1516b0 DIFF: https://github.com/llvm/llvm-project/commit/53fd8db79192f38feaec11c761e0d0fbdf1516b0.diff LOG: [Clang][AArch64][SVE] Allow subscript operator for SVE types Undefined behaviour is just passed on to extract_element when the index is out of bounds. Subscript on svbool_t is not allowed as this doesn't really have meaningful semantics. Differential Revision: https://reviews.llvm.org/D122732 Added: clang/test/CodeGen/aarch64-sve-vector-subscript-ops.c clang/test/Sema/aarch64-sve-vector-subscript-ops.c Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/AST/ExprConstant.cpp clang/lib/CodeGen/CGExprScalar.cpp clang/lib/Sema/SemaExpr.cpp Removed: diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 3213163ee7876..ea3db40aad571 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6638,6 +6638,8 @@ def err_subscript_function_type : Error< "subscript of pointer to function type %0">; def err_subscript_incomplete_or_sizeless_type : Error< "subscript of pointer to %select{incomplete|sizeless}0 type %1">; +def err_subscript_svbool_t : Error< + "subscript of svbool_t is not allowed">; def err_dereference_incomplete_type : Error< "dereference of pointer to incomplete type %0">; def ext_gnu_subscript_void_type : Extension< diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 93950ac5341ba..50d6340ed31f7 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -8423,7 +8423,8 @@ bool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) { bool LValueExprEvaluator::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { // FIXME: Deal with vectors as array subscript bases. - if (E->getBase()->getType()->isVectorType()) + if (E->getBase()->getType()->isVectorType() || + E->getBase()->getType()->isVLSTBuiltinType()) return Error(E); APSInt Index; diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 0711c993088bc..d3fe04d5a7915 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -1767,7 +1767,8 @@ Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { // loads the lvalue formed by the subscript expr. However, we have to be // careful, because the base of a vector subscript is occasionally an rvalue, // so we can't get it as an lvalue. - if (!E->getBase()->getType()->isVectorType()) + if (!E->getBase()->getType()->isVectorType() && + !E->getBase()->getType()->isVLSTBuiltinType()) return EmitLoadOfLValue(E); // Handle the vector case. The base must be a vector, the index must be an diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index da1fed4d72aec..faff375314e92 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -27,11 +27,13 @@ #include "clang/AST/OperationKinds.h" #include "clang/AST/ParentMapContext.h" #include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/DiagnosticSema.h" #include "clang/Basic/PartialDiagnostic.h" #include "clang/Basic/SourceManager.h" +#include "clang/Basic/Specifiers.h" #include "clang/Basic/TargetInfo.h" #include "clang/Lex/LiteralSupport.h" #include "clang/Lex/Preprocessor.h" @@ -5683,6 +5685,33 @@ Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, OK = OK_VectorComponent; ResultType = VTy->getElementType(); +QualType BaseType = BaseExpr->getType(); +Qualifiers BaseQuals = BaseType.getQualifiers(); +Qualifiers MemberQuals = ResultType.getQualifiers(); +Qualifiers Combined = BaseQuals + MemberQuals; +if (Combined != MemberQuals) + ResultType = Context.getQualifiedType(ResultType, Combined); + } else if (LHSTy->isBuiltinType() && + LHSTy->getAs()->isVLSTBuiltinType()) { +const BuiltinType *BTy = LHSTy->getAs(); +if (BTy->isSVEBool()) + return ExprError(Diag(LLoc, diag::err_subscript_svbool_t) + << LHSExp->getSourceRange() << RHSExp->getSourceRange()); + +BaseExpr = LHSExp; +IndexExpr = RHSExp; +if (getLangOpts().CPlusPlus11 && LHSExp->isPRValue()) { + ExprResult Materialized = TemporaryMaterializationConversion(LHSExp); + if (Materialized.isInvalid()) +return ExprError(); + LHSExp = Materialized.get(); +} +VK = LHSExp->getValueKind(); +if (VK != VK_PRValue) + OK = OK_VectorComponent; + +
[clang] 66c44b2 - [Clang][AArch64][SVE] Add shift operators for SVE vector types
Author: David Truby Date: 2022-04-14T13:20:50+01:00 New Revision: 66c44b20b4a538fbb1bae8bc9533c25f5a006bd5 URL: https://github.com/llvm/llvm-project/commit/66c44b20b4a538fbb1bae8bc9533c25f5a006bd5 DIFF: https://github.com/llvm/llvm-project/commit/66c44b20b4a538fbb1bae8bc9533c25f5a006bd5.diff LOG: [Clang][AArch64][SVE] Add shift operators for SVE vector types This patch enables shift operators on SVE vector types, as well as supporting vector-scalar shift operations. Shifts by a scalar that is wider than the contained type in the vector are permitted but as in the C standard if the value is larger than the width of the type the behavior is undefined. Differential Revision: https://reviews.llvm.org/D123303 Added: clang/test/CodeGen/aarch64-sve-vector-shift-ops.c clang/test/Sema/aarch64-sve-vector-shift-ops.c Modified: clang/lib/Sema/SemaExpr.cpp clang/test/Sema/sizeless-1.c clang/test/SemaCXX/sizeless-1.cpp Removed: diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index faff375314e92..f210a8ba7aac2 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -11476,6 +11476,97 @@ static QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, return LHSType; } +static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS, + ExprResult &RHS, SourceLocation Loc, + bool IsCompAssign) { + if (!IsCompAssign) { +LHS = S.UsualUnaryConversions(LHS.get()); +if (LHS.isInvalid()) + return QualType(); + } + + RHS = S.UsualUnaryConversions(RHS.get()); + if (RHS.isInvalid()) +return QualType(); + + QualType LHSType = LHS.get()->getType(); + const BuiltinType *LHSBuiltinTy = LHSType->getAs(); + QualType LHSEleType = LHSType->isVLSTBuiltinType() +? LHSBuiltinTy->getSveEltType(S.getASTContext()) +: LHSType; + + // Note that RHS might not be a vector + QualType RHSType = RHS.get()->getType(); + const BuiltinType *RHSBuiltinTy = RHSType->getAs(); + QualType RHSEleType = RHSType->isVLSTBuiltinType() +? RHSBuiltinTy->getSveEltType(S.getASTContext()) +: RHSType; + + if ((LHSBuiltinTy && LHSBuiltinTy->isSVEBool()) || + (RHSBuiltinTy && RHSBuiltinTy->isSVEBool())) { +S.Diag(Loc, diag::err_typecheck_invalid_operands) +<< LHSType << RHSType << LHS.get()->getSourceRange(); +return QualType(); + } + + if (!LHSEleType->isIntegerType()) { +S.Diag(Loc, diag::err_typecheck_expect_int) +<< LHS.get()->getType() << LHS.get()->getSourceRange(); +return QualType(); + } + + if (!RHSEleType->isIntegerType()) { +S.Diag(Loc, diag::err_typecheck_expect_int) +<< RHS.get()->getType() << RHS.get()->getSourceRange(); +return QualType(); + } + + if (LHSType->isVLSTBuiltinType() && RHSType->isVLSTBuiltinType() && + (S.Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC != + S.Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC)) { +S.Diag(Loc, diag::err_typecheck_invalid_operands) +<< LHSType << RHSType << LHS.get()->getSourceRange() +<< RHS.get()->getSourceRange(); +return QualType(); + } + + if (!LHSType->isVLSTBuiltinType()) { +assert(RHSType->isVLSTBuiltinType()); +if (IsCompAssign) + return RHSType; +if (LHSEleType != RHSEleType) { + LHS = S.ImpCastExprToType(LHS.get(), RHSEleType, clang::CK_IntegralCast); + LHSEleType = RHSEleType; +} +const llvm::ElementCount VecSize = +S.Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC; +QualType VecTy = +S.Context.getScalableVectorType(LHSEleType, VecSize.getKnownMinValue()); +LHS = S.ImpCastExprToType(LHS.get(), VecTy, clang::CK_VectorSplat); +LHSType = VecTy; + } else if (RHSBuiltinTy && RHSBuiltinTy->isVLSTBuiltinType()) { +if (S.Context.getTypeSize(RHSBuiltinTy) != +S.Context.getTypeSize(LHSBuiltinTy)) { + S.Diag(Loc, diag::err_typecheck_vector_lengths_not_equal) + << LHSType << RHSType << LHS.get()->getSourceRange() + << RHS.get()->getSourceRange(); + return QualType(); +} + } else { +const llvm::ElementCount VecSize = +S.Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC; +if (LHSEleType != RHSEleType) { + RHS = S.ImpCastExprToType(RHS.get(), LHSEleType, clang::CK_IntegralCast); + RHSEleType = LHSEleType; +} +QualType VecTy = +S.Context.getScalableVectorType(RHSEleType, VecSize.getKnownMinValue()); +RHS = S.ImpCastExprToType(RHS.get(), VecTy, CK_VectorSplat); + } + + return LHSType; +} + // C99 6.5.7 QualType Sema::CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, @@ -11501,7 +115
[clang] 8bc29d1 - [clang][AArch64][SVE] Implement conditional operator for SVE vectors
Author: David Truby Date: 2022-05-03T13:10:32Z New Revision: 8bc29d14273b05b05d5a56e34c07948dc2c770d3 URL: https://github.com/llvm/llvm-project/commit/8bc29d14273b05b05d5a56e34c07948dc2c770d3 DIFF: https://github.com/llvm/llvm-project/commit/8bc29d14273b05b05d5a56e34c07948dc2c770d3.diff LOG: [clang][AArch64][SVE] Implement conditional operator for SVE vectors This patch adds support for the conditional (ternary) operator on SVE scalable vector types in C++, matching the behaviour for NEON vector types. Like the conditional operator for NEON types, this is disabled in C mode. Differential Revision: https://reviews.llvm.org/D124091 Added: clang/test/CodeGenCXX/aarch64-sve-vector-conditional-op.cpp clang/test/SemaCXX/aarch64-sve-vector-conditional-op.cpp Modified: clang/include/clang/Sema/Sema.h clang/lib/CodeGen/CGExprScalar.cpp clang/lib/Sema/SemaExprCXX.cpp Removed: diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 114725498c982..7d33b5047a677 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11974,6 +11974,10 @@ class Sema final { QualType CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc); + + QualType CheckSizelessVectorConditionalTypes(ExprResult &Cond, + ExprResult &LHS, ExprResult &RHS, + SourceLocation QuestionLoc); QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2, bool ConvertArgs = true); QualType FindCompositePointerType(SourceLocation Loc, diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index d3fe04d5a7915..2343c7e4afbbe 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -4642,7 +4642,8 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { return tmp5; } - if (condExpr->getType()->isVectorType()) { + if (condExpr->getType()->isVectorType() || + condExpr->getType()->isVLSTBuiltinType()) { CGF.incrementProfileCounter(E); llvm::Value *CondV = CGF.EmitScalarExpr(condExpr); diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 2af4a85c91c21..27ec863e7a35e 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -23,6 +23,7 @@ #include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/TypeLoc.h" #include "clang/Basic/AlignedAllocation.h" +#include "clang/Basic/DiagnosticSema.h" #include "clang/Basic/PartialDiagnostic.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TypeTraits.h" @@ -40,6 +41,7 @@ #include "llvm/ADT/APInt.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/TypeSize.h" using namespace clang; using namespace sema; @@ -6108,6 +6110,16 @@ static bool isValidVectorForConditionalCondition(ASTContext &Ctx, return EltTy->isIntegralType(Ctx); } +static bool isValidSizelessVectorForConditionalCondition(ASTContext &Ctx, + QualType CondTy) { + if (!CondTy->isVLSTBuiltinType()) +return false; + const QualType EltTy = + cast(CondTy.getCanonicalType())->getSveEltType(Ctx); + assert(!EltTy->isEnumeralType() && "Vectors cant be enum types"); + return EltTy->isIntegralType(Ctx); +} + QualType Sema::CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc) { @@ -6199,6 +6211,89 @@ QualType Sema::CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, return ResultType; } +QualType Sema::CheckSizelessVectorConditionalTypes(ExprResult &Cond, + ExprResult &LHS, + ExprResult &RHS, + SourceLocation QuestionLoc) { + LHS = DefaultFunctionArrayLvalueConversion(LHS.get()); + RHS = DefaultFunctionArrayLvalueConversion(RHS.get()); + + QualType CondType = Cond.get()->getType(); + const auto *CondBT = CondType->castAs(); + QualType CondElementTy = CondBT->getSveEltType(Context); + llvm::ElementCount CondElementCount = + Context.getBuiltinVectorTypeInfo(CondBT).EC; + + QualType LHSType = LHS.get()->getType(); + const auto *LHSBT = + LHSType->isVLSTBuiltinType() ? LHSType->getAs() : nullptr; + QualType RHSType = RHS.get()->getType(); + const auto *RHSBT = + RHSType->isVLSTBuiltinType() ? RHSType->getAs() : nullptr; + + QualType ResultType; + + if (LHSBT && RHSBT) { +
[clang] bbb30bd - [clang][AArch64][SVE] Clarify documentation for sizeof operator on SVE
Author: David Truby Date: 2022-08-11T13:22:23Z New Revision: bbb30bd54a6447702f9f59a2ae4c478eb7133ae0 URL: https://github.com/llvm/llvm-project/commit/bbb30bd54a6447702f9f59a2ae4c478eb7133ae0 DIFF: https://github.com/llvm/llvm-project/commit/bbb30bd54a6447702f9f59a2ae4c478eb7133ae0.diff LOG: [clang][AArch64][SVE] Clarify documentation for sizeof operator on SVE Previously the table in LanguageExtensions said that sizeof worked on SVE types but this is only correct for fixed-length vectors so a clarification has been added. Added: Modified: clang/docs/LanguageExtensions.rst Removed: diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst index 3b80289fd5fe..3adf0a12fc4c 100644 --- a/clang/docs/LanguageExtensions.rst +++ b/clang/docs/LanguageExtensions.rst @@ -552,7 +552,7 @@ bitwise operators &,|,^,~yes yes yes yesyes ==, !=, >, <, >=, <= yes yes yes yesyes =yes yes yes yesyes ?: [#]_ yes --yes yesyes -sizeof yes yes yes yesyes +sizeof yes yes yes yesyes [#]_ C-style cast yes yes yes no no reinterpret_cast yes noyes no no static_cast yes noyes no no @@ -568,6 +568,7 @@ See also :ref:`langext-__builtin_shufflevector`, :ref:`langext-__builtin_convert conversions (that is, != 0). If it's an extension (OpenCL) vector, it's only available in C and OpenCL C. And it selects base on signedness of the condition operands (OpenCL v1.1 s6.3.9). +.. [#] sizeof can only be used on vector length specific SVE types. .. [#] Clang does not allow the address of an element to be taken while GCC allows this. This is intentional for vectors with a boolean element type and not implemented otherwise. ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 13a784f - [clang][AArch64][SVE] Change SVE_VECTOR_OPERATORS macro for VLA vectors
Author: David Truby Date: 2022-08-11T13:23:52Z New Revision: 13a784f368ef062a7bd652829bcf8bbdd94dc659 URL: https://github.com/llvm/llvm-project/commit/13a784f368ef062a7bd652829bcf8bbdd94dc659 DIFF: https://github.com/llvm/llvm-project/commit/13a784f368ef062a7bd652829bcf8bbdd94dc659.diff LOG: [clang][AArch64][SVE] Change SVE_VECTOR_OPERATORS macro for VLA vectors The __ARM_FEATURE_SVE_VECTOR_OPERATORS macro should be changed to indicate that this feature is now supported on VLA vectors as well as VLS vectors. There is a complementary PR to the ACLE spec here https://github.com/ARM-software/acle/pull/213 Reviewed By: peterwaller-arm Differential Revision: https://reviews.llvm.org/D131573 Added: Modified: clang/lib/Basic/Targets/AArch64.cpp clang/test/Preprocessor/aarch64-target-features.c Removed: diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 8612138c3194f..85346ebf92ab6 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -489,9 +489,12 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__FP_FAST_FMA", "1"); Builder.defineMacro("__FP_FAST_FMAF", "1"); + // C/C++ operators work on both VLS and VLA SVE types + if (FPU & SveMode) +Builder.defineMacro("__ARM_FEATURE_SVE_VECTOR_OPERATORS", "2"); + if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) { Builder.defineMacro("__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128)); -Builder.defineMacro("__ARM_FEATURE_SVE_VECTOR_OPERATORS"); } } diff --git a/clang/test/Preprocessor/aarch64-target-features.c b/clang/test/Preprocessor/aarch64-target-features.c index 6e495a0ae96e7..2d4ec2bbcae92 100644 --- a/clang/test/Preprocessor/aarch64-target-features.c +++ b/clang/test/Preprocessor/aarch64-target-features.c @@ -150,6 +150,7 @@ // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE %s // CHECK-SVE: __ARM_FEATURE_SVE 1 +// CHECK-SVE: __ARM_FEATURE_SVE_VECTOR_OPERATORS 2 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve+bf16 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE-BF16 %s // CHECK-SVE-BF16: __ARM_FEATURE_BF16_SCALAR_ARITHMETIC 1 @@ -512,9 +513,7 @@ // RUN: %clang -target aarch64-arm-none-eabi -march=armv8-a+sve -msve-vector-bits=2048 -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-SVE-VECTOR-BITS -D#VBITS=2048 %s // RUN: %clang -target aarch64-arm-none-eabi -march=armv8-a+sve -msve-vector-bits=512+ -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-NO-SVE-VECTOR-BITS %s // CHECK-SVE-VECTOR-BITS: __ARM_FEATURE_SVE_BITS [[#VBITS:]] -// CHECK-SVE-VECTOR-BITS: __ARM_FEATURE_SVE_VECTOR_OPERATORS 1 // CHECK-NO-SVE-VECTOR-BITS-NOT: __ARM_FEATURE_SVE_BITS -// CHECK-NO-SVE-VECTOR-BITS-NOT: __ARM_FEATURE_SVE_VECTOR_OPERATORS // == Check Large System Extensions (LSE) // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+lse -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-LSE %s ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] b4f2f7b - [clang][AArch64][SVE] Implicit conversions for vector-scalar operations
Author: David Truby Date: 2022-06-13T10:22:10Z New Revision: b4f2f7bebd29f7cedd3ce93c1925e8029b8e2b05 URL: https://github.com/llvm/llvm-project/commit/b4f2f7bebd29f7cedd3ce93c1925e8029b8e2b05 DIFF: https://github.com/llvm/llvm-project/commit/b4f2f7bebd29f7cedd3ce93c1925e8029b8e2b05.diff LOG: [clang][AArch64][SVE] Implicit conversions for vector-scalar operations This patch allows the same implicit conversions for vector-scalar operations in SVE that are allowed for NEON. Depends on D126377 Reviewed By: c-rhodes Differential Revision: https://reviews.llvm.org/D126380 Added: Modified: clang/lib/Sema/SemaChecking.cpp clang/lib/Sema/SemaExpr.cpp clang/test/CodeGen/aarch64-sve-vector-arith-ops.c clang/test/Sema/aarch64-sve-vector-arith-ops.c clang/test/Sema/sizeless-1.c clang/test/SemaCXX/sizeless-1.cpp Removed: diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 57a034d3c61e9..9cb031b87f3a8 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -13574,6 +13574,29 @@ static void CheckImplicitConversion(Sema &S, Expr *E, QualType T, const BuiltinType *SourceBT = dyn_cast(Source); const BuiltinType *TargetBT = dyn_cast(Target); + // Strip SVE vector types + if (SourceBT && SourceBT->isVLSTBuiltinType()) { +// Need the original target type for vector type checks +const Type *OriginalTarget = S.Context.getCanonicalType(T).getTypePtr(); +// Handle conversion from scalable to fixed when msve-vector-bits is +// specified +if (S.Context.areCompatibleSveTypes(QualType(OriginalTarget, 0), +QualType(Source, 0)) || +S.Context.areLaxCompatibleSveTypes(QualType(OriginalTarget, 0), + QualType(Source, 0))) + return; + +// If the vector cast is cast between two vectors of the same size, it is +// a bitcast, not a conversion. +if (S.Context.getTypeSize(Source) == S.Context.getTypeSize(Target)) + return; + +Source = SourceBT->getSveEltType(S.Context).getTypePtr(); + } + + if (TargetBT && TargetBT->isVLSTBuiltinType()) +Target = TargetBT->getSveEltType(S.Context).getTypePtr(); + // If the source is floating point... if (SourceBT && SourceBT->isFloatingPoint()) { // ...and the target is floating point... diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index e44172c399639..7e6618bd2d11d 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -10261,12 +10261,18 @@ static bool tryGCCVectorConvertAndSplat(Sema &S, ExprResult *Scalar, ExprResult *Vector) { QualType ScalarTy = Scalar->get()->getType().getUnqualifiedType(); QualType VectorTy = Vector->get()->getType().getUnqualifiedType(); - const auto *VT = VectorTy->castAs(); - - assert(!isa(VT) && - "ExtVectorTypes should not be handled here!"); - - QualType VectorEltTy = VT->getElementType(); + QualType VectorEltTy; + + if (const auto *VT = VectorTy->getAs()) { +assert(!isa(VT) && + "ExtVectorTypes should not be handled here!"); +VectorEltTy = VT->getElementType(); + } else if (VectorTy->isVLSTBuiltinType()) { +VectorEltTy = +VectorTy->castAs()->getSveEltType(S.getASTContext()); + } else { +llvm_unreachable("Only Fixed-Length and SVE Vector types are handled here"); + } // Reject cases where the vector element type or the scalar element type are // not integral or floating point types. @@ -10593,24 +10599,14 @@ QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, if (Context.hasSameType(LHSType, RHSType)) return LHSType; - auto tryScalableVectorConvert = [this](ExprResult *Src, QualType SrcType, - QualType DestType) { -const QualType DestBaseType = DestType->getSveEltType(Context); -if (DestBaseType->getUnqualifiedDesugaredType() == -SrcType->getUnqualifiedDesugaredType()) { - unsigned DiagID = diag::err_typecheck_invalid_operands; - if (!tryVectorConvertAndSplat(*this, Src, SrcType, DestBaseType, DestType, -DiagID)) -return DestType; -} -return QualType(); - }; - if (LHSType->isVLSTBuiltinType() && !RHSType->isVLSTBuiltinType()) { -auto DestType = tryScalableVectorConvert(&RHS, RHSType, LHSType); -if (DestType == QualType()) - return InvalidOperands(Loc, LHS, RHS); -return DestType; +if (!tryGCCVectorConvertAndSplat(*this, &RHS, &LHS)) + return LHSType; + } + if (RHSType->isVLSTBuiltinType() && !LHSType->isVLSTBuiltinType()) { +if (LHS.get()->isLValue() || +!tryGCCVectorConvertAndSplat(*this, &LHS, &RHS)) + return RHSType; } if ((!LHSType->isVLSTBuiltinType() && !LHSTyp
[clang] [cmake] Add LLVM_FORCE_VC_REVISION option (PR #67125)
https://github.com/DavidTruby created https://github.com/llvm/llvm-project/pull/67125 This patch adds a LLVM_FORCE_VC_REVISION option to force a custom VC revision to be included instead of trying to fetch one from a git command. This is helpful in environments where git is not available or is non-functional but the vc revision is available through some other means. >From 0690521dd83e8fae81f65bce173ed7189ff9307b Mon Sep 17 00:00:00 2001 From: David Truby Date: Fri, 22 Sep 2023 12:22:49 + Subject: [PATCH] [cmake] Add LLVM_FORCE_VC_REVISION option This patch adds a LLVM_FORCE_VC_REVISION option to force a custom VC revision to be included instead of trying to fetch one from a git command. This is helpful in environments where git is not available or is non-functional but the vc revision is available through some other means. --- clang/lib/Basic/CMakeLists.txt | 2 ++ flang/lib/Common/CMakeLists.txt | 4 +++- lld/Common/CMakeLists.txt | 2 ++ lldb/source/Version/CMakeLists.txt | 2 ++ llvm/CMakeLists.txt | 6 ++ llvm/cmake/modules/GenerateVersionFromVCS.cmake | 9 - llvm/include/llvm/Support/CMakeLists.txt| 4 7 files changed, 27 insertions(+), 2 deletions(-) diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index db59d7dd96da0a4..36ccf7d0809453e 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -39,6 +39,8 @@ add_custom_command(OUTPUT "${version_inc}" "-DHEADER_FILE=${version_inc}" "-DLLVM_VC_REPOSITORY=${llvm_vc_repository}" "-DLLVM_VC_REVISION=${llvm_vc_revision}" + "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}" + "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}" -P "${generate_vcs_version_script}") # Mark the generated header as being generated. diff --git a/flang/lib/Common/CMakeLists.txt b/flang/lib/Common/CMakeLists.txt index 81cee82e04b88ae..c6f818ad27cd19a 100644 --- a/flang/lib/Common/CMakeLists.txt +++ b/flang/lib/Common/CMakeLists.txt @@ -12,7 +12,7 @@ endif() if(flang_vc AND LLVM_APPEND_VC_REV) set(flang_source_dir ${FLANG_SOURCE_DIR}) endif() - + # Create custom target to generate the VC revision include. add_custom_command(OUTPUT "${version_inc}" DEPENDS "${llvm_vc}" "${flang_vc}" "${generate_vcs_version_script}" @@ -20,6 +20,8 @@ add_custom_command(OUTPUT "${version_inc}" "-DLLVM_SOURCE_DIR=${llvm_source_dir}" "-DFLANG_SOURCE_DIR=${flang_source_dir}" "-DHEADER_FILE=${version_inc}" + "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}" + "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}" -P "${generate_vcs_version_script}") # Mark the generated header as being generated. diff --git a/lld/Common/CMakeLists.txt b/lld/Common/CMakeLists.txt index c975da2a49b6bda..4f503d04f7844f7 100644 --- a/lld/Common/CMakeLists.txt +++ b/lld/Common/CMakeLists.txt @@ -13,6 +13,8 @@ add_custom_command(OUTPUT "${version_inc}" COMMAND ${CMAKE_COMMAND} "-DNAMES=LLD" "-DLLD_SOURCE_DIR=${lld_source_dir}" "-DHEADER_FILE=${version_inc}" + "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}" + "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}" -P "${generate_vcs_version_script}") # Mark the generated header as being generated. diff --git a/lldb/source/Version/CMakeLists.txt b/lldb/source/Version/CMakeLists.txt index c1393b5dd6e6b62..90fe53d52cc5d05 100644 --- a/lldb/source/Version/CMakeLists.txt +++ b/lldb/source/Version/CMakeLists.txt @@ -17,6 +17,8 @@ add_custom_command(OUTPUT "${vcs_version_inc}" COMMAND ${CMAKE_COMMAND} "-DNAMES=LLDB" "-DLLDB_SOURCE_DIR=${lldb_source_dir}" "-DHEADER_FILE=${vcs_version_inc}" + "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}" + "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}" -P "${generate_vcs_version_script}") set_source_files_properties("${vcs_version_inc}" diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index fa39c7554de1f61..5985256498dcbb2 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -325,6 +325,12 @@ include(VersionFromVCS) option(LLVM_APPEND_VC_REV "Embed the version control system revision in LLVM" ON) +set(LLVM_FORCE_VC_REVISION + "" CACHE STRING "Force custom VC revision for LLVM_APPEND_VC_REV") + +set(LLVM_FORCE_VC_REPOSITORY + "" CACHE STRING "Force custom VC repository for LLVM_APPEND_VC_REV") + option(LLVM_TOOL_LLVM_DRIVER_BUILD "Enables building the llvm multicall tool" OFF) set(PACKAGE_NAME LLVM) diff --git a
[clang] [cmake] Add LLVM_FORCE_VC_REVISION option (PR #67125)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/67125 >From 0690521dd83e8fae81f65bce173ed7189ff9307b Mon Sep 17 00:00:00 2001 From: David Truby Date: Fri, 22 Sep 2023 12:22:49 + Subject: [PATCH 1/2] [cmake] Add LLVM_FORCE_VC_REVISION option This patch adds a LLVM_FORCE_VC_REVISION option to force a custom VC revision to be included instead of trying to fetch one from a git command. This is helpful in environments where git is not available or is non-functional but the vc revision is available through some other means. --- clang/lib/Basic/CMakeLists.txt | 2 ++ flang/lib/Common/CMakeLists.txt | 4 +++- lld/Common/CMakeLists.txt | 2 ++ lldb/source/Version/CMakeLists.txt | 2 ++ llvm/CMakeLists.txt | 6 ++ llvm/cmake/modules/GenerateVersionFromVCS.cmake | 9 - llvm/include/llvm/Support/CMakeLists.txt| 4 7 files changed, 27 insertions(+), 2 deletions(-) diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index db59d7dd96da0a4..36ccf7d0809453e 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -39,6 +39,8 @@ add_custom_command(OUTPUT "${version_inc}" "-DHEADER_FILE=${version_inc}" "-DLLVM_VC_REPOSITORY=${llvm_vc_repository}" "-DLLVM_VC_REVISION=${llvm_vc_revision}" + "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}" + "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}" -P "${generate_vcs_version_script}") # Mark the generated header as being generated. diff --git a/flang/lib/Common/CMakeLists.txt b/flang/lib/Common/CMakeLists.txt index 81cee82e04b88ae..c6f818ad27cd19a 100644 --- a/flang/lib/Common/CMakeLists.txt +++ b/flang/lib/Common/CMakeLists.txt @@ -12,7 +12,7 @@ endif() if(flang_vc AND LLVM_APPEND_VC_REV) set(flang_source_dir ${FLANG_SOURCE_DIR}) endif() - + # Create custom target to generate the VC revision include. add_custom_command(OUTPUT "${version_inc}" DEPENDS "${llvm_vc}" "${flang_vc}" "${generate_vcs_version_script}" @@ -20,6 +20,8 @@ add_custom_command(OUTPUT "${version_inc}" "-DLLVM_SOURCE_DIR=${llvm_source_dir}" "-DFLANG_SOURCE_DIR=${flang_source_dir}" "-DHEADER_FILE=${version_inc}" + "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}" + "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}" -P "${generate_vcs_version_script}") # Mark the generated header as being generated. diff --git a/lld/Common/CMakeLists.txt b/lld/Common/CMakeLists.txt index c975da2a49b6bda..4f503d04f7844f7 100644 --- a/lld/Common/CMakeLists.txt +++ b/lld/Common/CMakeLists.txt @@ -13,6 +13,8 @@ add_custom_command(OUTPUT "${version_inc}" COMMAND ${CMAKE_COMMAND} "-DNAMES=LLD" "-DLLD_SOURCE_DIR=${lld_source_dir}" "-DHEADER_FILE=${version_inc}" + "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}" + "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}" -P "${generate_vcs_version_script}") # Mark the generated header as being generated. diff --git a/lldb/source/Version/CMakeLists.txt b/lldb/source/Version/CMakeLists.txt index c1393b5dd6e6b62..90fe53d52cc5d05 100644 --- a/lldb/source/Version/CMakeLists.txt +++ b/lldb/source/Version/CMakeLists.txt @@ -17,6 +17,8 @@ add_custom_command(OUTPUT "${vcs_version_inc}" COMMAND ${CMAKE_COMMAND} "-DNAMES=LLDB" "-DLLDB_SOURCE_DIR=${lldb_source_dir}" "-DHEADER_FILE=${vcs_version_inc}" + "-DLLVM_FORCE_VC_REVISION=${LLVM_FORCE_VC_REVISION}" + "-DLLVM_FORCE_VC_REPOSITORY=${LLVM_FORCE_VC_REPOSITORY}" -P "${generate_vcs_version_script}") set_source_files_properties("${vcs_version_inc}" diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index fa39c7554de1f61..5985256498dcbb2 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -325,6 +325,12 @@ include(VersionFromVCS) option(LLVM_APPEND_VC_REV "Embed the version control system revision in LLVM" ON) +set(LLVM_FORCE_VC_REVISION + "" CACHE STRING "Force custom VC revision for LLVM_APPEND_VC_REV") + +set(LLVM_FORCE_VC_REPOSITORY + "" CACHE STRING "Force custom VC repository for LLVM_APPEND_VC_REV") + option(LLVM_TOOL_LLVM_DRIVER_BUILD "Enables building the llvm multicall tool" OFF) set(PACKAGE_NAME LLVM) diff --git a/llvm/cmake/modules/GenerateVersionFromVCS.cmake b/llvm/cmake/modules/GenerateVersionFromVCS.cmake index 9cd780e5aa162c0..1b3b2946e62b25c 100644 --- a/llvm/cmake/modules/GenerateVersionFromVCS.cmake +++ b/llvm/cmake/modules/GenerateVersionFromVCS.cmake @@ -36,7 +36,14 @@ function
[clang] [cmake] Add LLVM_FORCE_VC_REVISION option (PR #67125)
https://github.com/DavidTruby closed https://github.com/llvm/llvm-project/pull/67125 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang]Add vscale argument parsing (PR #67676)
https://github.com/DavidTruby approved this pull request. LGTM :) https://github.com/llvm/llvm-project/pull/67676 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits