Skip to content

Commit 839344f

Browse files
authored
[clang][flang][mlir] Reapply "Support -frecord-command-line option (#102975)"
The underlying issue was caused by a file included in two different places which resulted in duplicate definition errors when linking individual shared libraries. This was fixed in c3201dd [#109874].
1 parent cbc4be2 commit 839344f

File tree

23 files changed

+245
-59
lines changed

23 files changed

+245
-59
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,16 +2002,18 @@ def fparse_all_comments : Flag<["-"], "fparse-all-comments">, Group<f_clang_Grou
20022002
Visibility<[ClangOption, CC1Option]>,
20032003
MarshallingInfoFlag<LangOpts<"CommentOpts.ParseAllComments">>;
20042004
def frecord_command_line : Flag<["-"], "frecord-command-line">,
2005-
DocBrief<[{Generate a section named ".GCC.command.line" containing the clang
2005+
DocBrief<[{Generate a section named ".GCC.command.line" containing the
20062006
driver command-line. After linking, the section may contain multiple command
20072007
lines, which will be individually terminated by null bytes. Separate arguments
20082008
within a command line are combined with spaces; spaces and backslashes within an
20092009
argument are escaped with backslashes. This format differs from the format of
20102010
the equivalent section produced by GCC with the -frecord-gcc-switches flag.
20112011
This option is currently only supported on ELF targets.}]>,
2012-
Group<f_clang_Group>;
2012+
Group<f_Group>,
2013+
Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>;
20132014
def fno_record_command_line : Flag<["-"], "fno-record-command-line">,
2014-
Group<f_clang_Group>;
2015+
Group<f_Group>,
2016+
Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>;
20152017
def : Flag<["-"], "frecord-gcc-switches">, Alias<frecord_command_line>;
20162018
def : Flag<["-"], "fno-record-gcc-switches">, Alias<fno_record_command_line>;
20172019
def fcommon : Flag<["-"], "fcommon">, Group<f_Group>,
@@ -7166,6 +7168,9 @@ def mrelocation_model : Separate<["-"], "mrelocation-model">,
71667168
NormalizedValues<["Static", "PIC_", "ROPI", "RWPI", "ROPI_RWPI", "DynamicNoPIC"]>,
71677169
MarshallingInfoEnum<CodeGenOpts<"RelocationModel">, "PIC_">;
71687170
def debug_info_kind_EQ : Joined<["-"], "debug-info-kind=">;
7171+
def record_command_line : Separate<["-"], "record-command-line">,
7172+
HelpText<"The string to embed in the .LLVM.command.line section.">,
7173+
MarshallingInfoString<CodeGenOpts<"RecordCommandLine">>;
71697174

71707175
} // let Visibility = [CC1Option, CC1AsOption, FC1Option]
71717176

@@ -7186,9 +7191,6 @@ def debugger_tuning_EQ : Joined<["-"], "debugger-tuning=">,
71867191
def dwarf_debug_flags : Separate<["-"], "dwarf-debug-flags">,
71877192
HelpText<"The string to embed in the Dwarf debug flags record.">,
71887193
MarshallingInfoString<CodeGenOpts<"DwarfDebugFlags">>;
7189-
def record_command_line : Separate<["-"], "record-command-line">,
7190-
HelpText<"The string to embed in the .LLVM.command.line section.">,
7191-
MarshallingInfoString<CodeGenOpts<"RecordCommandLine">>;
71927194
def compress_debug_sections_EQ : Joined<["-", "--"], "compress-debug-sections=">,
71937195
HelpText<"DWARF debug sections compression type">, Values<"none,zlib,zstd">,
71947196
NormalizedValuesScope<"llvm::DebugCompressionType">, NormalizedValues<["None", "Zlib", "Zstd"]>,

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 6 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -94,24 +94,6 @@ static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
9494
<< "-static";
9595
}
9696

97-
// Add backslashes to escape spaces and other backslashes.
98-
// This is used for the space-separated argument list specified with
99-
// the -dwarf-debug-flags option.
100-
static void EscapeSpacesAndBackslashes(const char *Arg,
101-
SmallVectorImpl<char> &Res) {
102-
for (; *Arg; ++Arg) {
103-
switch (*Arg) {
104-
default:
105-
break;
106-
case ' ':
107-
case '\\':
108-
Res.push_back('\\');
109-
break;
110-
}
111-
Res.push_back(*Arg);
112-
}
113-
}
114-
11597
/// Apply \a Work on the current tool chain \a RegularToolChain and any other
11698
/// offloading tool chain that is associated with the current action \a JA.
11799
static void
@@ -7724,31 +7706,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
77247706
// Also record command line arguments into the debug info if
77257707
// -grecord-gcc-switches options is set on.
77267708
// By default, -gno-record-gcc-switches is set on and no recording.
7727-
auto GRecordSwitches =
7728-
Args.hasFlag(options::OPT_grecord_command_line,
7729-
options::OPT_gno_record_command_line, false);
7730-
auto FRecordSwitches =
7731-
Args.hasFlag(options::OPT_frecord_command_line,
7732-
options::OPT_fno_record_command_line, false);
7733-
if (FRecordSwitches && !Triple.isOSBinFormatELF() &&
7734-
!Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
7735-
D.Diag(diag::err_drv_unsupported_opt_for_target)
7736-
<< Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
7737-
<< TripleStr;
7738-
if (TC.UseDwarfDebugFlags() || GRecordSwitches || FRecordSwitches) {
7739-
ArgStringList OriginalArgs;
7740-
for (const auto &Arg : Args)
7741-
Arg->render(Args, OriginalArgs);
7742-
7743-
SmallString<256> Flags;
7744-
EscapeSpacesAndBackslashes(Exec, Flags);
7745-
for (const char *OriginalArg : OriginalArgs) {
7746-
SmallString<128> EscapedArg;
7747-
EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
7748-
Flags += " ";
7749-
Flags += EscapedArg;
7750-
}
7751-
auto FlagsArgString = Args.MakeArgString(Flags);
7709+
auto GRecordSwitches = false;
7710+
auto FRecordSwitches = false;
7711+
if (shouldRecordCommandLine(TC, Args, FRecordSwitches, GRecordSwitches)) {
7712+
auto FlagsArgString = renderEscapedCommandLine(TC, Args);
77527713
if (TC.UseDwarfDebugFlags() || GRecordSwitches) {
77537714
CmdArgs.push_back("-dwarf-debug-flags");
77547715
CmdArgs.push_back(FlagsArgString);
@@ -8748,10 +8709,10 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
87488709

87498710
SmallString<256> Flags;
87508711
const char *Exec = getToolChain().getDriver().getClangProgramPath();
8751-
EscapeSpacesAndBackslashes(Exec, Flags);
8712+
escapeSpacesAndBackslashes(Exec, Flags);
87528713
for (const char *OriginalArg : OriginalArgs) {
87538714
SmallString<128> EscapedArg;
8754-
EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
8715+
escapeSpacesAndBackslashes(OriginalArg, EscapedArg);
87558716
Flags += " ";
87568717
Flags += EscapedArg;
87578718
}

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2979,3 +2979,62 @@ void tools::handleColorDiagnosticsArgs(const Driver &D, const ArgList &Args,
29792979
if (D.getDiags().getDiagnosticOptions().ShowColors)
29802980
CmdArgs.push_back("-fcolor-diagnostics");
29812981
}
2982+
2983+
void tools::escapeSpacesAndBackslashes(const char *Arg,
2984+
llvm::SmallVectorImpl<char> &Res) {
2985+
for (; *Arg; ++Arg) {
2986+
switch (*Arg) {
2987+
default:
2988+
break;
2989+
case ' ':
2990+
case '\\':
2991+
Res.push_back('\\');
2992+
break;
2993+
}
2994+
Res.push_back(*Arg);
2995+
}
2996+
}
2997+
2998+
const char *tools::renderEscapedCommandLine(const ToolChain &TC,
2999+
const llvm::opt::ArgList &Args) {
3000+
const Driver &D = TC.getDriver();
3001+
const char *Exec = D.getClangProgramPath();
3002+
3003+
llvm::opt::ArgStringList OriginalArgs;
3004+
for (const auto &Arg : Args)
3005+
Arg->render(Args, OriginalArgs);
3006+
3007+
llvm::SmallString<256> Flags;
3008+
escapeSpacesAndBackslashes(Exec, Flags);
3009+
for (const char *OriginalArg : OriginalArgs) {
3010+
llvm::SmallString<128> EscapedArg;
3011+
escapeSpacesAndBackslashes(OriginalArg, EscapedArg);
3012+
Flags += " ";
3013+
Flags += EscapedArg;
3014+
}
3015+
3016+
return Args.MakeArgString(Flags);
3017+
}
3018+
3019+
bool tools::shouldRecordCommandLine(const ToolChain &TC,
3020+
const llvm::opt::ArgList &Args,
3021+
bool &FRecordCommandLine,
3022+
bool &GRecordCommandLine) {
3023+
const Driver &D = TC.getDriver();
3024+
const llvm::Triple &Triple = TC.getEffectiveTriple();
3025+
const std::string &TripleStr = Triple.getTriple();
3026+
3027+
FRecordCommandLine =
3028+
Args.hasFlag(options::OPT_frecord_command_line,
3029+
options::OPT_fno_record_command_line, false);
3030+
GRecordCommandLine =
3031+
Args.hasFlag(options::OPT_grecord_command_line,
3032+
options::OPT_gno_record_command_line, false);
3033+
if (FRecordCommandLine && !Triple.isOSBinFormatELF() &&
3034+
!Triple.isOSBinFormatXCOFF() && !Triple.isOSBinFormatMachO())
3035+
D.Diag(diag::err_drv_unsupported_opt_for_target)
3036+
<< Args.getLastArg(options::OPT_frecord_command_line)->getAsString(Args)
3037+
<< TripleStr;
3038+
3039+
return FRecordCommandLine || TC.UseDwarfDebugFlags() || GRecordCommandLine;
3040+
}

clang/lib/Driver/ToolChains/CommonArgs.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,31 @@ void addMCModel(const Driver &D, const llvm::opt::ArgList &Args,
237237
void handleColorDiagnosticsArgs(const Driver &D, const llvm::opt::ArgList &Args,
238238
llvm::opt::ArgStringList &CmdArgs);
239239

240+
/// Add backslashes to escape spaces and other backslashes.
241+
/// This is used for the space-separated argument list specified with
242+
/// the -dwarf-debug-flags option.
243+
void escapeSpacesAndBackslashes(const char *Arg,
244+
llvm::SmallVectorImpl<char> &Res);
245+
246+
/// Join the args in the given ArgList, escape spaces and backslashes and
247+
/// return the joined string. This is used when saving the command line as a
248+
/// result of using either the -frecord-command-line or -grecord-command-line
249+
/// options. The lifetime of the returned c-string will match that of the Args
250+
/// argument.
251+
const char *renderEscapedCommandLine(const ToolChain &TC,
252+
const llvm::opt::ArgList &Args);
253+
254+
/// Check if the command line should be recorded in the object file. This is
255+
/// done if either -frecord-command-line or -grecord-command-line options have
256+
/// been passed. This also does some error checking since -frecord-command-line
257+
/// is currently only supported on ELF platforms. The last two boolean
258+
/// arguments are out parameters and will be set depending on the command
259+
/// line options that were passed.
260+
bool shouldRecordCommandLine(const ToolChain &TC,
261+
const llvm::opt::ArgList &Args,
262+
bool &FRecordCommandLine,
263+
bool &GRecordCommandLine);
264+
240265
} // end namespace tools
241266
} // end namespace driver
242267
} // end namespace clang

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,20 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
882882

883883
addDashXForInput(Args, Input, CmdArgs);
884884

885+
bool FRecordCmdLine = false;
886+
bool GRecordCmdLine = false;
887+
if (shouldRecordCommandLine(TC, Args, FRecordCmdLine, GRecordCmdLine)) {
888+
const char *CmdLine = renderEscapedCommandLine(TC, Args);
889+
if (FRecordCmdLine) {
890+
CmdArgs.push_back("-record-command-line");
891+
CmdArgs.push_back(CmdLine);
892+
}
893+
if (TC.UseDwarfDebugFlags() || GRecordCmdLine) {
894+
CmdArgs.push_back("-dwarf-debug-flags");
895+
CmdArgs.push_back(CmdLine);
896+
}
897+
}
898+
885899
CmdArgs.push_back(Input.getFilename());
886900

887901
const char *Exec = Args.MakeArgString(D.GetProgramPath("flang", TC));

flang/include/flang/Frontend/CodeGenOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ class CodeGenOptions : public CodeGenOptionsBase {
6363
/// The directory where temp files are stored if specified by -save-temps
6464
std::optional<std::string> SaveTempsDir;
6565

66+
/// The string containing the commandline for the llvm.commandline metadata.
67+
std::optional<std::string> RecordCommandLine;
68+
6669
/// The name of the file to which the backend should save YAML optimization
6770
/// records.
6871
std::string OptRecordFile;

flang/include/flang/Lower/Bridge.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#define FORTRAN_LOWER_BRIDGE_H
1515

1616
#include "flang/Common/Fortran.h"
17+
#include "flang/Frontend/CodeGenOptions.h"
18+
#include "flang/Frontend/TargetOptions.h"
1719
#include "flang/Lower/AbstractConverter.h"
1820
#include "flang/Lower/EnvironmentDefault.h"
1921
#include "flang/Lower/LoweringOptions.h"
@@ -65,11 +67,13 @@ class LoweringBridge {
6567
const Fortran::lower::LoweringOptions &loweringOptions,
6668
const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults,
6769
const Fortran::common::LanguageFeatureControl &languageFeatures,
68-
const llvm::TargetMachine &targetMachine, llvm::StringRef tuneCPU) {
70+
const llvm::TargetMachine &targetMachine,
71+
const Fortran::frontend::TargetOptions &targetOptions,
72+
const Fortran::frontend::CodeGenOptions &codeGenOptions) {
6973
return LoweringBridge(ctx, semanticsContext, defaultKinds, intrinsics,
7074
targetCharacteristics, allCooked, triple, kindMap,
7175
loweringOptions, envDefaults, languageFeatures,
72-
targetMachine, tuneCPU);
76+
targetMachine, targetOptions, codeGenOptions);
7377
}
7478

7579
//===--------------------------------------------------------------------===//
@@ -148,7 +152,9 @@ class LoweringBridge {
148152
const Fortran::lower::LoweringOptions &loweringOptions,
149153
const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults,
150154
const Fortran::common::LanguageFeatureControl &languageFeatures,
151-
const llvm::TargetMachine &targetMachine, const llvm::StringRef tuneCPU);
155+
const llvm::TargetMachine &targetMachine,
156+
const Fortran::frontend::TargetOptions &targetOptions,
157+
const Fortran::frontend::CodeGenOptions &codeGenOptions);
152158
LoweringBridge() = delete;
153159
LoweringBridge(const LoweringBridge &) = delete;
154160

flang/include/flang/Optimizer/Dialect/Support/FIRContext.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ void setIdent(mlir::ModuleOp mod, llvm::StringRef ident);
7777
/// Get the compiler identifier from the Module.
7878
llvm::StringRef getIdent(mlir::ModuleOp mod);
7979

80+
/// Set the command line used in this invocation.
81+
void setCommandline(mlir::ModuleOp mod, llvm::StringRef cmdLine);
82+
83+
/// Get the command line used in this invocation.
84+
llvm::StringRef getCommandline(mlir::ModuleOp mod);
85+
8086
/// Helper for determining the target from the host, etc. Tools may use this
8187
/// function to provide a consistent interpretation of the `--target=<string>`
8288
/// command-line option.

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,12 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
349349
if (auto *a = args.getLastArg(clang::driver::options::OPT_save_temps_EQ))
350350
opts.SaveTempsDir = a->getValue();
351351

352+
// -record-command-line option.
353+
if (const llvm::opt::Arg *a =
354+
args.getLastArg(clang::driver::options::OPT_record_command_line)) {
355+
opts.RecordCommandLine = a->getValue();
356+
}
357+
352358
// -mlink-builtin-bitcode
353359
for (auto *a :
354360
args.filtered(clang::driver::options::OPT_mlink_builtin_bitcode))

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ bool CodeGenAction::beginSourceFileAction() {
301301
kindMap, ci.getInvocation().getLoweringOpts(),
302302
ci.getInvocation().getFrontendOpts().envDefaults,
303303
ci.getInvocation().getFrontendOpts().features, targetMachine,
304-
ci.getInvocation().getTargetOpts().cpuToTuneFor);
304+
ci.getInvocation().getTargetOpts(), ci.getInvocation().getCodeGenOpts());
305305

306306
// Fetch module from lb, so we can set
307307
mlirModule = std::make_unique<mlir::ModuleOp>(lb.getModule());

flang/lib/Lower/Bridge.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6062,7 +6062,9 @@ Fortran::lower::LoweringBridge::LoweringBridge(
60626062
const Fortran::lower::LoweringOptions &loweringOptions,
60636063
const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults,
60646064
const Fortran::common::LanguageFeatureControl &languageFeatures,
6065-
const llvm::TargetMachine &targetMachine, const llvm::StringRef tuneCPU)
6065+
const llvm::TargetMachine &targetMachine,
6066+
const Fortran::frontend::TargetOptions &targetOpts,
6067+
const Fortran::frontend::CodeGenOptions &cgOpts)
60666068
: semanticsContext{semanticsContext}, defaultKinds{defaultKinds},
60676069
intrinsics{intrinsics}, targetCharacteristics{targetCharacteristics},
60686070
cooked{&cooked}, context{context}, kindMap{kindMap},
@@ -6119,11 +6121,13 @@ Fortran::lower::LoweringBridge::LoweringBridge(
61196121
fir::setTargetTriple(*module.get(), triple);
61206122
fir::setKindMapping(*module.get(), kindMap);
61216123
fir::setTargetCPU(*module.get(), targetMachine.getTargetCPU());
6122-
fir::setTuneCPU(*module.get(), tuneCPU);
6124+
fir::setTuneCPU(*module.get(), targetOpts.cpuToTuneFor);
61236125
fir::setTargetFeatures(*module.get(), targetMachine.getTargetFeatureString());
61246126
fir::support::setMLIRDataLayout(*module.get(),
61256127
targetMachine.createDataLayout());
61266128
fir::setIdent(*module.get(), Fortran::common::getFlangFullVersion());
6129+
if (cgOpts.RecordCommandLine)
6130+
fir::setCommandline(*module.get(), *cgOpts.RecordCommandLine);
61276131
}
61286132

61296133
void Fortran::lower::genCleanUpInRegionIfAny(

flang/lib/Optimizer/Dialect/Support/FIRContext.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,22 @@ llvm::StringRef fir::getIdent(mlir::ModuleOp mod) {
130130
return {};
131131
}
132132

133+
void fir::setCommandline(mlir::ModuleOp mod, llvm::StringRef cmdLine) {
134+
if (cmdLine.empty())
135+
return;
136+
137+
mlir::MLIRContext *ctx = mod.getContext();
138+
mod->setAttr(mlir::LLVM::LLVMDialect::getCommandlineAttrName(),
139+
mlir::StringAttr::get(ctx, cmdLine));
140+
}
141+
142+
llvm::StringRef fir::getCommandline(mlir::ModuleOp mod) {
143+
if (auto attr = mod->getAttrOfType<mlir::StringAttr>(
144+
mlir::LLVM::LLVMDialect::getCommandlineAttrName()))
145+
return attr;
146+
return {};
147+
}
148+
133149
std::string fir::determineTargetTriple(llvm::StringRef triple) {
134150
// Treat "" or "default" as stand-ins for the default machine.
135151
if (triple.empty() || triple == "default")
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
! This only checks that the command line is correctly passed on to the
2+
! -record-command-line option FC1 option and that the latter does not complain
3+
! about anything. The correct lowering to a module attribute and beyond will
4+
! be checked in other tests.
5+
!
6+
! RUN: %flang -### -target x86_64-unknown-linux -frecord-command-line %s 2>&1 | FileCheck --check-prefix=CHECK-RECORD %s
7+
! RUN: %flang -### -target x86_64-unknown-macosx -frecord-command-line %s 2>&1 | FileCheck --check-prefix=CHECK-RECORD %s
8+
! RUN: not %flang -### -target x86_64-unknown-windows -frecord-command-line %s 2>&1 | FileCheck --check-prefix=CHECK-RECORD-ERROR %s
9+
10+
! RUN: %flang -### -target x86_64-unknown-linux -fno-record-command-line %s 2>&1 | FileCheck --check-prefix=CHECK-NO-RECORD %s
11+
! RUN: %flang -### -target x86_64-unknown-macosx -fno-record-command-line %s 2>&1 | FileCheck --check-prefix=CHECK-NO-RECORD %s
12+
! RUN: %flang -### -target x86_64-unknown-windows -fno-record-command-line %s 2>&1 | FileCheck --check-prefix=CHECK-NO-RECORD %s
13+
14+
! CHECK-RECORD: "-record-command-line"
15+
! CHECK-NO-RECORD-NOT: "-record-command-line"
16+
! CHECK-RECORD-ERROR: error: unsupported option '-frecord-command-line' for target
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
! The actual command line is recorded by the frontend and passed on to FC1 as
2+
! the argument to -record-command-line, so in this test, we just match against
3+
! some string with spaces that mimics what a hypothetical command line.
4+
5+
! RUN: %flang_fc1 -record-command-line "exec -o infile" %s -emit-fir -o - | FileCheck %s
6+
7+
! CHECK: module attributes {
8+
! CHECK-SAME: llvm.commandline = "exec -o infile"
9+

flang/tools/bbc/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ target_link_libraries(bbc PRIVATE
2525
FIRBuilder
2626
HLFIRDialect
2727
HLFIRTransforms
28+
flangFrontend
2829
flangPasses
2930
FlangOpenMPTransforms
3031
${dialect_libs}

0 commit comments

Comments
 (0)