}
def LLVM_MetadataOp : LLVM_Op<"metadata", [
- NoRegionArguments, SymbolTable, Symbol
+ NoRegionArguments, NoTerminator, SymbolTable, Symbol
]> {
let arguments = (ins
SymbolNameAttr:$sym_name
llvm.metadata @metadata {
llvm.access_group @group1
llvm.access_group @group2
- llvm.return
}
}];
let regions = (region SizedRegion<1>:$body);
- let assemblyFormat = "$sym_name attr-dict-with-keyword $body";
+
+ let skipDefaultBuilders = 1;
+
+ let builders = [
+ OpBuilder<(ins "StringRef":$symName,
+ CArg<"bool", "true">:$createBodyBlock,
+ CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes)>
+ ];
+
+ let hasCustomAssemblyFormat = 1;
let hasRegionVerifier = 1;
}
llvm.alias_scope_domain @domain { description = "Optional domain description"}
llvm.alias_scope @scope1 { domain = @domain }
llvm.alias_scope @scope2 { domain = @domain, description = "Optional scope description" }
- llvm.return
}
}
Example:
llvm.metadata @tbaa {
llvm.tbaa_root @tbaa_root_0 {identity = "Simple C/C++ TBAA"}
- llvm.return
}
See the following link for more details:
members = [@tbaa_type_desc_5, @tbaa_type_desc_5],
offsets = array<i64: 0, 4>
}
- llvm.return
}
See the following link for more details:
base_type = @tbaa_type_desc_6,
offset = 0 : i64
}
- llvm.return
}
See the following link for more details:
// Utilities for LLVM::MetadataOp
//===----------------------------------------------------------------------===//
+void MetadataOp::build(OpBuilder &builder, OperationState &result,
+ StringRef symName, bool createBodyBlock,
+ ArrayRef<NamedAttribute> attributes) {
+ result.addAttribute(getSymNameAttrName(result.name),
+ builder.getStringAttr(symName));
+ result.attributes.append(attributes.begin(), attributes.end());
+ Region *body = result.addRegion();
+ if (createBodyBlock)
+ body->emplaceBlock();
+}
+
+ParseResult MetadataOp::parse(OpAsmParser &parser, OperationState &result) {
+ StringAttr symName;
+ if (parser.parseSymbolName(symName, getSymNameAttrName(result.name),
+ result.attributes) ||
+ parser.parseOptionalAttrDictWithKeyword(result.attributes))
+ return failure();
+
+ Region *bodyRegion = result.addRegion();
+ if (parser.parseRegion(*bodyRegion))
+ return failure();
+
+ // If the region appeared to be empty to parseRegion(),
+ // add the body block explicitly.
+ if (bodyRegion->empty())
+ bodyRegion->emplaceBlock();
+
+ return success();
+}
+
+void MetadataOp::print(OpAsmPrinter &printer) {
+ printer << ' ';
+ printer.printSymbolName(getSymName());
+ printer.printOptionalAttrDictWithKeyword((*this)->getAttrs(),
+ {getSymNameAttrName().getValue()});
+ printer << ' ';
+ printer.printRegion(getBody());
+}
+
namespace {
// A node of the TBAA graph.
struct TBAAGraphNode {
builder.setInsertionPointToEnd(mlirModule.getBody());
tbaaMetadataOp = builder.create<MetadataOp>(loc, getTBAAMetadataOpName());
- builder.createBlock(&tbaaMetadataOp.getBody());
- builder.create<ReturnOp>(loc, Value{});
return tbaaMetadataOp;
}
return true;
};
- // Insert new operations before the terminator.
+ // Insert new operations at the end of the MetadataOp.
OpBuilder::InsertionGuard guard(builder);
- builder.setInsertionPoint(&getTBAAMetadataOp().getBody().back().back());
+ builder.setInsertionPointToEnd(&getTBAAMetadataOp().getBody().back());
StringAttr metadataOpName = SymbolTable::getSymbolName(getTBAAMetadataOp());
// On the first walk, create SymbolRefAttr's and map them
LogicalResult ModuleImport::convertMetadata() {
OpBuilder::InsertionGuard guard(builder);
- builder.setInsertionPoint(mlirModule.getBody(), mlirModule.getBody()->end());
+ builder.setInsertionPointToEnd(mlirModule.getBody());
for (const llvm::Function &func : llvmModule->functions())
for (const llvm::Instruction &inst : llvm::instructions(func)) {
llvm::AAMDNodes nodes = inst.getAAMetadata();
llvm.return
}
llvm.metadata @metadata {
- llvm.return
}
}
llvm.return
}
llvm.metadata @metadata {
- llvm.return
}
}
llvm.return
}
llvm.metadata @metadata {
- llvm.return
}
}
llvm.metadata @metadata {
llvm.alias_scope_domain @domain
llvm.alias_scope @scope { domain = @domain }
- llvm.return
}
}
}
llvm.metadata @metadata {
llvm.access_group @group
- llvm.return
}
}
}
llvm.metadata @metadata {
llvm.access_group @group
- llvm.return
}
}
llvm.metadata @metadata attributes {test_attribute} {
// CHECK: llvm.access_group @group1
llvm.access_group @group1
- llvm.return
}
}
llvm.metadata @__tbaa {
llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"}
llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64}
- llvm.return
}
llvm.func @tbaa(%arg0: !llvm.ptr) {
%0 = llvm.mlir.constant(1 : i8) : i8
}
llvm.metadata @metadata {
llvm.access_group @group1
- llvm.return
}
}
llvm.return
}
llvm.metadata @metadata {
- llvm.return
}
}
module {
llvm.metadata @__tbaa {
llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"}
- llvm.return
}
llvm.func @tbaa() {
module {
llvm.metadata @__tbaa {
llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"}
- llvm.return
}
llvm.func @tbaa() {
llvm.metadata @__tbaa {
// expected-error@below {{expected non-empty "identity"}}
llvm.tbaa_root @tbaa_root_0 {id = ""}
- llvm.return
}
}
"llvm.tbaa_type_desc"() {identity = "omnipotent char", members = [@tbaa_root_0], offsets = array<i64: 0>, sym_name = "tbaa_type_desc_1"} : () -> ()
// expected-error@below {{expected the same number of elements in "members" and "offsets": 2 != 1}}
"llvm.tbaa_type_desc"() {identity = "agg_t", members = [@tbaa_type_desc_1, @tbaa_type_desc_1], offsets = array<i64: 0>, sym_name = "tbaa_type_desc_2"} : () -> ()
- "llvm.return"() : () -> ()
}) {sym_name = "__tbaa"} : () -> ()
}) : () -> ()
llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"}
// expected-error@below {{expected "base_type" to reference a symbol from 'llvm.metadata @__tbaa' defined by either 'llvm.tbaa_root' or 'llvm.tbaa_type_desc' while it references '@tbaa_root_2'}}
llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_2, offset = 0 : i64}
- llvm.return
}
}
llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"}
// expected-error@below {{expected "access_type" to reference a symbol from 'llvm.metadata @__tbaa' defined by either 'llvm.tbaa_root' or 'llvm.tbaa_type_desc' while it references '@tbaa_root_2'}}
llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_2, base_type = @tbaa_root_0, offset = 0 : i64}
- llvm.return
}
}
llvm.tbaa_type_desc @tbaa_type_desc_2 {id = "long long", members = {<@tbaa_type_desc_1, 0>}}
// expected-error@below {{expected "members" to reference a symbol from 'llvm.metadata @__tbaa' defined by either 'llvm.tbaa_root' or 'llvm.tbaa_type_desc' while it references '@tbaa_type_desc_4'}}
llvm.tbaa_type_desc @tbaa_type_desc_3 {id = "agg2_t", members = {<@tbaa_type_desc_2, 0>, <@tbaa_type_desc_4, 8>}}
- llvm.return
}
}
llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64}
// expected-error@below {{expected "access_type" to reference a symbol from 'llvm.metadata @__tbaa' defined by either 'llvm.tbaa_root' or 'llvm.tbaa_type_desc' while it references '@tbaa_tag_1'}}
llvm.tbaa_tag @tbaa_tag_2 {access_type = @tbaa_tag_1, base_type = @tbaa_root_0, offset = 0 : i64}
- llvm.return
}
}
llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"}
llvm.tbaa_type_desc @tbaa_type_desc_1 {id = "omnipotent char", members = {<@tbaa_type_desc_2, 0>}}
llvm.tbaa_type_desc @tbaa_type_desc_2 {id = "long long", members = {<@tbaa_type_desc_1, 0>}}
- llvm.return
}
}
llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64}
llvm.tbaa_root @tbaa_root_2 {id = "Other language TBAA"}
llvm.tbaa_tag @tbaa_tag_3 {access_type = @tbaa_root_2, base_type = @tbaa_root_2, offset = 0 : i64}
- llvm.return
}
llvm.func @tbaa1(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {
%0 = llvm.mlir.constant(1 : i8) : i8
// CHECK: llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64}
// CHECK: llvm.tbaa_root @tbaa_root_2 {id = "Other language TBAA"}
// CHECK: llvm.tbaa_tag @tbaa_tag_3 {access_type = @tbaa_root_2, base_type = @tbaa_root_2, offset = 0 : i64}
-// CHECK: llvm.return
// CHECK: }
// CHECK: llvm.func @tbaa1(%[[VAL_0:.*]]: !llvm.ptr, %[[VAL_1:.*]]: !llvm.ptr) {
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i8) : i8
llvm.tbaa_type_desc @tbaa_type_desc_5 {id = "int", members = {<@tbaa_type_desc_1, 0>}}
llvm.tbaa_type_desc @tbaa_type_desc_6 {id = "agg1_t", members = {<@tbaa_type_desc_5, 0>, <@tbaa_type_desc_5, 4>}}
llvm.tbaa_tag @tbaa_tag_7 {access_type = @tbaa_type_desc_5, base_type = @tbaa_type_desc_6, offset = 0 : i64}
- llvm.return
}
llvm.func @tbaa2(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {
%0 = llvm.mlir.constant(0 : i32) : i32
// CHECK: llvm.tbaa_type_desc @tbaa_type_desc_5 {id = "int", members = {<@tbaa_type_desc_1, 0>}}
// CHECK: llvm.tbaa_type_desc @tbaa_type_desc_6 {id = "agg1_t", members = {<@tbaa_type_desc_5, 0>, <@tbaa_type_desc_5, 4>}}
// CHECK: llvm.tbaa_tag @tbaa_tag_7 {access_type = @tbaa_type_desc_5, base_type = @tbaa_type_desc_6, offset = 0 : i64}
-// CHECK: llvm.return
// CHECK: }
// CHECK: llvm.func @tbaa2(%[[VAL_0:.*]]: !llvm.ptr, %[[VAL_1:.*]]: !llvm.ptr) {
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32
llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64}
llvm.tbaa_root @tbaa_root_2 {id = "Other language TBAA"}
llvm.tbaa_tag @tbaa_tag_3 {access_type = @tbaa_root_2, base_type = @tbaa_root_2, offset = 0 : i64}
- llvm.return
}
llvm.func @tbaa1(%arg0: !llvm.ptr) {
%0 = llvm.mlir.constant(1 : i8) : i8
// CHECK: llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64}
// CHECK: llvm.tbaa_root @tbaa_root_2 {id = "Other language TBAA"}
// CHECK: llvm.tbaa_tag @tbaa_tag_3 {access_type = @tbaa_root_2, base_type = @tbaa_root_2, offset = 0 : i64}
-// CHECK: llvm.return
// CHECK: }
// CHECK: llvm.func @tbaa1(%[[VAL_0:.*]]: !llvm.ptr) {
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(1 : i8) : i8
; CHECK-NEXT: llvm.tbaa_tag @[[T0:tbaa_tag_[0-9]+]] {access_type = @[[R0]], base_type = @[[R0]], offset = 0 : i64}
; CHECK-NEXT: llvm.tbaa_root @[[R1:tbaa_root_[0-9]+]] {id = "Other language TBAA"}
; CHECK-NEXT: llvm.tbaa_tag @[[T1:tbaa_tag_[0-9]+]] {access_type = @[[R1]], base_type = @[[R1]], offset = 0 : i64}
-; CHECK-NEXT: llvm.return
; CHECK-NEXT: }
; CHECK: llvm.func @tbaa1
; CHECK: llvm.store %{{.*}}, %{{.*}} {
; CHECK-NEXT: llvm.tbaa_tag @[[T1:tbaa_tag_[0-9]+]] {access_type = @[[D3:tbaa_type_desc_[0-9]+]], base_type = @[[D4:tbaa_type_desc_[0-9]+]], offset = 0 : i64}
; CHECK-NEXT: llvm.tbaa_type_desc @[[D3]] {id = "int", members = {<@[[D0]], 0>}}
; CHECK-NEXT: llvm.tbaa_type_desc @[[D4]] {id = "agg1_t", members = {<@[[D3]], 0>, <@[[D3]], 4>}}
-; CHECK-NEXT: llvm.return
; CHECK-NEXT: }
; CHECK: llvm.func @tbaa2
; CHECK: llvm.load %{{.*}} {
llvm.metadata @metadata {
llvm.access_group @group1
llvm.access_group @group2
- llvm.return
}
}
llvm.alias_scope @scope1 { domain = @domain, description = "The first scope" }
llvm.alias_scope @scope2 { domain = @domain }
llvm.alias_scope @scope3 { domain = @domain }
- llvm.return
}
}
llvm.tbaa_type_desc @tbaa_type_desc_5 {id = "int", members = {<@tbaa_type_desc_1, 0>}}
llvm.tbaa_type_desc @tbaa_type_desc_6 {id = "agg1_t", members = {<@tbaa_type_desc_5, 0>, <@tbaa_type_desc_5, 4>}}
llvm.tbaa_tag @tbaa_tag_7 {access_type = @tbaa_type_desc_5, base_type = @tbaa_type_desc_6, offset = 0 : i64, constant}
- llvm.return
}
llvm.func @tbaa2(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {
%0 = llvm.mlir.constant(0 : i32) : i32