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