blob: cb75684886afeceee5f00cdb314ddfcbe4b3aa47 [file] [log] [blame] [edit]
// RUN: cir-opt %s -o %t.cir
// RUN: FileCheck --input-file=%t.cir %s
!s8i = !cir.int<s, 8>
!s32i = !cir.int<s, 32>
!s64i = !cir.int<s, 64>
!ty_Init = !cir.struct<class "Init" {!s8i} #cir.record.decl.ast>
module {
cir.global external @a = #cir.int<3> : !s32i
cir.global external @rgb = #cir.const_array<[#cir.int<0> : !s8i, #cir.int<-23> : !s8i, #cir.int<33> : !s8i] : !cir.array<!s8i x 3>>
cir.global external @b = #cir.const_array<"example\00" : !cir.array<!s8i x 8>>
cir.global external @rgb2 = #cir.const_struct<{#cir.int<0> : !s8i, #cir.int<5> : !s64i, #cir.ptr<null> : !cir.ptr<!s8i>}> : !cir.struct<struct {!s8i, !s64i, !cir.ptr<!s8i>}>
cir.global "private" constant internal @".str" : !cir.array<!s8i x 8> {alignment = 1 : i64}
cir.global "private" internal @c : !s32i
cir.global "private" constant internal @".str2" = #cir.const_array<"example\00" : !cir.array<!s8i x 8>> : !cir.array<!s8i x 8> {alignment = 1 : i64}
cir.global external @s = #cir.global_view<@".str2"> : !cir.ptr<!s8i>
cir.func @use_global() {
%0 = cir.get_global @a : !cir.ptr<!s32i>
cir.return
}
cir.global external @table = #cir.global_view<@s> : !cir.ptr<!s8i>
cir.global external @elt_ptr = #cir.global_view<@rgb, [1]> : !cir.ptr<!s8i>
cir.global external @table_of_ptrs = #cir.const_array<[#cir.global_view<@rgb, [1]> : !cir.ptr<!s8i>] : !cir.array<!cir.ptr<!s8i> x 1>>
// Note MLIR requires "private" for global declarations, should get
// rid of this somehow in favor of clarity?
cir.global "private" external @_ZTVN10__cxxabiv120__si_class_type_infoE : !cir.ptr<!s32i>
cir.global "private" constant external @type_info_A : !cir.ptr<!s8i>
cir.global constant external @type_info_name_B = #cir.const_array<"1B\00" : !cir.array<!s8i x 3>>
cir.global external @type_info_B = #cir.typeinfo<{
#cir.global_view<@_ZTVN10__cxxabiv120__si_class_type_infoE, [2]> : !cir.ptr<!s8i>,
#cir.global_view<@type_info_name_B> : !cir.ptr<!s8i>,
#cir.global_view<@type_info_A> : !cir.ptr<!s8i>}>
: !cir.struct<struct {!cir.ptr<!s8i>, !cir.ptr<!s8i>, !cir.ptr<!s8i>}>
cir.func private @_ZN4InitC1Eb(!cir.ptr<!ty_Init>, !s8i)
cir.func private @_ZN4InitD1Ev(!cir.ptr<!ty_Init>)
cir.global "private" internal @_ZL8__ioinit = ctor : !ty_Init {
%0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_Init>
%1 = cir.const #cir.int<3> : !s8i
cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_Init>, !s8i) -> ()
} dtor {
%0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_Init>
cir.call @_ZN4InitD1Ev(%0) : (!cir.ptr<!ty_Init>) -> ()
}
cir.func @f31() global_ctor {
cir.return
}
cir.func @f32() global_ctor(777) {
cir.return
}
cir.func @f33() global_dtor {
cir.return
}
cir.func @f34() global_dtor(777) {
cir.return
}
cir.global external tls_dyn @model0 = #cir.int<0> : !s32i
cir.global external tls_local_dyn @model1 = #cir.int<0> : !s32i
cir.global external tls_init_exec @model2 = #cir.int<0> : !s32i
cir.global external tls_local_exec @model3 = #cir.int<0> : !s32i
cir.global "private" external tls_dyn @batata : !s32i
cir.func @f35() {
%0 = cir.get_global thread_local @batata : !cir.ptr<!s32i>
cir.return
}
cir.global external addrspace(offload_global) @addrspace1 = #cir.int<1> : !s32i
cir.global "private" internal addrspace(offload_local) @addrspace2 : !s32i
cir.global external addrspace(target<1>) @addrspace3 = #cir.int<3> : !s32i
}
// CHECK: cir.global external @a = #cir.int<3> : !s32i
// CHECK: cir.global external @rgb = #cir.const_array<[#cir.int<0> : !s8i, #cir.int<-23> : !s8i, #cir.int<33> : !s8i]> : !cir.array<!s8i x 3>
// CHECK: cir.global external @b = #cir.const_array<"example\00" : !cir.array<!s8i x 8>>
// CHECK: cir.global "private" constant internal @".str" : !cir.array<!s8i x 8> {alignment = 1 : i64}
// CHECK: cir.global "private" internal @c : !s32i
// CHECK: cir.global "private" constant internal @".str2" = #cir.const_array<"example\00" : !cir.array<!s8i x 8>> : !cir.array<!s8i x 8> {alignment = 1 : i64}
// CHECK: cir.global external @s = #cir.global_view<@".str2"> : !cir.ptr<!s8i>
// CHECK: cir.func @use_global()
// CHECK-NEXT: %0 = cir.get_global @a : !cir.ptr<!s32i>
// CHECK: cir.global "private" internal @_ZL8__ioinit = ctor : !ty_Init {
// CHECK-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_Init>
// CHECK-NEXT: %1 = cir.const #cir.int<3> : !s8i
// CHECK-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_Init>, !s8i) -> ()
// CHECK-NEXT: }
// CHECK: cir.func @f31() global_ctor
// CHECK: cir.func @f32() global_ctor(777)
// CHECK: cir.func @f33() global_dtor
// CHECK: cir.func @f34() global_dtor(777)
// CHECK: cir.global external tls_dyn @model0 = #cir.int<0> : !s32i
// CHECK: cir.global external tls_local_dyn @model1 = #cir.int<0> : !s32i
// CHECK: cir.global external tls_init_exec @model2 = #cir.int<0> : !s32i
// CHECK: cir.global external tls_local_exec @model3 = #cir.int<0> : !s32i
// CHECK: cir.global "private" external tls_dyn @batata : !s32i
// CHECK: cir.func @f35() {
// CHECK: %0 = cir.get_global thread_local @batata : !cir.ptr<!s32i>
// CHECK: cir.return
// CHECK: }
// CHECK: cir.global external addrspace(offload_global) @addrspace1 = #cir.int<1> : !s32i
// CHECK: cir.global "private" internal addrspace(offload_local) @addrspace2 : !s32i
// CHECK: cir.global external addrspace(target<1>) @addrspace3 = #cir.int<3> : !s32i