[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