Skip to content

Commit e307d2d

Browse files
Tarun Prabhutarunprabhu
authored andcommitted
[clang][flang][mlir] Support -frecord-command-line option
Add support for the -frecord-command-line option that will produce the llvm.commandline metadata which will eventually be saved in the object file. This behavior is also supported in clang. Some refactoring of the code in flang to handle these command line options was carried out. The corresponding -grecord-command-line option which saves the command line in the debug information has not yet been enabled for flang.
1 parent 159d694 commit e307d2d

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)