Skip to content

Commit d2814ba

Browse files
committed
[mlir] Add LLVM attributes to the c api
1 parent 762f762 commit d2814ba

File tree

6 files changed

+345
-1
lines changed

6 files changed

+345
-1
lines changed

mlir/include/mlir-c/BuiltinAttributes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,10 @@ mlirSymbolRefAttrGetNestedReference(MlirAttribute attr, intptr_t pos);
266266
/// Returns the typeID of an SymbolRef attribute.
267267
MLIR_CAPI_EXPORTED MlirTypeID mlirSymbolRefAttrGetTypeID(void);
268268

269+
/// Creates a DisctinctAttr with the referenced attribute.
270+
MLIR_CAPI_EXPORTED MlirAttribute
271+
mlirDisctinctAttrCreate(MlirAttribute referencedAttr);
272+
269273
//===----------------------------------------------------------------------===//
270274
// Flat SymbolRef attribute.
271275
//===----------------------------------------------------------------------===//

mlir/include/mlir-c/Dialect/LLVM.h

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,98 @@ MLIR_CAPI_EXPORTED MlirLogicalResult
9898
mlirLLVMStructTypeSetBody(MlirType structType, intptr_t nFieldTypes,
9999
MlirType const *fieldTypes, bool isPacked);
100100

101+
/// Creates a LLVM CConv attribute.
102+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMCConvAttrGet(MlirContext ctx,
103+
uint64_t cconv);
104+
105+
/// Creates a LLVM Comdat attribute.
106+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMComdatAttrGet(MlirContext ctx,
107+
uint64_t comdat);
108+
109+
/// Creates a LLVM Linkage attribute.
110+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMLinkageAttrGet(MlirContext ctx,
111+
uint64_t linkage);
112+
113+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx);
114+
115+
/// Creates a LLVM DIExpression attribute.
116+
/*
117+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIExpressionAttrGet(
118+
MlirContext ctx, intptr_t nOperations, MlirAttribute const *operations);
119+
*/
120+
121+
/// Creates a LLVM DIBasicType attribute.
122+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIBasicTypeAttrGet(
123+
MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
124+
unsigned int encoding);
125+
126+
/// Creates a LLVM DICompositeType attribute.
127+
/* fails to compile with: error: no viable conversion from 'mlir::Attribute' to
128+
'ValueParamT' (aka 'mlir::LLVM::DINodeAttr') MLIR_CAPI_EXPORTED MlirAttribute
129+
mlirLLVMDICompositeTypeAttrGet( MlirContext ctx, unsigned int tag, MlirAttribute
130+
name, MlirAttribute file, uint32_t line, MlirAttribute scope, MlirAttribute
131+
baseType, int64_t flags, uint64_t sizeInBits, uint64_t alignInBits, intptr_t
132+
nElements, MlirAttribute const *elements);
133+
*/
134+
135+
/// Creates a LLVM DIDerivedType attribute.
136+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIDerivedTypeAttrGet(
137+
MlirContext ctx, unsigned int tag, MlirAttribute name,
138+
MlirAttribute baseType, uint64_t sizeInBits, uint32_t alignInBits,
139+
uint64_t offsetInBits);
140+
141+
/// Creates a LLVM DIFileAttr attribute.
142+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIFileAttrGet(MlirContext ctx,
143+
MlirAttribute name,
144+
MlirAttribute directory);
145+
146+
/// Creates a LLVM DICompileUnit attribute.
147+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompileUnitAttrGet(
148+
MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage,
149+
MlirAttribute file, MlirAttribute producer, bool isOptimized,
150+
uint64_t emissionKind);
151+
152+
/// Creates a LLVM DIFlags attribute.
153+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIFlagsAttrGet(MlirContext ctx,
154+
uint64_t value);
155+
156+
/// Creates a LLVM DILexicalBlock attribute.
157+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILexicalBlockAttrGet(
158+
MlirContext ctx, MlirAttribute scope, MlirAttribute file, unsigned int line,
159+
unsigned int column);
160+
161+
/// Creates a LLVM DILexicalBlockFile attribute.
162+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILexicalBlockFileAttrGet(
163+
MlirContext ctx, MlirAttribute scope, MlirAttribute file,
164+
unsigned int discriminator);
165+
166+
/// Creates a LLVM DILocalVariableAttr attribute.
167+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILocalVariableAttrGet(
168+
MlirContext ctx, MlirAttribute scope, MlirAttribute name,
169+
MlirAttribute diFile, unsigned int line, unsigned int arg,
170+
unsigned int alignInBits, MlirAttribute diType);
171+
172+
/// Creates a LLVM DISubprogramAttr attribute.
173+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDISubprogramAttrGet(
174+
MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
175+
MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
176+
MlirAttribute file, unsigned int line, unsigned int scopeLine,
177+
uint64_t subprogramFlags, MlirAttribute type);
178+
179+
/// Creates a LLVM DISubroutineTypeAttr attribute.
180+
/* fails to compile with error: no viable conversion from 'mlir::Attribute' to
181+
'ValueParamT' (aka 'mlir::LLVM::DITypeAttr') MLIR_CAPI_EXPORTED MlirAttribute
182+
mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx, unsigned int callingConvention,
183+
intptr_t nTypes,
184+
MlirAttribute const *types);
185+
*/
186+
187+
/// Creates a LLVM DIModuleAttr attribute.
188+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIModuleAttrGet(
189+
MlirContext ctx, MlirAttribute file, MlirAttribute scope,
190+
MlirAttribute name, MlirAttribute configMacros, MlirAttribute includePath,
191+
MlirAttribute apinotes, unsigned int line, bool isDecl);
192+
101193
#ifdef __cplusplus
102194
}
103195
#endif

mlir/lib/CAPI/Dialect/LLVM.cpp

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,17 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "mlir-c/Dialect/LLVM.h"
10+
#include "mlir-c/IR.h"
11+
#include "mlir-c/Support.h"
1012
#include "mlir/CAPI/Registration.h"
13+
#include "mlir/CAPI/Wrap.h"
14+
#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
1115
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
16+
#include "mlir/Dialect/LLVMIR/LLVMOpsAttrDefs.h.inc"
1217
#include "mlir/Dialect/LLVMIR/LLVMTypes.h"
18+
#include "mlir/IR/Attributes.h"
19+
#include "mlir/IR/BuiltinAttributes.h"
20+
#include <stdint.h>
1321

1422
using namespace mlir;
1523
using namespace mlir::LLVM;
@@ -110,3 +118,158 @@ MlirLogicalResult mlirLLVMStructTypeSetBody(MlirType structType,
110118
cast<LLVM::LLVMStructType>(unwrap(structType))
111119
.setBody(unwrapList(nFieldTypes, fieldTypes, fields), isPacked));
112120
}
121+
122+
/* fails to compile with: error: no viable conversion from 'mlir::Attribute' to
123+
'ValueParamT' (aka 'mlir::LLVM::DIExpressionElemAttr') MlirAttribute
124+
mlirLLVMDIExpressionAttrGet(MlirContext ctx, intptr_t nOperations, MlirAttribute
125+
const *operations) { SmallVector<DIExpressionElemAttr, 2> valueStorage; return
126+
wrap(DIExpressionAttr::get( unwrap(ctx), unwrapList(nOperations, operations,
127+
valueStorage)));
128+
}
129+
*/
130+
131+
MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx) {
132+
return wrap(DINullTypeAttr::get(unwrap(ctx)));
133+
}
134+
135+
MlirAttribute mlirLLVMDIBasicTypeAttrGet(MlirContext ctx, unsigned int tag,
136+
MlirAttribute name,
137+
uint64_t sizeInBits,
138+
unsigned int encoding) {
139+
return wrap(DIBasicTypeAttr::get(
140+
unwrap(ctx), tag, cast<StringAttr>(unwrap(name)), sizeInBits, encoding));
141+
}
142+
143+
/* fails to compile with: error: no viable conversion from 'mlir::Attribute' to
144+
'ValueParamT' (aka 'mlir::LLVM::DINodeAttr') MlirAttribute
145+
mlirLLVMDICompositeTypeAttrGet( MlirContext ctx, unsigned int tag, MlirAttribute
146+
name, MlirAttribute file, uint32_t line, MlirAttribute scope, MlirAttribute
147+
baseType, int64_t flags, uint64_t sizeInBits, uint64_t alignInBits, intptr_t
148+
nElements, MlirAttribute const *elements) {
149+
SmallVector<DINodeAttr, 2>
150+
elementsStorage; elementsStorage.reserve(nElements); mlir::ArrayRef<DINodeAttr>
151+
list = unwrapList(nElements, elements, elementsStorage); return
152+
wrap(DICompositeTypeAttr::get( unwrap(ctx), tag, cast<StringAttr>(unwrap(name)),
153+
cast<DIFileAttr>(unwrap(file)), line, cast<DIScopeAttr>(unwrap(scope)),
154+
cast<DITypeAttr>(unwrap(baseType)), DIFlags(flags), sizeInBits,
155+
alignInBits, list));
156+
}
157+
*/
158+
159+
MlirAttribute mlirLLVMDIDerivedTypeAttrGet(MlirContext ctx, unsigned int tag,
160+
MlirAttribute name,
161+
MlirAttribute baseType,
162+
uint64_t sizeInBits,
163+
uint32_t alignInBits,
164+
uint64_t offsetInBits) {
165+
return wrap(DIDerivedTypeAttr::get(unwrap(ctx), tag,
166+
cast<StringAttr>(unwrap(name)),
167+
cast<DITypeAttr>(unwrap(baseType)),
168+
sizeInBits, alignInBits, offsetInBits));
169+
}
170+
171+
MlirAttribute mlirLLVMCConvAttrGet(MlirContext ctx, uint64_t cconv) {
172+
return wrap(CConvAttr::get(unwrap(ctx), CConv(cconv)));
173+
}
174+
175+
MlirAttribute mlirLLVMComdatAttrGet(MlirContext ctx, uint64_t comdat) {
176+
return wrap(ComdatAttr::get(unwrap(ctx), comdat::Comdat(comdat)));
177+
}
178+
179+
MlirAttribute mlirLLVMLinkageAttrGet(MlirContext ctx, uint64_t linkage) {
180+
return wrap(LinkageAttr::get(unwrap(ctx), linkage::Linkage(linkage)));
181+
}
182+
183+
MlirAttribute mlirLLVMDIFileAttrGet(MlirContext ctx, MlirAttribute name,
184+
MlirAttribute directory) {
185+
return wrap(DIFileAttr::get(unwrap(ctx), cast<StringAttr>(unwrap(name)),
186+
cast<StringAttr>(unwrap(directory))));
187+
}
188+
189+
MlirAttribute mlirLLVMDICompileUnitAttrGet(MlirContext ctx, MlirAttribute id,
190+
unsigned int sourceLanguage,
191+
MlirAttribute file,
192+
MlirAttribute producer,
193+
bool isOptimized,
194+
uint64_t emissionKind) {
195+
return wrap(DICompileUnitAttr::get(
196+
unwrap(ctx), cast<DistinctAttr>(unwrap(id)), sourceLanguage,
197+
cast<DIFileAttr>(unwrap(file)), cast<StringAttr>(unwrap(producer)),
198+
isOptimized, DIEmissionKind(emissionKind)));
199+
}
200+
201+
MlirAttribute mlirLLVMDIFlagsAttrGet(MlirContext ctx, uint64_t value) {
202+
return wrap(DIFlagsAttr::get(unwrap(ctx), DIFlags(value)));
203+
}
204+
205+
MlirAttribute mlirLLVMDILexicalBlockAttrGet(MlirContext ctx,
206+
MlirAttribute scope,
207+
MlirAttribute file,
208+
unsigned int line,
209+
unsigned int column) {
210+
return wrap(
211+
DILexicalBlockAttr::get(unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
212+
cast<DIFileAttr>(unwrap(file)), line, column));
213+
}
214+
215+
MlirAttribute mlirLLVMDILexicalBlockFileAttrGet(MlirContext ctx,
216+
MlirAttribute scope,
217+
MlirAttribute file,
218+
unsigned int discriminator) {
219+
return wrap(DILexicalBlockFileAttr::get(
220+
unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
221+
cast<DIFileAttr>(unwrap(file)), discriminator));
222+
}
223+
224+
MlirAttribute
225+
mlirLLVMDILocalVariableAttrGet(MlirContext ctx, MlirAttribute scope,
226+
MlirAttribute name, MlirAttribute diFile,
227+
unsigned int line, unsigned int arg,
228+
unsigned int alignInBits, MlirAttribute diType) {
229+
return wrap(DILocalVariableAttr::get(
230+
unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
231+
cast<StringAttr>(unwrap(name)), cast<DIFileAttr>(unwrap(diFile)), line,
232+
arg, alignInBits, cast<DITypeAttr>(unwrap(diType))));
233+
}
234+
235+
// fails to compile with error: no viable conversion from 'mlir::Attribute' to
236+
// 'ValueParamT' (aka 'mlir::LLVM::DITypeAttr')
237+
/*
238+
MlirAttribute mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx,
239+
unsigned int callingConvention,
240+
intptr_t nTypes,
241+
MlirAttribute const *types) {
242+
SmallVector<DITypeAttr, 2> elementsStorage;
243+
elementsStorage.reserve(nTypes);
244+
mlir::ArrayRef<DITypeAttr> list = unwrapList(nTypes, types, elementsStorage);
245+
return wrap(DISubroutineTypeAttr::get(unwrap(ctx), callingConvention, list));
246+
}
247+
*/
248+
249+
MlirAttribute mlirLLVMDISubprogramAttrGet(
250+
MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
251+
MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
252+
MlirAttribute file, unsigned int line, unsigned int scopeLine,
253+
uint64_t subprogramFlags, MlirAttribute type) {
254+
return wrap(DISubprogramAttr::get(
255+
unwrap(ctx), cast<DistinctAttr>(unwrap(id)),
256+
cast<DICompileUnitAttr>(unwrap(compileUnit)),
257+
cast<DIScopeAttr>(unwrap(scope)), cast<StringAttr>(unwrap(name)),
258+
cast<StringAttr>(unwrap(linkageName)), cast<DIFileAttr>(unwrap(file)),
259+
line, scopeLine, DISubprogramFlags(subprogramFlags),
260+
cast<DISubroutineTypeAttr>(unwrap(type))));
261+
}
262+
263+
MlirAttribute mlirLLVMDIModuleAttrGet(MlirContext ctx, MlirAttribute file,
264+
MlirAttribute scope, MlirAttribute name,
265+
MlirAttribute configMacros,
266+
MlirAttribute includePath,
267+
MlirAttribute apinotes, unsigned int line,
268+
bool isDecl) {
269+
return wrap(DIModuleAttr::get(
270+
unwrap(ctx), cast<DIFileAttr>(unwrap(file)),
271+
cast<DIScopeAttr>(unwrap(scope)), cast<StringAttr>(unwrap(name)),
272+
cast<StringAttr>(unwrap(configMacros)),
273+
cast<StringAttr>(unwrap(includePath)), cast<StringAttr>(unwrap(apinotes)),
274+
line, isDecl));
275+
}

mlir/lib/CAPI/IR/BuiltinAttributes.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,10 @@ MlirTypeID mlirSymbolRefAttrGetTypeID(void) {
289289
return wrap(SymbolRefAttr::getTypeID());
290290
}
291291

292+
MlirAttribute mlirDisctinctAttrCreate(MlirAttribute referencedAttr) {
293+
return wrap(mlir::DistinctAttr::create(unwrap(referencedAttr)));
294+
}
295+
292296
//===----------------------------------------------------------------------===//
293297
// Flat SymbolRef attribute.
294298
//===----------------------------------------------------------------------===//

mlir/test/CAPI/ir.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,6 +1482,10 @@ int printAffineMap(MlirContext ctx) {
14821482
// CHECK: (d0, d1, d2) -> (d0)
14831483
// CHECK: (d0, d1, d2) -> (d2)
14841484

1485+
// CHECK: distinct[0]<"foo">
1486+
mlirAttributeDump(mlirDisctinctAttrCreate(
1487+
mlirStringAttrGet(ctx, mlirStringRefCreateFromCString("foo"))));
1488+
14851489
return 0;
14861490
}
14871491

0 commit comments

Comments
 (0)