10
10
#define LLVMIR_ATTRDEFS
11
11
12
12
include "mlir/Dialect/LLVMIR/LLVMDialect.td"
13
+ include "mlir/Dialect/LLVMIR/LLVMInterfaces.td"
13
14
include "mlir/IR/AttrTypeBase.td"
14
15
include "mlir/IR/CommonAttrConstraints.td"
15
16
@@ -238,41 +239,43 @@ def LoopAnnotationAttr : LLVM_Attr<"LoopAnnotation", "loop_annotation"> {
238
239
//===----------------------------------------------------------------------===//
239
240
240
241
class LLVM_DIParameter<string summary, string default, string parseName,
241
- string printName = parseName>
242
+ string errorCase, string printName = parseName>
242
243
: AttrOrTypeParameter<"unsigned", "debug info " # summary> {
243
244
let parser = [{ [&]() -> FailureOr<unsigned> {
244
245
SMLoc tagLoc = $_parser.getCurrentLocation();
245
246
StringRef name;
246
247
if ($_parser.parseKeyword(&name))
247
248
return failure();
248
249
249
- if (unsigned tag = llvm::dwarf::get}] # parseName # [{(name))
250
- return tag;
251
- return $_parser.emitError(tagLoc)
252
- << "invalid debug info }] # summary # [{ name: " << name;
250
+ unsigned tag = llvm::dwarf::get}] # parseName # [{(name);
251
+ if (tag == }] # errorCase # [{)
252
+ return $_parser.emitError(tagLoc)
253
+ << "invalid debug info }] # summary # [{ name: " << name;
254
+ return tag;
253
255
}() }];
254
256
let printer = "$_printer << llvm::dwarf::" # printName # "String($_self)";
255
257
let defaultValue = default;
256
258
}
257
259
258
260
def LLVM_DICallingConventionParameter : LLVM_DIParameter<
259
- "calling convention", /*default=*/"0", "CallingConvention", "Convention"
261
+ "calling convention", /*default=*/"0", "CallingConvention", /*errorCase=*/"0",
262
+ "Convention"
260
263
>;
261
264
262
265
def LLVM_DIEncodingParameter : LLVM_DIParameter<
263
- "encoding", /*default=*/"0", "AttributeEncoding"
266
+ "encoding", /*default=*/"0", "AttributeEncoding", /*errorCase=*/"0"
264
267
>;
265
268
266
269
def LLVM_DILanguageParameter : LLVM_DIParameter<
267
- "language", /*default=*/"", "Language"
270
+ "language", /*default=*/"", "Language", /*errorCase=*/"0"
268
271
>;
269
272
270
273
def LLVM_DITagParameter : LLVM_DIParameter<
271
- "tag", /*default=*/"", "Tag"
274
+ "tag", /*default=*/"", "Tag", /*errorCase=*/"llvm::dwarf::DW_TAG_invalid"
272
275
>;
273
276
274
277
def LLVM_DIOperationEncodingParameter : LLVM_DIParameter<
275
- "operation encoding", /*default=*/"", "OperationEncoding"
278
+ "operation encoding", /*default=*/"", "OperationEncoding", /*errorCase=*/"0"
276
279
>;
277
280
278
281
//===----------------------------------------------------------------------===//
@@ -357,9 +360,11 @@ def LLVM_DICompileUnitAttr : LLVM_Attr<"DICompileUnit", "di_compile_unit",
357
360
//===----------------------------------------------------------------------===//
358
361
359
362
def LLVM_DICompositeTypeAttr : LLVM_Attr<"DICompositeType", "di_composite_type",
360
- /*traits=*/[], "DITypeAttr"> {
363
+ [LLVM_DIRecursiveTypeAttrInterface],
364
+ "DITypeAttr"> {
361
365
let parameters = (ins
362
366
LLVM_DITagParameter:$tag,
367
+ OptionalParameter<"DistinctAttr">:$recId,
363
368
OptionalParameter<"StringAttr">:$name,
364
369
OptionalParameter<"DIFileAttr">:$file,
365
370
OptionalParameter<"uint32_t">:$line,
@@ -371,6 +376,21 @@ def LLVM_DICompositeTypeAttr : LLVM_Attr<"DICompositeType", "di_composite_type",
371
376
OptionalArrayRefParameter<"DINodeAttr">:$elements
372
377
);
373
378
let assemblyFormat = "`<` struct(params) `>`";
379
+ let extraClassDeclaration = [{
380
+ /// Requirements of DIRecursiveTypeAttrInterface.
381
+ /// @{
382
+
383
+ /// Get whether this attr describes a recursive self reference.
384
+ bool isRecSelf() { return getTag() == 0; }
385
+
386
+ /// Get a copy of this type attr but with the recursive ID set to `recId`.
387
+ DIRecursiveTypeAttrInterface withRecId(DistinctAttr recId);
388
+
389
+ /// Build a rec-self instance using the provided `recId`.
390
+ static DIRecursiveTypeAttrInterface getRecSelf(DistinctAttr recId);
391
+
392
+ /// @}
393
+ }];
374
394
}
375
395
376
396
//===----------------------------------------------------------------------===//
0 commit comments