Skip to content

Commit 2865ed1

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

File tree

6 files changed

+511
-1
lines changed

6 files changed

+511
-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: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#define MLIR_C_DIALECT_LLVM_H
1212

1313
#include "mlir-c/IR.h"
14+
#include "mlir-c/Support.h"
1415

1516
#ifdef __cplusplus
1617
extern "C" {
@@ -98,6 +99,129 @@ MLIR_CAPI_EXPORTED MlirLogicalResult
9899
mlirLLVMStructTypeSetBody(MlirType structType, intptr_t nFieldTypes,
99100
MlirType const *fieldTypes, bool isPacked);
100101

102+
/// Creates a LLVM CConv attribute.
103+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMCConvAttrGet(MlirContext ctx,
104+
uint64_t cconv);
105+
106+
/// Creates a LLVM Comdat attribute.
107+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMComdatAttrGet(MlirContext ctx,
108+
uint64_t comdat);
109+
110+
/// Creates a LLVM Linkage attribute.
111+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMLinkageAttrGet(MlirContext ctx,
112+
uint64_t linkage);
113+
114+
/// Creates a LLVM DINullType attribute.
115+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx);
116+
117+
/// Creates a LLVM DIExpressionElem attribute.
118+
MLIR_CAPI_EXPORTED MlirAttribute
119+
mlirLLVMDIExpressionElemAttrGet(MlirContext ctx, unsigned int opcode,
120+
intptr_t nArguments, uint64_t const *arguments);
121+
122+
/// Creates a LLVM DIExpression attribute.
123+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIExpressionAttrGet(
124+
MlirContext ctx, intptr_t nOperations, MlirAttribute const *operations);
125+
126+
/// Creates a LLVM DIBasicType attribute.
127+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIBasicTypeAttrGet(
128+
MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
129+
unsigned int encoding);
130+
131+
/// Creates a LLVM DICompositeType attribute.
132+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompositeTypeAttrGet(
133+
MlirContext ctx, unsigned int tag, MlirAttribute name, MlirAttribute file,
134+
uint32_t line, MlirAttribute scope, MlirAttribute baseType, int64_t flags,
135+
uint64_t sizeInBits, uint64_t alignInBits, intptr_t nElements,
136+
MlirAttribute const *elements);
137+
138+
/// Creates a LLVM DIDerivedType attribute.
139+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIDerivedTypeAttrGet(
140+
MlirContext ctx, unsigned int tag, MlirAttribute name,
141+
MlirAttribute baseType, uint64_t sizeInBits, uint32_t alignInBits,
142+
uint64_t offsetInBits);
143+
144+
/// Gets the base type from a LLVM DIDerivedType attribute.
145+
MLIR_CAPI_EXPORTED MlirAttribute
146+
mlirLLVMDIDerivedTypeAttrGetBaseType(MlirAttribute diDerivedType);
147+
148+
/// Creates a LLVM DIFileAttr attribute.
149+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIFileAttrGet(MlirContext ctx,
150+
MlirAttribute name,
151+
MlirAttribute directory);
152+
153+
/// Creates a LLVM DICompileUnit attribute.
154+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompileUnitAttrGet(
155+
MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage,
156+
MlirAttribute file, MlirAttribute producer, bool isOptimized,
157+
uint64_t emissionKind);
158+
159+
/// Creates a LLVM DIFlags attribute.
160+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIFlagsAttrGet(MlirContext ctx,
161+
uint64_t value);
162+
163+
/// Creates a LLVM DILexicalBlock attribute.
164+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILexicalBlockAttrGet(
165+
MlirContext ctx, MlirAttribute scope, MlirAttribute file, unsigned int line,
166+
unsigned int column);
167+
168+
/// Creates a LLVM DILexicalBlockFile attribute.
169+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILexicalBlockFileAttrGet(
170+
MlirContext ctx, MlirAttribute scope, MlirAttribute file,
171+
unsigned int discriminator);
172+
173+
/// Creates a LLVM DILocalVariableAttr attribute.
174+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILocalVariableAttrGet(
175+
MlirContext ctx, MlirAttribute scope, MlirAttribute name,
176+
MlirAttribute diFile, unsigned int line, unsigned int arg,
177+
unsigned int alignInBits, MlirAttribute diType);
178+
179+
/// Creates a LLVM DISubprogramAttr attribute.
180+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDISubprogramAttrGet(
181+
MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
182+
MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
183+
MlirAttribute file, unsigned int line, unsigned int scopeLine,
184+
uint64_t subprogramFlags, MlirAttribute type);
185+
186+
/// Gets the scope from this DISubprogramAttr.
187+
MLIR_CAPI_EXPORTED MlirAttribute
188+
mlirLLVMDISubprogramAttrGetScope(MlirAttribute diSubprogram);
189+
190+
/// Gets the line from this DISubprogramAttr.
191+
MLIR_CAPI_EXPORTED unsigned int
192+
mlirLLVMDISubprogramAttrGetLine(MlirAttribute diSubprogram);
193+
194+
/// Gets the scope line from this DISubprogram.
195+
MLIR_CAPI_EXPORTED unsigned int
196+
mlirLLVMDISubprogramAttrGetScopeLine(MlirAttribute diSubprogram);
197+
198+
/// Gets the compile unit from this DISubprogram.
199+
MLIR_CAPI_EXPORTED MlirAttribute
200+
mlirLLVMDISubprogramAttrGetCompileUnit(MlirAttribute diSubprogram);
201+
202+
/// Gets the file from this DISubprogramAttr.
203+
MLIR_CAPI_EXPORTED MlirAttribute
204+
mlirLLVMDISubprogramAttrGetFile(MlirAttribute diSubprogram);
205+
206+
/// Gets the type from this DISubprogramAttr.
207+
MLIR_CAPI_EXPORTED MlirAttribute
208+
mlirLLVMDISubprogramAttrGetType(MlirAttribute diSubprogram);
209+
210+
/// Creates a LLVM DISubroutineTypeAttr attribute.
211+
MLIR_CAPI_EXPORTED MlirAttribute
212+
mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx, unsigned int callingConvention,
213+
intptr_t nTypes, MlirAttribute const *types);
214+
215+
/// Creates a LLVM DIModuleAttr attribute.
216+
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIModuleAttrGet(
217+
MlirContext ctx, MlirAttribute file, MlirAttribute scope,
218+
MlirAttribute name, MlirAttribute configMacros, MlirAttribute includePath,
219+
MlirAttribute apinotes, unsigned int line, bool isDecl);
220+
221+
/// Gets the scope of this DIModuleAttr.
222+
MLIR_CAPI_EXPORTED MlirAttribute
223+
mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule);
224+
101225
#ifdef __cplusplus
102226
}
103227
#endif

mlir/lib/CAPI/Dialect/LLVM.cpp

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,18 @@
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 "mlir/Support/LLVM.h"
21+
#include <stdint.h>
1322

1423
using namespace mlir;
1524
using namespace mlir::LLVM;
@@ -110,3 +119,222 @@ MlirLogicalResult mlirLLVMStructTypeSetBody(MlirType structType,
110119
cast<LLVM::LLVMStructType>(unwrap(structType))
111120
.setBody(unwrapList(nFieldTypes, fieldTypes, fields), isPacked));
112121
}
122+
123+
MlirAttribute mlirLLVMDIExpressionElemAttrGet(MlirContext ctx,
124+
unsigned int opcode,
125+
intptr_t nArguments,
126+
uint64_t const *arguments) {
127+
auto list = mlir::ArrayRef<uint64_t>(arguments, nArguments);
128+
return wrap(DIExpressionElemAttr::get(unwrap(ctx), opcode, list));
129+
}
130+
131+
MlirAttribute mlirLLVMDIExpressionAttrGet(MlirContext ctx, intptr_t nOperations,
132+
MlirAttribute const *operations) {
133+
SmallVector<Attribute, 2> attrStorage;
134+
attrStorage.reserve(nOperations);
135+
mlir::ArrayRef<Attribute> tempList =
136+
unwrapList(nOperations, operations, attrStorage);
137+
138+
SmallVector<DIExpressionElemAttr, 2> diExpressionElemStorage;
139+
diExpressionElemStorage.reserve(tempList.size());
140+
141+
for (auto attr : tempList) {
142+
diExpressionElemStorage.push_back(attr.cast<DIExpressionElemAttr>());
143+
}
144+
145+
return wrap(DIExpressionAttr::get(unwrap(ctx), diExpressionElemStorage));
146+
}
147+
148+
MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx) {
149+
return wrap(DINullTypeAttr::get(unwrap(ctx)));
150+
}
151+
152+
MlirAttribute mlirLLVMDIBasicTypeAttrGet(MlirContext ctx, unsigned int tag,
153+
MlirAttribute name,
154+
uint64_t sizeInBits,
155+
unsigned int encoding) {
156+
return wrap(DIBasicTypeAttr::get(
157+
unwrap(ctx), tag, cast<StringAttr>(unwrap(name)), sizeInBits, encoding));
158+
}
159+
160+
MlirAttribute mlirLLVMDICompositeTypeAttrGet(
161+
MlirContext ctx, unsigned int tag, MlirAttribute name, MlirAttribute file,
162+
uint32_t line, MlirAttribute scope, MlirAttribute baseType, int64_t flags,
163+
uint64_t sizeInBits, uint64_t alignInBits, intptr_t nElements,
164+
MlirAttribute const *elements) {
165+
SmallVector<Attribute, 2> elementsStorage;
166+
elementsStorage.reserve(nElements);
167+
168+
mlir::ArrayRef<Attribute> tempList =
169+
unwrapList(nElements, elements, elementsStorage);
170+
171+
SmallVector<DINodeAttr, 2> diNodesStorage;
172+
diNodesStorage.reserve(tempList.size());
173+
174+
for (auto attr : tempList) {
175+
diNodesStorage.push_back(attr.cast<DINodeAttr>());
176+
}
177+
178+
return wrap(DICompositeTypeAttr::get(
179+
unwrap(ctx), tag, cast<StringAttr>(unwrap(name)),
180+
cast<DIFileAttr>(unwrap(file)), line, cast<DIScopeAttr>(unwrap(scope)),
181+
cast<DITypeAttr>(unwrap(baseType)), DIFlags(flags), sizeInBits,
182+
alignInBits, diNodesStorage));
183+
}
184+
185+
MlirAttribute mlirLLVMDIDerivedTypeAttrGet(MlirContext ctx, unsigned int tag,
186+
MlirAttribute name,
187+
MlirAttribute baseType,
188+
uint64_t sizeInBits,
189+
uint32_t alignInBits,
190+
uint64_t offsetInBits) {
191+
return wrap(DIDerivedTypeAttr::get(unwrap(ctx), tag,
192+
cast<StringAttr>(unwrap(name)),
193+
cast<DITypeAttr>(unwrap(baseType)),
194+
sizeInBits, alignInBits, offsetInBits));
195+
}
196+
197+
MlirAttribute
198+
mlirLLVMDIDerivedTypeAttrGetBaseType(MlirAttribute diDerivedType) {
199+
return wrap(cast<DIDerivedTypeAttr>(unwrap(diDerivedType)).getBaseType());
200+
}
201+
202+
MlirAttribute mlirLLVMCConvAttrGet(MlirContext ctx, uint64_t cconv) {
203+
return wrap(CConvAttr::get(unwrap(ctx), CConv(cconv)));
204+
}
205+
206+
MlirAttribute mlirLLVMComdatAttrGet(MlirContext ctx, uint64_t comdat) {
207+
return wrap(ComdatAttr::get(unwrap(ctx), comdat::Comdat(comdat)));
208+
}
209+
210+
MlirAttribute mlirLLVMLinkageAttrGet(MlirContext ctx, uint64_t linkage) {
211+
return wrap(LinkageAttr::get(unwrap(ctx), linkage::Linkage(linkage)));
212+
}
213+
214+
MlirAttribute mlirLLVMDIFileAttrGet(MlirContext ctx, MlirAttribute name,
215+
MlirAttribute directory) {
216+
return wrap(DIFileAttr::get(unwrap(ctx), cast<StringAttr>(unwrap(name)),
217+
cast<StringAttr>(unwrap(directory))));
218+
}
219+
220+
MlirAttribute mlirLLVMDICompileUnitAttrGet(MlirContext ctx, MlirAttribute id,
221+
unsigned int sourceLanguage,
222+
MlirAttribute file,
223+
MlirAttribute producer,
224+
bool isOptimized,
225+
uint64_t emissionKind) {
226+
return wrap(DICompileUnitAttr::get(
227+
unwrap(ctx), cast<DistinctAttr>(unwrap(id)), sourceLanguage,
228+
cast<DIFileAttr>(unwrap(file)), cast<StringAttr>(unwrap(producer)),
229+
isOptimized, DIEmissionKind(emissionKind)));
230+
}
231+
232+
MlirAttribute mlirLLVMDIFlagsAttrGet(MlirContext ctx, uint64_t value) {
233+
return wrap(DIFlagsAttr::get(unwrap(ctx), DIFlags(value)));
234+
}
235+
236+
MlirAttribute mlirLLVMDILexicalBlockAttrGet(MlirContext ctx,
237+
MlirAttribute scope,
238+
MlirAttribute file,
239+
unsigned int line,
240+
unsigned int column) {
241+
return wrap(
242+
DILexicalBlockAttr::get(unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
243+
cast<DIFileAttr>(unwrap(file)), line, column));
244+
}
245+
246+
MlirAttribute mlirLLVMDILexicalBlockFileAttrGet(MlirContext ctx,
247+
MlirAttribute scope,
248+
MlirAttribute file,
249+
unsigned int discriminator) {
250+
return wrap(DILexicalBlockFileAttr::get(
251+
unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
252+
cast<DIFileAttr>(unwrap(file)), discriminator));
253+
}
254+
255+
MlirAttribute
256+
mlirLLVMDILocalVariableAttrGet(MlirContext ctx, MlirAttribute scope,
257+
MlirAttribute name, MlirAttribute diFile,
258+
unsigned int line, unsigned int arg,
259+
unsigned int alignInBits, MlirAttribute diType) {
260+
return wrap(DILocalVariableAttr::get(
261+
unwrap(ctx), cast<DIScopeAttr>(unwrap(scope)),
262+
cast<StringAttr>(unwrap(name)), cast<DIFileAttr>(unwrap(diFile)), line,
263+
arg, alignInBits, cast<DITypeAttr>(unwrap(diType))));
264+
}
265+
266+
MlirAttribute mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx,
267+
unsigned int callingConvention,
268+
intptr_t nTypes,
269+
MlirAttribute const *types) {
270+
SmallVector<Attribute, 2> attrStorage;
271+
attrStorage.reserve(nTypes);
272+
mlir::ArrayRef<Attribute> tempList = unwrapList(nTypes, types, attrStorage);
273+
274+
SmallVector<DITypeAttr, 2> diTypesStorage;
275+
diTypesStorage.reserve(tempList.size());
276+
277+
for (auto attr : tempList) {
278+
diTypesStorage.push_back(attr.cast<DITypeAttr>());
279+
}
280+
281+
return wrap(DISubroutineTypeAttr::get(unwrap(ctx), callingConvention,
282+
diTypesStorage));
283+
}
284+
285+
MlirAttribute mlirLLVMDISubprogramAttrGet(
286+
MlirContext ctx, MlirAttribute id, MlirAttribute compileUnit,
287+
MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName,
288+
MlirAttribute file, unsigned int line, unsigned int scopeLine,
289+
uint64_t subprogramFlags, MlirAttribute type) {
290+
return wrap(DISubprogramAttr::get(
291+
unwrap(ctx), cast<DistinctAttr>(unwrap(id)),
292+
cast<DICompileUnitAttr>(unwrap(compileUnit)),
293+
cast<DIScopeAttr>(unwrap(scope)), cast<StringAttr>(unwrap(name)),
294+
cast<StringAttr>(unwrap(linkageName)), cast<DIFileAttr>(unwrap(file)),
295+
line, scopeLine, DISubprogramFlags(subprogramFlags),
296+
cast<DISubroutineTypeAttr>(unwrap(type))));
297+
}
298+
299+
MlirAttribute mlirLLVMDISubprogramAttrGetScope(MlirAttribute diSubprogram) {
300+
return wrap(cast<DISubprogramAttr>(unwrap(diSubprogram)).getScope());
301+
}
302+
303+
unsigned int mlirLLVMDISubprogramAttrGetLine(MlirAttribute diSubprogram) {
304+
return cast<DISubprogramAttr>(unwrap(diSubprogram)).getLine();
305+
}
306+
307+
unsigned int mlirLLVMDISubprogramAttrGetScopeLine(MlirAttribute diSubprogram) {
308+
return cast<DISubprogramAttr>(unwrap(diSubprogram)).getScopeLine();
309+
}
310+
311+
MlirAttribute
312+
mlirLLVMDISubprogramAttrGetCompileUnit(MlirAttribute diSubprogram) {
313+
return wrap(cast<DISubprogramAttr>(unwrap(diSubprogram)).getCompileUnit());
314+
}
315+
316+
MlirAttribute mlirLLVMDISubprogramAttrGetFile(MlirAttribute diSubprogram) {
317+
return wrap(cast<DISubprogramAttr>(unwrap(diSubprogram)).getFile());
318+
}
319+
320+
MlirAttribute mlirLLVMDISubprogramAttrGetType(MlirAttribute diSubprogram) {
321+
return wrap(cast<DISubprogramAttr>(unwrap(diSubprogram)).getType());
322+
}
323+
324+
MlirAttribute mlirLLVMDIModuleAttrGet(MlirContext ctx, MlirAttribute file,
325+
MlirAttribute scope, MlirAttribute name,
326+
MlirAttribute configMacros,
327+
MlirAttribute includePath,
328+
MlirAttribute apinotes, unsigned int line,
329+
bool isDecl) {
330+
return wrap(DIModuleAttr::get(
331+
unwrap(ctx), cast<DIFileAttr>(unwrap(file)),
332+
cast<DIScopeAttr>(unwrap(scope)), cast<StringAttr>(unwrap(name)),
333+
cast<StringAttr>(unwrap(configMacros)),
334+
cast<StringAttr>(unwrap(includePath)), cast<StringAttr>(unwrap(apinotes)),
335+
line, isDecl));
336+
}
337+
338+
MlirAttribute mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule) {
339+
return wrap(cast<DIModuleAttr>(unwrap(diModule)).getScope());
340+
}

0 commit comments

Comments
 (0)