xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/GC/badwriteproto.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: not llvm-as < %s >& /dev/null
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker	%list = type { i32, %list* }
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; This usage is invalid now; instead, objects must be bitcast to i8* for input
6*9880d681SAndroid Build Coastguard Worker; to the gc intrinsics.
7*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.gcwrite(%list*, %list*, %list**)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine %list* @cons(i32 %hd, %list* %tl) gc "example" {
10*9880d681SAndroid Build Coastguard Worker	%tmp = call i8* @gcalloc(i32 bitcast(%list* getelementptr(%list, %list* null, i32 1) to i32))
11*9880d681SAndroid Build Coastguard Worker	%cell = bitcast i8* %tmp to %list*
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker	%hd.ptr = getelementptr %list, %list* %cell, i32 0, i32 0
14*9880d681SAndroid Build Coastguard Worker	store i32 %hd, i32* %hd.ptr
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker	%tl.ptr = getelementptr %list, %list* %cell, i32 0, i32 0
17*9880d681SAndroid Build Coastguard Worker	call void @llvm.gcwrite(%list* %tl, %list* %cell, %list** %tl.ptr)
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker	ret %cell.2
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdeclare i8* @gcalloc(i32)
23