1target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 2target triple = "x86_64-apple-macosx10.11.0" 3 4@globalvar = global i32 1, align 4 5@staticvar = internal global i32 1, align 4 6@staticconstvar = internal unnamed_addr constant [2 x i32] [i32 10, i32 20], align 4 7@commonvar = common global i32 0, align 4 8@P = internal global ptr null, align 8 9 10@weakalias = weak alias void (...), ptr @globalfunc1 11@analias = alias void (...), ptr @globalfunc2 12@linkoncealias = alias void (...), ptr @linkoncefunc 13 14define void @globalfunc1() #0 { 15entry: 16 call void @funcwithpersonality() 17 call void (...) @variadic_va_start() 18 ret void 19} 20 21define void @globalfunc2() #0 { 22entry: 23 ret void 24} 25 26define linkonce_odr void @linkoncefunc() #0 { 27entry: 28 ret void 29} 30 31define i32 @referencestatics(i32 %i) #0 { 32entry: 33 %i.addr = alloca i32, align 4 34 store i32 %i, ptr %i.addr, align 4 35 %call = call i32 @staticfunc() 36 %0 = load i32, ptr @staticvar, align 4 37 %add = add nsw i32 %call, %0 38 %1 = load i32, ptr %i.addr, align 4 39 %idxprom = sext i32 %1 to i64 40 %arrayidx = getelementptr inbounds [2 x i32], ptr @staticconstvar, i64 0, i64 %idxprom 41 %2 = load i32, ptr %arrayidx, align 4 42 %add1 = add nsw i32 %add, %2 43 ret i32 %add1 44} 45 46define i32 @referenceglobals(i32 %i) #0 { 47entry: 48 %i.addr = alloca i32, align 4 49 store i32 %i, ptr %i.addr, align 4 50 call void @globalfunc1() 51 %0 = load i32, ptr @globalvar, align 4 52 ret i32 %0 53} 54 55define i32 @referencecommon(i32 %i) #0 { 56entry: 57 %i.addr = alloca i32, align 4 58 store i32 %i, ptr %i.addr, align 4 59 %0 = load i32, ptr @commonvar, align 4 60 ret i32 %0 61} 62 63define void @setfuncptr() #0 { 64entry: 65 store ptr @staticfunc2, ptr @P, align 8 66 ret void 67} 68 69define void @callfuncptr() #0 { 70entry: 71 %0 = load ptr, ptr @P, align 8 72 call void %0() 73 ret void 74} 75 76@weakvar = weak global i32 1, align 4 77define weak void @weakfunc() #0 { 78entry: 79 ret void 80} 81 82define linkonce void @linkoncefunc2() #0 { 83entry: 84 ret void 85} 86 87define internal i32 @staticfunc() #0 { 88entry: 89 ret i32 1 90} 91 92declare i32 @__gxx_personality_v0(...) 93 94; Add enough instructions to prevent import with inst limit of 5 95define internal void @funcwithpersonality() #2 personality ptr @__gxx_personality_v0 { 96entry: 97 call void @globalfunc2() 98 call void @globalfunc2() 99 call void @globalfunc2() 100 call void @globalfunc2() 101 call void @globalfunc2() 102 call void @globalfunc2() 103 ret void 104} 105 106define internal void @staticfunc2() #0 { 107entry: 108 ret void 109} 110 111define void @referencelargelinkonce() #0 { 112entry: 113 call void @linkonceodr() 114 ret void 115} 116 117; A large enough linkonce_odr function that should never be imported 118define linkonce_odr void @linkonceodr() #0 { 119entry: 120 call void @globalfunc2() 121 call void @globalfunc2() 122 call void @globalfunc2() 123 call void @globalfunc2() 124 call void @globalfunc2() 125 call void @globalfunc2() 126 call void @globalfunc2() 127 call void @globalfunc2() 128 call void @globalfunc2() 129 call void @globalfunc2() 130 call void @globalfunc2() 131 call void @globalfunc2() 132 call void @globalfunc2() 133 call void @globalfunc2() 134 call void @globalfunc2() 135 call void @globalfunc2() 136 call void @globalfunc2() 137 call void @globalfunc2() 138 call void @globalfunc2() 139 call void @globalfunc2() 140 call void @globalfunc2() 141 call void @globalfunc2() 142 call void @globalfunc2() 143 call void @globalfunc2() 144 call void @globalfunc2() 145 call void @globalfunc2() 146 call void @globalfunc2() 147 call void @globalfunc2() 148 call void @globalfunc2() 149 call void @globalfunc2() 150 ret void 151} 152 153; Variadic function without va_start can be imported because inliner 154; can handle it. 155define void @variadic_no_va_start(...) { 156 ret void 157} 158 159; Variadic function with va_start should not be imported because inliner 160; doesn't handle it. 161define void @variadic_va_start(...) { 162 %ap = alloca ptr, align 8 163 call void @llvm.va_start(ptr %ap) 164 ret void 165} 166 167declare void @llvm.va_start(ptr) nounwind 168