[clang] [flang] [llvm] [mlir] [LLVM-Flang] Add support for -fdebug-info-for-profiling option (PR #188022)
Kaviya Rajendiran via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 25 22:47:22 PDT 2026
https://github.com/kaviya2510 updated https://github.com/llvm/llvm-project/pull/188022
>From 590d1c3196a189c6f22a9292cd58fd4cb2d89f37 Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <kaviyara2000 at gmail.com>
Date: Mon, 23 Mar 2026 17:19:28 +0530
Subject: [PATCH 1/4] [LLVM-Flang] Add support for -fdebug-info-for-profiling
option
---
clang/include/clang/Options/Options.td | 4 +--
clang/lib/Driver/ToolChains/Flang.cpp | 5 +++
.../include/flang/Frontend/CodeGenOptions.def | 1 +
.../flang/Optimizer/Passes/Pipelines.h | 4 +--
.../flang/Optimizer/Transforms/Passes.td | 3 ++
flang/include/flang/Tools/CrossToolHelpers.h | 2 ++
flang/lib/Frontend/CompilerInvocation.cpp | 3 ++
flang/lib/Frontend/FrontendActions.cpp | 24 ++++++++-----
flang/lib/Optimizer/Passes/Pipelines.cpp | 14 +++++---
.../lib/Optimizer/Transforms/AddDebugInfo.cpp | 2 +-
.../test/Driver/fdebug-info-for-profiling.f90 | 36 +++++++++++++++++++
llvm/include/llvm/IR/DebugInfoMetadata.h | 1 +
mlir/include/mlir-c/Dialect/LLVM.h | 4 +--
.../mlir/Dialect/LLVMIR/LLVMAttrDefs.td | 4 ++-
.../Dialect/LLVMIR/LLVMDialectBytecode.td | 4 ++-
mlir/lib/CAPI/Dialect/LLVM.cpp | 7 ++--
mlir/lib/Target/LLVMIR/DebugImporter.cpp | 3 +-
mlir/lib/Target/LLVMIR/DebugTranslation.cpp | 2 +-
mlir/test/CAPI/llvm.c | 2 +-
19 files changed, 96 insertions(+), 29 deletions(-)
create mode 100644 flang/test/Driver/fdebug-info-for-profiling.f90
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index aa64f4b17c252..215d4e885709c 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -1820,9 +1820,9 @@ def ffile_compilation_dir_EQ : Joined<["-"], "ffile-compilation-dir=">, Group<f_
HelpText<"The compilation directory to embed in the debug info and coverage mapping.">;
defm debug_info_for_profiling : BoolFOption<"debug-info-for-profiling",
CodeGenOpts<"DebugInfoForProfiling">, DefaultFalse,
- PosFlag<SetTrue, [], [ClangOption, CC1Option],
+ PosFlag<SetTrue, [], [ClangOption, CC1Option, FlangOption, FC1Option],
"Emit extra debug info to make sample profile more accurate">,
- NegFlag<SetFalse>>;
+ NegFlag<SetFalse, [], [ClangOption, FlangOption]>>;
def fprofile_generate_cold_function_coverage : Flag<["-"], "fprofile-generate-cold-function-coverage">,
Group<f_Group>, Visibility<[ClangOption, CLOption]>,
HelpText<"Generate instrumented code to collect coverage info for cold functions into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var)">;
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index d56a8c4448469..0b45a8dc8498c 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -193,6 +193,11 @@ void Flang::addDebugOptions(const llvm::opt::ArgList &Args, const JobAction &JA,
CmdArgs.push_back(SplitDWARFOut);
}
}
+ if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
+ options::OPT_fno_debug_info_for_profiling, false) &&
+ checkDebugInfoOption(
+ Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
+ CmdArgs.push_back("-fdebug-info-for-profiling");
}
void Flang::addCodegenOptions(const ArgList &Args,
diff --git a/flang/include/flang/Frontend/CodeGenOptions.def b/flang/include/flang/Frontend/CodeGenOptions.def
index c877e3320b264..38f1a85b998dc 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.def
+++ b/flang/include/flang/Frontend/CodeGenOptions.def
@@ -51,6 +51,7 @@ CODEGENOPT(LoopVersioning, 1, 0) ///< Enable loop versioning.
CODEGENOPT(UnrollLoops, 1, 0) ///< Enable loop unrolling
CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass
CODEGENOPT(DwarfVersion, 3, 0) ///< Dwarf version
+CODEGENOPT(DebugInfoForProfiling, 1, 0) ///< Emit extra debug info to make sample profile more accurate.
CODEGENOPT(Underscoring, 1, 1)
ENUM_CODEGENOPT(FPMaxminBehavior, Fortran::common::FPMaxminBehavior, 2, Fortran::common::FPMaxminBehavior::Legacy)
diff --git a/flang/include/flang/Optimizer/Passes/Pipelines.h b/flang/include/flang/Optimizer/Passes/Pipelines.h
index 6c2a1e3c3c074..cf8e8fba7d171 100644
--- a/flang/include/flang/Optimizer/Passes/Pipelines.h
+++ b/flang/include/flang/Optimizer/Passes/Pipelines.h
@@ -104,8 +104,8 @@ void addCompilerGeneratedNamesConversionPass(mlir::PassManager &pm);
void addDebugInfoPass(mlir::PassManager &pm,
llvm::codegenoptions::DebugInfoKind debugLevel,
llvm::OptimizationLevel optLevel,
- llvm::StringRef inputFilename, int32_t dwarfVersion,
- llvm::StringRef splitDwarfFile,
+ bool debugInfoForProfiling, llvm::StringRef inputFilename,
+ int32_t dwarfVersion, llvm::StringRef splitDwarfFile,
llvm::StringRef dwarfDebugFlags);
/// Create FIRToLLVMPassOptions from pipeline configuration.
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.td b/flang/include/flang/Optimizer/Transforms/Passes.td
index 38c5fc8db911c..82d89c4df42c3 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.td
+++ b/flang/include/flang/Optimizer/Transforms/Passes.td
@@ -250,6 +250,9 @@ def AddDebugInfo : Pass<"add-debug-info", "mlir::ModuleOp"> {
Option<"isOptimized", "is-optimized",
"bool", /*default=*/"false",
"is optimized.">,
+ Option<"debugInfoForProfiling", "debug-info-for-profiling", "bool",
+ /*default=*/"false",
+ "Emit extra debug info to make sample profile more accurate">,
Option<"inputFilename", "file-name",
"std::string",
/*default=*/"std::string{}",
diff --git a/flang/include/flang/Tools/CrossToolHelpers.h b/flang/include/flang/Tools/CrossToolHelpers.h
index c5993a5b972bd..4415a0417be01 100644
--- a/flang/include/flang/Tools/CrossToolHelpers.h
+++ b/flang/include/flang/Tools/CrossToolHelpers.h
@@ -106,6 +106,7 @@ struct MLIRToLLVMPassPipelineConfig : public FlangEPCallBacks {
ApproxFuncFPMath && mathOpts.getFPContractEnabled();
Reciprocals = opts.Reciprocals;
PreferVectorWidth = opts.PreferVectorWidth;
+ DebugInfoForProfiling = opts.DebugInfoForProfiling;
if (opts.InstrumentFunctions) {
InstrumentFunctionEntry = "__cyg_profile_func_enter";
InstrumentFunctionExit = "__cyg_profile_func_exit";
@@ -139,6 +140,7 @@ struct MLIRToLLVMPassPipelineConfig : public FlangEPCallBacks {
///< functions.
bool NSWOnLoopVarInc = true; ///< Add nsw flag to loop variable increments.
bool EnableOpenMP = false; ///< Enable OpenMP lowering.
+ bool DebugInfoForProfiling = false; /// Enable extra debugging info
bool EnableOpenMPSimd = false; ///< Enable OpenMP simd-only mode.
bool SkipConvertComplexPow = false; ///< Do not run complex pow conversion.
std::string InstrumentFunctionEntry =
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 36791201825ce..8d99fc9d4403e 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -170,6 +170,9 @@ static bool parseDebugArgs(Fortran::frontend::CodeGenOptions &opts,
args.getLastArg(clang::options::OPT_dwarf_debug_flags))
opts.DwarfDebugFlags = arg->getValue();
+ opts.DebugInfoForProfiling =
+ args.hasArg(clang::options::OPT_fdebug_info_for_profiling);
+
return true;
}
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index be6edbd2a2310..ec9e8f48693fe 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -969,14 +969,14 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
if (opts.hasProfileIRInstr()) {
// -fprofile-generate.
- pgoOpt = llvm::PGOOptions(opts.InstrProfileOutput.empty()
- ? llvm::driver::getDefaultProfileGenName()
- : opts.InstrProfileOutput,
- "", "", opts.MemoryProfileUsePath,
- llvm::PGOOptions::IRInstr,
- llvm::PGOOptions::NoCSAction,
- llvm::PGOOptions::ColdFuncOpt::Default, false,
- /*PseudoProbeForProfiling=*/false, false);
+ pgoOpt = llvm::PGOOptions(
+ opts.InstrProfileOutput.empty()
+ ? llvm::driver::getDefaultProfileGenName()
+ : opts.InstrProfileOutput,
+ "", "", opts.MemoryProfileUsePath, llvm::PGOOptions::IRInstr,
+ llvm::PGOOptions::NoCSAction, llvm::PGOOptions::ColdFuncOpt::Default,
+ opts.DebugInfoForProfiling,
+ /*PseudoProbeForProfiling=*/false, false);
} else if (opts.hasProfileIRUse()) {
// -fprofile-use.
auto CSAction = opts.hasProfileCSIRUse() ? llvm::PGOOptions::CSIRUse
@@ -984,7 +984,13 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
pgoOpt = llvm::PGOOptions(
opts.ProfileInstrumentUsePath, "", opts.ProfileRemappingFile,
opts.MemoryProfileUsePath, llvm::PGOOptions::IRUse, CSAction,
- llvm::PGOOptions::ColdFuncOpt::Default, false);
+ llvm::PGOOptions::ColdFuncOpt::Default, opts.DebugInfoForProfiling);
+ } else if (opts.DebugInfoForProfiling) {
+ // -fdebug-info-for-profiling
+ pgoOpt = llvm::PGOOptions("", "", "", /*MemoryProfile=*/"",
+ llvm::PGOOptions::NoAction,
+ llvm::PGOOptions::NoCSAction,
+ llvm::PGOOptions::ColdFuncOpt::Default, true);
}
llvm::StandardInstrumentations si(llvmModule->getContext(),
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index e9cd5da56083e..631496a2cea20 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -96,13 +96,14 @@ getEmissionKind(llvm::codegenoptions::DebugInfoKind kind) {
void addDebugInfoPass(mlir::PassManager &pm,
llvm::codegenoptions::DebugInfoKind debugLevel,
llvm::OptimizationLevel optLevel,
- llvm::StringRef inputFilename, int32_t dwarfVersion,
- llvm::StringRef splitDwarfFile,
+ bool debugInfoForProfiling, llvm::StringRef inputFilename,
+ int32_t dwarfVersion, llvm::StringRef splitDwarfFile,
llvm::StringRef dwarfDebugFlags) {
fir::AddDebugInfoOptions options;
options.debugLevel = getEmissionKind(debugLevel);
options.isOptimized = optLevel != llvm::OptimizationLevel::O0;
options.inputFilename = inputFilename;
+ options.debugInfoForProfiling = debugInfoForProfiling;
options.dwarfVersion = dwarfVersion;
options.splitDwarfFile = splitDwarfFile;
options.dwarfDebugFlags = dwarfDebugFlags;
@@ -372,12 +373,14 @@ void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
void createDebugPasses(mlir::PassManager &pm,
llvm::codegenoptions::DebugInfoKind debugLevel,
llvm::OptimizationLevel OptLevel,
+ bool debugInfoForProfiling,
llvm::StringRef inputFilename, int32_t dwarfVersion,
llvm::StringRef splitDwarfFile,
llvm::StringRef dwarfDebugFlags) {
if (debugLevel != llvm::codegenoptions::NoDebugInfo)
- addDebugInfoPass(pm, debugLevel, OptLevel, inputFilename, dwarfVersion,
- splitDwarfFile, dwarfDebugFlags);
+ addDebugInfoPass(pm, debugLevel, OptLevel, debugInfoForProfiling,
+ inputFilename, dwarfVersion, splitDwarfFile,
+ dwarfDebugFlags);
}
void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
@@ -395,7 +398,8 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
fir::addCodeGenRewritePass(
pm, (config.DebugInfo != llvm::codegenoptions::NoDebugInfo));
fir::addExternalNameConversionPass(pm, config.Underscoring);
- fir::createDebugPasses(pm, config.DebugInfo, config.OptLevel, inputFilename,
+ fir::createDebugPasses(pm, config.DebugInfo, config.OptLevel,
+ config.DebugInfoForProfiling, inputFilename,
config.DwarfVersion, config.SplitDwarfFile,
config.DwarfDebugFlags);
fir::addTargetRewritePass(pm);
diff --git a/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp b/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
index c42f5a29ecd62..389581c376a6d 100644
--- a/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
+++ b/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp
@@ -936,7 +936,7 @@ void AddDebugInfoPass::runOnOperation() {
mlir::LLVM::DICompileUnitAttr cuAttr = mlir::LLVM::DICompileUnitAttr::get(
mlir::DistinctAttr::create(mlir::UnitAttr::get(context)),
llvm::dwarf::getLanguage("DW_LANG_Fortran95"), fileAttr, producer,
- isOptimized, debugLevel,
+ isOptimized, debugLevel, debugInfoForProfiling,
/*nameTableKind=*/mlir::LLVM::DINameTableKind::Default,
splitDwarfFile.empty() ? mlir::StringAttr()
: mlir::StringAttr::get(context, splitDwarfFile));
diff --git a/flang/test/Driver/fdebug-info-for-profiling.f90 b/flang/test/Driver/fdebug-info-for-profiling.f90
new file mode 100644
index 0000000000000..2e72e2b569164
--- /dev/null
+++ b/flang/test/Driver/fdebug-info-for-profiling.f90
@@ -0,0 +1,36 @@
+! Test to check the option "-fdebug-info-for-profiling".
+
+!RUN: %flang -### -S -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
+!RUN: %flang -### -S -fdebug-info-for-profiling -fno-debug-info-for-profiling -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
+! RUN: %flang -S -emit-llvm -fdebug-info-for-profiling -g -o - %s | FileCheck %s
+
+! CHECK-DEBUG-INFO: "-fdebug-info-for-profiling"
+
+! CHECK: !DICompileUnit({{.*}}debugInfoForProfiling: true{{.*}})
+! CHECK: !DILexicalBlockFile(
+! CHECK: discriminator:
+
+program test
+ implicit none
+ integer :: i, sum
+ sum = 0
+ do i = 1, 20
+ if (mod(i, 2) == 0) then
+ sum = sum + compute(i)
+ else
+ sum = sum + compute(i)*2
+ end if
+ end do
+
+contains
+ integer function compute(x)
+ implicit none
+ integer, intent(in) :: x
+ if (x < 10) then
+ compute = x*x
+ else
+ compute = x + 5
+ end if
+ end function compute
+
+end program test
diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h
index 3ce899db66217..e28b47d87d4e5 100644
--- a/llvm/include/llvm/IR/DebugInfoMetadata.h
+++ b/llvm/include/llvm/IR/DebugInfoMetadata.h
@@ -2118,6 +2118,7 @@ class DICompileUnit : public DIScope {
DISourceLanguageName getSourceLanguage() const { return SourceLanguage; }
bool isOptimized() const { return IsOptimized; }
+ bool isDebugInfoForProfiling() const { return DebugInfoForProfiling; }
unsigned getRuntimeVersion() const { return RuntimeVersion; }
DebugEmissionKind getEmissionKind() const {
return (DebugEmissionKind)EmissionKind;
diff --git a/mlir/include/mlir-c/Dialect/LLVM.h b/mlir/include/mlir-c/Dialect/LLVM.h
index 2c167d23a7d9a..02ae71e41b8b7 100644
--- a/mlir/include/mlir-c/Dialect/LLVM.h
+++ b/mlir/include/mlir-c/Dialect/LLVM.h
@@ -366,8 +366,8 @@ typedef enum MlirLLVMDINameTableKind MlirLLVMDINameTableKind;
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompileUnitAttrGet(
MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage,
MlirAttribute file, MlirAttribute producer, bool isOptimized,
- MlirLLVMDIEmissionKind emissionKind, MlirLLVMDINameTableKind nameTableKind,
- MlirAttribute splitDebugFilename);
+ MlirLLVMDIEmissionKind emissionKind, bool debugInfoForProfiling,
+ MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename);
MLIR_CAPI_EXPORTED MlirStringRef mlirLLVMDICompileUnitAttrGetName(void);
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
index 14a4f888bd51d..89bdbe96c01b9 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -425,6 +425,7 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
OptionalParameter<"StringAttr">:$producer,
"bool":$isOptimized,
"DIEmissionKind":$emissionKind,
+ OptionalParameter<"bool">:$debugInfoForProfiling,
OptionalParameter<"DINameTableKind">:$nameTableKind,
OptionalParameter<"StringAttr">:$splitDebugFilename
);
@@ -433,11 +434,12 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
"DistinctAttr":$id, "unsigned":$sourceLanguage, "DIFileAttr":$file,
"StringAttr":$producer, "bool":$isOptimized,
"DIEmissionKind":$emissionKind,
+ CArg<"bool", "false">:$debugInfoForProfiling,
CArg<"DINameTableKind", "DINameTableKind::Default">:$nameTableKind,
CArg<"StringAttr", "{}">:$splitDebugFilename
), [{
return $_get(id.getContext(), id, sourceLanguage, file, producer,
- isOptimized, emissionKind, nameTableKind, splitDebugFilename);
+ isOptimized, emissionKind, debugInfoForProfiling, nameTableKind, splitDebugFilename);
}]>
];
let assemblyFormat = "`<` struct(params) `>`";
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
index 659c535c1b671..9ab725af71495 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
@@ -136,9 +136,11 @@ def DICompileUnitAttr : DialectAttribute<(attr
Bool:$isOptimized,
EnumClassFlag<"DIEmissionKind", "getEmissionKind()">:$_rawEmissionKind,
LocalVar<"DIEmissionKind", "(DIEmissionKind)_rawEmissionKind">:$emissionKind,
+ Bool:$debugInfoForProfiling,
EnumClassFlag<"DINameTableKind", "getNameTableKind()">:$_rawNameTableKind,
LocalVar<"DINameTableKind",
- "(DINameTableKind)_rawNameTableKind">:$nameTableKind
+ "(DINameTableKind)_rawNameTableKind">:$nameTableKind,
+ OptionalAttribute<"StringAttr">:$splitDebugFilename
)>;
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/CAPI/Dialect/LLVM.cpp b/mlir/lib/CAPI/Dialect/LLVM.cpp
index 154ebbc51e961..c1f60fb2753f3 100644
--- a/mlir/lib/CAPI/Dialect/LLVM.cpp
+++ b/mlir/lib/CAPI/Dialect/LLVM.cpp
@@ -345,12 +345,13 @@ MlirStringRef mlirLLVMDIFileAttrGetName(void) { return wrap(DIFileAttr::name); }
MlirAttribute mlirLLVMDICompileUnitAttrGet(
MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage,
MlirAttribute file, MlirAttribute producer, bool isOptimized,
- MlirLLVMDIEmissionKind emissionKind, MlirLLVMDINameTableKind nameTableKind,
- MlirAttribute splitDebugFilename) {
+ MlirLLVMDIEmissionKind emissionKind, bool debugInfoForProfiling,
+ MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename) {
return wrap(DICompileUnitAttr::get(
unwrap(ctx), cast<DistinctAttr>(unwrap(id)), sourceLanguage,
cast<DIFileAttr>(unwrap(file)), cast<StringAttr>(unwrap(producer)),
- isOptimized, DIEmissionKind(emissionKind), DINameTableKind(nameTableKind),
+ isOptimized, DIEmissionKind(emissionKind), debugInfoForProfiling,
+ DINameTableKind(nameTableKind),
cast<StringAttr>(unwrap(splitDebugFilename))));
}
diff --git a/mlir/lib/Target/LLVMIR/DebugImporter.cpp b/mlir/lib/Target/LLVMIR/DebugImporter.cpp
index 37140e3a949c7..c099865bdd16e 100644
--- a/mlir/lib/Target/LLVMIR/DebugImporter.cpp
+++ b/mlir/lib/Target/LLVMIR/DebugImporter.cpp
@@ -61,7 +61,8 @@ DICompileUnitAttr DebugImporter::translateImpl(llvm::DICompileUnit *node) {
context, getOrCreateDistinctID(node),
node->getSourceLanguage().getUnversionedName(),
translate(node->getFile()), getStringAttrOrNull(node->getRawProducer()),
- node->isOptimized(), emissionKind.value(), nameTableKind.value(),
+ node->isOptimized(), emissionKind.value(),
+ node->isDebugInfoForProfiling(), nameTableKind.value(),
getStringAttrOrNull(node->getRawSplitDebugFilename()));
}
diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
index 08eee68c195db..588998b6f6c73 100644
--- a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
@@ -130,7 +130,7 @@ llvm::DICompileUnit *DebugTranslation::translateImpl(DICompileUnitAttr attr) {
: "",
static_cast<llvm::DICompileUnit::DebugEmissionKind>(
attr.getEmissionKind()),
- 0, true, false,
+ 0, true, attr.getDebugInfoForProfiling(),
static_cast<llvm::DICompileUnit::DebugNameTableKind>(
attr.getNameTableKind()));
}
diff --git a/mlir/test/CAPI/llvm.c b/mlir/test/CAPI/llvm.c
index 32f6b8c8d8a33..0e9c1ce0d7ccd 100644
--- a/mlir/test/CAPI/llvm.c
+++ b/mlir/test/CAPI/llvm.c
@@ -278,7 +278,7 @@ static void testDebugInfoAttributes(MlirContext ctx) {
MlirAttribute compile_unit = mlirLLVMDICompileUnitAttrGet(
ctx, id, LLVMDWARFSourceLanguageC99, file, foo, false,
- MlirLLVMDIEmissionKindFull, MlirLLVMDINameTableKindDefault, bar);
+ MlirLLVMDIEmissionKindFull, false, MlirLLVMDINameTableKindDefault, bar);
// CHECK: #llvm.di_compile_unit<{{.*}}>
mlirAttributeDump(compile_unit);
>From 3b7a6b334b2b4707ec2a111ae0cc96793d123952 Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <kaviyara2000 at gmail.com>
Date: Tue, 24 Mar 2026 16:54:35 +0530
Subject: [PATCH 2/4] [LLVM-Flang] Addressed review comments and modified
testcases in mlir
---
clang/include/clang/Driver/CommonArgs.h | 4 ++
clang/lib/Driver/ToolChains/Clang.cpp | 6 +--
clang/lib/Driver/ToolChains/CommonArgs.cpp | 10 ++++
clang/lib/Driver/ToolChains/Flang.cpp | 6 +--
flang/lib/Optimizer/Passes/Pipelines.cpp | 38 ++++++---------
.../test/Driver/fdebug-info-for-profiling.f90 | 12 ++---
.../Integration/debug-info-for-profiling.f90 | 36 +++++++++++++++
.../mlir/Dialect/LLVMIR/LLVMAttrDefs.td | 6 +--
.../Dialect/LLVMIR/LLVMDialectBytecode.td | 2 +-
mlir/lib/Target/LLVMIR/DebugTranslation.cpp | 2 +-
mlir/test/Dialect/LLVMIR/debuginfo.mlir | 4 +-
mlir/test/Target/LLVMIR/Import/debug-info.ll | 4 +-
mlir/test/Target/LLVMIR/llvmir-debug.mlir | 46 +++++++++----------
13 files changed, 102 insertions(+), 74 deletions(-)
create mode 100644 flang/test/Integration/debug-info-for-profiling.f90
diff --git a/clang/include/clang/Driver/CommonArgs.h b/clang/include/clang/Driver/CommonArgs.h
index a895579be7419..0af1b89425227 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -118,6 +118,10 @@ bool checkDebugInfoOption(const llvm::opt::Arg *A,
const llvm::opt::ArgList &Args, const Driver &D,
const ToolChain &TC);
+void addDebugInfoForProfilingArgs(const Driver &D, const ToolChain &TC,
+ const llvm::opt::ArgList &Args,
+ llvm::opt::ArgStringList &CmdArgs);
+
void AddAssemblerKPIC(const ToolChain &ToolChain,
const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs);
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index a74cce6deffd8..db82695f87d6b 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4441,11 +4441,7 @@ renderDebugOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T,
!isHIP(InputType) && !isObjC(InputType) &&
!isOpenCL(InputType);
- if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
- options::OPT_fno_debug_info_for_profiling, false) &&
- checkDebugInfoOption(
- Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
- CmdArgs.push_back("-fdebug-info-for-profiling");
+ addDebugInfoForProfilingArgs(D, TC, Args, CmdArgs);
// The 'g' groups options involve a somewhat intricate sequence of decisions
// about what to pass from the driver to the frontend, but by the time they
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index bfa2667e566e1..286657a320087 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -2353,6 +2353,16 @@ bool tools::checkDebugInfoOption(const Arg *A, const ArgList &Args,
return false;
}
+void tools::addDebugInfoForProfilingArgs(const Driver &D, const ToolChain &TC,
+ const ArgList &Args,
+ ArgStringList &CmdArgs) {
+ if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
+ options::OPT_fno_debug_info_for_profiling, false) &&
+ checkDebugInfoOption(
+ Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
+ CmdArgs.push_back("-fdebug-info-for-profiling");
+}
+
void tools::AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
ArgStringList &CmdArgs) {
llvm::Reloc::Model RelocationModel;
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 0b45a8dc8498c..c7716b52009f6 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -193,11 +193,7 @@ void Flang::addDebugOptions(const llvm::opt::ArgList &Args, const JobAction &JA,
CmdArgs.push_back(SplitDWARFOut);
}
}
- if (Args.hasFlag(options::OPT_fdebug_info_for_profiling,
- options::OPT_fno_debug_info_for_profiling, false) &&
- checkDebugInfoOption(
- Args.getLastArg(options::OPT_fdebug_info_for_profiling), Args, D, TC))
- CmdArgs.push_back("-fdebug-info-for-profiling");
+ addDebugInfoForProfilingArgs(D, TC, Args, CmdArgs);
}
void Flang::addCodegenOptions(const ArgList &Args,
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index 631496a2cea20..2216fc0c68494 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -94,19 +94,16 @@ getEmissionKind(llvm::codegenoptions::DebugInfoKind kind) {
}
void addDebugInfoPass(mlir::PassManager &pm,
- llvm::codegenoptions::DebugInfoKind debugLevel,
- llvm::OptimizationLevel optLevel,
- bool debugInfoForProfiling, llvm::StringRef inputFilename,
- int32_t dwarfVersion, llvm::StringRef splitDwarfFile,
- llvm::StringRef dwarfDebugFlags) {
+ const MLIRToLLVMPassPipelineConfig &config,
+ llvm::StringRef inputFilename) {
fir::AddDebugInfoOptions options;
- options.debugLevel = getEmissionKind(debugLevel);
- options.isOptimized = optLevel != llvm::OptimizationLevel::O0;
+ options.debugLevel = getEmissionKind(config.DebugInfo);
+ options.isOptimized = config.OptLevel != llvm::OptimizationLevel::O0;
options.inputFilename = inputFilename;
- options.debugInfoForProfiling = debugInfoForProfiling;
- options.dwarfVersion = dwarfVersion;
- options.splitDwarfFile = splitDwarfFile;
- options.dwarfDebugFlags = dwarfDebugFlags;
+ options.debugInfoForProfiling = config.DebugInfoForProfiling;
+ options.dwarfVersion = config.DwarfVersion;
+ options.splitDwarfFile = config.SplitDwarfFile;
+ options.dwarfDebugFlags = config.DwarfDebugFlags;
addPassConditionally(pm, disableDebugInfo,
[&]() { return fir::createAddDebugInfoPass(options); });
}
@@ -371,16 +368,10 @@ void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
}
void createDebugPasses(mlir::PassManager &pm,
- llvm::codegenoptions::DebugInfoKind debugLevel,
- llvm::OptimizationLevel OptLevel,
- bool debugInfoForProfiling,
- llvm::StringRef inputFilename, int32_t dwarfVersion,
- llvm::StringRef splitDwarfFile,
- llvm::StringRef dwarfDebugFlags) {
- if (debugLevel != llvm::codegenoptions::NoDebugInfo)
- addDebugInfoPass(pm, debugLevel, OptLevel, debugInfoForProfiling,
- inputFilename, dwarfVersion, splitDwarfFile,
- dwarfDebugFlags);
+ const MLIRToLLVMPassPipelineConfig &config,
+ llvm::StringRef inputFilename) {
+ if (config.DebugInfo != llvm::codegenoptions::NoDebugInfo)
+ addDebugInfoPass(pm, config, inputFilename);
}
void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
@@ -398,10 +389,7 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
fir::addCodeGenRewritePass(
pm, (config.DebugInfo != llvm::codegenoptions::NoDebugInfo));
fir::addExternalNameConversionPass(pm, config.Underscoring);
- fir::createDebugPasses(pm, config.DebugInfo, config.OptLevel,
- config.DebugInfoForProfiling, inputFilename,
- config.DwarfVersion, config.SplitDwarfFile,
- config.DwarfDebugFlags);
+ fir::createDebugPasses(pm, config, inputFilename);
fir::addTargetRewritePass(pm);
fir::addCompilerGeneratedNamesConversionPass(pm);
diff --git a/flang/test/Driver/fdebug-info-for-profiling.f90 b/flang/test/Driver/fdebug-info-for-profiling.f90
index 2e72e2b569164..28512a33e561e 100644
--- a/flang/test/Driver/fdebug-info-for-profiling.f90
+++ b/flang/test/Driver/fdebug-info-for-profiling.f90
@@ -1,14 +1,12 @@
! Test to check the option "-fdebug-info-for-profiling".
-!RUN: %flang -### -S -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
-!RUN: %flang -### -S -fdebug-info-for-profiling -fno-debug-info-for-profiling -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
-! RUN: %flang -S -emit-llvm -fdebug-info-for-profiling -g -o - %s | FileCheck %s
+!RUN: %flang -### -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
+!RUN: %flang -### -fdebug-info-for-profiling -fno-debug-info-for-profiling -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
+!RUN: %flang -### %s 2>&1 | FileCheck %s
+!RUN: %flang -### -fdebug-info-for-profiling -fno-debug-info-for-profiling %s 2>&1 | FileCheck %s
! CHECK-DEBUG-INFO: "-fdebug-info-for-profiling"
-
-! CHECK: !DICompileUnit({{.*}}debugInfoForProfiling: true{{.*}})
-! CHECK: !DILexicalBlockFile(
-! CHECK: discriminator:
+! CHECK-NOT: "-fdebug-info-for-profiling"
program test
implicit none
diff --git a/flang/test/Integration/debug-info-for-profiling.f90 b/flang/test/Integration/debug-info-for-profiling.f90
new file mode 100644
index 0000000000000..808e950f0803a
--- /dev/null
+++ b/flang/test/Integration/debug-info-for-profiling.f90
@@ -0,0 +1,36 @@
+! Test to check the option "-fdebug-info-for-profiling".
+
+!RUN: %flang -### -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
+!RUN: %flang -### -fdebug-info-for-profiling -fno-debug-info-for-profiling -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
+! RUN: %flang -S -emit-llvm -fdebug-info-for-profiling -g -o - %s | FileCheck %s
+
+! CHECK-DEBUG-INFO: "-fdebug-info-for-profiling"
+
+! CHECK: !DICompileUnit({{.*}}debugInfoForProfiling: true{{.*}})
+! CHECK: !DILexicalBlockFile(
+! CHECK: discriminator:
+
+program test
+ implicit none
+ integer :: i, sum
+ sum = 0
+ do i = 1, 20
+ if (mod(i, 2) == 0) then
+ sum = sum + compute(i)
+ else
+ sum = sum + compute(i)*2
+ end if
+ end do
+
+contains
+ integer function compute(x)
+ implicit none
+ integer, intent(in) :: x
+ if (x < 10) then
+ compute = x*x
+ else
+ compute = x + 5
+ end if
+ end function compute
+
+end program test
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
index 89bdbe96c01b9..ee82badadb642 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -425,7 +425,7 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
OptionalParameter<"StringAttr">:$producer,
"bool":$isOptimized,
"DIEmissionKind":$emissionKind,
- OptionalParameter<"bool">:$debugInfoForProfiling,
+ OptionalParameter<"bool">:$isDebugInfoForProfiling,
OptionalParameter<"DINameTableKind">:$nameTableKind,
OptionalParameter<"StringAttr">:$splitDebugFilename
);
@@ -434,12 +434,12 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
"DistinctAttr":$id, "unsigned":$sourceLanguage, "DIFileAttr":$file,
"StringAttr":$producer, "bool":$isOptimized,
"DIEmissionKind":$emissionKind,
- CArg<"bool", "false">:$debugInfoForProfiling,
+ CArg<"bool", "false">:$isDebugInfoForProfiling,
CArg<"DINameTableKind", "DINameTableKind::Default">:$nameTableKind,
CArg<"StringAttr", "{}">:$splitDebugFilename
), [{
return $_get(id.getContext(), id, sourceLanguage, file, producer,
- isOptimized, emissionKind, debugInfoForProfiling, nameTableKind, splitDebugFilename);
+ isOptimized, emissionKind, isDebugInfoForProfiling, nameTableKind, splitDebugFilename);
}]>
];
let assemblyFormat = "`<` struct(params) `>`";
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
index 9ab725af71495..5f3821f0299b6 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
@@ -136,7 +136,7 @@ def DICompileUnitAttr : DialectAttribute<(attr
Bool:$isOptimized,
EnumClassFlag<"DIEmissionKind", "getEmissionKind()">:$_rawEmissionKind,
LocalVar<"DIEmissionKind", "(DIEmissionKind)_rawEmissionKind">:$emissionKind,
- Bool:$debugInfoForProfiling,
+ Bool:$isDebugInfoForProfiling,
EnumClassFlag<"DINameTableKind", "getNameTableKind()">:$_rawNameTableKind,
LocalVar<"DINameTableKind",
"(DINameTableKind)_rawNameTableKind">:$nameTableKind,
diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
index 588998b6f6c73..ab4662edf42ab 100644
--- a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
@@ -130,7 +130,7 @@ llvm::DICompileUnit *DebugTranslation::translateImpl(DICompileUnitAttr attr) {
: "",
static_cast<llvm::DICompileUnit::DebugEmissionKind>(
attr.getEmissionKind()),
- 0, true, attr.getDebugInfoForProfiling(),
+ 0, true, attr.getIsDebugInfoForProfiling(),
static_cast<llvm::DICompileUnit::DebugNameTableKind>(
attr.getNameTableKind()));
}
diff --git a/mlir/test/Dialect/LLVMIR/debuginfo.mlir b/mlir/test/Dialect/LLVMIR/debuginfo.mlir
index f6f52b3fcc001..8b02d0f44ab0a 100644
--- a/mlir/test/Dialect/LLVMIR/debuginfo.mlir
+++ b/mlir/test/Dialect/LLVMIR/debuginfo.mlir
@@ -3,10 +3,10 @@
// CHECK-DAG: #[[FILE:.*]] = #llvm.di_file<"debuginfo.mlir" in "/test/">
#file = #llvm.di_file<"debuginfo.mlir" in "/test/">
-// CHECK-DAG: #[[CU:.*]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #[[FILE]], producer = "MLIR", isOptimized = true, emissionKind = Full>
+// CHECK-DAG: #[[CU:.*]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #[[FILE]], producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true>
#cu = #llvm.di_compile_unit<
id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #file,
- producer = "MLIR", isOptimized = true, emissionKind = Full
+ producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true
>
// CHECK-DAG: #[[NULL:.*]] = #llvm.di_null_type
diff --git a/mlir/test/Target/LLVMIR/Import/debug-info.ll b/mlir/test/Target/LLVMIR/Import/debug-info.ll
index 3c2691217e0bf..e4284c6041312 100644
--- a/mlir/test/Target/LLVMIR/Import/debug-info.ll
+++ b/mlir/test/Target/LLVMIR/Import/debug-info.ll
@@ -218,7 +218,7 @@ define void @composite_type() !dbg !3 {
; // -----
; CHECK-DAG: #[[FILE:.+]] = #llvm.di_file<"debug-info.ll" in "/">
-; CHECK-DAG: #[[CU:.+]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #[[FILE]], isOptimized = false, emissionKind = None, nameTableKind = None, splitDebugFilename = "test.dwo">
+; CHECK-DAG: #[[CU:.+]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #[[FILE]], isOptimized = false, emissionKind = None, isDebugInfoForProfiling = true, nameTableKind = None, splitDebugFilename = "test.dwo">
; Verify an empty subroutine types list is supported.
; CHECK-DAG: #[[SP_TYPE:.+]] = #llvm.di_subroutine_type<callingConvention = DW_CC_normal>
; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #[[CU]], scope = #[[FILE]], name = "subprogram", linkageName = "subprogram", file = #[[FILE]], line = 42, scopeLine = 42, subprogramFlags = Definition, type = #[[SP_TYPE]]>
@@ -230,7 +230,7 @@ define void @subprogram() !dbg !3 {
!llvm.dbg.cu = !{!1}
!llvm.module.flags = !{!0}
!0 = !{i32 2, !"Debug Info Version", i32 3}
-!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2, nameTableKind: None, splitDebugFilename: "test.dwo")
+!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2, nameTableKind: None, debugInfoForProfiling: true, splitDebugFilename: "test.dwo")
!2 = !DIFile(filename: "debug-info.ll", directory: "/")
!3 = distinct !DISubprogram(name: "subprogram", linkageName: "subprogram", scope: !2, file: !2, line: 42, scopeLine: 42, spFlags: DISPFlagDefinition, unit: !1, type: !4)
!4 = !DISubroutineType(cc: DW_CC_normal, types: !5)
diff --git a/mlir/test/Target/LLVMIR/llvmir-debug.mlir b/mlir/test/Target/LLVMIR/llvmir-debug.mlir
index 1aa6362fc42d3..7391221fe4370 100644
--- a/mlir/test/Target/LLVMIR/llvmir-debug.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir-debug.mlir
@@ -50,8 +50,8 @@ llvm.func @func_no_debug() {
>
#cu = #llvm.di_compile_unit<
id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #file,
- producer = "MLIR", isOptimized = true, emissionKind = Full,
- nameTableKind = None, splitDebugFilename = "test.dwo"
+ producer = "MLIR", isOptimized = true,
+ emissionKind = Full, isDebugInfoForProfiling = true, nameTableKind = None, splitDebugFilename = "test.dwo"
>
#composite = #llvm.di_composite_type<
tag = DW_TAG_structure_type, name = "composite", file = #file,
@@ -148,7 +148,7 @@ llvm.func @empty_types() {
llvm.return
} loc(fused<#sp1>["foo.mlir":2:1])
-// CHECK: ![[CU_LOC:.*]] = distinct !DICompileUnit(language: DW_LANG_C, file: ![[CU_FILE_LOC:.*]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, splitDebugFilename: "test.dwo", emissionKind: FullDebug, nameTableKind: None)
+// CHECK: ![[CU_LOC:.*]] = distinct !DICompileUnit(language: DW_LANG_C, file: ![[CU_FILE_LOC:.*]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, splitDebugFilename: "test.dwo", emissionKind: FullDebug, debugInfoForProfiling: true, nameTableKind: None)
// CHECK: ![[CU_FILE_LOC]] = !DIFile(filename: "foo.mlir", directory: "/test/")
// CHECK: ![[FUNC_LOC]] = distinct !DISubprogram(name: "func_with_debug", linkageName: "func_with_debug", scope: ![[NESTED_NAMESPACE:.*]], file: ![[CU_FILE_LOC]], line: 3, type: ![[FUNC_TYPE:.*]], scopeLine: 3, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: ![[CU_LOC]])
@@ -215,7 +215,7 @@ llvm.func @func_decl_with_subprogram() -> (i32) loc(fused<#di_subprogram>["foo.m
#di_file = #llvm.di_file<"foo.mlir" in "/test/">
#di_compile_unit = #llvm.di_compile_unit<
id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file,
- producer = "MLIR", isOptimized = true, emissionKind = Full
+ producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true
>
#di_subprogram = #llvm.di_subprogram<
compileUnit = #di_compile_unit, scope = #di_file, name = "outer_func",
@@ -259,7 +259,7 @@ llvm.func @func_with_inlined_dbg_value(%arg0: i32) -> (i32) {
#di_file = #llvm.di_file<"foo.mlir" in "/test/">
#di_compile_unit = #llvm.di_compile_unit<
id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file,
- producer = "MLIR", isOptimized = true, emissionKind = Full
+ producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true
>
#di_subprogram = #llvm.di_subprogram<
compileUnit = #di_compile_unit, scope = #di_file, name = "func",
@@ -288,7 +288,7 @@ llvm.func @func_without_subprogram(%0 : i32) {
#di_file = #llvm.di_file<"foo.mlir" in "/test/">
#di_compile_unit = #llvm.di_compile_unit<
id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file,
- producer = "MLIR", isOptimized = true, emissionKind = Full
+ producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true
>
#di_subprogram = #llvm.di_subprogram<
compileUnit = #di_compile_unit, scope = #di_file, name = "outer_func",
@@ -319,7 +319,7 @@ llvm.func @dbg_intrinsics_with_no_location(%arg0: i32) -> (i32) {
// CHECK-DAG: !llvm.dbg.cu = !{{{.*}}}
// CHECK-DAG: ![[FILE:.*]] = !DIFile(filename: "not", directory: "existence")
// CHECK-DAG: ![[TYPE:.*]] = !DIBasicType(name: "uint64_t", size: 64, encoding: DW_ATE_unsigned)
-// CHECK-DAG: ![[SCOPE:.*]] = distinct !DICompileUnit(language: DW_LANG_C, file: ![[FILE]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: ![[GVALS:.*]])
+// CHECK-DAG: ![[SCOPE:.*]] = distinct !DICompileUnit(language: DW_LANG_C, file: ![[FILE]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: ![[GVALS:.*]], debugInfoForProfiling: true)
// CHECK-DAG: ![[GVAR0:.*]] = distinct !DIGlobalVariable(name: "global_with_expr_1", linkageName: "global_with_expr_1", scope: ![[SCOPE]], file: ![[FILE]], line: 370, type: ![[TYPE]], isLocal: false, isDefinition: false)
// CHECK-DAG: ![[GVAR1:.*]] = distinct !DIGlobalVariable(name: "global_with_expr_2", linkageName: "global_with_expr_2", scope: ![[SCOPE]], file: ![[FILE]], line: 371, type: ![[TYPE]], isLocal: true, isDefinition: true, align: 8)
// CHECK-DAG: ![[GEXPR0:.*]] = !DIGlobalVariableExpression(var: ![[GVAR0]], expr: !DIExpression())
@@ -327,7 +327,7 @@ llvm.func @dbg_intrinsics_with_no_location(%arg0: i32) -> (i32) {
// CHECK-DAG: ![[GVALS]] = !{![[GEXPR0]], ![[GEXPR1]]}
#di_file_2 = #llvm.di_file<"not" in "existence">
-#di_compile_unit_2 = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file_2, producer = "MLIR", isOptimized = true, emissionKind = Full>
+#di_compile_unit_2 = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file_2, producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true>
#di_basic_type_2 = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "uint64_t", sizeInBits = 64, encoding = DW_ATE_unsigned>
llvm.mlir.global external @global_with_expr_1() {addr_space = 0 : i32, dbg_exprs = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit_2, name = "global_with_expr_1", linkageName = "global_with_expr_1", file = #di_file_2, line = 370, type = #di_basic_type_2>, expr = <>>]} : i64
llvm.mlir.global external @global_with_expr_2() {addr_space = 0 : i32, dbg_exprs = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit_2, name = "global_with_expr_2", linkageName = "global_with_expr_2", file = #di_file_2, line = 371, type = #di_basic_type_2, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <>>]} : i64
@@ -339,14 +339,14 @@ llvm.mlir.global external @global_with_expr_2() {addr_space = 0 : i32, dbg_exprs
// CHECK-DAG: !llvm.dbg.cu = !{{{.*}}}
// CHECK-DAG: ![[FILE:.*]] = !DIFile(filename: "test.f90", directory: "existence")
// CHECK-DAG: ![[TYPE:.*]] = !DIBasicType(name: "integer", size: 64, encoding: DW_ATE_signed)
-// CHECK-DAG: ![[SCOPE:.*]] = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: ![[FILE]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: ![[GVALS:.*]])
+// CHECK-DAG: ![[SCOPE:.*]] = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: ![[FILE]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: ![[GVALS:.*]], debugInfoForProfiling: true)
// CHECK-DAG: ![[SCOPE1:.*]] = !DIModule(scope: ![[SCOPE]], name: "module2", file: ![[FILE]], line: 120)
// CHECK-DAG: ![[GVAR:.*]] = distinct !DIGlobalVariable(name: "module_global", linkageName: "module_global", scope: ![[SCOPE1]], file: ![[FILE]], line: 121, type: ![[TYPE]], isLocal: false, isDefinition: true)
// CHECK-DAG: ![[GEXPR:.*]] = !DIGlobalVariableExpression(var: ![[GVAR]], expr: !DIExpression())
// CHECK-DAG: ![[GVALS]] = !{![[GEXPR]]}
#di_file = #llvm.di_file<"test.f90" in "existence">
-#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_Fortran95, file = #di_file, producer = "MLIR", isOptimized = true, emissionKind = Full>
+#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_Fortran95, file = #di_file, producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true>
#di_basic_type = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "integer", sizeInBits = 64, encoding = DW_ATE_signed>
#di_module = #llvm.di_module<file = #di_file, scope = #di_compile_unit, name = "module2", configMacros = "", includePath = "", apinotes = "", line = 120, isDecl = false >
llvm.mlir.global external @module_global() {dbg_exprs = [#llvm.di_global_variable_expression<var = <scope = #di_module, name = "module_global", linkageName = "module_global", file = #di_file, line = 121, type = #di_basic_type, isLocalToUnit = false, isDefined = true>, expr = <>>]} : i64
@@ -354,14 +354,14 @@ llvm.mlir.global external @module_global() {dbg_exprs = [#llvm.di_global_variabl
// -----
// CHECK: @func_global = external global i64, !dbg {{.*}}
-// CHECK-DAG: ![[CU:.*]] = distinct !DICompileUnit({{.*}}globals: ![[GVALS:.*]])
+// CHECK-DAG: ![[CU:.*]] = distinct !DICompileUnit({{.*}}globals: ![[GVALS:[0-9]+]], debugInfoForProfiling: true)
// CHECK-DAG: ![[SP:.*]] = distinct !DISubprogram(name: "fn_with_gl"{{.*}}unit: ![[CU]])
// CHECK-DAG: ![[GVAR:.*]] = distinct !DIGlobalVariable(name: "func_global"{{.*}}, scope: ![[SP]]{{.*}})
// CHECK-DAG: ![[GEXPR:.*]] = !DIGlobalVariableExpression(var: ![[GVAR]], expr: !DIExpression())
// CHECK-DAG: ![[GVALS]] = !{![[GEXPR]]}
#file = #llvm.di_file<"test.f90" in "existence">
-#cu = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_Fortran95, file = #file, producer = "MLIR", isOptimized = true, emissionKind = Full>
+#cu = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_Fortran95, file = #file, producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true>
#ty1 = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "integer", sizeInBits = 64, encoding = DW_ATE_signed>
#sp = #llvm.di_subprogram<compileUnit = #cu, scope = #file, name = "fn_with_gl", file = #file, subprogramFlags = "Definition|Optimized">
llvm.mlir.global @func_global() {dbg_exprs = [#llvm.di_global_variable_expression<var = <scope = #sp, name = "func_global", linkageName = "func_global", file = #file, line = 121, type = #ty1, isLocalToUnit = true, isDefined = true>, expr = <>>]} : i64
@@ -383,7 +383,7 @@ llvm.func @imp_fn() {
#di_subroutine_type = #llvm.di_subroutine_type<callingConvention = DW_CC_program>
#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>,
sourceLanguage = DW_LANG_Fortran95, file = #di_file, isOptimized = false,
- emissionKind = Full>
+ emissionKind = Full, isDebugInfoForProfiling = false>
#di_module_1 = #llvm.di_module<file = #di_file, scope = #di_compile_unit, name = "mod1">
#di_module_2 = #llvm.di_module<file = #di_file, scope = #di_compile_unit, name = "mod2">
#di_subprogram_self_rec = #llvm.di_subprogram<recId = distinct[1]<>>
@@ -429,10 +429,10 @@ llvm.mlir.global external constant @".str.1"() {addr_space = 0 : i32, dbg_exprs
#di_file_1 = #llvm.di_file<"foo1.mlir" in "/test/">
// CHECK-DAG: ![[FILE2:.*]] = !DIFile(filename: "foo2.mlir", directory: "/test/")
#di_file_2 = #llvm.di_file<"foo2.mlir" in "/test/">
-// CHECK-DAG: ![[SCOPE2:.*]] = distinct !DICompileUnit(language: DW_LANG_C, file: ![[FILE2]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: DebugDirectivesOnly)
-#di_compile_unit_1 = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file_1, producer = "MLIR", isOptimized = true, emissionKind = LineTablesOnly>
-// CHECK-DAG: ![[SCOPE1:.*]] = distinct !DICompileUnit(language: DW_LANG_C, file: ![[FILE1]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly)
-#di_compile_unit_2 = #llvm.di_compile_unit<id = distinct[1]<>, sourceLanguage = DW_LANG_C, file = #di_file_2, producer = "MLIR", isOptimized = true, emissionKind = DebugDirectivesOnly>
+// CHECK-DAG: ![[SCOPE2:.*]] = distinct !DICompileUnit(language: DW_LANG_C, file: ![[FILE2]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: DebugDirectivesOnly, debugInfoForProfiling: true)
+#di_compile_unit_1 = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file_1, producer = "MLIR", isOptimized = true, emissionKind = LineTablesOnly, isDebugInfoForProfiling = true>
+// CHECK-DAG: ![[SCOPE1:.*]] = distinct !DICompileUnit(language: DW_LANG_C, file: ![[FILE1]], producer: "MLIR", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, debugInfoForProfiling: true)
+#di_compile_unit_2 = #llvm.di_compile_unit<id = distinct[1]<>, sourceLanguage = DW_LANG_C, file = #di_file_2, producer = "MLIR", isOptimized = true, emissionKind = DebugDirectivesOnly, isDebugInfoForProfiling = true>
#di_subprogram_1 = #llvm.di_subprogram<compileUnit = #di_compile_unit_1, scope = #di_file_1, name = "func1", file = #di_file_1, subprogramFlags = "Definition|Optimized">
#di_subprogram_2 = #llvm.di_subprogram<compileUnit = #di_compile_unit_2, scope = #di_file_2, name = "func2", file = #di_file_2, subprogramFlags = "Definition|Optimized">
@@ -451,7 +451,7 @@ llvm.func @func_debug_directives() {
// Common base nodes.
#di_file = #llvm.di_file<"test.mlir" in "/">
#di_null_type = #llvm.di_null_type
-#di_compile_unit = #llvm.di_compile_unit<id = distinct[1]<>, sourceLanguage = DW_LANG_C, file = #di_file, isOptimized = false, emissionKind = None>
+#di_compile_unit = #llvm.di_compile_unit<id = distinct[1]<>, sourceLanguage = DW_LANG_C, file = #di_file, isOptimized = false, emissionKind = None, isDebugInfoForProfiling = false>
// Recursive type itself.
#di_struct_self = #llvm.di_composite_type<recId = distinct[0]<>, isRecSelf = true>
@@ -560,7 +560,7 @@ llvm.mlir.global @global_variable() {dbg_exprs = [#di_global_variable_expression
#file = #llvm.di_file<"test.f90" in "">
#cu = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_Fortran95,
- file = #file, producer = "", isOptimized = false, emissionKind = Full>
+ file = #file, producer = "", isOptimized = false, emissionKind = Full, isDebugInfoForProfiling = false>
#i32 = #llvm.di_basic_type<
tag = DW_TAG_base_type, name = "integer",
sizeInBits = 32, encoding = DW_ATE_signed
@@ -599,7 +599,7 @@ llvm.func @fn_with_composite() {
#file = #llvm.di_file<"debug-info.ll" in "/">
#cu = #llvm.di_compile_unit<id = distinct[1]<>,
sourceLanguage = DW_LANG_Fortran95, file = #file, isOptimized = false,
- emissionKind = Full>
+ emissionKind = Full, isDebugInfoForProfiling = false>
#exp1 = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(16),
DW_OP_deref]>
#comp_ty1 = #llvm.di_composite_type<tag = DW_TAG_array_type,
@@ -662,7 +662,7 @@ llvm.func @subranges(%arg: !llvm.ptr) {
#bt = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int", sizeInBits = 32>
#file = #llvm.di_file<"debug-info.ll" in "/">
#cu = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C,
- file = #file, isOptimized = false, emissionKind = Full>
+ file = #file, isOptimized = false, emissionKind = Full, isDebugInfoForProfiling = false>
#sp = #llvm.di_subprogram<compileUnit = #cu, scope = #file, name = "test",
file = #file, subprogramFlags = Definition>
#var = #llvm.di_local_variable<scope = #sp, name = "string_size", type = #bt, flags = Artificial>
@@ -693,7 +693,7 @@ llvm.func @string_ty(%arg0: !llvm.ptr) {
#bt = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int", sizeInBits = 32>
#file = #llvm.di_file<"test.f90" in "">
#cu = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C,
- file = #file, isOptimized = false, emissionKind = Full>
+ file = #file, isOptimized = false, emissionKind = Full, isDebugInfoForProfiling = false>
#sp = #llvm.di_subprogram<compileUnit = #cu, scope = #file, name = "test",
file = #file, subprogramFlags = Definition>
#di_common_block = #llvm.di_common_block<scope = #sp, name = "block",
@@ -723,7 +723,7 @@ llvm.func @test() {
#bt = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int", sizeInBits = 32>
#file = #llvm.di_file<"test.f90" in "">
#cu = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C,
- file = #file, isOptimized = false, emissionKind = Full>
+ file = #file, isOptimized = false, emissionKind = Full, isDebugInfoForProfiling = false>
#global_var = #llvm.di_global_variable<scope = #cu, name = "a",
file = #file, line = 2, type = #bt>
#var_expression = #llvm.di_global_variable_expression<var = #global_var,
>From ee0157344115968f007e9a6528a2869d145a831b Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <kaviyara2000 at gmail.com>
Date: Wed, 25 Mar 2026 10:08:02 +0530
Subject: [PATCH 3/4] [LLVM-FLANG] Add NO-DEBUG-INFO/DEBUG-INFO prefixes and
renamed debugInfoForProfiling to isDebugInfoForProfiling in LLVM.cpp
---
flang/include/flang/Optimizer/Passes/Pipelines.h | 14 ++++----------
flang/test/Driver/fdebug-info-for-profiling.f90 | 12 ++++++------
.../test/Integration/debug-info-for-profiling.f90 | 4 ----
mlir/include/mlir-c/Dialect/LLVM.h | 2 +-
mlir/lib/CAPI/Dialect/LLVM.cpp | 4 ++--
5 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/flang/include/flang/Optimizer/Passes/Pipelines.h b/flang/include/flang/Optimizer/Passes/Pipelines.h
index cf8e8fba7d171..04eca81daf05e 100644
--- a/flang/include/flang/Optimizer/Passes/Pipelines.h
+++ b/flang/include/flang/Optimizer/Passes/Pipelines.h
@@ -102,11 +102,8 @@ void addExternalNameConversionPass(mlir::PassManager &pm,
void addCompilerGeneratedNamesConversionPass(mlir::PassManager &pm);
void addDebugInfoPass(mlir::PassManager &pm,
- llvm::codegenoptions::DebugInfoKind debugLevel,
- llvm::OptimizationLevel optLevel,
- bool debugInfoForProfiling, llvm::StringRef inputFilename,
- int32_t dwarfVersion, llvm::StringRef splitDwarfFile,
- llvm::StringRef dwarfDebugFlags);
+ const MLIRToLLVMPassPipelineConfig &config,
+ llvm::StringRef inputFilename);
/// Create FIRToLLVMPassOptions from pipeline configuration.
FIRToLLVMPassOptions
@@ -164,11 +161,8 @@ void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
#if !defined(FLANG_EXCLUDE_CODEGEN)
void createDebugPasses(mlir::PassManager &pm,
- llvm::codegenoptions::DebugInfoKind debugLevel,
- llvm::OptimizationLevel OptLevel,
- llvm::StringRef inputFilename, int32_t dwarfVersion,
- llvm::StringRef splitDwarfFile,
- llvm::StringRef dwarfDebugFlags);
+ const MLIRToLLVMPassPipelineConfig &config,
+ llvm::StringRef inputFilename);
void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
MLIRToLLVMPassPipelineConfig config,
diff --git a/flang/test/Driver/fdebug-info-for-profiling.f90 b/flang/test/Driver/fdebug-info-for-profiling.f90
index 28512a33e561e..6214d4b2701bc 100644
--- a/flang/test/Driver/fdebug-info-for-profiling.f90
+++ b/flang/test/Driver/fdebug-info-for-profiling.f90
@@ -1,12 +1,12 @@
! Test to check the option "-fdebug-info-for-profiling".
-!RUN: %flang -### -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
-!RUN: %flang -### -fdebug-info-for-profiling -fno-debug-info-for-profiling -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
-!RUN: %flang -### %s 2>&1 | FileCheck %s
-!RUN: %flang -### -fdebug-info-for-profiling -fno-debug-info-for-profiling %s 2>&1 | FileCheck %s
+!RUN: %flang -### -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=DEBUG-INFO
+!RUN: %flang -### -fdebug-info-for-profiling -fno-debug-info-for-profiling -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=DEBUG-INFO
+!RUN: %flang -### %s 2>&1 | FileCheck %s --check-prefix=NO-DEBUG-INFO
+!RUN: %flang -### -fdebug-info-for-profiling -fno-debug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=NO-DEBUG-INFO
-! CHECK-DEBUG-INFO: "-fdebug-info-for-profiling"
-! CHECK-NOT: "-fdebug-info-for-profiling"
+! DEBUG-INFO: "-fdebug-info-for-profiling"
+! NO-DEBUG-INFO-NOT: "-fdebug-info-for-profiling"
program test
implicit none
diff --git a/flang/test/Integration/debug-info-for-profiling.f90 b/flang/test/Integration/debug-info-for-profiling.f90
index 808e950f0803a..fec68413bc872 100644
--- a/flang/test/Integration/debug-info-for-profiling.f90
+++ b/flang/test/Integration/debug-info-for-profiling.f90
@@ -1,11 +1,7 @@
! Test to check the option "-fdebug-info-for-profiling".
-!RUN: %flang -### -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
-!RUN: %flang -### -fdebug-info-for-profiling -fno-debug-info-for-profiling -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEBUG-INFO
! RUN: %flang -S -emit-llvm -fdebug-info-for-profiling -g -o - %s | FileCheck %s
-! CHECK-DEBUG-INFO: "-fdebug-info-for-profiling"
-
! CHECK: !DICompileUnit({{.*}}debugInfoForProfiling: true{{.*}})
! CHECK: !DILexicalBlockFile(
! CHECK: discriminator:
diff --git a/mlir/include/mlir-c/Dialect/LLVM.h b/mlir/include/mlir-c/Dialect/LLVM.h
index 02ae71e41b8b7..44628787f9805 100644
--- a/mlir/include/mlir-c/Dialect/LLVM.h
+++ b/mlir/include/mlir-c/Dialect/LLVM.h
@@ -366,7 +366,7 @@ typedef enum MlirLLVMDINameTableKind MlirLLVMDINameTableKind;
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompileUnitAttrGet(
MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage,
MlirAttribute file, MlirAttribute producer, bool isOptimized,
- MlirLLVMDIEmissionKind emissionKind, bool debugInfoForProfiling,
+ MlirLLVMDIEmissionKind emissionKind, bool isDebugInfoForProfiling,
MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename);
MLIR_CAPI_EXPORTED MlirStringRef mlirLLVMDICompileUnitAttrGetName(void);
diff --git a/mlir/lib/CAPI/Dialect/LLVM.cpp b/mlir/lib/CAPI/Dialect/LLVM.cpp
index c1f60fb2753f3..8234769ca3865 100644
--- a/mlir/lib/CAPI/Dialect/LLVM.cpp
+++ b/mlir/lib/CAPI/Dialect/LLVM.cpp
@@ -345,12 +345,12 @@ MlirStringRef mlirLLVMDIFileAttrGetName(void) { return wrap(DIFileAttr::name); }
MlirAttribute mlirLLVMDICompileUnitAttrGet(
MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage,
MlirAttribute file, MlirAttribute producer, bool isOptimized,
- MlirLLVMDIEmissionKind emissionKind, bool debugInfoForProfiling,
+ MlirLLVMDIEmissionKind emissionKind, bool isDebugInfoForProfiling,
MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename) {
return wrap(DICompileUnitAttr::get(
unwrap(ctx), cast<DistinctAttr>(unwrap(id)), sourceLanguage,
cast<DIFileAttr>(unwrap(file)), cast<StringAttr>(unwrap(producer)),
- isOptimized, DIEmissionKind(emissionKind), debugInfoForProfiling,
+ isOptimized, DIEmissionKind(emissionKind), isDebugInfoForProfiling,
DINameTableKind(nameTableKind),
cast<StringAttr>(unwrap(splitDebugFilename))));
}
>From 2b66533da89bec9bcc92561a6c194d3e83660fc7 Mon Sep 17 00:00:00 2001
From: Kaviya Rajendiran <kaviyara2000 at gmail.com>
Date: Wed, 25 Mar 2026 19:20:00 +0530
Subject: [PATCH 4/4] [LLVM-Flang][test] Use %flang_fc1 and replace -g with
-debug-info-kind=standalone
---
flang/test/Integration/debug-info-for-profiling.f90 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/flang/test/Integration/debug-info-for-profiling.f90 b/flang/test/Integration/debug-info-for-profiling.f90
index fec68413bc872..3c323a19a4444 100644
--- a/flang/test/Integration/debug-info-for-profiling.f90
+++ b/flang/test/Integration/debug-info-for-profiling.f90
@@ -1,6 +1,6 @@
! Test to check the option "-fdebug-info-for-profiling".
-! RUN: %flang -S -emit-llvm -fdebug-info-for-profiling -g -o - %s | FileCheck %s
+! RUN: %flang_fc1 -emit-llvm -debug-info-kind=standalone -fdebug-info-for-profiling -o - %s | FileCheck %s
! CHECK: !DICompileUnit({{.*}}debugInfoForProfiling: true{{.*}})
! CHECK: !DILexicalBlockFile(
More information about the cfe-commits
mailing list