[Mlir-commits] [mlir] [MLIR][LLVM] Support DWARF v6 source language names in DICompileUnitAttr (PR #217432)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Aug 19 11:54:47 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: Gibran Essa (gibwrong)
<details>
<summary>Changes</summary>
Adds support to the LLVM dialect `DICompileUnitAttr` for DWARF v6 source language name and version .
`DICompileUnitAttr`'s `sourceLanugage` field now points to a `DISourceLanguageNameAttr`, which contains all source language information, including dialect, name, and version. This is done to map as closely as possible to `llvm::DISourceLanguageName`.
`DISourceLanguageNameAttr` has parameters for:
- An DW_LANG_* language.
- A DWARF v6 DW_LNAME_* name, which can only be set if the language is not.
- An optional language-dependent version.
- An optional target-specific language dialect.
Parsers and printers are added so if only a language is passed, it is parsed and printed in as before this change.
Assistance from codex was used in this PR.
---
Patch is 30.33 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/217432.diff
14 Files Affected:
- (modified) mlir/include/mlir-c/Dialect/LLVM.h (+12)
- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td (+64-5)
- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td (+12-2)
- (modified) mlir/lib/CAPI/Dialect/LLVM.cpp (+29-1)
- (modified) mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp (+77-5)
- (modified) mlir/lib/Target/LLVMIR/DebugImporter.cpp (+14-5)
- (modified) mlir/lib/Target/LLVMIR/DebugTranslation.cpp (+8-2)
- (modified) mlir/test/CAPI/llvm.c (+17-2)
- (modified) mlir/test/Dialect/LLVMIR/bytecode.mlir (+9-2)
- (modified) mlir/test/Dialect/LLVMIR/debuginfo.mlir (+3-3)
- (added) mlir/test/Dialect/LLVMIR/di-compile-unit-source-language.mlir (+24)
- (added) mlir/test/Dialect/LLVMIR/invalid-di-compile-unit-source-language.mlir (+31)
- (modified) mlir/test/Target/LLVMIR/Import/debug-info.ll (+20-1)
- (modified) mlir/test/Target/LLVMIR/llvmir-debug.mlir (+24-2)
``````````diff
diff --git a/mlir/include/mlir-c/Dialect/LLVM.h b/mlir/include/mlir-c/Dialect/LLVM.h
index 30137faaaa8d8..5c8e24bef3798 100644
--- a/mlir/include/mlir-c/Dialect/LLVM.h
+++ b/mlir/include/mlir-c/Dialect/LLVM.h
@@ -386,6 +386,18 @@ mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename,
intptr_t nImportedEntities, MlirAttribute const *importedEntities);
+/// Creates an LLVM DICompileUnit attribute with a DWARF v6 source language
+/// name, version, and optional source language dialect.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDICompileUnitAttrGetWithSourceLanguageName(
+ MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id,
+ unsigned int sourceLanguageName, uint32_t sourceLanguageVersion,
+ unsigned int 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 0c8f90b0de557..20392846f2ace 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -360,6 +360,24 @@ def LLVM_DILanguageParameter : LLVM_DIParameter<
"language", /*default=*/"0", "Language", /*errorCase=*/"0"
>;
+def LLVM_DISourceLanguageNameParameter : AttrOrTypeParameter<
+ "unsigned", "debug info source language name"> {
+ let parser = [{ [&]() -> FailureOr<unsigned> {
+ SMLoc loc = $_parser.getCurrentLocation();
+ StringRef name;
+ if ($_parser.parseKeyword(&name))
+ return failure();
+ unsigned value = llvm::dwarf::getSourceLanguageName(name);
+ if (!value)
+ return $_parser.emitError(loc)
+ << "invalid debug info source language name: " << name;
+ return value;
+ }() }];
+ let printer = [{ $_printer << llvm::dwarf::SourceLanguageNameString(
+ static_cast<llvm::dwarf::SourceLanguageName>($_self)) }];
+ let defaultValue = "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
@@ -443,6 +461,30 @@ def LLVM_DIBasicTypeAttr : LLVM_Attr<"DIBasicType", "di_basic_type",
let genMnemonicAlias = 1;
}
+//===----------------------------------------------------------------------===//
+// DISourceLanguageNameAttr
+//===----------------------------------------------------------------------===//
+
+def LLVM_DISourceLanguageNameAttr : LLVM_Attr<"DISourceLanguageName",
+ "di_source_language_name"> {
+ let parameters = (ins
+ // An unversioned source-language name (a DW_LANG_* value). This maps to
+ // llvm::DISourceLanguageName::Name when HasVersion is false.
+ LLVM_DILanguageParameter:$language,
+ // A version-independent source-language name (a DW_LNAME_* value). This
+ // maps to llvm::DISourceLanguageName::Name when HasVersion is true.
+ LLVM_DISourceLanguageNameParameter:$name,
+ // The language-dependent version. Its presence maps to
+ // llvm::DISourceLanguageName::HasVersion and its value maps to Version.
+ OptionalParameter<"std::optional<uint32_t>">:$version,
+ // An optional target-specific source-language dialect. Zero represents no
+ // dialect, its value maps to llvm::DISourceLanguageName::Dialect.
+ LLVM_DILanguageDialectParameter:$dialect
+ );
+ let assemblyFormat = "`<` struct(params) `>`";
+ let genVerifyDecl = 1;
+}
+
//===----------------------------------------------------------------------===//
// DICompileUnitAttr
//===----------------------------------------------------------------------===//
@@ -456,8 +498,10 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
OptionalParameter<"bool">:$isRecSelf,
// DICompileUnitAttr specific parameters.
OptionalParameter<"DistinctAttr">:$id,
- LLVM_DILanguageParameter:$sourceLanguage,
- LLVM_DILanguageDialectParameter:$sourceLanguageDialect,
+ // A plain DW_LANG value uses the historical inline syntax. Source language
+ // names, versions, and dialects are represented by
+ // DISourceLanguageNameAttr.
+ OptionalParameter<"DISourceLanguageNameAttr">:$sourceLanguage,
OptionalParameter<"DIFileAttr">:$file,
OptionalParameter<"StringAttr">:$producer,
OptionalParameter<"bool">:$isOptimized,
@@ -478,8 +522,11 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
CArg<"StringAttr", "{}">:$splitDebugFilename,
CArg<"ArrayRef<DINodeAttr>", "{}">:$importedEntities
), [{
+ auto language = DISourceLanguageNameAttr::get(
+ id.getContext(), sourceLanguage, /*name=*/0,
+ /*version=*/std::nullopt, sourceLanguageDialect);
return $_get(id.getContext(), /*recId=*/nullptr, /*isRecSelf=*/false, id,
- sourceLanguage, sourceLanguageDialect, file, producer,
+ language, file, producer,
isOptimized, emissionKind, isDebugInfoForProfiling,
nameTableKind, splitDebugFilename, importedEntities);
}]>,
@@ -492,13 +539,25 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
CArg<"StringAttr", "{}">:$splitDebugFilename,
CArg<"ArrayRef<DINodeAttr>", "{}">:$importedEntities
), [{
+ auto language = DISourceLanguageNameAttr::get(
+ id.getContext(), sourceLanguage, /*name=*/0,
+ /*version=*/std::nullopt, /*dialect=*/0);
return $_get(id.getContext(), /*recId=*/nullptr, /*isRecSelf=*/false, id,
- sourceLanguage, /*sourceLanguageDialect=*/0, file, producer,
+ language, file, producer,
isOptimized, emissionKind, isDebugInfoForProfiling,
nameTableKind, splitDebugFilename, importedEntities);
}]>
];
- let assemblyFormat = "`<` struct(params) `>`";
+ let assemblyFormat = [{
+ `<` struct(
+ $recId, $isRecSelf, $id,
+ custom<SourceLanguage>($sourceLanguage),
+ $file, $producer, $isOptimized, $emissionKind,
+ $isDebugInfoForProfiling, $nameTableKind, $splitDebugFilename,
+ $importedEntities
+ ) `>`
+ }];
+ let genVerifyDecl = 1;
let extraClassDeclaration = [{
/// Requirements of DIRecursiveTypeAttrInterface.
/// @{
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
index fe63c106a3e7c..15d81c4449ac5 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
@@ -124,6 +124,17 @@ def DISubroutineTypeAttr : DialectAttribute<(attr
OptionalArrayRef<"DITypeAttr">:$types
)>;
+//===----------------------------------------------------------------------===//
+// DISourceLanguageNameAttr
+//===----------------------------------------------------------------------===//
+
+def DISourceLanguageNameAttr : DialectAttribute<(attr
+ VarInt:$language,
+ VarInt:$name,
+ OptionalInt<"uint32_t">:$version,
+ VarInt:$dialect
+)>;
+
//===----------------------------------------------------------------------===//
// DICompileUnitAttr
//===----------------------------------------------------------------------===//
@@ -132,8 +143,7 @@ def DICompileUnitAttr : DialectAttribute<(attr
OptionalAttribute<"DistinctAttr">:$recId,
Bool:$isRecSelf,
OptionalAttribute<"DistinctAttr">:$id,
- VarInt:$sourceLanguage,
- VarInt:$sourceLanguageDialect,
+ OptionalAttribute<"DISourceLanguageNameAttr">:$sourceLanguage,
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 9885ae7b2b77f..c9a0cc1f15af4 100644
--- a/mlir/lib/CAPI/Dialect/LLVM.cpp
+++ b/mlir/lib/CAPI/Dialect/LLVM.cpp
@@ -372,9 +372,37 @@ MlirAttribute mlirLLVMDICompileUnitAttrGetWithSourceLanguageDialect(
intptr_t nImportedEntities, MlirAttribute const *importedEntities) {
SmallVector<Attribute> importsStorage;
importsStorage.reserve(nImportedEntities);
+ auto sourceLanguageAttr = DISourceLanguageNameAttr::get(
+ unwrap(ctx), sourceLanguage, /*name=*/0, /*version=*/std::nullopt,
+ sourceLanguageDialect);
return wrap(DICompileUnitAttr::get(
unwrap(ctx), cast<DistinctAttr>(unwrap(recId)), isRecSelf,
- cast<DistinctAttr>(unwrap(id)), sourceLanguage, sourceLanguageDialect,
+ cast<DistinctAttr>(unwrap(id)), sourceLanguageAttr,
+ cast<DIFileAttr>(unwrap(file)), cast<StringAttr>(unwrap(producer)),
+ isOptimized, DIEmissionKind(emissionKind), isDebugInfoForProfiling,
+ DINameTableKind(nameTableKind),
+ cast<StringAttr>(unwrap(splitDebugFilename)),
+ llvm::map_to_vector(
+ unwrapList(nImportedEntities, importedEntities, importsStorage),
+ llvm::CastTo<DINodeAttr>)));
+}
+
+MlirAttribute mlirLLVMDICompileUnitAttrGetWithSourceLanguageName(
+ MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id,
+ unsigned int sourceLanguageName, uint32_t sourceLanguageVersion,
+ unsigned int 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);
+ auto sourceLanguageAttr = DISourceLanguageNameAttr::get(
+ unwrap(ctx), /*language=*/0, sourceLanguageName,
+ std::optional<uint32_t>(sourceLanguageVersion), sourceLanguageDialect);
+ return wrap(DICompileUnitAttr::get(
+ unwrap(ctx), cast<DistinctAttr>(unwrap(recId)), isRecSelf,
+ cast<DistinctAttr>(unwrap(id)), sourceLanguageAttr,
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 b3a7d2e46030d..fc5f79b0cd6e7 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp
@@ -20,6 +20,7 @@
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/TypeSwitch.h"
#include "llvm/BinaryFormat/Dwarf.h"
+#include "llvm/IR/DebugInfoMetadata.h"
using namespace mlir;
using namespace mlir::LLVM;
@@ -35,6 +36,11 @@ static ParseResult parseExpressionArg(AsmParser &parser, uint64_t opcode,
static void printExpressionArg(AsmPrinter &printer, uint64_t opcode,
ArrayRef<uint64_t> args);
+static ParseResult parseSourceLanguage(AsmParser &parser,
+ DISourceLanguageNameAttr &language);
+static void printSourceLanguage(AsmPrinter &printer,
+ DISourceLanguageNameAttr language);
+
#include "mlir/Dialect/LLVMIR/LLVMAttrInterfaces.cpp.inc"
#include "mlir/Dialect/LLVMIR/LLVMOpsEnums.cpp.inc"
#define GET_ATTRDEF_CLASSES
@@ -345,6 +351,58 @@ DICompositeTypeAttr::getRecSelf(DistinctAttr recId) {
{}, {}, {}, {}, {});
}
+//===----------------------------------------------------------------------===//
+// DISourceLanguageNameAttr
+//===----------------------------------------------------------------------===//
+
+static ParseResult parseSourceLanguage(AsmParser &parser,
+ DISourceLanguageNameAttr &language) {
+ DISourceLanguageNameAttr nestedLanguage;
+ OptionalParseResult nestedResult =
+ parser.parseOptionalAttribute(nestedLanguage);
+ if (nestedResult.has_value()) {
+ if (failed(*nestedResult))
+ return failure();
+ language = nestedLanguage;
+ return success();
+ }
+
+ SMLoc loc = parser.getCurrentLocation();
+ StringRef spelling;
+ if (parser.parseKeyword(&spelling))
+ return failure();
+ if (unsigned value = llvm::dwarf::getLanguage(spelling)) {
+ language = DISourceLanguageNameAttr::get(
+ parser.getContext(), value, /*name=*/0, /*version=*/std::nullopt,
+ /*dialect=*/0);
+ return success();
+ }
+ return parser.emitError(loc)
+ << "invalid debug info source language: " << spelling;
+}
+
+static void printSourceLanguage(AsmPrinter &printer,
+ DISourceLanguageNameAttr language) {
+ if (language.getLanguage() && !language.getName() && !language.getVersion() &&
+ !language.getDialect()) {
+ printer << llvm::dwarf::LanguageString(language.getLanguage());
+ return;
+ }
+ printer.printAttribute(language);
+}
+
+LogicalResult DISourceLanguageNameAttr::verify(
+ function_ref<InFlightDiagnostic()> emitError, unsigned language,
+ unsigned name, std::optional<uint32_t> version, unsigned /*dialect*/) {
+ if (static_cast<bool>(language) == static_cast<bool>(name))
+ return emitError() << "expected exactly one of language or name";
+ if (name && !version)
+ return emitError() << "DW_LNAME requires a version";
+ if (language && version)
+ return emitError() << "DW_LANG cannot have a version";
+ return success();
+}
+
//===----------------------------------------------------------------------===//
// DICompileUnitAttr
//===----------------------------------------------------------------------===//
@@ -352,21 +410,35 @@ DICompositeTypeAttr::getRecSelf(DistinctAttr recId) {
DIRecursiveTypeAttrInterface DICompileUnitAttr::withRecId(DistinctAttr recId) {
return DICompileUnitAttr::get(
getContext(), recId, getIsRecSelf(), getId(), getSourceLanguage(),
- getSourceLanguageDialect(), getFile(), getProducer(), getIsOptimized(),
- getEmissionKind(), getIsDebugInfoForProfiling(), getNameTableKind(),
- getSplitDebugFilename(), getImportedEntities());
+ getFile(), getProducer(), getIsOptimized(), getEmissionKind(),
+ getIsDebugInfoForProfiling(), getNameTableKind(), getSplitDebugFilename(),
+ getImportedEntities());
}
DIRecursiveTypeAttrInterface DICompileUnitAttr::getRecSelf(DistinctAttr recId) {
return DICompileUnitAttr::get(
recId.getContext(), recId, /*isRecSelf=*/true, /*id=*/{},
- /*sourceLanguage=*/0u, /*sourceLanguageDialect=*/0u, /*file=*/{},
- /*producer=*/{}, /*isOptimized=*/false, DIEmissionKind::None,
+ /*sourceLanguage=*/{},
+ /*file=*/{}, /*producer=*/{}, /*isOptimized=*/false, DIEmissionKind::None,
/*isDebugInfoForProfiling=*/false, DINameTableKind::Default,
/*splitDebugFilename=*/{}, /*importedEntities=*/{});
}
+LogicalResult DICompileUnitAttr::verify(
+ function_ref<InFlightDiagnostic()> emitError, DistinctAttr recId,
+ bool isRecSelf, DistinctAttr id, DISourceLanguageNameAttr sourceLanguage,
+ DIFileAttr file, StringAttr producer, bool isOptimized,
+ DIEmissionKind emissionKind, bool isDebugInfoForProfiling,
+ DINameTableKind nameTableKind, StringAttr splitDebugFilename,
+ ArrayRef<DINodeAttr> importedEntities) {
+ if (isRecSelf)
+ return success();
+ if (!sourceLanguage)
+ return emitError() << "sourceLanguage must be set";
+ return success();
+}
+
//===----------------------------------------------------------------------===//
// DISubprogramAttr
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Target/LLVMIR/DebugImporter.cpp b/mlir/lib/Target/LLVMIR/DebugImporter.cpp
index 82beb2984b043..92a8c9aad249f 100644
--- a/mlir/lib/Target/LLVMIR/DebugImporter.cpp
+++ b/mlir/lib/Target/LLVMIR/DebugImporter.cpp
@@ -65,13 +65,22 @@ DICompileUnitAttr DebugImporter::translateImpl(llvm::DICompileUnit *node) {
imports.push_back(nodeAttr);
}
llvm::DISourceLanguageName sourceLanguage = node->getSourceLanguage();
+ DISourceLanguageNameAttr sourceLanguageAttr;
+ if (sourceLanguage.hasVersionedName()) {
+ sourceLanguageAttr = DISourceLanguageNameAttr::get(
+ context, /*language=*/0, sourceLanguage.getName(),
+ sourceLanguage.getVersion(), sourceLanguage.getDialect());
+ } else {
+ sourceLanguageAttr = DISourceLanguageNameAttr::get(
+ context, sourceLanguage.getName(), /*name=*/0,
+ /*version=*/std::nullopt, sourceLanguage.getDialect());
+ }
return DICompileUnitAttr::get(
context, /*recId=*/DistinctAttr{}, /*isRecSelf=*/false,
- getOrCreateDistinctID(node), sourceLanguage.getUnversionedName(),
- sourceLanguage.getDialect(), translate(node->getFile()),
- getStringAttrOrNull(node->getRawProducer()), node->isOptimized(),
- emissionKind.value(), node->isDebugInfoForProfiling(),
- nameTableKind.value(),
+ getOrCreateDistinctID(node), sourceLanguageAttr,
+ 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 4dc9e91b4e1c2..32ed4157691ad 100644
--- a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
@@ -139,11 +139,17 @@ llvm::DIBasicType *DebugTranslation::translateImpl(DIBasicTypeAttr attr) {
}
static llvm::DISourceLanguageName getSourceLanguage(DICompileUnitAttr attr) {
+ DISourceLanguageNameAttr sourceLanguage = attr.getSourceLanguage();
// DISourceLanguageName represents "no source-language dialect" as 0; the
// LLVM IR printer omits the `dialect:` field for that value.
+ if (sourceLanguage.getName())
+ return llvm::DISourceLanguageName(
+ static_cast<uint16_t>(sourceLanguage.getName()),
+ *sourceLanguage.getVersion(),
+ static_cast<uint16_t>(sourceLanguage.getDialect()));
return llvm::DISourceLanguageName(
- static_cast<uint16_t>(attr.getSourceLanguage()),
- static_cast<uint16_t>(attr.getSourceLanguageDialect()));
+ static_cast<uint16_t>(sourceLanguage.getLanguage()),
+ static_cast<uint16_t>(sourceLanguage.getDialect()));
}
llvm::TempDICompileUnit
diff --git a/mlir/test/CAPI/llvm.c b/mlir/test/CAPI/llvm.c
index 692a846d3b3c9..98d723a226330 100644
--- a/mlir/test/CAPI/llvm.c
+++ b/mlir/test/CAPI/llvm.c
@@ -285,10 +285,25 @@ static void testDebugInfoAttributes(MlirContext ctx) {
MlirLLVMDIEmissionKindFull, false, MlirLLVMDINameTableKindDefault,
bar, 0, NULL);
- // CHECK: #llvm.di_compile_unit<{{.*}}sourceLanguageDialect =
- // CHECK-SAME: DW_LLVM_LANG_DIALECT_simt{{.*}}>
+ // CHECK: #llvm.di_compile_unit<{{.*}}sourceLanguage =
+ // CHECK-SAME: #llvm.di_source_language_name<language = DW_LANG_C99
+ // CHECK-SAME: dialect = DW_LLVM_LANG_DIALECT_simt>
mlirAttributeDump(compile_unit);
+ // sourceLanguageName 4 is DW_LNAME_C_plus_plus.
+ MlirAttribute versioned_compile_unit =
+ mlirLLVMDICompileUnitAttrGetWithSourceLanguageName(
+ ctx, recId0, false, id, /*sourceLanguageName=*/4,
+ /*sourceLanguageVersion=*/202002,
+ /*sourceLanguageDialect=*/1, file, foo, false,
+ MlirLLVMDIEmissionKindFull, false, MlirLLVMDINameTableKindDefault,
+ bar, 0, NULL);
+
+ // CHECK: #llvm.di_compile_unit<{{.*}}sourceLanguage =
+ // CHECK-SAME: #llvm.di_source_language_name<name = DW_LNAME_C_plus_plus
+ // CHECK-SAME: version = 202002
+ mlirAttributeDump(versioned_compile_unit);
+
// CHECK: #llvm.di_compile_unit<recId = {{.*}}, isRecSelf = true>
mlirAttributeDump(mlirLLVMDICompileUnitAttrGetRecSelf(recId1));
diff --git a/mlir/test/Dialect/LLVMIR/bytecode.mlir b/mlir/test/Dialect/LLVMIR/bytecode.mlir
index 02409c8adab94..095684a5bdd93 100644
--- a/mlir/test/Dialect/LLVMIR/bytecode.mlir
+++ b/mlir/test/Dialect/LLVMIR/bytecode.mlir
@@ -8,7 +8,14 @@
#loc6 = ...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/217432
More information about the Mlir-commits
mailing list