[flang] [clang] [Flang] Add code-object-version option (PR #72638)
@@ -85,6 +85,19 @@ class CodeGenOptions : public CodeGenOptionsBase { RK_WithPattern, // Remark pattern specified via '-Rgroup=regexp'. }; + /// \brief Enumeration value for AMDGPU code object version, which is the + /// code object version times 100. + enum class CodeObjectVersionKind { +COV_None, +COV_2 = 200, // Unsupported. +COV_3 = 300, // Unsupported. +COV_4 = 400, +COV_5 = 500, + }; kiranchandramohan wrote: If possible move this to `llvm/include/llvm/Frontend/Driver/TargetOptions.h`. https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
banach-space wrote: All test files in this PR use hyphen (`-`) rather than underscore (`_`) ;-) https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
@@ -264,6 +263,37 @@ static void addDepdendentLibs(mlir::ModuleOp &mlirModule, } } +// Add to MLIR code target specific items which are dependent on target +// configuration specified by the user +static void addTargetSpecificMLIRItems(mlir::ModuleOp &mlirModule, + CompilerInstance &ci) { + const TargetOptions &targetOpts = ci.getInvocation().getTargetOpts(); + const llvm::Triple triple(targetOpts.triple); + if (triple.isAMDGPU()) { +unsigned oclcABIVERsion; +const unsigned defaultOclcABIVERsion = 400; +mlir::OpBuilder builder(mlirModule.getContext()); +const CodeGenOptions &codeGenOpts = ci.getInvocation().getCodeGenOpts(); +if (codeGenOpts.CodeObjectVersion == +CodeGenOptions::CodeObjectVersionKind::COV_None) + oclcABIVERsion = defaultOclcABIVERsion; +else + oclcABIVERsion = static_cast(codeGenOpts.CodeObjectVersion); + +auto int32Type = builder.getI32Type(); +auto covInfo = builder.create( +mlirModule.getLoc(), int32Type, true, mlir::LLVM::Linkage::WeakODR, +"__oclc_ABI_version", +builder.getIntegerAttr(int32Type, oclcABIVERsion)); +covInfo.setUnnamedAddr(mlir::LLVM::UnnamedAddr::Local); +covInfo.setAddrSpace(4); +covInfo.setVisibility_(mlir::LLVM::Visibility::Hidden); +builder.setInsertionPointToStart(mlirModule.getBody()); +builder.insert(covInfo); + } + addDependentLibs(mlirModule, ci); banach-space wrote: My terminology might be off, but: * most of this function adds some specific to a particular hardware _target_ (i.e. AMDGPU), * `addDependentLibs` is something linked to specific to a particular _platform_ (i.e. MSVC/Windows). My suggestion: * keep `addDependentLibs` as an independent hook, * rename `addTargetSpecificMLIRItems` as `addAMDGPUSpecificMLIRItems` (we can rename this later if people want to add support for other targets). @jsjodin - is that consistent with what you had in mind? https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
@@ -85,6 +85,19 @@ class CodeGenOptions : public CodeGenOptionsBase { RK_WithPattern, // Remark pattern specified via '-Rgroup=regexp'. }; + /// \brief Enumeration value for AMDGPU code object version, which is the + /// code object version times 100. + enum class CodeObjectVersionKind { +COV_None, +COV_2 = 200, // Unsupported. +COV_3 = 300, // Unsupported. banach-space wrote: What does `COV` stand for and what does `unsupported` mean in this context? Why list any unsupported versions? Isn't it a bit like: * `400` and `500` _are supported_, and * everything else is _not supported_? https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
https://github.com/jsjodin edited https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
@@ -264,6 +263,37 @@ static void addDepdendentLibs(mlir::ModuleOp &mlirModule, } } +// Add to MLIR code target specific items which are dependent on target +// configuration specified by the user +static void addTargetSpecificMLIRItems(mlir::ModuleOp &mlirModule, + CompilerInstance &ci) { + const TargetOptions &targetOpts = ci.getInvocation().getTargetOpts(); + const llvm::Triple triple(targetOpts.triple); + if (triple.isAMDGPU()) { +unsigned oclcABIVERsion; +const unsigned defaultOclcABIVERsion = 400; skatrak wrote: Would it be possible/advisable to have this constant somewhere shared between clang and flang, so they are guaranteed to default to the same ABI version? https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
@@ -264,6 +263,37 @@ static void addDepdendentLibs(mlir::ModuleOp &mlirModule, } } +// Add to MLIR code target specific items which are dependent on target +// configuration specified by the user +static void addTargetSpecificMLIRItems(mlir::ModuleOp &mlirModule, + CompilerInstance &ci) { + const TargetOptions &targetOpts = ci.getInvocation().getTargetOpts(); + const llvm::Triple triple(targetOpts.triple); + if (triple.isAMDGPU()) { +unsigned oclcABIVERsion; +const unsigned defaultOclcABIVERsion = 400; +mlir::OpBuilder builder(mlirModule.getContext()); +const CodeGenOptions &codeGenOpts = ci.getInvocation().getCodeGenOpts(); +if (codeGenOpts.CodeObjectVersion == +CodeGenOptions::CodeObjectVersionKind::COV_None) + oclcABIVERsion = defaultOclcABIVERsion; +else + oclcABIVERsion = static_cast(codeGenOpts.CodeObjectVersion); + +auto int32Type = builder.getI32Type(); +auto covInfo = builder.create( +mlirModule.getLoc(), int32Type, true, mlir::LLVM::Linkage::WeakODR, +"__oclc_ABI_version", +builder.getIntegerAttr(int32Type, oclcABIVERsion)); +covInfo.setUnnamedAddr(mlir::LLVM::UnnamedAddr::Local); +covInfo.setAddrSpace(4); skatrak wrote: Is this address space value defined in any enumeration that could be used here, rather than passing just a number? Of if they are documented somewhere, at least refer to it in a comment. https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
https://github.com/skatrak commented: Thanks for this work, Dominik. It LGTM, but please wait for another review before merging. I have a couple of suggestions for small improvements, but let me know if they would take significant effort to address, as I'm not completely familiar with that part of the project. https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
https://github.com/DominikAdamski updated https://github.com/llvm/llvm-project/pull/72638 >From e5d339c24193e4e37013b3b25460009418d6ce6d Mon Sep 17 00:00:00 2001 From: Dominik Adamski Date: Fri, 17 Nov 2023 03:02:49 -0600 Subject: [PATCH] [Flang] Add code-object-version option Information about code object version can be configured by the user for AMD GPU target and it needs to be placed in LLVM IR generated by Flang. Information about code object version in MLIR generated by the parser can be reused by other tools. There is no need to specify extra flags if we want to invoke MLIR tools separately. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/Flang.cpp | 11 ++ clang/lib/Driver/ToolChains/Flang.h | 7 flang/include/flang/Frontend/CodeGenOptions.h | 13 +++ flang/lib/Frontend/CompilerInvocation.cpp | 9 + flang/lib/Frontend/FrontendActions.cpp| 39 +-- flang/test/Driver/code-object-version.f90 | 8 flang/test/Driver/driver-help-hidden.f90 | 2 + flang/test/Driver/driver-help.f90 | 4 ++ flang/test/Lower/AMD/code_object_version.f90 | 11 ++ 10 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 flang/test/Driver/code-object-version.f90 create mode 100644 flang/test/Lower/AMD/code_object_version.f90 diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 811550416110b3d..e7eb94d174e75f8 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4688,7 +4688,7 @@ defm amdgpu_ieee : BoolOption<"m", "amdgpu-ieee", def mcode_object_version_EQ : Joined<["-"], "mcode-object-version=">, Group, HelpText<"Specify code object ABI version. Defaults to 4. (AMDGPU only)">, - Visibility<[ClangOption, CC1Option]>, + Visibility<[ClangOption, FlangOption, CC1Option, FC1Option]>, Values<"none,4,5">, NormalizedValuesScope<"TargetOptions">, NormalizedValues<["COV_None", "COV_4", "COV_5"]>, diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 8bdd920c3dcbb79..e60c11bfbe8e38b 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -204,6 +204,14 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args, } } +void Flang::AddAMDGPUTargetArgs(const ArgList &Args, +ArgStringList &CmdArgs) const { + if (Arg *A = Args.getLastArg(options::OPT_mcode_object_version_EQ)) { +StringRef Val = A->getValue(); +CmdArgs.push_back(Args.MakeArgString("-mcode-object-version=" + Val)); + } +} + void Flang::addTargetOptions(const ArgList &Args, ArgStringList &CmdArgs) const { const ToolChain &TC = getToolChain(); @@ -227,6 +235,9 @@ void Flang::addTargetOptions(const ArgList &Args, case llvm::Triple::r600: case llvm::Triple::amdgcn: +getTargetFeatures(D, Triple, Args, CmdArgs, /*ForAs*/ false); +AddAMDGPUTargetArgs(Args, CmdArgs); +break; case llvm::Triple::riscv64: case llvm::Triple::x86_64: getTargetFeatures(D, Triple, Args, CmdArgs, /*ForAs*/ false); diff --git a/clang/lib/Driver/ToolChains/Flang.h b/clang/lib/Driver/ToolChains/Flang.h index 0141240b5d3ac90..8d35080e1c0c88b 100644 --- a/clang/lib/Driver/ToolChains/Flang.h +++ b/clang/lib/Driver/ToolChains/Flang.h @@ -63,6 +63,13 @@ class LLVM_LIBRARY_VISIBILITY Flang : public Tool { void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; + /// Add specific options for AMDGPU target. + /// + /// \param [in] Args The list of input driver arguments + /// \param [out] CmdArgs The list of output command arguments + void AddAMDGPUTargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; + /// Extract offload options from the driver arguments and add them to /// the command arguments. /// \param [in] C The current compilation for the driver invocation diff --git a/flang/include/flang/Frontend/CodeGenOptions.h b/flang/include/flang/Frontend/CodeGenOptions.h index b86bb88610a9a4a..8d938c361a0aa23 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.h +++ b/flang/include/flang/Frontend/CodeGenOptions.h @@ -85,6 +85,19 @@ class CodeGenOptions : public CodeGenOptionsBase { RK_WithPattern, // Remark pattern specified via '-Rgroup=regexp'. }; + /// \brief Enumeration value for AMDGPU code object version, which is the + /// code object version times 100. + enum class CodeObjectVersionKind { +COV_None, +COV_2 = 200, // Unsupported. +COV_3 = 300, // Unsupported. +COV_4 = 400, +COV_5 = 500, + }; + + /// \brief Code object version for AMDGPU. + CodeObjectVersionKind CodeObjectVersion = CodeObjectVersionKind::COV_None; + /// Optimization remark with an optional regular expre
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff a67b85ef63c7ec29c2076294e3f7c7f923144a53 eb2710b0f736860dac62cc2ff8907fcefc64a8d6 -- clang/lib/Driver/ToolChains/Flang.cpp clang/lib/Driver/ToolChains/Flang.h flang/include/flang/Frontend/CodeGenOptions.h flang/lib/Frontend/CompilerInvocation.cpp flang/lib/Frontend/FrontendActions.cpp `` View the diff from clang-format here. ``diff diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 6184f80eda..6888ba1cd8 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -244,8 +244,7 @@ static void setMLIRDataLayout(mlir::ModuleOp &mlirModule, mlirModule->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec); } -static void addDependentLibs(mlir::ModuleOp &mlirModule, - CompilerInstance &ci) { +static void addDependentLibs(mlir::ModuleOp &mlirModule, CompilerInstance &ci) { const std::vector &libs = ci.getInvocation().getCodeGenOpts().DependentLibs; if (libs.empty()) { `` https://github.com/llvm/llvm-project/pull/72638 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [Flang] Add code-object-version option (PR #72638)
llvmbot wrote: @llvm/pr-subscribers-clang-driver @llvm/pr-subscribers-flang-driver Author: Dominik Adamski (DominikAdamski) Changes Information about code object version can be configured by the user for AMD GPU target and it needs to be placed in LLVM IR generated by Flang. Information about code object version in MLIR generated by the parser can be reused by other tools. There is no need to specify extra flags if we want to invoke MLIR tools (like fir-opt) separately. --- Full diff: https://github.com/llvm/llvm-project/pull/72638.diff 10 Files Affected: - (modified) clang/include/clang/Driver/Options.td (+1-1) - (modified) clang/lib/Driver/ToolChains/Flang.cpp (+11) - (modified) clang/lib/Driver/ToolChains/Flang.h (+7) - (modified) flang/include/flang/Frontend/CodeGenOptions.h (+13) - (modified) flang/lib/Frontend/CompilerInvocation.cpp (+9) - (modified) flang/lib/Frontend/FrontendActions.cpp (+35-3) - (added) flang/test/Driver/code-object-version.f90 (+8) - (modified) flang/test/Driver/driver-help-hidden.f90 (+2) - (modified) flang/test/Driver/driver-help.f90 (+4) - (added) flang/test/Lower/AMD/code_object_version.f90 (+11) ``diff diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 811550416110b3d..e7eb94d174e75f8 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4688,7 +4688,7 @@ defm amdgpu_ieee : BoolOption<"m", "amdgpu-ieee", def mcode_object_version_EQ : Joined<["-"], "mcode-object-version=">, Group, HelpText<"Specify code object ABI version. Defaults to 4. (AMDGPU only)">, - Visibility<[ClangOption, CC1Option]>, + Visibility<[ClangOption, FlangOption, CC1Option, FC1Option]>, Values<"none,4,5">, NormalizedValuesScope<"TargetOptions">, NormalizedValues<["COV_None", "COV_4", "COV_5"]>, diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 8bdd920c3dcbb79..e60c11bfbe8e38b 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -204,6 +204,14 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args, } } +void Flang::AddAMDGPUTargetArgs(const ArgList &Args, +ArgStringList &CmdArgs) const { + if (Arg *A = Args.getLastArg(options::OPT_mcode_object_version_EQ)) { +StringRef Val = A->getValue(); +CmdArgs.push_back(Args.MakeArgString("-mcode-object-version=" + Val)); + } +} + void Flang::addTargetOptions(const ArgList &Args, ArgStringList &CmdArgs) const { const ToolChain &TC = getToolChain(); @@ -227,6 +235,9 @@ void Flang::addTargetOptions(const ArgList &Args, case llvm::Triple::r600: case llvm::Triple::amdgcn: +getTargetFeatures(D, Triple, Args, CmdArgs, /*ForAs*/ false); +AddAMDGPUTargetArgs(Args, CmdArgs); +break; case llvm::Triple::riscv64: case llvm::Triple::x86_64: getTargetFeatures(D, Triple, Args, CmdArgs, /*ForAs*/ false); diff --git a/clang/lib/Driver/ToolChains/Flang.h b/clang/lib/Driver/ToolChains/Flang.h index 0141240b5d3ac90..8d35080e1c0c88b 100644 --- a/clang/lib/Driver/ToolChains/Flang.h +++ b/clang/lib/Driver/ToolChains/Flang.h @@ -63,6 +63,13 @@ class LLVM_LIBRARY_VISIBILITY Flang : public Tool { void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; + /// Add specific options for AMDGPU target. + /// + /// \param [in] Args The list of input driver arguments + /// \param [out] CmdArgs The list of output command arguments + void AddAMDGPUTargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; + /// Extract offload options from the driver arguments and add them to /// the command arguments. /// \param [in] C The current compilation for the driver invocation diff --git a/flang/include/flang/Frontend/CodeGenOptions.h b/flang/include/flang/Frontend/CodeGenOptions.h index b86bb88610a9a4a..8d938c361a0aa23 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.h +++ b/flang/include/flang/Frontend/CodeGenOptions.h @@ -85,6 +85,19 @@ class CodeGenOptions : public CodeGenOptionsBase { RK_WithPattern, // Remark pattern specified via '-Rgroup=regexp'. }; + /// \brief Enumeration value for AMDGPU code object version, which is the + /// code object version times 100. + enum class CodeObjectVersionKind { +COV_None, +COV_2 = 200, // Unsupported. +COV_3 = 300, // Unsupported. +COV_4 = 400, +COV_5 = 500, + }; + + /// \brief Code object version for AMDGPU. + CodeObjectVersionKind CodeObjectVersion = CodeObjectVersionKind::COV_None; + /// Optimization remark with an optional regular expression pattern. struct OptRemark { RemarkKind Kind = RemarkKind::RK_Missing; diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index cb4f