Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 1 | ; RUN: llvm-as < %s | llc |
Chris Lattner | 1f0758c | 2004-11-06 21:11:04 +0000 | [diff] [blame] | 2 | |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 3 | |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 4 | declare i8* @llvm_gc_allocate(i32) |
| 5 | declare void @llvm_gc_initialize(i32) |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 6 | |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 7 | declare void @llvm.gcroot(i8**, i8*) |
| 8 | declare void @llvm.gcwrite(i8*, i8*, i8**) |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 9 | |
Gordon Henriksen | 71183b6 | 2007-12-10 03:18:06 +0000 | [diff] [blame] | 10 | define i32 @main() gc "shadow-stack" { |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 11 | entry: |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 12 | %A = alloca i8* |
| 13 | %B = alloca i8** |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 14 | |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 15 | call void @llvm_gc_initialize(i32 1048576) ; Start with 1MB heap |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 16 | |
| 17 | ;; void *A; |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 18 | call void @llvm.gcroot(i8** %A, i8* null) |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 19 | |
| 20 | ;; A = gcalloc(10); |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 21 | %Aptr = call i8* @llvm_gc_allocate(i32 10) |
| 22 | store i8* %Aptr, i8** %A |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 23 | |
| 24 | ;; void **B; |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 25 | %tmp.1 = bitcast i8*** %B to i8** |
| 26 | call void @llvm.gcroot(i8** %tmp.1, i8* null) |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 27 | |
| 28 | ;; B = gcalloc(4); |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 29 | %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 Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 32 | |
| 33 | ;; *B = A; |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 34 | %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 Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 37 | |
| 38 | br label %AllocLoop |
| 39 | |
| 40 | AllocLoop: |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 41 | %i = phi i32 [ 0, %entry ], [ %indvar.next, %AllocLoop ] |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 42 | ;; Allocated mem: allocated memory is immediately dead. |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 43 | call i8* @llvm_gc_allocate(i32 100) |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 44 | |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 45 | %indvar.next = add i32 %i, 1 |
| 46 | %exitcond = icmp eq i32 %indvar.next, 10000000 |
| 47 | br i1 %exitcond, label %Exit, label %AllocLoop |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 48 | |
| 49 | Exit: |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 50 | ret i32 0 |
Chris Lattner | acd339e | 2004-05-23 21:24:50 +0000 | [diff] [blame] | 51 | } |
| 52 | |
Gordon Henriksen | ad80af9 | 2007-12-09 15:03:01 +0000 | [diff] [blame] | 53 | declare void @__main() |