1; RUN: llc -mtriple=x86_64 < %s 2 3declare i8* @llvm_gc_allocate(i32) 4declare void @llvm_gc_initialize(i32) 5 6declare void @llvm.gcroot(i8**, i8*) 7declare void @llvm.gcwrite(i8*, i8*, i8**) 8 9define i32 @main() gc "shadow-stack" { 10entry: 11 %A = alloca i8* 12 %B = alloca i8** 13 14 call void @llvm_gc_initialize(i32 1048576) ; Start with 1MB heap 15 16 ;; void *A; 17 call void @llvm.gcroot(i8** %A, i8* null) 18 19 ;; A = gcalloc(10); 20 %Aptr = call i8* @llvm_gc_allocate(i32 10) 21 store i8* %Aptr, i8** %A 22 23 ;; void **B; 24 %tmp.1 = bitcast i8*** %B to i8** 25 call void @llvm.gcroot(i8** %tmp.1, i8* null) 26 27 ;; B = gcalloc(4); 28 %B.upgrd.1 = call i8* @llvm_gc_allocate(i32 8) 29 %tmp.2 = bitcast i8* %B.upgrd.1 to i8** 30 store i8** %tmp.2, i8*** %B 31 32 ;; *B = A; 33 %B.1 = load i8**, i8*** %B 34 %A.1 = load i8*, i8** %A 35 call void @llvm.gcwrite(i8* %A.1, i8* %B.upgrd.1, i8** %B.1) 36 37 br label %AllocLoop 38 39AllocLoop: 40 %i = phi i32 [ 0, %entry ], [ %indvar.next, %AllocLoop ] 41 ;; Allocated mem: allocated memory is immediately dead. 42 call i8* @llvm_gc_allocate(i32 100) 43 44 %indvar.next = add i32 %i, 1 45 %exitcond = icmp eq i32 %indvar.next, 10000000 46 br i1 %exitcond, label %Exit, label %AllocLoop 47 48Exit: 49 ret i32 0 50} 51 52declare void @__main() 53