blob: b1fee68abab8dc776a527d4f2fac01e6e867ca41 [file] [log] [blame]
Gordon Henriksenad80af92007-12-09 15:03:01 +00001; RUN: llvm-as < %s | llc
Chris Lattner1f0758c2004-11-06 21:11:04 +00002
Chris Lattneracd339e2004-05-23 21:24:50 +00003
Gordon Henriksenad80af92007-12-09 15:03:01 +00004declare i8* @llvm_gc_allocate(i32)
5declare void @llvm_gc_initialize(i32)
Chris Lattneracd339e2004-05-23 21:24:50 +00006
Gordon Henriksenad80af92007-12-09 15:03:01 +00007declare void @llvm.gcroot(i8**, i8*)
8declare void @llvm.gcwrite(i8*, i8*, i8**)
Chris Lattneracd339e2004-05-23 21:24:50 +00009
Gordon Henriksen71183b62007-12-10 03:18:06 +000010define i32 @main() gc "shadow-stack" {
Chris Lattneracd339e2004-05-23 21:24:50 +000011entry:
Gordon Henriksenad80af92007-12-09 15:03:01 +000012 %A = alloca i8*
13 %B = alloca i8**
Chris Lattneracd339e2004-05-23 21:24:50 +000014
Gordon Henriksenad80af92007-12-09 15:03:01 +000015 call void @llvm_gc_initialize(i32 1048576) ; Start with 1MB heap
Chris Lattneracd339e2004-05-23 21:24:50 +000016
17 ;; void *A;
Gordon Henriksenad80af92007-12-09 15:03:01 +000018 call void @llvm.gcroot(i8** %A, i8* null)
Chris Lattneracd339e2004-05-23 21:24:50 +000019
20 ;; A = gcalloc(10);
Gordon Henriksenad80af92007-12-09 15:03:01 +000021 %Aptr = call i8* @llvm_gc_allocate(i32 10)
22 store i8* %Aptr, i8** %A
Chris Lattneracd339e2004-05-23 21:24:50 +000023
24 ;; void **B;
Gordon Henriksenad80af92007-12-09 15:03:01 +000025 %tmp.1 = bitcast i8*** %B to i8**
26 call void @llvm.gcroot(i8** %tmp.1, i8* null)
Chris Lattneracd339e2004-05-23 21:24:50 +000027
28 ;; B = gcalloc(4);
Gordon Henriksenad80af92007-12-09 15:03:01 +000029 %B.upgrd.1 = call i8* @llvm_gc_allocate(i32 8)
30 %tmp.2 = bitcast i8* %B.upgrd.1 to i8**
31 store i8** %tmp.2, i8*** %B
Chris Lattneracd339e2004-05-23 21:24:50 +000032
33 ;; *B = A;
Gordon Henriksenad80af92007-12-09 15:03:01 +000034 %B.1 = load i8*** %B
35 %A.1 = load i8** %A
36 call void @llvm.gcwrite(i8* %A.1, i8* %B.upgrd.1, i8** %B.1)
Chris Lattneracd339e2004-05-23 21:24:50 +000037
38 br label %AllocLoop
39
40AllocLoop:
Gordon Henriksenad80af92007-12-09 15:03:01 +000041 %i = phi i32 [ 0, %entry ], [ %indvar.next, %AllocLoop ]
Chris Lattneracd339e2004-05-23 21:24:50 +000042 ;; Allocated mem: allocated memory is immediately dead.
Gordon Henriksenad80af92007-12-09 15:03:01 +000043 call i8* @llvm_gc_allocate(i32 100)
Chris Lattneracd339e2004-05-23 21:24:50 +000044
Gordon Henriksenad80af92007-12-09 15:03:01 +000045 %indvar.next = add i32 %i, 1
46 %exitcond = icmp eq i32 %indvar.next, 10000000
47 br i1 %exitcond, label %Exit, label %AllocLoop
Chris Lattneracd339e2004-05-23 21:24:50 +000048
49Exit:
Gordon Henriksenad80af92007-12-09 15:03:01 +000050 ret i32 0
Chris Lattneracd339e2004-05-23 21:24:50 +000051}
52
Gordon Henriksenad80af92007-12-09 15:03:01 +000053declare void @__main()