[Mlir-commits] [mlir] [mlir][llvm] support DICompileUnit source language dialect (PR #214301)
Gibran Essa
llvmlistbot at llvm.org
Thu Aug 6 08:30:01 PDT 2026
https://github.com/gibwrong updated https://github.com/llvm/llvm-project/pull/214301
>From 55ca7627f4a6954b1c096660bbcbb0f4c2011f19 Mon Sep 17 00:00:00 2001
From: Gibran Essa <gessa at nvidia.com>
Date: Tue, 4 Aug 2026 18:29:49 +0000
Subject: [PATCH 1/2] add dialect field to llvm dialect compile unit
---
mlir/include/mlir-c/Dialect/LLVM.h | 22 +++++++++++++
.../mlir/Dialect/LLVMIR/LLVMAttrDefs.td | 31 +++++++++++++++++--
.../Dialect/LLVMIR/LLVMDialectBytecode.td | 1 +
mlir/lib/CAPI/Dialect/LLVM.cpp | 17 +++++++++-
mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp | 10 +++---
mlir/lib/Target/LLVMIR/DebugImporter.cpp | 11 ++++---
mlir/lib/Target/LLVMIR/DebugTranslation.cpp | 13 ++++++--
mlir/test/CAPI/llvm.c | 14 +++++----
mlir/test/Dialect/LLVMIR/bytecode.mlir | 2 +-
mlir/test/Dialect/LLVMIR/debuginfo.mlir | 5 +--
mlir/test/Target/LLVMIR/Import/debug-info.ll | 19 ++++++++++++
mlir/test/Target/LLVMIR/llvmir-debug.mlir | 22 +++++++++++++
12 files changed, 141 insertions(+), 26 deletions(-)
diff --git a/mlir/include/mlir-c/Dialect/LLVM.h b/mlir/include/mlir-c/Dialect/LLVM.h
index 28c4cdb98931d..f145d57c67b2c 100644
--- a/mlir/include/mlir-c/Dialect/LLVM.h
+++ b/mlir/include/mlir-c/Dialect/LLVM.h
@@ -363,6 +363,17 @@ enum MlirLLVMDINameTableKind {
typedef enum MlirLLVMDINameTableKind MlirLLVMDINameTableKind;
+enum MlirLLVMDWARFSourceLanguageDialect {
+ /// No source-language dialect. LLVM textual IR spells this by omitting the
+ /// `dialect:` field.
+ MlirLLVMDWARFSourceLanguageDialectNone = 0,
+ MlirLLVMDWARFSourceLanguageDialectSIMT = 0x01,
+ MlirLLVMDWARFSourceLanguageDialectTile = 0x02,
+};
+
+typedef enum MlirLLVMDWARFSourceLanguageDialect
+ MlirLLVMDWARFSourceLanguageDialect;
+
/// Creates a self-referencing LLVM DICompileUnitAttr attribute.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDICompileUnitAttrGetRecSelf(MlirAttribute recId);
@@ -376,6 +387,17 @@ MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompileUnitAttrGet(
MlirAttribute splitDebugFilename, intptr_t nImportedEntities,
MlirAttribute const *importedEntities);
+/// Creates a LLVM DICompileUnit attribute with a source language dialect.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
+ MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id,
+ unsigned int sourceLanguage,
+ MlirLLVMDWARFSourceLanguageDialect sourceLanguageDialect, MlirAttribute file,
+ MlirAttribute producer, bool isOptimized,
+ MlirLLVMDIEmissionKind emissionKind, bool isDebugInfoForProfiling,
+ MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename,
+ intptr_t nImportedEntities, MlirAttribute const *importedEntities);
+
MLIR_CAPI_EXPORTED MlirStringRef mlirLLVMDICompileUnitAttrGetName(void);
/// Creates a LLVM DIFlags attribute.
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
index 55bbf2a02f706..a5e4bc52c84a6 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -360,6 +360,15 @@ def LLVM_DILanguageParameter : LLVM_DIParameter<
"language", /*default=*/"0", "Language", /*errorCase=*/"0"
>;
+// Source-language dialect values are defined by LLVM's
+// dwarf::LanguageDialectAttribute enum in llvm/BinaryFormat/Dwarf.h. LLVM
+// represents "no source-language dialect" as 0; the LLVM IR printer omits the
+// `dialect:` field for that value.
+def LLVM_DILanguageDialectParameter : LLVM_DIParameter<
+ "language dialect", /*default=*/"0", "LanguageDialect",
+ /*errorCase=*/"~0U"
+>;
+
def LLVM_DITagParameter : LLVM_DIParameter<
"tag", /*default=*/"0", "Tag", /*errorCase=*/"llvm::dwarf::DW_TAG_invalid"
>;
@@ -448,6 +457,7 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
// DICompileUnitAttr specific parameters.
OptionalParameter<"DistinctAttr">:$id,
LLVM_DILanguageParameter:$sourceLanguage,
+ LLVM_DILanguageDialectParameter:$sourceLanguageDialect,
OptionalParameter<"DIFileAttr">:$file,
OptionalParameter<"StringAttr">:$producer,
OptionalParameter<"bool">:$isOptimized,
@@ -458,6 +468,21 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
OptionalArrayRefParameter<"DINodeAttr">:$importedEntities
);
let builders = [
+ AttrBuilderWithInferredContext<(ins
+ "DistinctAttr":$id, "unsigned":$sourceLanguage,
+ "unsigned":$sourceLanguageDialect, "DIFileAttr":$file,
+ "StringAttr":$producer, "bool":$isOptimized,
+ "DIEmissionKind":$emissionKind,
+ CArg<"bool", "false">:$isDebugInfoForProfiling,
+ CArg<"DINameTableKind", "DINameTableKind::Default">:$nameTableKind,
+ CArg<"StringAttr", "{}">:$splitDebugFilename,
+ CArg<"ArrayRef<DINodeAttr>", "{}">:$importedEntities
+ ), [{
+ return $_get(id.getContext(), /*recId=*/nullptr, /*isRecSelf=*/false, id,
+ sourceLanguage, sourceLanguageDialect, file, producer,
+ isOptimized, emissionKind, isDebugInfoForProfiling,
+ nameTableKind, splitDebugFilename, importedEntities);
+ }]>,
AttrBuilderWithInferredContext<(ins
"DistinctAttr":$id, "unsigned":$sourceLanguage, "DIFileAttr":$file,
"StringAttr":$producer, "bool":$isOptimized,
@@ -468,9 +493,9 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
CArg<"ArrayRef<DINodeAttr>", "{}">:$importedEntities
), [{
return $_get(id.getContext(), /*recId=*/nullptr, /*isRecSelf=*/false, id,
- sourceLanguage, file, producer, isOptimized, emissionKind,
- isDebugInfoForProfiling, nameTableKind, splitDebugFilename,
- importedEntities);
+ sourceLanguage, /*sourceLanguageDialect=*/0, file, producer,
+ isOptimized, emissionKind, isDebugInfoForProfiling,
+ nameTableKind, splitDebugFilename, importedEntities);
}]>
];
let assemblyFormat = "`<` struct(params) `>`";
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
index b25a8c8a9829e..fe63c106a3e7c 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
@@ -133,6 +133,7 @@ def DICompileUnitAttr : DialectAttribute<(attr
Bool:$isRecSelf,
OptionalAttribute<"DistinctAttr">:$id,
VarInt:$sourceLanguage,
+ VarInt:$sourceLanguageDialect,
OptionalAttribute<"DIFileAttr">:$file,
OptionalAttribute<"StringAttr">:$producer,
Bool:$isOptimized,
diff --git a/mlir/lib/CAPI/Dialect/LLVM.cpp b/mlir/lib/CAPI/Dialect/LLVM.cpp
index bae811704cad3..7b9b3a17f9931 100644
--- a/mlir/lib/CAPI/Dialect/LLVM.cpp
+++ b/mlir/lib/CAPI/Dialect/LLVM.cpp
@@ -356,11 +356,26 @@ MlirAttribute mlirLLVMDICompileUnitAttrGet(
bool isDebugInfoForProfiling, MlirLLVMDINameTableKind nameTableKind,
MlirAttribute splitDebugFilename, intptr_t nImportedEntities,
MlirAttribute const *importedEntities) {
+ return mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
+ ctx, recId, isRecSelf, id, sourceLanguage,
+ MlirLLVMDWARFSourceLanguageDialectNone, file, producer, isOptimized,
+ emissionKind, isDebugInfoForProfiling, nameTableKind, splitDebugFilename,
+ nImportedEntities, importedEntities);
+}
+
+MlirAttribute mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
+ MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id,
+ unsigned int sourceLanguage,
+ MlirLLVMDWARFSourceLanguageDialect sourceLanguageDialect, MlirAttribute file,
+ MlirAttribute producer, bool isOptimized,
+ MlirLLVMDIEmissionKind emissionKind, bool isDebugInfoForProfiling,
+ MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename,
+ intptr_t nImportedEntities, MlirAttribute const *importedEntities) {
SmallVector<Attribute> importsStorage;
importsStorage.reserve(nImportedEntities);
return wrap(DICompileUnitAttr::get(
unwrap(ctx), cast<DistinctAttr>(unwrap(recId)), isRecSelf,
- cast<DistinctAttr>(unwrap(id)), sourceLanguage,
+ cast<DistinctAttr>(unwrap(id)), sourceLanguage, sourceLanguageDialect,
cast<DIFileAttr>(unwrap(file)), cast<StringAttr>(unwrap(producer)),
isOptimized, DIEmissionKind(emissionKind), isDebugInfoForProfiling,
DINameTableKind(nameTableKind),
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp
index 266faeca4553b..3b26aa2621370 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp
@@ -352,17 +352,17 @@ DICompositeTypeAttr::getRecSelf(DistinctAttr recId) {
DIRecursiveTypeAttrInterface DICompileUnitAttr::withRecId(DistinctAttr recId) {
return DICompileUnitAttr::get(
getContext(), recId, getIsRecSelf(), getId(), getSourceLanguage(),
- getFile(), getProducer(), getIsOptimized(), getEmissionKind(),
- getIsDebugInfoForProfiling(), getNameTableKind(), getSplitDebugFilename(),
- getImportedEntities());
+ getSourceLanguageDialect(), getFile(), getProducer(), getIsOptimized(),
+ getEmissionKind(), getIsDebugInfoForProfiling(), getNameTableKind(),
+ getSplitDebugFilename(), getImportedEntities());
}
DIRecursiveTypeAttrInterface DICompileUnitAttr::getRecSelf(DistinctAttr recId) {
return DICompileUnitAttr::get(
recId.getContext(), recId, /*isRecSelf=*/true, /*id=*/{},
- /*sourceLanguage=*/0u, /*file=*/{}, /*producer=*/{},
- /*isOptimized=*/false, DIEmissionKind::None,
+ /*sourceLanguage=*/0u, /*sourceLanguageDialect=*/0u, /*file=*/{},
+ /*producer=*/{}, /*isOptimized=*/false, DIEmissionKind::None,
/*isDebugInfoForProfiling=*/false, DINameTableKind::Default,
/*splitDebugFilename=*/{}, /*importedEntities=*/{});
}
diff --git a/mlir/lib/Target/LLVMIR/DebugImporter.cpp b/mlir/lib/Target/LLVMIR/DebugImporter.cpp
index 85df880d2712a..82beb2984b043 100644
--- a/mlir/lib/Target/LLVMIR/DebugImporter.cpp
+++ b/mlir/lib/Target/LLVMIR/DebugImporter.cpp
@@ -64,13 +64,14 @@ DICompileUnitAttr DebugImporter::translateImpl(llvm::DICompileUnit *node) {
translate(static_cast<llvm::DINode *>(importedEntity)))
imports.push_back(nodeAttr);
}
+ llvm::DISourceLanguageName sourceLanguage = node->getSourceLanguage();
return DICompileUnitAttr::get(
context, /*recId=*/DistinctAttr{}, /*isRecSelf=*/false,
- getOrCreateDistinctID(node),
- node->getSourceLanguage().getUnversionedName(),
- translate(node->getFile()), getStringAttrOrNull(node->getRawProducer()),
- node->isOptimized(), emissionKind.value(),
- node->isDebugInfoForProfiling(), nameTableKind.value(),
+ getOrCreateDistinctID(node), sourceLanguage.getUnversionedName(),
+ sourceLanguage.getDialect(), translate(node->getFile()),
+ getStringAttrOrNull(node->getRawProducer()), node->isOptimized(),
+ emissionKind.value(), node->isDebugInfoForProfiling(),
+ nameTableKind.value(),
getStringAttrOrNull(node->getRawSplitDebugFilename()), imports);
}
diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
index 442f5b6b137e6..4dc9e91b4e1c2 100644
--- a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
@@ -138,11 +138,18 @@ llvm::DIBasicType *DebugTranslation::translateImpl(DIBasicTypeAttr attr) {
/*AlignInBits=*/0, attr.getEncoding(), llvm::DINode::FlagZero);
}
+static llvm::DISourceLanguageName getSourceLanguage(DICompileUnitAttr attr) {
+ // DISourceLanguageName represents "no source-language dialect" as 0; the
+ // LLVM IR printer omits the `dialect:` field for that value.
+ return llvm::DISourceLanguageName(
+ static_cast<uint16_t>(attr.getSourceLanguage()),
+ static_cast<uint16_t>(attr.getSourceLanguageDialect()));
+}
+
llvm::TempDICompileUnit
DebugTranslation::translateTemporaryImpl(DICompileUnitAttr attr) {
return llvm::DICompileUnit::getTemporary(
- llvmCtx,
- static_cast<llvm::DISourceLanguageName>(attr.getSourceLanguage()),
+ llvmCtx, getSourceLanguage(attr),
/*File=*/nullptr, "", attr.getIsOptimized(),
/*Flags=*/"", /*RuntimeVersion=*/0,
/*splitDebugFileName=*/"",
@@ -166,7 +173,7 @@ llvm::DICompileUnit *DebugTranslation::translateImpl(DICompileUnitAttr attr) {
llvm::DIBuilder builder(llvmModule);
llvm::DICompileUnit *cu = builder.createCompileUnit(
- attr.getSourceLanguage(), translate(attr.getFile()),
+ getSourceLanguage(attr), translate(attr.getFile()),
attr.getProducer() ? attr.getProducer().getValue() : "",
attr.getIsOptimized(),
/*Flags=*/"", /*RV=*/0,
diff --git a/mlir/test/CAPI/llvm.c b/mlir/test/CAPI/llvm.c
index 7e0cf9fee1899..091486833ecf8 100644
--- a/mlir/test/CAPI/llvm.c
+++ b/mlir/test/CAPI/llvm.c
@@ -276,12 +276,14 @@ static void testDebugInfoAttributes(MlirContext ctx) {
// CHECK: #llvm.di_file<"foo" in "bar">
mlirAttributeDump(file);
- MlirAttribute compile_unit = mlirLLVMDICompileUnitAttrGet(
- ctx, recId0, false, id, LLVMDWARFSourceLanguageC99, file, foo, false,
- MlirLLVMDIEmissionKindFull, false, MlirLLVMDINameTableKindDefault, bar, 0,
- NULL);
-
- // CHECK: #llvm.di_compile_unit<{{.*}}>
+ MlirAttribute compile_unit =
+ mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
+ ctx, recId0, false, id, LLVMDWARFSourceLanguageC99,
+ MlirLLVMDWARFSourceLanguageDialectSIMT, file, foo, false,
+ MlirLLVMDIEmissionKindFull, false, MlirLLVMDINameTableKindDefault, bar,
+ 0, NULL);
+
+ // CHECK: #llvm.di_compile_unit<{{.*}}sourceLanguageDialect = DW_LLVM_LANG_DIALECT_simt{{.*}}>
mlirAttributeDump(compile_unit);
// CHECK: #llvm.di_compile_unit<recId = {{.*}}, isRecSelf = true>
diff --git a/mlir/test/Dialect/LLVMIR/bytecode.mlir b/mlir/test/Dialect/LLVMIR/bytecode.mlir
index b70ded784bc4b..02409c8adab94 100644
--- a/mlir/test/Dialect/LLVMIR/bytecode.mlir
+++ b/mlir/test/Dialect/LLVMIR/bytecode.mlir
@@ -24,7 +24,7 @@ module {
#loc3 = loc("test-path":36:3)
#loc4 = loc("test-path":37:5)
#loc5 = loc("test-path":39:5)
-#di_compile_unit = #llvm.di_compile_unit<id = distinct[3]<>, sourceLanguage = DW_LANG_Fortran95, file = #di_file, isOptimized = false, emissionKind = Full>
+#di_compile_unit = #llvm.di_compile_unit<id = distinct[3]<>, sourceLanguage = DW_LANG_Fortran95, sourceLanguageDialect = DW_LLVM_LANG_DIALECT_tile, file = #di_file, isOptimized = false, emissionKind = Full>
#di_compile_unit1 = #llvm.di_compile_unit<id = distinct[4]<>, sourceLanguage = DW_LANG_Fortran95, file = #di_file, isOptimized = false, emissionKind = Full>
#di_compile_unit2 = #llvm.di_compile_unit<id = distinct[5]<>, sourceLanguage = DW_LANG_Fortran95, file = #di_file, isOptimized = false, emissionKind = Full>
#di_module = #llvm.di_module<file = #di_file, scope = #di_compile_unit1, name = "mod1">
diff --git a/mlir/test/Dialect/LLVMIR/debuginfo.mlir b/mlir/test/Dialect/LLVMIR/debuginfo.mlir
index 21bcbcffbace7..020f3b3b0ee7a 100644
--- a/mlir/test/Dialect/LLVMIR/debuginfo.mlir
+++ b/mlir/test/Dialect/LLVMIR/debuginfo.mlir
@@ -5,11 +5,12 @@
// CHECK-DAG: #[[NS:.*]] = #llvm.di_namespace<name = "cu_import_ns", exportSymbols = false>
// CHECK-DAG: #[[IE:.*]] = #llvm.di_imported_entity<tag = DW_TAG_imported_module, scope = #[[FILE]], entity = #[[NS]], file = #[[FILE]]>
-// CHECK-DAG: #[[CU:.*]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #[[FILE]], producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true, importedEntities = #[[IE]]>
+// CHECK-DAG: #[[CU:.*]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, sourceLanguageDialect = DW_LLVM_LANG_DIALECT_simt, file = #[[FILE]], producer = "MLIR", isOptimized = true, emissionKind = Full, isDebugInfoForProfiling = true, importedEntities = #[[IE]]>
#cu_import_ns = #llvm.di_namespace<name = "cu_import_ns", exportSymbols = false>
#cu_import_ie = #llvm.di_imported_entity<tag = DW_TAG_imported_module, scope = #file, entity = #cu_import_ns, file = #file>
#cu = #llvm.di_compile_unit<
- id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #file,
+ id = distinct[0]<>, sourceLanguage = DW_LANG_C,
+ sourceLanguageDialect = DW_LLVM_LANG_DIALECT_simt, file = #file,
producer = "MLIR", isOptimized = true, emissionKind = Full,
isDebugInfoForProfiling = true, importedEntities = #cu_import_ie
>
diff --git a/mlir/test/Target/LLVMIR/Import/debug-info.ll b/mlir/test/Target/LLVMIR/Import/debug-info.ll
index 28c25809002cd..f00fd792e77fa 100644
--- a/mlir/test/Target/LLVMIR/Import/debug-info.ll
+++ b/mlir/test/Target/LLVMIR/Import/debug-info.ll
@@ -1046,3 +1046,22 @@ define void @fn_with_static_local() !dbg !3 {
!12 = !DILocalVariable(name: "unused_local", scope: !3, file: !4, line: 122, type: !9)
!13 = !DISubroutineType(types: !14)
!14 = !{null}
+
+; // -----
+
+; CHECK-DAG: #[[DIALECT_FILE:.+]] = #llvm.di_file<"dialect.ll" in "/">
+; CHECK-DAG: #[[DIALECT_CU:.+]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, sourceLanguageDialect = DW_LLVM_LANG_DIALECT_tile, file = #[[DIALECT_FILE]]>
+
+define void @fn_cu_dialect() !dbg !3 {
+ ret void
+}
+
+!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, dialect: DW_LLVM_LANG_DIALECT_tile)
+!2 = !DIFile(filename: "dialect.ll", directory: "/")
+!3 = distinct !DISubprogram(name: "fn_cu_dialect", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, type: !4)
+!4 = !DISubroutineType(types: !5)
+!5 = !{null}
diff --git a/mlir/test/Target/LLVMIR/llvmir-debug.mlir b/mlir/test/Target/LLVMIR/llvmir-debug.mlir
index b93a38be6634d..6628b2882a26c 100644
--- a/mlir/test/Target/LLVMIR/llvmir-debug.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir-debug.mlir
@@ -870,6 +870,28 @@ llvm.func @fn_cu_import_cycle() {
// -----
+#file = #llvm.di_file<"dialect.mlir" in "/test/">
+#cu = #llvm.di_compile_unit<
+ id = distinct[0]<>, sourceLanguage = DW_LANG_C,
+ sourceLanguageDialect = DW_LLVM_LANG_DIALECT_simt, file = #file,
+ isOptimized = false, emissionKind = Full
+>
+#sp_ty = #llvm.di_subroutine_type<callingConvention = DW_CC_normal>
+#sp = #llvm.di_subprogram<
+ compileUnit = #cu, scope = #file, name = "fn_cu_dialect",
+ file = #file, line = 1, scopeLine = 1, subprogramFlags = Definition,
+ type = #sp_ty
+>
+
+// CHECK-LABEL: define void @fn_cu_dialect()
+llvm.func @fn_cu_dialect() {
+ llvm.return
+} loc(fused<#sp>["dialect.mlir":1:1])
+
+// CHECK-DAG: !DICompileUnit({{.*}}dialect: DW_LLVM_LANG_DIALECT_simt)
+
+// -----
+
#di_file = #llvm.di_file<"foo.mlir" in "/tmp">
#di_cu = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file, isOptimized = false, emissionKind = Full>
#di_uint8 = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "uint8", sizeInBits = 8, encoding = DW_ATE_unsigned>
>From ea57d1274ce4b2d4eecd860afc2e908de2af3ed3 Mon Sep 17 00:00:00 2001
From: Gibran Essa <gessa at nvidia.com>
Date: Wed, 5 Aug 2026 19:41:53 +0000
Subject: [PATCH 2/2] don't add enum to CAPI
---
mlir/include/mlir-c/Dialect/LLVM.h | 16 ++--------------
mlir/lib/CAPI/Dialect/LLVM.cpp | 9 ++++-----
mlir/test/CAPI/llvm.c | 4 +++-
3 files changed, 9 insertions(+), 20 deletions(-)
diff --git a/mlir/include/mlir-c/Dialect/LLVM.h b/mlir/include/mlir-c/Dialect/LLVM.h
index f145d57c67b2c..30137faaaa8d8 100644
--- a/mlir/include/mlir-c/Dialect/LLVM.h
+++ b/mlir/include/mlir-c/Dialect/LLVM.h
@@ -363,17 +363,6 @@ enum MlirLLVMDINameTableKind {
typedef enum MlirLLVMDINameTableKind MlirLLVMDINameTableKind;
-enum MlirLLVMDWARFSourceLanguageDialect {
- /// No source-language dialect. LLVM textual IR spells this by omitting the
- /// `dialect:` field.
- MlirLLVMDWARFSourceLanguageDialectNone = 0,
- MlirLLVMDWARFSourceLanguageDialectSIMT = 0x01,
- MlirLLVMDWARFSourceLanguageDialectTile = 0x02,
-};
-
-typedef enum MlirLLVMDWARFSourceLanguageDialect
- MlirLLVMDWARFSourceLanguageDialect;
-
/// Creates a self-referencing LLVM DICompileUnitAttr attribute.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDICompileUnitAttrGetRecSelf(MlirAttribute recId);
@@ -391,9 +380,8 @@ MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompileUnitAttrGet(
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id,
- unsigned int sourceLanguage,
- MlirLLVMDWARFSourceLanguageDialect sourceLanguageDialect, MlirAttribute file,
- MlirAttribute producer, bool isOptimized,
+ unsigned int sourceLanguage, unsigned int sourceLanguageDialect,
+ MlirAttribute file, MlirAttribute producer, bool isOptimized,
MlirLLVMDIEmissionKind emissionKind, bool isDebugInfoForProfiling,
MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename,
intptr_t nImportedEntities, MlirAttribute const *importedEntities);
diff --git a/mlir/lib/CAPI/Dialect/LLVM.cpp b/mlir/lib/CAPI/Dialect/LLVM.cpp
index 7b9b3a17f9931..9885ae7b2b77f 100644
--- a/mlir/lib/CAPI/Dialect/LLVM.cpp
+++ b/mlir/lib/CAPI/Dialect/LLVM.cpp
@@ -358,16 +358,15 @@ MlirAttribute mlirLLVMDICompileUnitAttrGet(
MlirAttribute const *importedEntities) {
return mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
ctx, recId, isRecSelf, id, sourceLanguage,
- MlirLLVMDWARFSourceLanguageDialectNone, file, producer, isOptimized,
- emissionKind, isDebugInfoForProfiling, nameTableKind, splitDebugFilename,
+ /*sourceLanguageDialect=*/0, file, producer, isOptimized, emissionKind,
+ isDebugInfoForProfiling, nameTableKind, splitDebugFilename,
nImportedEntities, importedEntities);
}
MlirAttribute mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id,
- unsigned int sourceLanguage,
- MlirLLVMDWARFSourceLanguageDialect sourceLanguageDialect, MlirAttribute file,
- MlirAttribute producer, bool isOptimized,
+ unsigned int sourceLanguage, unsigned int sourceLanguageDialect,
+ MlirAttribute file, MlirAttribute producer, bool isOptimized,
MlirLLVMDIEmissionKind emissionKind, bool isDebugInfoForProfiling,
MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename,
intptr_t nImportedEntities, MlirAttribute const *importedEntities) {
diff --git a/mlir/test/CAPI/llvm.c b/mlir/test/CAPI/llvm.c
index 091486833ecf8..9873fbf920df3 100644
--- a/mlir/test/CAPI/llvm.c
+++ b/mlir/test/CAPI/llvm.c
@@ -276,10 +276,12 @@ static void testDebugInfoAttributes(MlirContext ctx) {
// CHECK: #llvm.di_file<"foo" in "bar">
mlirAttributeDump(file);
+ // sourceLanguageDialect 1 is DW_LLVM_LANG_DIALECT_simt, as defined by
+ // LLVM's dwarf::LanguageDialectAttribute enum.
MlirAttribute compile_unit =
mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
ctx, recId0, false, id, LLVMDWARFSourceLanguageC99,
- MlirLLVMDWARFSourceLanguageDialectSIMT, file, foo, false,
+ /*sourceLanguageDialect=*/1, file, foo, false,
MlirLLVMDIEmissionKindFull, false, MlirLLVMDINameTableKindDefault, bar,
0, NULL);
More information about the Mlir-commits
mailing list