[Mlir-commits] [mlir] [MLIR] Add llvm (debug) attributes to CAPI (PR #83992)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Mar 6 03:01:39 PST 2024
https://github.com/edg-l updated https://github.com/llvm/llvm-project/pull/83992
>From 2865ed114c163ad3d673d48ef93ac7463cd107f1 Mon Sep 17 00:00:00 2001
From: Edgar Luque <git at edgarluque.com>
Date: Mon, 19 Feb 2024 13:43:36 +0100
Subject: [PATCH 1/2] [mlir] Add LLVM attributes to the c api
---
mlir/include/mlir-c/BuiltinAttributes.h | 4 +
mlir/include/mlir-c/Dialect/LLVM.h | 124 +++++++++++++
mlir/lib/CAPI/Dialect/LLVM.cpp | 228 ++++++++++++++++++++++++
mlir/lib/CAPI/IR/BuiltinAttributes.cpp | 4 +
mlir/test/CAPI/ir.c | 4 +
mlir/test/CAPI/llvm.c | 148 ++++++++++++++-
6 files changed, 511 insertions(+), 1 deletion(-)
diff --git a/mlir/include/mlir-c/BuiltinAttributes.h b/mlir/include/mlir-c/BuiltinAttributes.h
index 01d1b6008f5e21..231eb83b5e2694 100644
--- a/mlir/include/mlir-c/BuiltinAttributes.h
+++ b/mlir/include/mlir-c/BuiltinAttributes.h
@@ -266,6 +266,10 @@ mlirSymbolRefAttrGetNestedReference(MlirAttribute attr, intptr_t pos);
/// Returns the typeID of an SymbolRef attribute.
MLIR_CAPI_EXPORTED MlirTypeID mlirSymbolRefAttrGetTypeID(void);
+/// Creates a DisctinctAttr with the referenced attribute.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirDisctinctAttrCreate(MlirAttribute referencedAttr);
+
//===----------------------------------------------------------------------===//
// Flat SymbolRef attribute.
//===----------------------------------------------------------------------===//
diff --git a/mlir/include/mlir-c/Dialect/LLVM.h b/mlir/include/mlir-c/Dialect/LLVM.h
index ac216b01f364d4..3393ec6f51cc03 100644
--- a/mlir/include/mlir-c/Dialect/LLVM.h
+++ b/mlir/include/mlir-c/Dialect/LLVM.h
@@ -11,6 +11,7 @@
#define MLIR_C_DIALECT_LLVM_H
#include "mlir-c/IR.h"
+#include "mlir-c/Support.h"
#ifdef __cplusplus
extern "C" {
@@ -98,6 +99,129 @@ MLIR_CAPI_EXPORTED MlirLogicalResult
mlirLLVMStructTypeSetBody(MlirType structType, intptr_t nFieldTypes,
MlirType const *fieldTypes, bool isPacked);
+/// Creates a LLVM CConv attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMCConvAttrGet(MlirContext ctx,
+ uint64_t cconv);
+
+/// Creates a LLVM Comdat attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMComdatAttrGet(MlirContext ctx,
+ uint64_t comdat);
+
+/// Creates a LLVM Linkage attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMLinkageAttrGet(MlirContext ctx,
+ uint64_t linkage);
+
+/// Creates a LLVM DINullType attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx);
+
+/// Creates a LLVM DIExpressionElem attribute.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDIExpressionElemAttrGet(MlirContext ctx, unsigned int opcode,
+ intptr_t nArguments, uint64_t const *arguments);
+
+/// Creates a LLVM DIExpression attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIExpressionAttrGet(
+ MlirContext ctx, intptr_t nOperations, MlirAttribute const *operations);
+
+/// Creates a LLVM DIBasicType attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIBasicTypeAttrGet(
+ MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
+ unsigned int encoding);
+
+/// Creates a LLVM DICompositeType attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompositeTypeAttrGet(
+ MlirContext ctx, unsigned int tag, MlirAttribute name, MlirAttribute file,
+ uint32_t line, MlirAttribute scope, MlirAttribute baseType, int64_t flags,
+ uint64_t sizeInBits, uint64_t alignInBits, intptr_t nElements,
+ MlirAttribute const *elements);
+
+/// Creates a LLVM DIDerivedType attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIDerivedTypeAttrGet(
+ MlirContext ctx, unsigned int tag, MlirAttribute name,
+ MlirAttribute baseType, uint64_t sizeInBits, uint32_t alignInBits,
+ uint64_t offsetInBits);
+
+/// Gets the base type from a LLVM DIDerivedType attribute.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDIDerivedTypeAttrGetBaseType(MlirAttribute diDerivedType);
+
+/// Creates a LLVM DIFileAttr attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIFileAttrGet(MlirContext ctx,
+ MlirAttribute name,
+ MlirAttribute directory);
+
+/// Creates a LLVM DICompileUnit attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompileUnitAttrGet(
+ MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage,
+ MlirAttribute file, MlirAttribute producer, bool isOptimized,
+ uint64_t emissionKind);
+
+/// Creates a LLVM DIFlags attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIFlagsAttrGet(MlirContext ctx,
+ uint64_t value);
+
+/// Creates a LLVM DILexicalBlock attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILexicalBlockAttrGet(
+ MlirContext ctx, MlirAttribute scope, MlirAttribute file, unsigned int line,
+ unsigned int column);
+
+/// Creates a LLVM DILexicalBlockFile attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILexicalBlockFileAttrGet(
+ MlirContext ctx, MlirAttribute scope, MlirAttribute file,
+ unsigned int discriminator);
+
+/// Creates a LLVM DILocalVariableAttr attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILocalVariableAttrGet(
+ MlirContext ctx, MlirAttribute scope, MlirAttribute name,
+ MlirAttribute diFile, unsigned int line, unsigned int arg,
+ unsigned int alignInBits, MlirAttribute diType);
+
+/// Creates a LLVM DISubprogramAttr attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDISubprogramAttrGet(
+ MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
+ MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
+ MlirAttribute file, unsigned int line, unsigned int scopeLine,
+ uint64_t subprogramFlags, MlirAttribute type);
+
+/// Gets the scope from this DISubprogramAttr.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDISubprogramAttrGetScope(MlirAttribute diSubprogram);
+
+/// Gets the line from this DISubprogramAttr.
+MLIR_CAPI_EXPORTED unsigned int
+mlirLLVMDISubprogramAttrGetLine(MlirAttribute diSubprogram);
+
+/// Gets the scope line from this DISubprogram.
+MLIR_CAPI_EXPORTED unsigned int
+mlirLLVMDISubprogramAttrGetScopeLine(MlirAttribute diSubprogram);
+
+/// Gets the compile unit from this DISubprogram.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDISubprogramAttrGetCompileUnit(MlirAttribute diSubprogram);
+
+/// Gets the file from this DISubprogramAttr.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDISubprogramAttrGetFile(MlirAttribute diSubprogram);
+
+/// Gets the type from this DISubprogramAttr.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDISubprogramAttrGetType(MlirAttribute diSubprogram);
+
+/// Creates a LLVM DISubroutineTypeAttr attribute.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx, unsigned int callingConvention,
+ intptr_t nTypes, MlirAttribute const *types);
+
+/// Creates a LLVM DIModuleAttr attribute.
+MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIModuleAttrGet(
+ MlirContext ctx, MlirAttribute file, MlirAttribute scope,
+ MlirAttribute name, MlirAttribute configMacros, MlirAttribute includePath,
+ MlirAttribute apinotes, unsigned int line, bool isDecl);
+
+/// Gets the scope of this DIModuleAttr.
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule);
+
#ifdef __cplusplus
}
#endif
diff --git a/mlir/lib/CAPI/Dialect/LLVM.cpp b/mlir/lib/CAPI/Dialect/LLVM.cpp
index 642018a814ca12..d540b1a81ee0e4 100644
--- a/mlir/lib/CAPI/Dialect/LLVM.cpp
+++ b/mlir/lib/CAPI/Dialect/LLVM.cpp
@@ -7,9 +7,18 @@
//===----------------------------------------------------------------------===//
#include "mlir-c/Dialect/LLVM.h"
+#include "mlir-c/IR.h"
+#include "mlir-c/Support.h"
#include "mlir/CAPI/Registration.h"
+#include "mlir/CAPI/Wrap.h"
+#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
+#include "mlir/Dialect/LLVMIR/LLVMOpsAttrDefs.h.inc"
#include "mlir/Dialect/LLVMIR/LLVMTypes.h"
+#include "mlir/IR/Attributes.h"
+#include "mlir/IR/BuiltinAttributes.h"
+#include "mlir/Support/LLVM.h"
+#include <stdint.h>
using namespace mlir;
using namespace mlir::LLVM;
@@ -110,3 +119,222 @@ MlirLogicalResult mlirLLVMStructTypeSetBody(MlirType structType,
cast<LLVM::LLVMStructType>(unwrap(structType))
.setBody(unwrapList(nFieldTypes, fieldTypes, fields), isPacked));
}
+
+MlirAttribute mlirLLVMDIExpressionElemAttrGet(MlirContext ctx,
+ unsigned int opcode,
+ intptr_t nArguments,
+ uint64_t const *arguments) {
+ auto list = mlir::ArrayRef<uint64_t>(arguments, nArguments);
+ return wrap(DIExpressionElemAttr::get(unwrap(ctx), opcode, list));
+}
+
+MlirAttribute mlirLLVMDIExpressionAttrGet(MlirContext ctx, intptr_t nOperations,
+ MlirAttribute const *operations) {
+ SmallVector<Attribute, 2> attrStorage;
+ attrStorage.reserve(nOperations);
+ mlir::ArrayRef<Attribute> tempList =
+ unwrapList(nOperations, operations, attrStorage);
+
+ SmallVector<DIExpressionElemAttr, 2> diExpressionElemStorage;
+ diExpressionElemStorage.reserve(tempList.size());
+
+ for (auto attr : tempList) {
+ diExpressionElemStorage.push_back(attr.cast<DIExpressionElemAttr>());
+ }
+
+ return wrap(DIExpressionAttr::get(unwrap(ctx), diExpressionElemStorage));
+}
+
+MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx) {
+ return wrap(DINullTypeAttr::get(unwrap(ctx)));
+}
+
+MlirAttribute mlirLLVMDIBasicTypeAttrGet(MlirContext ctx, unsigned int tag,
+ MlirAttribute name,
+ uint64_t sizeInBits,
+ unsigned int encoding) {
+ return wrap(DIBasicTypeAttr::get(
+ unwrap(ctx), tag, cast<StringAttr>(unwrap(name)), sizeInBits, encoding));
+}
+
+MlirAttribute mlirLLVMDICompositeTypeAttrGet(
+ MlirContext ctx, unsigned int tag, MlirAttribute name, MlirAttribute file,
+ uint32_t line, MlirAttribute scope, MlirAttribute baseType, int64_t flags,
+ uint64_t sizeInBits, uint64_t alignInBits, intptr_t nElements,
+ MlirAttribute const *elements) {
+ SmallVector<Attribute, 2> elementsStorage;
+ elementsStorage.reserve(nElements);
+
+ mlir::ArrayRef<Attribute> tempList =
+ unwrapList(nElements, elements, elementsStorage);
+
+ SmallVector<DINodeAttr, 2> diNodesStorage;
+ diNodesStorage.reserve(tempList.size());
+
+ for (auto attr : tempList) {
+ diNodesStorage.push_back(attr.cast<DINodeAttr>());
+ }
+
+ return wrap(DICompositeTypeAttr::get(
+ unwrap(ctx), tag, cast<StringAttr>(unwrap(name)),
+ cast<DIFileAttr>(unwrap(file)), line, cast<DIScopeAttr>(unwrap(scope)),
+ cast<DITypeAttr>(unwrap(baseType)), DIFlags(flags), sizeInBits,
+ alignInBits, diNodesStorage));
+}
+
+MlirAttribute mlirLLVMDIDerivedTypeAttrGet(MlirContext ctx, unsigned int tag,
+ MlirAttribute name,
+ MlirAttribute baseType,
+ uint64_t sizeInBits,
+ uint32_t alignInBits,
+ uint64_t offsetInBits) {
+ return wrap(DIDerivedTypeAttr::get(unwrap(ctx), tag,
+ cast<StringAttr>(unwrap(name)),
+ cast<DITypeAttr>(unwrap(baseType)),
+ sizeInBits, alignInBits, offsetInBits));
+}
+
+MlirAttribute
+mlirLLVMDIDerivedTypeAttrGetBaseType(MlirAttribute diDerivedType) {
+ return wrap(cast<DIDerivedTypeAttr>(unwrap(diDerivedType)).getBaseType());
+}
+
+MlirAttribute mlirLLVMCConvAttrGet(MlirContext ctx, uint64_t cconv) {
+ return wrap(CConvAttr::get(unwrap(ctx), CConv(cconv)));
+}
+
+MlirAttribute mlirLLVMComdatAttrGet(MlirContext ctx, uint64_t comdat) {
+ return wrap(ComdatAttr::get(unwrap(ctx), comdat::Comdat(comdat)));
+}
+
+MlirAttribute mlirLLVMLinkageAttrGet(MlirContext ctx, uint64_t linkage) {
+ return wrap(LinkageAttr::get(unwrap(ctx), linkage::Linkage(linkage)));
+}
+
+MlirAttribute mlirLLVMDIFileAttrGet(MlirContext ctx, MlirAttribute name,
+ MlirAttribute directory) {
+ return wrap(DIFileAttr::get(unwrap(ctx), cast<StringAttr>(unwrap(name)),
+ cast<StringAttr>(unwrap(directory))));
+}
+
+MlirAttribute mlirLLVMDICompileUnitAttrGet(MlirContext ctx, MlirAttribute id,
+ unsigned int sourceLanguage,
+ MlirAttribute file,
+ MlirAttribute producer,
+ bool isOptimized,
+ uint64_t emissionKind) {
+ return wrap(DICompileUnitAttr::get(
+ unwrap(ctx), cast<DistinctAttr>(unwrap(id)), sourceLanguage,
+ cast<DIFileAttr>(unwrap(file)), cast<StringAttr>(unwrap(producer)),
+ isOptimized, DIEmissionKind(emissionKind)));
+}
+
+MlirAttribute mlirLLVMDIFlagsAttrGet(MlirContext ctx, uint64_t value) {
+ return wrap(DIFlagsAttr::get(unwrap(ctx), DIFlags(value)));
+}
+
+MlirAttribute mlirLLVMDILexicalBlockAttrGet(MlirContext ctx,
+ MlirAttribute scope,
+ MlirAttribute file,
+ unsigned int line,
+ unsigned int column) {
+ return wrap(
+ DILexicalBlockAttr::get(unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
+ cast<DIFileAttr>(unwrap(file)), line, column));
+}
+
+MlirAttribute mlirLLVMDILexicalBlockFileAttrGet(MlirContext ctx,
+ MlirAttribute scope,
+ MlirAttribute file,
+ unsigned int discriminator) {
+ return wrap(DILexicalBlockFileAttr::get(
+ unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
+ cast<DIFileAttr>(unwrap(file)), discriminator));
+}
+
+MlirAttribute
+mlirLLVMDILocalVariableAttrGet(MlirContext ctx, MlirAttribute scope,
+ MlirAttribute name, MlirAttribute diFile,
+ unsigned int line, unsigned int arg,
+ unsigned int alignInBits, MlirAttribute diType) {
+ return wrap(DILocalVariableAttr::get(
+ unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
+ cast<StringAttr>(unwrap(name)), cast<DIFileAttr>(unwrap(diFile)), line,
+ arg, alignInBits, cast<DITypeAttr>(unwrap(diType))));
+}
+
+MlirAttribute mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx,
+ unsigned int callingConvention,
+ intptr_t nTypes,
+ MlirAttribute const *types) {
+ SmallVector<Attribute, 2> attrStorage;
+ attrStorage.reserve(nTypes);
+ mlir::ArrayRef<Attribute> tempList = unwrapList(nTypes, types, attrStorage);
+
+ SmallVector<DITypeAttr, 2> diTypesStorage;
+ diTypesStorage.reserve(tempList.size());
+
+ for (auto attr : tempList) {
+ diTypesStorage.push_back(attr.cast<DITypeAttr>());
+ }
+
+ return wrap(DISubroutineTypeAttr::get(unwrap(ctx), callingConvention,
+ diTypesStorage));
+}
+
+MlirAttribute mlirLLVMDISubprogramAttrGet(
+ MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
+ MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
+ MlirAttribute file, unsigned int line, unsigned int scopeLine,
+ uint64_t subprogramFlags, MlirAttribute type) {
+ return wrap(DISubprogramAttr::get(
+ unwrap(ctx), cast<DistinctAttr>(unwrap(id)),
+ cast<DICompileUnitAttr>(unwrap(compileUnit)),
+ cast<DIScopeAttr>(unwrap(scope)), cast<StringAttr>(unwrap(name)),
+ cast<StringAttr>(unwrap(linkageName)), cast<DIFileAttr>(unwrap(file)),
+ line, scopeLine, DISubprogramFlags(subprogramFlags),
+ cast<DISubroutineTypeAttr>(unwrap(type))));
+}
+
+MlirAttribute mlirLLVMDISubprogramAttrGetScope(MlirAttribute diSubprogram) {
+ return wrap(cast<DISubprogramAttr>(unwrap(diSubprogram)).getScope());
+}
+
+unsigned int mlirLLVMDISubprogramAttrGetLine(MlirAttribute diSubprogram) {
+ return cast<DISubprogramAttr>(unwrap(diSubprogram)).getLine();
+}
+
+unsigned int mlirLLVMDISubprogramAttrGetScopeLine(MlirAttribute diSubprogram) {
+ return cast<DISubprogramAttr>(unwrap(diSubprogram)).getScopeLine();
+}
+
+MlirAttribute
+mlirLLVMDISubprogramAttrGetCompileUnit(MlirAttribute diSubprogram) {
+ return wrap(cast<DISubprogramAttr>(unwrap(diSubprogram)).getCompileUnit());
+}
+
+MlirAttribute mlirLLVMDISubprogramAttrGetFile(MlirAttribute diSubprogram) {
+ return wrap(cast<DISubprogramAttr>(unwrap(diSubprogram)).getFile());
+}
+
+MlirAttribute mlirLLVMDISubprogramAttrGetType(MlirAttribute diSubprogram) {
+ return wrap(cast<DISubprogramAttr>(unwrap(diSubprogram)).getType());
+}
+
+MlirAttribute mlirLLVMDIModuleAttrGet(MlirContext ctx, MlirAttribute file,
+ MlirAttribute scope, MlirAttribute name,
+ MlirAttribute configMacros,
+ MlirAttribute includePath,
+ MlirAttribute apinotes, unsigned int line,
+ bool isDecl) {
+ return wrap(DIModuleAttr::get(
+ unwrap(ctx), cast<DIFileAttr>(unwrap(file)),
+ cast<DIScopeAttr>(unwrap(scope)), cast<StringAttr>(unwrap(name)),
+ cast<StringAttr>(unwrap(configMacros)),
+ cast<StringAttr>(unwrap(includePath)), cast<StringAttr>(unwrap(apinotes)),
+ line, isDecl));
+}
+
+MlirAttribute mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule) {
+ return wrap(cast<DIModuleAttr>(unwrap(diModule)).getScope());
+}
diff --git a/mlir/lib/CAPI/IR/BuiltinAttributes.cpp b/mlir/lib/CAPI/IR/BuiltinAttributes.cpp
index b3066ee0c28bdc..726af884668b2d 100644
--- a/mlir/lib/CAPI/IR/BuiltinAttributes.cpp
+++ b/mlir/lib/CAPI/IR/BuiltinAttributes.cpp
@@ -289,6 +289,10 @@ MlirTypeID mlirSymbolRefAttrGetTypeID(void) {
return wrap(SymbolRefAttr::getTypeID());
}
+MlirAttribute mlirDisctinctAttrCreate(MlirAttribute referencedAttr) {
+ return wrap(mlir::DistinctAttr::create(unwrap(referencedAttr)));
+}
+
//===----------------------------------------------------------------------===//
// Flat SymbolRef attribute.
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/CAPI/ir.c b/mlir/test/CAPI/ir.c
index a9850c0a132e75..8e79338c57a22a 100644
--- a/mlir/test/CAPI/ir.c
+++ b/mlir/test/CAPI/ir.c
@@ -1482,6 +1482,10 @@ int printAffineMap(MlirContext ctx) {
// CHECK: (d0, d1, d2) -> (d0)
// CHECK: (d0, d1, d2) -> (d2)
+ // CHECK: distinct[0]<"foo">
+ mlirAttributeDump(mlirDisctinctAttrCreate(
+ mlirStringAttrGet(ctx, mlirStringRefCreateFromCString("foo"))));
+
return 0;
}
diff --git a/mlir/test/CAPI/llvm.c b/mlir/test/CAPI/llvm.c
index 1817988dd67dd6..82e5dd5d1a8019 100644
--- a/mlir/test/CAPI/llvm.c
+++ b/mlir/test/CAPI/llvm.c
@@ -10,6 +10,7 @@
// RUN: mlir-capi-llvm-test 2>&1 | FileCheck %s
#include "mlir-c/Dialect/LLVM.h"
+#include "mlir-c/BuiltinAttributes.h"
#include "mlir-c/BuiltinTypes.h"
#include "mlir-c/IR.h"
#include "mlir-c/Support.h"
@@ -77,7 +78,7 @@ static void testTypeCreation(MlirContext ctx) {
// CHECK-LABEL: testStructTypeCreation
static int testStructTypeCreation(MlirContext ctx) {
- fprintf(stderr, "testStructTypeCreation");
+ fprintf(stderr, "testStructTypeCreation\n");
// CHECK: !llvm.struct<()>
mlirTypeDump(mlirLLVMStructTypeLiteralGet(ctx, /*nFieldTypes=*/0,
@@ -225,12 +226,157 @@ static int testStructTypeCreation(MlirContext ctx) {
return 0;
}
+// CHECK-LABEL: testLLVMAttributes
+static void testLLVMAttributes(MlirContext ctx) {
+ fprintf(stderr, "testLLVMAttributes\n");
+
+ // CHECK: #llvm.linkage<internal>
+ mlirAttributeDump(mlirLLVMLinkageAttrGet(ctx, 0x1));
+ // CHECK: #llvm.cconv<ccc>
+ mlirAttributeDump(mlirLLVMCConvAttrGet(ctx, 0x0));
+ // CHECK: #llvm<comdat any>
+ mlirAttributeDump(mlirLLVMComdatAttrGet(ctx, 0x0));
+}
+
+// CHECK-LABEL: testDebugInfoAttributes
+static void testDebugInfoAttributes(MlirContext ctx) {
+ fprintf(stderr, "testDebugInfoAttributes\n");
+
+ MlirAttribute foo =
+ mlirStringAttrGet(ctx, mlirStringRefCreateFromCString("foo"));
+ MlirAttribute bar =
+ mlirStringAttrGet(ctx, mlirStringRefCreateFromCString("bar"));
+ MlirAttribute id = mlirDisctinctAttrCreate(foo);
+
+ // CHECK: #llvm.di_null_type
+ mlirAttributeDump(mlirLLVMDINullTypeAttrGet(ctx));
+ // CHECK: #llvm.di_basic_type<tag = DW_TAG_null, name = "foo", sizeInBits =
+ // 64, encoding = DW_ATE_signed>
+ MlirAttribute di_type = mlirLLVMDIBasicTypeAttrGet(ctx, 0, foo, 64, 0x5);
+ mlirAttributeDump(di_type);
+
+ MlirAttribute file = mlirLLVMDIFileAttrGet(ctx, foo, bar);
+
+ // CHECK: #llvm.di_file<"foo" in "bar">
+ mlirAttributeDump(file);
+
+ MlirAttribute compile_unit =
+ mlirLLVMDICompileUnitAttrGet(ctx, id, 0x1C, file, foo, false, 0x1);
+
+ // CHECK: #llvm.di_compile_unit<id = distinct[0]<"foo">, sourceLanguage =
+ // DW_LANG_Rust, file = <"foo" in "bar">, producer = "foo", isOptimized =
+ // false, emissionKind = Full>
+ mlirAttributeDump(compile_unit);
+
+ MlirAttribute di_module = mlirLLVMDIModuleAttrGet(
+ ctx, file, compile_unit, foo,
+ mlirStringAttrGet(ctx, mlirStringRefCreateFromCString("")), bar, foo, 1,
+ 0);
+ // CHECK: #llvm.di_module<file = <"foo" in "bar">, scope =
+ // #llvm.di_compile_unit<id = distinct[0]<"foo">, sourceLanguage =
+ // DW_LANG_Rust, file = <"foo" in "bar">, producer = "foo", isOptimized =
+ // false, emissionKind = Full>, name = "foo", configMacros = "", includePath =
+ // "bar", apinotes = "foo", line = 1>
+ mlirAttributeDump(di_module);
+
+ // CHECK: #llvm.di_compile_unit<id = distinct[0]<"foo">, sourceLanguage =
+ // DW_LANG_Rust, file = <"foo" in "bar">, producer = "foo", isOptimized =
+ // false, emissionKind = Full>
+ mlirAttributeDump(mlirLLVMDIModuleAttrGetScope(di_module));
+
+ // CHECK: 1 : i32
+ mlirAttributeDump(mlirLLVMDIFlagsAttrGet(ctx, 0x1));
+
+ // CHECK: #llvm.di_lexical_block<scope = #llvm.di_compile_unit<id =
+ // distinct[0]<"foo">, sourceLanguage = DW_LANG_Rust, file = <"foo" in "bar">,
+ // producer = "foo", isOptimized = false, emissionKind = Full>, file = <"foo"
+ // in "bar">, line = 1, column = 2>
+ mlirAttributeDump(
+ mlirLLVMDILexicalBlockAttrGet(ctx, compile_unit, file, 1, 2));
+
+ // CHECK: #llvm.di_lexical_block_file<scope = #llvm.di_compile_unit<id =
+ // distinct[0]<"foo">, sourceLanguage = DW_LANG_Rust, file = <"foo" in "bar">,
+ // producer = "foo", isOptimized = false, emissionKind = Full>, file = <"foo"
+ // in "bar">, discriminator = 3>
+ mlirAttributeDump(
+ mlirLLVMDILexicalBlockFileAttrGet(ctx, compile_unit, file, 3));
+
+ // CHECK: #llvm.di_local_variable<scope = #llvm.di_compile_unit<id =
+ // distinct[0]<"foo">, sourceLanguage = DW_LANG_Rust, file = <"foo" in "bar">,
+ // producer = "foo", isOptimized = false, emissionKind = Full>, name = "foo",
+ // file = <"foo" in "bar">, line = 1, alignInBits = 8, type =
+ // #llvm.di_basic_type<tag = DW_TAG_null, name = "foo", sizeInBits = 64,
+ // encoding = DW_ATE_signed>>
+ mlirAttributeDump(mlirLLVMDILocalVariableAttrGet(ctx, compile_unit, foo, file,
+ 1, 0, 8, di_type));
+ // CHECK: #llvm.di_derived_type<tag = DW_TAG_null, name = "bar", baseType =
+ // #llvm.di_basic_type<tag = DW_TAG_null, name = "foo", sizeInBits = 64,
+ // encoding = DW_ATE_signed>, sizeInBits = 64, alignInBits = 8>
+ mlirAttributeDump(
+ mlirLLVMDIDerivedTypeAttrGet(ctx, 0, bar, di_type, 64, 8, 0));
+
+ // CHECK: #llvm.di_composite_type<tag = DW_TAG_null, name = "foo", file =
+ // <"foo" in "bar">, line = 1, scope = #llvm.di_compile_unit<id =
+ // distinct[0]<"foo">, sourceLanguage = DW_LANG_Rust, file = <"foo" in "bar">,
+ // producer = "foo", isOptimized = false, emissionKind = Full>, baseType =
+ // #llvm.di_basic_type<tag = DW_TAG_null, name = "foo", sizeInBits = 64,
+ // encoding = DW_ATE_signed>, sizeInBits = 64, alignInBits = 8, elements =
+ // #llvm.di_basic_type<tag = DW_TAG_null, name = "foo", sizeInBits = 64,
+ // encoding = DW_ATE_signed>>
+ mlirAttributeDump(mlirLLVMDICompositeTypeAttrGet(
+ ctx, 0, foo, file, 1, compile_unit, di_type, 0, 64, 8, 1, &di_type));
+
+ MlirAttribute subroutine_type =
+ mlirLLVMDISubroutineTypeAttrGet(ctx, 0x0, 1, &di_type);
+
+ // CHECK: #llvm.di_subroutine_type<types = #llvm.di_basic_type<tag =
+ // DW_TAG_null, name = "foo", sizeInBits = 64, encoding = DW_ATE_signed>>
+ mlirAttributeDump(subroutine_type);
+
+ MlirAttribute di_subprogram =
+ mlirLLVMDISubprogramAttrGet(ctx, id, compile_unit, compile_unit, foo, bar,
+ file, 1, 2, 0, subroutine_type);
+ // CHECK: #llvm.di_subprogram<id = distinct[0]<"foo">, compileUnit = <id =
+ // distinct[0]<"foo">, sourceLanguage = DW_LANG_Rust, file = <"foo" in "bar">,
+ // producer = "foo", isOptimized = false, emissionKind = Full>, scope =
+ // #llvm.di_compile_unit<id = distinct[0]<"foo">, sourceLanguage =
+ // DW_LANG_Rust, file = <"foo" in "bar">, producer = "foo", isOptimized =
+ // false, emissionKind = Full>, name = "foo", linkageName = "bar", file =
+ // <"foo" in "bar">, line = 1, scopeLine = 2, subprogramFlags = , type =
+ // <types = #llvm.di_basic_type<tag = DW_TAG_null, name = "foo", sizeInBits =
+ // 64, encoding = DW_ATE_signed>>>
+ mlirAttributeDump(di_subprogram);
+
+ // CHECK: #llvm.di_compile_unit<id = distinct[0]<"foo">, sourceLanguage =
+ // DW_LANG_Rust, file = <"foo" in "bar">, producer = "foo", isOptimized =
+ // false, emissionKind = Full>
+ mlirAttributeDump(mlirLLVMDISubprogramAttrGetScope(di_subprogram));
+
+ // CHECK: #llvm.di_file<"foo" in "bar">
+ mlirAttributeDump(mlirLLVMDISubprogramAttrGetFile(di_subprogram));
+
+ // CHECK: #llvm.di_subroutine_type<types = #llvm.di_basic_type<tag =
+ // DW_TAG_null, name = "foo", sizeInBits = 64, encoding = DW_ATE_signed>>
+ mlirAttributeDump(mlirLLVMDISubprogramAttrGetType(di_subprogram));
+
+ MlirAttribute expression_elem =
+ mlirLLVMDIExpressionElemAttrGet(ctx, 1, 1, &(uint64_t){1});
+
+ // CHECK: #llvm<di_expression_elem(1)>
+ mlirAttributeDump(expression_elem);
+
+ // CHECK: #llvm.di_expression<[(1)]>
+ mlirAttributeDump(mlirLLVMDIExpressionAttrGet(ctx, 1, &expression_elem));
+}
+
int main(void) {
MlirContext ctx = mlirContextCreate();
mlirDialectHandleRegisterDialect(mlirGetDialectHandle__llvm__(), ctx);
mlirContextGetOrLoadDialect(ctx, mlirStringRefCreateFromCString("llvm"));
testTypeCreation(ctx);
int result = testStructTypeCreation(ctx);
+ testLLVMAttributes(ctx);
+ testDebugInfoAttributes(ctx);
mlirContextDestroy(ctx);
if (result)
fprintf(stderr, "FAILED: code %d", result);
>From d7d582409ada14d762ecf39481bfd407c43fe648 Mon Sep 17 00:00:00 2001
From: Edgar Luque <git at edgarluque.com>
Date: Wed, 6 Mar 2024 12:01:25 +0100
Subject: [PATCH 2/2] address some comments
---
mlir/lib/CAPI/Dialect/LLVM.cpp | 40 +++++++++++-----------------------
1 file changed, 13 insertions(+), 27 deletions(-)
diff --git a/mlir/lib/CAPI/Dialect/LLVM.cpp b/mlir/lib/CAPI/Dialect/LLVM.cpp
index d540b1a81ee0e4..3ffbbdf1fe262a 100644
--- a/mlir/lib/CAPI/Dialect/LLVM.cpp
+++ b/mlir/lib/CAPI/Dialect/LLVM.cpp
@@ -13,12 +13,9 @@
#include "mlir/CAPI/Wrap.h"
#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
-#include "mlir/Dialect/LLVMIR/LLVMOpsAttrDefs.h.inc"
#include "mlir/Dialect/LLVMIR/LLVMTypes.h"
-#include "mlir/IR/Attributes.h"
-#include "mlir/IR/BuiltinAttributes.h"
-#include "mlir/Support/LLVM.h"
-#include <stdint.h>
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/SmallVectorExtras.h"
using namespace mlir;
using namespace mlir::LLVM;
@@ -124,7 +121,7 @@ MlirAttribute mlirLLVMDIExpressionElemAttrGet(MlirContext ctx,
unsigned int opcode,
intptr_t nArguments,
uint64_t const *arguments) {
- auto list = mlir::ArrayRef<uint64_t>(arguments, nArguments);
+ auto list = ArrayRef<uint64_t>(arguments, nArguments);
return wrap(DIExpressionElemAttr::get(unwrap(ctx), opcode, list));
}
@@ -132,17 +129,12 @@ MlirAttribute mlirLLVMDIExpressionAttrGet(MlirContext ctx, intptr_t nOperations,
MlirAttribute const *operations) {
SmallVector<Attribute, 2> attrStorage;
attrStorage.reserve(nOperations);
- mlir::ArrayRef<Attribute> tempList =
- unwrapList(nOperations, operations, attrStorage);
- SmallVector<DIExpressionElemAttr, 2> diExpressionElemStorage;
- diExpressionElemStorage.reserve(tempList.size());
-
- for (auto attr : tempList) {
- diExpressionElemStorage.push_back(attr.cast<DIExpressionElemAttr>());
- }
-
- return wrap(DIExpressionAttr::get(unwrap(ctx), diExpressionElemStorage));
+ return wrap(DIExpressionAttr::get(
+ unwrap(ctx),
+ llvm::map_to_vector(
+ unwrapList(nOperations, operations, attrStorage),
+ [](Attribute a) { return a.cast<DIExpressionElemAttr>(); })));
}
MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx) {
@@ -165,7 +157,7 @@ MlirAttribute mlirLLVMDICompositeTypeAttrGet(
SmallVector<Attribute, 2> elementsStorage;
elementsStorage.reserve(nElements);
- mlir::ArrayRef<Attribute> tempList =
+ ArrayRef<Attribute> tempList =
unwrapList(nElements, elements, elementsStorage);
SmallVector<DINodeAttr, 2> diNodesStorage;
@@ -269,17 +261,11 @@ MlirAttribute mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx,
MlirAttribute const *types) {
SmallVector<Attribute, 2> attrStorage;
attrStorage.reserve(nTypes);
- mlir::ArrayRef<Attribute> tempList = unwrapList(nTypes, types, attrStorage);
-
- SmallVector<DITypeAttr, 2> diTypesStorage;
- diTypesStorage.reserve(tempList.size());
-
- for (auto attr : tempList) {
- diTypesStorage.push_back(attr.cast<DITypeAttr>());
- }
- return wrap(DISubroutineTypeAttr::get(unwrap(ctx), callingConvention,
- diTypesStorage));
+ return wrap(DISubroutineTypeAttr::get(
+ unwrap(ctx), callingConvention,
+ llvm::map_to_vector(unwrapList(nTypes, types, attrStorage),
+ [](Attribute a) { return a.cast<DITypeAttr>(); })));
}
MlirAttribute mlirLLVMDISubprogramAttrGet(
More information about the Mlir-commits
mailing list