1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s 2 3// CHECK: llvm.mlir.global external @default_external 4llvm.mlir.global @default_external() : i64 5 6// CHECK: llvm.mlir.global external constant @default_external_constant 7llvm.mlir.global constant @default_external_constant(42) : i64 8 9// CHECK: llvm.mlir.global internal @global(42 : i64) {addr_space = 0 : i32} : i64 10llvm.mlir.global internal @global(42 : i64) : i64 11 12// CHECK: llvm.mlir.global private @aligned_global(42 : i64) {addr_space = 0 : i32, aligned = 64 : i64} : i64 13llvm.mlir.global private @aligned_global(42 : i64) {aligned = 64} : i64 14 15// CHECK: llvm.mlir.global private constant @aligned_global_const(42 : i64) {addr_space = 0 : i32, aligned = 32 : i64} : i64 16llvm.mlir.global private constant @aligned_global_const(42 : i64) {aligned = 32} : i64 17 18// CHECK: llvm.mlir.global internal constant @constant(3.700000e+01 : f64) {addr_space = 0 : i32} : f32 19llvm.mlir.global internal constant @constant(37.0) : f32 20 21// CHECK: llvm.mlir.global internal constant @".string"("foobar") 22llvm.mlir.global internal constant @".string"("foobar") : !llvm.array<6 x i8> 23 24// CHECK: llvm.mlir.global internal @string_notype("1234567") 25llvm.mlir.global internal @string_notype("1234567") 26 27// CHECK: llvm.mlir.global internal @global_undef() 28llvm.mlir.global internal @global_undef() : i64 29 30// CHECK: llvm.mlir.global internal @global_mega_initializer() {addr_space = 0 : i32} : i64 { 31// CHECK-NEXT: %[[c:[0-9]+]] = llvm.mlir.constant(42 : i64) : i64 32// CHECK-NEXT: llvm.return %[[c]] : i64 33// CHECK-NEXT: } 34llvm.mlir.global internal @global_mega_initializer() : i64 { 35 %c = llvm.mlir.constant(42 : i64) : i64 36 llvm.return %c : i64 37} 38 39// Check different linkage types. 40// CHECK: llvm.mlir.global private 41llvm.mlir.global private @private() : i64 42// CHECK: llvm.mlir.global internal 43llvm.mlir.global internal @internal() : i64 44// CHECK: llvm.mlir.global available_externally 45llvm.mlir.global available_externally @available_externally() : i64 46// CHECK: llvm.mlir.global linkonce 47llvm.mlir.global linkonce @linkonce() : i64 48// CHECK: llvm.mlir.global weak 49llvm.mlir.global weak @weak() : i64 50// CHECK: llvm.mlir.global common 51llvm.mlir.global common @common() : i64 52// CHECK: llvm.mlir.global appending 53llvm.mlir.global appending @appending() : !llvm.array<2 x i64> 54// CHECK: llvm.mlir.global extern_weak 55llvm.mlir.global extern_weak @extern_weak() : i64 56// CHECK: llvm.mlir.global linkonce_odr 57llvm.mlir.global linkonce_odr @linkonce_odr() : i64 58// CHECK: llvm.mlir.global weak_odr 59llvm.mlir.global weak_odr @weak_odr() : i64 60// CHECK: llvm.mlir.global external @has_thr_local(42 : i64) {addr_space = 0 : i32, thr_local} : i64 61llvm.mlir.global external @has_thr_local(42 : i64) {thr_local} : i64 62// CHECK: llvm.mlir.global external @has_dso_local(42 : i64) {addr_space = 0 : i32, dso_local} : i64 63llvm.mlir.global external @has_dso_local(42 : i64) {dso_local} : i64 64// CHECK: llvm.mlir.global external @has_addr_space(32 : i64) {addr_space = 3 : i32} : i64 65llvm.mlir.global external @has_addr_space(32 : i64) {addr_space = 3: i32} : i64 66 67// CHECK: llvm.comdat @__llvm_comdat 68llvm.comdat @__llvm_comdat { 69 // CHECK: llvm.comdat_selector @any any 70 llvm.comdat_selector @any any 71} 72// CHECK: llvm.mlir.global external @any() comdat(@__llvm_comdat::@any) {addr_space = 1 : i32} : i64 73llvm.mlir.global @any() comdat(@__llvm_comdat::@any) {addr_space = 1 : i32} : i64 74 75// CHECK-LABEL: references 76func.func @references() { 77 // CHECK: llvm.mlir.addressof @".string" : !llvm.ptr 78 %0 = llvm.mlir.addressof @".string" : !llvm.ptr 79 80 // CHECK: llvm.mlir.addressof @global : !llvm.ptr 81 %1 = llvm.mlir.addressof @global : !llvm.ptr 82 83 // CHECK: llvm.mlir.addressof @has_addr_space : !llvm.ptr<3> 84 %2 = llvm.mlir.addressof @has_addr_space : !llvm.ptr<3> 85 86 llvm.return 87} 88 89// CHECK: llvm.mlir.global private local_unnamed_addr constant @local(42 : i64) {addr_space = 0 : i32} : i64 90llvm.mlir.global private local_unnamed_addr constant @local(42 : i64) : i64 91 92// CHECK: llvm.mlir.global private unnamed_addr constant @foo(42 : i64) {addr_space = 0 : i32} : i64 93llvm.mlir.global private unnamed_addr constant @foo(42 : i64) : i64 94 95// CHECK: llvm.mlir.global internal constant @sectionvar("teststring") {addr_space = 0 : i32, section = ".mysection"} 96llvm.mlir.global internal constant @sectionvar("teststring") {section = ".mysection"}: !llvm.array<10 x i8> 97 98// CHECK: llvm.mlir.global internal thread_local constant @thread_local(42 : i32) 99llvm.mlir.global internal thread_local constant @thread_local(42 : i32) : i32 100 101// Visibility types. 102// CHECK: llvm.mlir.global internal hidden constant @hidden(42 : i32) 103llvm.mlir.global internal hidden constant @hidden(42 : i32) : i32 104 105// CHECK: llvm.mlir.global internal protected unnamed_addr @protected(42 : i32) 106llvm.mlir.global internal protected unnamed_addr @protected(42 : i32) : i32 107 108// ----- 109 110// expected-error @+1 {{op requires attribute 'sym_name'}} 111"llvm.mlir.global"() ({}) {linkage = #llvm.linkage<private>, type = i64, constant, global_type = i64, value = 42 : i64} : () -> () 112 113// ----- 114 115// expected-error @+1 {{requires attribute 'global_type'}} 116"llvm.mlir.global"() ({}) {sym_name = "foo", constant, value = 42 : i64} : () -> () 117 118// ----- 119 120// expected-error @+1 {{expects type to be a valid element type for an LLVM global}} 121llvm.mlir.global internal constant @constant(37.0) : !llvm.label 122 123// ----- 124// expected-error @+1 {{'addr_space' failed to satisfy constraint: 32-bit signless integer attribute whose value is non-negative}} 125"llvm.mlir.global"() ({}) {sym_name = "foo", global_type = i64, value = 42 : i64, addr_space = -1 : i32, linkage = #llvm.linkage<private>} : () -> () 126 127// ----- 128 129// expected-error @+1 {{'addr_space' failed to satisfy constraint: 32-bit signless integer attribute whose value is non-negative}} 130"llvm.mlir.global"() ({}) {sym_name = "foo", global_type = i64, value = 42 : i64, addr_space = 1.0 : f32, linkage = #llvm.linkage<private>} : () -> () 131 132// ----- 133 134func.func @foo() { 135 // expected-error @+1 {{op symbol's parent must have the SymbolTable trait}} 136 llvm.mlir.global internal @bar(42) : i32 137 138 return 139} 140 141// ----- 142 143// expected-error @+1 {{requires an i8 array type of the length equal to that of the string}} 144llvm.mlir.global internal constant @string("foobar") : !llvm.array<42 x i8> 145 146// ----- 147 148// expected-error @+1 {{type can only be omitted for string globals}} 149llvm.mlir.global internal @i64_needs_type(0: i64) 150 151// ----- 152 153// expected-error @+1 {{expected zero or one type}} 154llvm.mlir.global internal @more_than_one_type(0) : i64, i32 155 156// ----- 157 158llvm.mlir.global internal @foo(0: i32) : i32 159 160func.func @bar() { 161 // expected-error @+1{{expected ':'}} 162 llvm.mlir.addressof @foo 163} 164 165// ----- 166 167func.func @foo() { 168 // The attribute parser will consume the first colon-type, so we put two of 169 // them to trigger the attribute type mismatch error. 170 // expected-error @+1 {{invalid kind of attribute specified}} 171 llvm.mlir.addressof "foo" : i64 : !llvm.ptr 172 llvm.return 173} 174 175// ----- 176 177func.func @foo() { 178 // expected-error @+1 {{must reference a global defined by 'llvm.mlir.global'}} 179 llvm.mlir.addressof @foo : !llvm.ptr 180 llvm.return 181} 182 183// ----- 184 185// expected-error @+2 {{block with no terminator}} 186llvm.mlir.global internal @g() : i64 { 187 %c = llvm.mlir.constant(42 : i64) : i64 188} 189 190// ----- 191 192// expected-error @+1 {{'llvm.mlir.global' op initializer region type 'i64' does not match global type 'i32'}} 193llvm.mlir.global internal @g() : i32 { 194 %c = llvm.mlir.constant(42 : i64) : i64 195 llvm.return %c : i64 196} 197 198// ----- 199 200// expected-error @+1 {{'llvm.mlir.global' op cannot have both initializer value and region}} 201llvm.mlir.global internal @g(43 : i64) : i64 { 202 %c = llvm.mlir.constant(42 : i64) : i64 203 llvm.return %c : i64 204} 205 206// ----- 207 208llvm.mlir.global internal @g(32 : i64) {addr_space = 3: i32} : i64 209func.func @mismatch_addr_space_implicit_global() { 210 // expected-error @+1 {{pointer address space must match address space of the referenced global}} 211 llvm.mlir.addressof @g : !llvm.ptr 212 llvm.return 213} 214 215// ----- 216 217llvm.mlir.global internal @g(32 : i64) {addr_space = 3: i32} : i64 218 219func.func @mismatch_addr_space() { 220 // expected-error @+1 {{pointer address space must match address space of the referenced global}} 221 llvm.mlir.addressof @g : !llvm.ptr<4> 222 llvm.return 223} 224 225// ----- 226 227llvm.func @ctor() { 228 llvm.return 229} 230 231// CHECK: llvm.mlir.global_ctors {ctors = [@ctor], priorities = [0 : i32]} 232llvm.mlir.global_ctors { ctors = [@ctor], priorities = [0 : i32]} 233 234// ----- 235 236llvm.func @dtor() { 237 llvm.return 238} 239 240// CHECK: llvm.mlir.global_dtors {dtors = [@dtor], priorities = [0 : i32]} 241llvm.mlir.global_dtors { dtors = [@dtor], priorities = [0 : i32]} 242 243// ----- 244 245// CHECK: llvm.mlir.global external @target_ext() {addr_space = 0 : i32} : !llvm.target<"spirv.Image", i32, 0> 246llvm.mlir.global @target_ext() : !llvm.target<"spirv.Image", i32, 0> 247 248// CHECK: llvm.mlir.global external @target_ext_init() {addr_space = 0 : i32} : !llvm.target<"spirv.Image", i32, 0> 249// CHECK-NEXT: %0 = llvm.mlir.zero : !llvm.target<"spirv.Image", i32, 0> 250// CHECK-NEXT: llvm.return %0 : !llvm.target<"spirv.Image", i32, 0> 251// CHECK-NEXT: } 252llvm.mlir.global @target_ext_init() : !llvm.target<"spirv.Image", i32, 0> { 253 %0 = llvm.mlir.zero : !llvm.target<"spirv.Image", i32, 0> 254 llvm.return %0 : !llvm.target<"spirv.Image", i32, 0> 255} 256 257// ----- 258 259// expected-error @+1 {{global with target extension type can only be initialized with zero-initializer}} 260llvm.mlir.global @target_fail(0 : i64) : !llvm.target<"spirv.Image", i32, 0> 261 262// ----- 263 264// CHECK-DAG: #[[TYPE:.*]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "uint64_t", sizeInBits = 64, encoding = DW_ATE_unsigned> 265// CHECK-DAG: #[[FILE:.*]] = #llvm.di_file<"not" in "existence"> 266// CHECK-DAG: #[[CU:.*]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #[[FILE]], producer = "MLIR", isOptimized = true, emissionKind = Full> 267// CHECK-DAG: #[[GVAR0:.*]] = #llvm.di_global_variable<scope = #[[CU]], name = "global_with_expr_1", linkageName = "global_with_expr_1", file = #[[FILE]], line = 370, type = #[[TYPE]], isLocalToUnit = true, isDefined = true, alignInBits = 8> 268// CHECK-DAG: #[[GVAR1:.*]] = #llvm.di_global_variable<scope = #[[CU]], name = "global_with_expr_2", linkageName = "global_with_expr_2", file = #[[FILE]], line = 371, type = #[[TYPE]], isLocalToUnit = true, isDefined = true, alignInBits = 8> 269// CHECK-DAG: #[[GVAR2:.*]] = #llvm.di_global_variable<scope = #[[CU]], name = "global_with_expr_3", linkageName = "global_with_expr_3", file = #[[FILE]], line = 372, type = #[[TYPE]], isLocalToUnit = true, isDefined = true, alignInBits = 8> 270// CHECK-DAG: #[[GVAR3:.*]] = #llvm.di_global_variable<scope = #[[CU]], name = "global_with_expr_4", linkageName = "global_with_expr_4", file = #[[FILE]], line = 373, type = #[[TYPE]], isLocalToUnit = true, isDefined = true, alignInBits = 8> 271// CHECK-DAG: #[[EXPR0:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR0]], expr = <>> 272// CHECK-DAG: #[[EXPR1:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR1]], expr = <[DW_OP_push_object_address, DW_OP_deref]>> 273// CHECK-DAG: #[[EXPR2:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR2]], expr = <[DW_OP_LLVM_arg(0), DW_OP_LLVM_arg(1), DW_OP_plus]>> 274// CHECK-DAG: #[[EXPR3:.*]] = #llvm.di_global_variable_expression<var = #[[GVAR3]], expr = <[DW_OP_LLVM_convert(16, DW_ATE_signed)]>> 275// CHECK-DAG: llvm.mlir.global external @global_with_expr1() {addr_space = 0 : i32, dbg_expr = [#[[EXPR0]]]} : i64 276// CHECK-DAG: llvm.mlir.global external @global_with_expr2() {addr_space = 0 : i32, dbg_expr = [#[[EXPR1]]]} : i64 277// CHECK-DAG: llvm.mlir.global external @global_with_expr3() {addr_space = 0 : i32, dbg_expr = [#[[EXPR2]]]} : i64 278// CHECK-DAG: llvm.mlir.global external @global_with_expr4() {addr_space = 0 : i32, dbg_expr = [#[[EXPR3]]]} : i64 279 280#di_file = #llvm.di_file<"not" in "existence"> 281#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #di_file, producer = "MLIR", isOptimized = true, emissionKind = Full> 282#di_basic_type = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "uint64_t", sizeInBits = 64, encoding = DW_ATE_unsigned> 283llvm.mlir.global external @global_with_expr1() {addr_space = 0 : i32, dbg_expr = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit, name = "global_with_expr_1", linkageName = "global_with_expr_1", file = #di_file, line = 370, type = #di_basic_type, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <>>]} : i64 284llvm.mlir.global external @global_with_expr2() {addr_space = 0 : i32, dbg_expr = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit, name = "global_with_expr_2", linkageName = "global_with_expr_2", file = #di_file, line = 371, type = #di_basic_type, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <[DW_OP_push_object_address, DW_OP_deref]>>]} : i64 285llvm.mlir.global external @global_with_expr3() {addr_space = 0 : i32, dbg_expr = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit, name = "global_with_expr_3", linkageName = "global_with_expr_3", file = #di_file, line = 372, type = #di_basic_type, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <[DW_OP_LLVM_arg(0), DW_OP_LLVM_arg(1), DW_OP_plus]>>]} : i64 286llvm.mlir.global external @global_with_expr4() {addr_space = 0 : i32, dbg_expr = [#llvm.di_global_variable_expression<var = <scope = #di_compile_unit, name = "global_with_expr_4", linkageName = "global_with_expr_4", file = #di_file, line = 373, type = #di_basic_type, isLocalToUnit = true, isDefined = true, alignInBits = 8>, expr = <[DW_OP_LLVM_convert(16, DW_ATE_signed)]>>]} : i64 287