1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2 3; Test appropriate tagging of funclet for function calls generated by asan. 4; RUN: opt -S -passes=asan,win-eh-prepare -asan-use-stack-safety=0 -asan-max-inline-poisoning-size=0 -asan-detect-invalid-pointer-cmp -asan-detect-invalid-pointer-sub -asan-use-after-scope < %s | FileCheck %s --check-prefixes=CHECK,CHECK-INLINE 5; RUN: opt -S -passes=asan,win-eh-prepare -asan-use-stack-safety=0 -asan-max-inline-poisoning-size=0 -asan-instrumentation-with-call-threshold=0 -asan-detect-invalid-pointer-cmp -asan-detect-invalid-pointer-sub -asan-use-after-scope < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OUTLINE 6 7; REQUIRES: x86-registered-target 8 9target triple = "x86_64-pc-windows-msvc" 10 11declare void @DeInit(ptr) 12declare void @MayThrowFunc() 13declare void @NoReturn() noreturn 14 15declare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture readonly, i64, i1) 16declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1) 17declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1) 18declare void @llvm.lifetime.start.p0(i64, ptr nocapture) nounwind 19declare void @llvm.lifetime.end.p0(i64, ptr nocapture) nounwind 20 21declare i32 @__CxxFrameHandler3(...) 22declare i32 @dummyPersonality(...) 23 24define void @FuncletPersonality(ptr %ptrParam) sanitize_address personality ptr @__CxxFrameHandler3 { 25; CHECK-INLINE-LABEL: define void @FuncletPersonality( 26; CHECK-INLINE-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR4:[0-9]+]] personality ptr @__CxxFrameHandler3 { 27; CHECK-INLINE-NEXT: entry: 28; CHECK-INLINE-NEXT: [[TMP0:%.*]] = alloca i64, align 32 29; CHECK-INLINE-NEXT: store i64 0, ptr [[TMP0]], align 8 30; CHECK-INLINE-NEXT: [[TMP1:%.*]] = load i64, ptr @__asan_shadow_memory_dynamic_address, align 8 31; CHECK-INLINE-NEXT: [[ASAN_LOCAL_STACK_BASE:%.*]] = alloca i64, align 8 32; CHECK-INLINE-NEXT: [[TMP2:%.*]] = load i32, ptr @__asan_option_detect_stack_use_after_return, align 4 33; CHECK-INLINE-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 34; CHECK-INLINE-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP6:%.*]] 35; CHECK-INLINE: 4: 36; CHECK-INLINE-NEXT: [[TMP5:%.*]] = call i64 @__asan_stack_malloc_8(i64 8544) 37; CHECK-INLINE-NEXT: br label [[TMP6]] 38; CHECK-INLINE: 6: 39; CHECK-INLINE-NEXT: [[TMP7:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[TMP5]], [[TMP4]] ] 40; CHECK-INLINE-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 0 41; CHECK-INLINE-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP11:%.*]] 42; CHECK-INLINE: 9: 43; CHECK-INLINE-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 8544, align 32 44; CHECK-INLINE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 45; CHECK-INLINE-NEXT: br label [[TMP11]] 46; CHECK-INLINE: 11: 47; CHECK-INLINE-NEXT: [[TMP12:%.*]] = phi i64 [ [[TMP7]], [[TMP6]] ], [ [[TMP10]], [[TMP9]] ] 48; CHECK-INLINE-NEXT: store i64 [[TMP12]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 49; CHECK-INLINE-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 32 50; CHECK-INLINE-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr 51; CHECK-INLINE-NEXT: [[TMP15:%.*]] = add i64 [[TMP12]], 8480 52; CHECK-INLINE-NEXT: [[TMP16:%.*]] = inttoptr i64 [[TMP15]] to ptr 53; CHECK-INLINE-NEXT: [[TMP17:%.*]] = add i64 [[TMP12]], 8496 54; CHECK-INLINE-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr 55; CHECK-INLINE-NEXT: [[TMP19:%.*]] = add i64 [[TMP12]], 8512 56; CHECK-INLINE-NEXT: [[TMP20:%.*]] = inttoptr i64 [[TMP19]] to ptr 57; CHECK-INLINE-NEXT: [[TMP21:%.*]] = add i64 [[TMP12]], 8528 58; CHECK-INLINE-NEXT: [[TMP22:%.*]] = inttoptr i64 [[TMP21]] to ptr 59; CHECK-INLINE-NEXT: [[TMP23:%.*]] = inttoptr i64 [[TMP12]] to ptr 60; CHECK-INLINE-NEXT: store i64 1102416563, ptr [[TMP23]], align 8 61; CHECK-INLINE-NEXT: [[TMP24:%.*]] = add i64 [[TMP12]], 8 62; CHECK-INLINE-NEXT: [[TMP25:%.*]] = inttoptr i64 [[TMP24]] to ptr 63; CHECK-INLINE-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP25]], align 8 64; CHECK-INLINE-NEXT: [[TMP26:%.*]] = add i64 [[TMP12]], 16 65; CHECK-INLINE-NEXT: [[TMP27:%.*]] = inttoptr i64 [[TMP26]] to ptr 66; CHECK-INLINE-NEXT: store i64 ptrtoint (ptr @FuncletPersonality to i64), ptr [[TMP27]], align 8 67; CHECK-INLINE-NEXT: [[TMP28:%.*]] = lshr i64 [[TMP12]], 3 68; CHECK-INLINE-NEXT: [[TMP29:%.*]] = add i64 [[TMP28]], [[TMP1]] 69; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f1(i64 [[TMP29]], i64 4) 70; CHECK-INLINE-NEXT: [[TMP30:%.*]] = add i64 [[TMP29]], 1028 71; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP30]], i64 32) 72; CHECK-INLINE-NEXT: [[TMP31:%.*]] = add i64 [[TMP29]], 1060 73; CHECK-INLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP31]], i64 1) 74; CHECK-INLINE-NEXT: [[TMP32:%.*]] = add i64 [[TMP29]], 1061 75; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP32]], i64 1) 76; CHECK-INLINE-NEXT: [[TMP33:%.*]] = add i64 [[TMP29]], 1062 77; CHECK-INLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP33]], i64 1) 78; CHECK-INLINE-NEXT: [[TMP34:%.*]] = add i64 [[TMP29]], 1063 79; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP34]], i64 1) 80; CHECK-INLINE-NEXT: [[TMP35:%.*]] = add i64 [[TMP29]], 1064 81; CHECK-INLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP35]], i64 1) 82; CHECK-INLINE-NEXT: [[TMP36:%.*]] = add i64 [[TMP29]], 1065 83; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP36]], i64 1) 84; CHECK-INLINE-NEXT: [[TMP37:%.*]] = add i64 [[TMP29]], 1066 85; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f8(i64 [[TMP37]], i64 1) 86; CHECK-INLINE-NEXT: [[TMP38:%.*]] = add i64 [[TMP29]], 1067 87; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f3(i64 [[TMP38]], i64 1) 88; CHECK-INLINE-NEXT: [[TMP39:%.*]] = add i64 [[TMP29]], 1066 89; CHECK-INLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP39]], i64 1) 90; CHECK-INLINE-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[TMP22]]) 91; CHECK-INLINE-NEXT: [[TMP40:%.*]] = lshr i64 [[TMP21]], 3 92; CHECK-INLINE-NEXT: [[TMP41:%.*]] = add i64 [[TMP40]], [[TMP1]] 93; CHECK-INLINE-NEXT: [[TMP42:%.*]] = inttoptr i64 [[TMP41]] to ptr 94; CHECK-INLINE-NEXT: [[TMP43:%.*]] = load i8, ptr [[TMP42]], align 1 95; CHECK-INLINE-NEXT: [[TMP44:%.*]] = icmp ne i8 [[TMP43]], 0 96; CHECK-INLINE-NEXT: br i1 [[TMP44]], label [[TMP45:%.*]], label [[TMP50:%.*]], !prof [[PROF1:![0-9]+]] 97; CHECK-INLINE: 45: 98; CHECK-INLINE-NEXT: [[TMP46:%.*]] = and i64 [[TMP21]], 7 99; CHECK-INLINE-NEXT: [[TMP47:%.*]] = trunc i64 [[TMP46]] to i8 100; CHECK-INLINE-NEXT: [[TMP48:%.*]] = icmp sge i8 [[TMP47]], [[TMP43]] 101; CHECK-INLINE-NEXT: br i1 [[TMP48]], label [[TMP49:%.*]], label [[TMP50]] 102; CHECK-INLINE: 49: 103; CHECK-INLINE-NEXT: call void @__asan_report_store1(i64 [[TMP21]]) #[[ATTR8:[0-9]+]] 104; CHECK-INLINE-NEXT: unreachable 105; CHECK-INLINE: 50: 106; CHECK-INLINE-NEXT: store volatile i8 0, ptr [[TMP22]], align 1 107; CHECK-INLINE-NEXT: [[TMP51:%.*]] = add i64 [[TMP29]], 1066 108; CHECK-INLINE-NEXT: call void @__asan_set_shadow_f8(i64 [[TMP51]], i64 1) 109; CHECK-INLINE-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[TMP22]]) 110; CHECK-INLINE-NEXT: [[TMP52:%.*]] = alloca i8, i64 96, align 32 111; CHECK-INLINE-NEXT: [[TMP53:%.*]] = ptrtoint ptr [[TMP52]] to i64 112; CHECK-INLINE-NEXT: [[TMP54:%.*]] = add i64 [[TMP53]], 32 113; CHECK-INLINE-NEXT: call void @__asan_alloca_poison(i64 [[TMP54]], i64 4) 114; CHECK-INLINE-NEXT: [[TMP55:%.*]] = ptrtoint ptr [[TMP52]] to i64 115; CHECK-INLINE-NEXT: store i64 [[TMP55]], ptr [[TMP0]], align 8 116; CHECK-INLINE-NEXT: [[TMP56:%.*]] = inttoptr i64 [[TMP54]] to ptr 117; CHECK-INLINE-NEXT: [[TMP57:%.*]] = alloca i8, i64 96, align 32 118; CHECK-INLINE-NEXT: [[TMP58:%.*]] = ptrtoint ptr [[TMP57]] to i64 119; CHECK-INLINE-NEXT: [[TMP59:%.*]] = add i64 [[TMP58]], 32 120; CHECK-INLINE-NEXT: call void @__asan_alloca_poison(i64 [[TMP59]], i64 8) 121; CHECK-INLINE-NEXT: [[TMP60:%.*]] = ptrtoint ptr [[TMP57]] to i64 122; CHECK-INLINE-NEXT: store i64 [[TMP60]], ptr [[TMP0]], align 8 123; CHECK-INLINE-NEXT: [[TMP61:%.*]] = inttoptr i64 [[TMP59]] to ptr 124; CHECK-INLINE-NEXT: [[TMP62:%.*]] = lshr i64 [[TMP59]], 3 125; CHECK-INLINE-NEXT: [[TMP63:%.*]] = add i64 [[TMP62]], [[TMP1]] 126; CHECK-INLINE-NEXT: [[TMP64:%.*]] = inttoptr i64 [[TMP63]] to ptr 127; CHECK-INLINE-NEXT: [[TMP65:%.*]] = load i8, ptr [[TMP64]], align 1 128; CHECK-INLINE-NEXT: [[TMP66:%.*]] = icmp ne i8 [[TMP65]], 0 129; CHECK-INLINE-NEXT: br i1 [[TMP66]], label [[TMP67:%.*]], label [[TMP68:%.*]] 130; CHECK-INLINE: 67: 131; CHECK-INLINE-NEXT: call void @__asan_report_store8(i64 [[TMP59]]) #[[ATTR8]] 132; CHECK-INLINE-NEXT: unreachable 133; CHECK-INLINE: 68: 134; CHECK-INLINE-NEXT: store volatile i64 0, ptr [[TMP61]], align 8 135; CHECK-INLINE-NEXT: [[TMPCOPYI64:%.*]] = load i64, ptr [[TMP61]], align 8 136; CHECK-INLINE-NEXT: [[TMP69:%.*]] = and i64 [[TMPCOPYI64]], 31 137; CHECK-INLINE-NEXT: [[TMP70:%.*]] = sub i64 32, [[TMP69]] 138; CHECK-INLINE-NEXT: [[TMP71:%.*]] = icmp ne i64 [[TMP70]], 32 139; CHECK-INLINE-NEXT: [[TMP72:%.*]] = select i1 [[TMP71]], i64 [[TMP70]], i64 0 140; CHECK-INLINE-NEXT: [[TMP73:%.*]] = add i64 64, [[TMP72]] 141; CHECK-INLINE-NEXT: [[TMP74:%.*]] = add i64 [[TMPCOPYI64]], [[TMP73]] 142; CHECK-INLINE-NEXT: [[TMP75:%.*]] = alloca i8, i64 [[TMP74]], align 32 143; CHECK-INLINE-NEXT: [[TMP76:%.*]] = ptrtoint ptr [[TMP75]] to i64 144; CHECK-INLINE-NEXT: [[TMP77:%.*]] = add i64 [[TMP76]], 32 145; CHECK-INLINE-NEXT: call void @__asan_alloca_poison(i64 [[TMP77]], i64 [[TMPCOPYI64]]) 146; CHECK-INLINE-NEXT: [[TMP78:%.*]] = ptrtoint ptr [[TMP75]] to i64 147; CHECK-INLINE-NEXT: store i64 [[TMP78]], ptr [[TMP0]], align 8 148; CHECK-INLINE-NEXT: [[TMP79:%.*]] = inttoptr i64 [[TMP77]] to ptr 149; CHECK-INLINE-NEXT: [[TMP80:%.*]] = lshr i64 [[TMP77]], 3 150; CHECK-INLINE-NEXT: [[TMP81:%.*]] = add i64 [[TMP80]], [[TMP1]] 151; CHECK-INLINE-NEXT: [[TMP82:%.*]] = inttoptr i64 [[TMP81]] to ptr 152; CHECK-INLINE-NEXT: [[TMP83:%.*]] = load i8, ptr [[TMP82]], align 1 153; CHECK-INLINE-NEXT: [[TMP84:%.*]] = icmp ne i8 [[TMP83]], 0 154; CHECK-INLINE-NEXT: br i1 [[TMP84]], label [[TMP85:%.*]], label [[TMP90:%.*]], !prof [[PROF1]] 155; CHECK-INLINE: 85: 156; CHECK-INLINE-NEXT: [[TMP86:%.*]] = and i64 [[TMP77]], 7 157; CHECK-INLINE-NEXT: [[TMP87:%.*]] = trunc i64 [[TMP86]] to i8 158; CHECK-INLINE-NEXT: [[TMP88:%.*]] = icmp sge i8 [[TMP87]], [[TMP83]] 159; CHECK-INLINE-NEXT: br i1 [[TMP88]], label [[TMP89:%.*]], label [[TMP90]] 160; CHECK-INLINE: 89: 161; CHECK-INLINE-NEXT: call void @__asan_report_store1(i64 [[TMP77]]) #[[ATTR8]] 162; CHECK-INLINE-NEXT: unreachable 163; CHECK-INLINE: 90: 164; CHECK-INLINE-NEXT: store volatile i8 0, ptr [[TMP79]], align 1 165; CHECK-INLINE-NEXT: invoke void @MayThrowFunc() 166; CHECK-INLINE-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[EHCLEANUP:%.*]] 167; CHECK-INLINE: invoke.cont: 168; CHECK-INLINE-NEXT: call void @DeInit(ptr [[TMP14]]) 169; CHECK-INLINE-NEXT: [[TMP91:%.*]] = ptrtoint ptr [[TMP0]] to i64 170; CHECK-INLINE-NEXT: [[TMP92:%.*]] = load i64, ptr [[TMP0]], align 8 171; CHECK-INLINE-NEXT: call void @__asan_allocas_unpoison(i64 [[TMP92]], i64 [[TMP91]]) 172; CHECK-INLINE-NEXT: store i64 1172321806, ptr [[TMP23]], align 8 173; CHECK-INLINE-NEXT: [[TMP93:%.*]] = icmp ne i64 [[TMP7]], 0 174; CHECK-INLINE-NEXT: br i1 [[TMP93]], label [[TMP94:%.*]], label [[TMP95:%.*]] 175; CHECK-INLINE: 94: 176; CHECK-INLINE-NEXT: call void @__asan_stack_free_8(i64 [[TMP7]], i64 8544) 177; CHECK-INLINE-NEXT: br label [[TMP97:%.*]] 178; CHECK-INLINE: 95: 179; CHECK-INLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP29]], i64 4) 180; CHECK-INLINE-NEXT: [[TMP96:%.*]] = add i64 [[TMP29]], 1028 181; CHECK-INLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP96]], i64 40) 182; CHECK-INLINE-NEXT: br label [[TMP97]] 183; CHECK-INLINE: 97: 184; CHECK-INLINE-NEXT: ret void 185; CHECK-INLINE: ehcleanup: 186; CHECK-INLINE-NEXT: [[TMP98:%.*]] = cleanuppad within none [] 187; CHECK-INLINE-NEXT: call void @__asan_unpoison_stack_memory(i64 [[TMP54]], i64 4) [ "funclet"(token [[TMP98]]) ] 188; CHECK-INLINE-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[TMP56]]) 189; CHECK-INLINE-NEXT: [[TMP99:%.*]] = lshr i64 [[TMP54]], 3 190; CHECK-INLINE-NEXT: [[TMP100:%.*]] = add i64 [[TMP99]], [[TMP1]] 191; CHECK-INLINE-NEXT: [[TMP101:%.*]] = inttoptr i64 [[TMP100]] to ptr 192; CHECK-INLINE-NEXT: [[TMP102:%.*]] = load i8, ptr [[TMP101]], align 1 193; CHECK-INLINE-NEXT: [[TMP103:%.*]] = icmp ne i8 [[TMP102]], 0 194; CHECK-INLINE-NEXT: br i1 [[TMP103]], label [[TMP104:%.*]], label [[TMP109:%.*]], !prof [[PROF1]] 195; CHECK-INLINE: 104: 196; CHECK-INLINE-NEXT: [[TMP105:%.*]] = and i64 [[TMP54]], 7 197; CHECK-INLINE-NEXT: [[TMP106:%.*]] = trunc i64 [[TMP105]] to i8 198; CHECK-INLINE-NEXT: [[TMP107:%.*]] = icmp sge i8 [[TMP106]], [[TMP102]] 199; CHECK-INLINE-NEXT: br i1 [[TMP107]], label [[TMP108:%.*]], label [[TMP109]] 200; CHECK-INLINE: 108: 201; CHECK-INLINE-NEXT: call void @__asan_report_store1(i64 [[TMP54]]) #[[ATTR8]] [ "funclet"(token [[TMP98]]) ] 202; CHECK-INLINE-NEXT: unreachable 203; CHECK-INLINE: 109: 204; CHECK-INLINE-NEXT: store volatile i8 0, ptr [[TMP56]], align 1 205; CHECK-INLINE-NEXT: call void @__asan_poison_stack_memory(i64 [[TMP54]], i64 4) [ "funclet"(token [[TMP98]]) ] 206; CHECK-INLINE-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[TMP56]]) 207; CHECK-INLINE-NEXT: call void @DeInit(ptr [[TMP14]]) [ "funclet"(token [[TMP98]]) ] 208; CHECK-INLINE-NEXT: [[TMP110:%.*]] = call ptr @__asan_memset(ptr [[TMP16]], i32 0, i64 4) [ "funclet"(token [[TMP98]]) ] 209; CHECK-INLINE-NEXT: [[TMP111:%.*]] = call ptr @__asan_memcpy(ptr [[TMP18]], ptr [[TMP16]], i64 4) [ "funclet"(token [[TMP98]]) ] 210; CHECK-INLINE-NEXT: [[TMP112:%.*]] = call ptr @__asan_memmove(ptr [[TMP20]], ptr [[TMP16]], i64 4) [ "funclet"(token [[TMP98]]) ] 211; CHECK-INLINE-NEXT: call void @__sanitizer_ptr_cmp(i64 [[TMP15]], i64 [[TMP17]]) [ "funclet"(token [[TMP98]]) ] 212; CHECK-INLINE-NEXT: call void @__sanitizer_ptr_sub(i64 [[TMP15]], i64 [[TMP17]]) [ "funclet"(token [[TMP98]]) ] 213; CHECK-INLINE-NEXT: [[TMP113:%.*]] = ptrtoint ptr [[PTRPARAM]] to i64 214; CHECK-INLINE-NEXT: [[TMP114:%.*]] = add i64 [[TMP113]], 7 215; CHECK-INLINE-NEXT: [[TMP115:%.*]] = inttoptr i64 [[TMP114]] to ptr 216; CHECK-INLINE-NEXT: [[TMP116:%.*]] = ptrtoint ptr [[PTRPARAM]] to i64 217; CHECK-INLINE-NEXT: [[TMP117:%.*]] = lshr i64 [[TMP116]], 3 218; CHECK-INLINE-NEXT: [[TMP118:%.*]] = add i64 [[TMP117]], [[TMP1]] 219; CHECK-INLINE-NEXT: [[TMP119:%.*]] = inttoptr i64 [[TMP118]] to ptr 220; CHECK-INLINE-NEXT: [[TMP120:%.*]] = load i8, ptr [[TMP119]], align 1 221; CHECK-INLINE-NEXT: [[TMP121:%.*]] = icmp ne i8 [[TMP120]], 0 222; CHECK-INLINE-NEXT: br i1 [[TMP121]], label [[TMP122:%.*]], label [[TMP127:%.*]], !prof [[PROF1]] 223; CHECK-INLINE: 122: 224; CHECK-INLINE-NEXT: [[TMP123:%.*]] = and i64 [[TMP116]], 7 225; CHECK-INLINE-NEXT: [[TMP124:%.*]] = trunc i64 [[TMP123]] to i8 226; CHECK-INLINE-NEXT: [[TMP125:%.*]] = icmp sge i8 [[TMP124]], [[TMP120]] 227; CHECK-INLINE-NEXT: br i1 [[TMP125]], label [[TMP126:%.*]], label [[TMP127]] 228; CHECK-INLINE: 126: 229; CHECK-INLINE-NEXT: call void @__asan_report_store_n(i64 [[TMP116]], i64 8) #[[ATTR8]] [ "funclet"(token [[TMP98]]) ] 230; CHECK-INLINE-NEXT: unreachable 231; CHECK-INLINE: 127: 232; CHECK-INLINE-NEXT: [[TMP128:%.*]] = lshr i64 [[TMP114]], 3 233; CHECK-INLINE-NEXT: [[TMP129:%.*]] = add i64 [[TMP128]], [[TMP1]] 234; CHECK-INLINE-NEXT: [[TMP130:%.*]] = inttoptr i64 [[TMP129]] to ptr 235; CHECK-INLINE-NEXT: [[TMP131:%.*]] = load i8, ptr [[TMP130]], align 1 236; CHECK-INLINE-NEXT: [[TMP132:%.*]] = icmp ne i8 [[TMP131]], 0 237; CHECK-INLINE-NEXT: br i1 [[TMP132]], label [[TMP133:%.*]], label [[EHEXIT:%.*]], !prof [[PROF1]] 238; CHECK-INLINE: 133: 239; CHECK-INLINE-NEXT: [[TMP134:%.*]] = and i64 [[TMP114]], 7 240; CHECK-INLINE-NEXT: [[TMP135:%.*]] = trunc i64 [[TMP134]] to i8 241; CHECK-INLINE-NEXT: [[TMP136:%.*]] = icmp sge i8 [[TMP135]], [[TMP131]] 242; CHECK-INLINE-NEXT: br i1 [[TMP136]], label [[TMP137:%.*]], label [[EHEXIT]] 243; CHECK-INLINE: 137: 244; CHECK-INLINE-NEXT: call void @__asan_report_store_n(i64 [[TMP114]], i64 8) #[[ATTR8]] [ "funclet"(token [[TMP98]]) ] 245; CHECK-INLINE-NEXT: unreachable 246; CHECK-INLINE: ehexit: 247; CHECK-INLINE-NEXT: store i64 0, ptr [[PTRPARAM]], align 1 248; CHECK-INLINE-NEXT: [[TMP138:%.*]] = call i64 @llvm.get.dynamic.area.offset.i64() 249; CHECK-INLINE-NEXT: [[TMP139:%.*]] = ptrtoint ptr [[TMP0]] to i64 250; CHECK-INLINE-NEXT: [[TMP140:%.*]] = add i64 [[TMP139]], [[TMP138]] 251; CHECK-INLINE-NEXT: [[TMP141:%.*]] = load i64, ptr [[TMP0]], align 8 252; CHECK-INLINE-NEXT: call void @__asan_allocas_unpoison(i64 [[TMP141]], i64 [[TMP140]]) [ "funclet"(token [[TMP98]]) ] 253; CHECK-INLINE-NEXT: store i64 1172321806, ptr [[TMP23]], align 8 254; CHECK-INLINE-NEXT: [[TMP142:%.*]] = icmp ne i64 [[TMP7]], 0 255; CHECK-INLINE-NEXT: br i1 [[TMP142]], label [[TMP143:%.*]], label [[TMP144:%.*]] 256; CHECK-INLINE: 143: 257; CHECK-INLINE-NEXT: call void @__asan_stack_free_8(i64 [[TMP7]], i64 8544) [ "funclet"(token [[TMP98]]) ] 258; CHECK-INLINE-NEXT: br label [[TMP146:%.*]] 259; CHECK-INLINE: 144: 260; CHECK-INLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP29]], i64 4) [ "funclet"(token [[TMP98]]) ] 261; CHECK-INLINE-NEXT: [[TMP145:%.*]] = add i64 [[TMP29]], 1028 262; CHECK-INLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP145]], i64 40) [ "funclet"(token [[TMP98]]) ] 263; CHECK-INLINE-NEXT: br label [[TMP146]] 264; CHECK-INLINE: 146: 265; CHECK-INLINE-NEXT: cleanupret from [[TMP98]] unwind to caller 266; 267; CHECK-OUTLINE-LABEL: define void @FuncletPersonality( 268; CHECK-OUTLINE-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR4:[0-9]+]] personality ptr @__CxxFrameHandler3 { 269; CHECK-OUTLINE-NEXT: entry: 270; CHECK-OUTLINE-NEXT: [[TMP0:%.*]] = alloca i64, align 32 271; CHECK-OUTLINE-NEXT: store i64 0, ptr [[TMP0]], align 8 272; CHECK-OUTLINE-NEXT: [[TMP1:%.*]] = load i64, ptr @__asan_shadow_memory_dynamic_address, align 8 273; CHECK-OUTLINE-NEXT: [[ASAN_LOCAL_STACK_BASE:%.*]] = alloca i64, align 8 274; CHECK-OUTLINE-NEXT: [[TMP2:%.*]] = load i32, ptr @__asan_option_detect_stack_use_after_return, align 4 275; CHECK-OUTLINE-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 276; CHECK-OUTLINE-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP6:%.*]] 277; CHECK-OUTLINE: 4: 278; CHECK-OUTLINE-NEXT: [[TMP5:%.*]] = call i64 @__asan_stack_malloc_8(i64 8608) 279; CHECK-OUTLINE-NEXT: br label [[TMP6]] 280; CHECK-OUTLINE: 6: 281; CHECK-OUTLINE-NEXT: [[TMP7:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[TMP5]], [[TMP4]] ] 282; CHECK-OUTLINE-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 0 283; CHECK-OUTLINE-NEXT: br i1 [[TMP8]], label [[TMP9:%.*]], label [[TMP11:%.*]] 284; CHECK-OUTLINE: 9: 285; CHECK-OUTLINE-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 8608, align 32 286; CHECK-OUTLINE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 287; CHECK-OUTLINE-NEXT: br label [[TMP11]] 288; CHECK-OUTLINE: 11: 289; CHECK-OUTLINE-NEXT: [[TMP12:%.*]] = phi i64 [ [[TMP7]], [[TMP6]] ], [ [[TMP10]], [[TMP9]] ] 290; CHECK-OUTLINE-NEXT: store i64 [[TMP12]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 291; CHECK-OUTLINE-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 32 292; CHECK-OUTLINE-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr 293; CHECK-OUTLINE-NEXT: [[TMP15:%.*]] = add i64 [[TMP12]], 8480 294; CHECK-OUTLINE-NEXT: [[TMP16:%.*]] = inttoptr i64 [[TMP15]] to ptr 295; CHECK-OUTLINE-NEXT: [[TMP17:%.*]] = add i64 [[TMP12]], 8496 296; CHECK-OUTLINE-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr 297; CHECK-OUTLINE-NEXT: [[TMP19:%.*]] = add i64 [[TMP12]], 8512 298; CHECK-OUTLINE-NEXT: [[TMP20:%.*]] = inttoptr i64 [[TMP19]] to ptr 299; CHECK-OUTLINE-NEXT: [[TMP21:%.*]] = add i64 [[TMP12]], 8528 300; CHECK-OUTLINE-NEXT: [[TMP22:%.*]] = inttoptr i64 [[TMP21]] to ptr 301; CHECK-OUTLINE-NEXT: [[TMP23:%.*]] = add i64 [[TMP12]], 8544 302; CHECK-OUTLINE-NEXT: [[TMP24:%.*]] = inttoptr i64 [[TMP23]] to ptr 303; CHECK-OUTLINE-NEXT: [[TMP25:%.*]] = add i64 [[TMP12]], 8560 304; CHECK-OUTLINE-NEXT: [[TMP26:%.*]] = inttoptr i64 [[TMP25]] to ptr 305; CHECK-OUTLINE-NEXT: [[TMP27:%.*]] = inttoptr i64 [[TMP12]] to ptr 306; CHECK-OUTLINE-NEXT: store i64 1102416563, ptr [[TMP27]], align 8 307; CHECK-OUTLINE-NEXT: [[TMP28:%.*]] = add i64 [[TMP12]], 8 308; CHECK-OUTLINE-NEXT: [[TMP29:%.*]] = inttoptr i64 [[TMP28]] to ptr 309; CHECK-OUTLINE-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack to i64), ptr [[TMP29]], align 8 310; CHECK-OUTLINE-NEXT: [[TMP30:%.*]] = add i64 [[TMP12]], 16 311; CHECK-OUTLINE-NEXT: [[TMP31:%.*]] = inttoptr i64 [[TMP30]] to ptr 312; CHECK-OUTLINE-NEXT: store i64 ptrtoint (ptr @FuncletPersonality to i64), ptr [[TMP31]], align 8 313; CHECK-OUTLINE-NEXT: [[TMP32:%.*]] = lshr i64 [[TMP12]], 3 314; CHECK-OUTLINE-NEXT: [[TMP33:%.*]] = add i64 [[TMP32]], [[TMP1]] 315; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f1(i64 [[TMP33]], i64 4) 316; CHECK-OUTLINE-NEXT: [[TMP34:%.*]] = add i64 [[TMP33]], 1028 317; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP34]], i64 32) 318; CHECK-OUTLINE-NEXT: [[TMP35:%.*]] = add i64 [[TMP33]], 1060 319; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP35]], i64 1) 320; CHECK-OUTLINE-NEXT: [[TMP36:%.*]] = add i64 [[TMP33]], 1061 321; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP36]], i64 1) 322; CHECK-OUTLINE-NEXT: [[TMP37:%.*]] = add i64 [[TMP33]], 1062 323; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP37]], i64 1) 324; CHECK-OUTLINE-NEXT: [[TMP38:%.*]] = add i64 [[TMP33]], 1063 325; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP38]], i64 1) 326; CHECK-OUTLINE-NEXT: [[TMP39:%.*]] = add i64 [[TMP33]], 1064 327; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP39]], i64 1) 328; CHECK-OUTLINE-NEXT: [[TMP40:%.*]] = add i64 [[TMP33]], 1065 329; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP40]], i64 1) 330; CHECK-OUTLINE-NEXT: [[TMP41:%.*]] = add i64 [[TMP33]], 1066 331; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f8(i64 [[TMP41]], i64 1) 332; CHECK-OUTLINE-NEXT: [[TMP42:%.*]] = add i64 [[TMP33]], 1067 333; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP42]], i64 1) 334; CHECK-OUTLINE-NEXT: [[TMP43:%.*]] = add i64 [[TMP33]], 1068 335; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f8(i64 [[TMP43]], i64 1) 336; CHECK-OUTLINE-NEXT: [[TMP44:%.*]] = add i64 [[TMP33]], 1069 337; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f2(i64 [[TMP44]], i64 1) 338; CHECK-OUTLINE-NEXT: [[TMP45:%.*]] = add i64 [[TMP33]], 1071 339; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f3(i64 [[TMP45]], i64 5) 340; CHECK-OUTLINE-NEXT: [[TMP46:%.*]] = add i64 [[TMP33]], 1066 341; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP46]], i64 1) 342; CHECK-OUTLINE-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[TMP22]]) 343; CHECK-OUTLINE-NEXT: call void @__asan_store1(i64 [[TMP21]]) 344; CHECK-OUTLINE-NEXT: store volatile i8 0, ptr [[TMP22]], align 1 345; CHECK-OUTLINE-NEXT: [[TMP47:%.*]] = add i64 [[TMP33]], 1066 346; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f8(i64 [[TMP47]], i64 1) 347; CHECK-OUTLINE-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[TMP22]]) 348; CHECK-OUTLINE-NEXT: call void @__asan_store8(i64 [[TMP25]]) 349; CHECK-OUTLINE-NEXT: store volatile i64 0, ptr [[TMP26]], align 8 350; CHECK-OUTLINE-NEXT: [[TMPCOPYI64:%.*]] = load i64, ptr [[TMP26]], align 8 351; CHECK-OUTLINE-NEXT: [[TMP48:%.*]] = and i64 [[TMPCOPYI64]], 31 352; CHECK-OUTLINE-NEXT: [[TMP49:%.*]] = sub i64 32, [[TMP48]] 353; CHECK-OUTLINE-NEXT: [[TMP50:%.*]] = icmp ne i64 [[TMP49]], 32 354; CHECK-OUTLINE-NEXT: [[TMP51:%.*]] = select i1 [[TMP50]], i64 [[TMP49]], i64 0 355; CHECK-OUTLINE-NEXT: [[TMP52:%.*]] = add i64 64, [[TMP51]] 356; CHECK-OUTLINE-NEXT: [[TMP53:%.*]] = add i64 [[TMPCOPYI64]], [[TMP52]] 357; CHECK-OUTLINE-NEXT: [[TMP54:%.*]] = alloca i8, i64 [[TMP53]], align 32 358; CHECK-OUTLINE-NEXT: [[TMP55:%.*]] = ptrtoint ptr [[TMP54]] to i64 359; CHECK-OUTLINE-NEXT: [[TMP56:%.*]] = add i64 [[TMP55]], 32 360; CHECK-OUTLINE-NEXT: call void @__asan_alloca_poison(i64 [[TMP56]], i64 [[TMPCOPYI64]]) 361; CHECK-OUTLINE-NEXT: [[TMP57:%.*]] = ptrtoint ptr [[TMP54]] to i64 362; CHECK-OUTLINE-NEXT: store i64 [[TMP57]], ptr [[TMP0]], align 8 363; CHECK-OUTLINE-NEXT: [[TMP58:%.*]] = inttoptr i64 [[TMP56]] to ptr 364; CHECK-OUTLINE-NEXT: call void @__asan_store1(i64 [[TMP56]]) 365; CHECK-OUTLINE-NEXT: store volatile i8 0, ptr [[TMP58]], align 1 366; CHECK-OUTLINE-NEXT: invoke void @MayThrowFunc() 367; CHECK-OUTLINE-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[EHCLEANUP:%.*]] 368; CHECK-OUTLINE: invoke.cont: 369; CHECK-OUTLINE-NEXT: call void @DeInit(ptr [[TMP14]]) 370; CHECK-OUTLINE-NEXT: [[TMP59:%.*]] = ptrtoint ptr [[TMP0]] to i64 371; CHECK-OUTLINE-NEXT: [[TMP60:%.*]] = load i64, ptr [[TMP0]], align 8 372; CHECK-OUTLINE-NEXT: call void @__asan_allocas_unpoison(i64 [[TMP60]], i64 [[TMP59]]) 373; CHECK-OUTLINE-NEXT: store i64 1172321806, ptr [[TMP27]], align 8 374; CHECK-OUTLINE-NEXT: [[TMP61:%.*]] = icmp ne i64 [[TMP7]], 0 375; CHECK-OUTLINE-NEXT: br i1 [[TMP61]], label [[TMP62:%.*]], label [[TMP63:%.*]] 376; CHECK-OUTLINE: 62: 377; CHECK-OUTLINE-NEXT: call void @__asan_stack_free_8(i64 [[TMP7]], i64 8608) 378; CHECK-OUTLINE-NEXT: br label [[TMP66:%.*]] 379; CHECK-OUTLINE: 63: 380; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP33]], i64 4) 381; CHECK-OUTLINE-NEXT: [[TMP64:%.*]] = add i64 [[TMP33]], 1028 382; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP64]], i64 42) 383; CHECK-OUTLINE-NEXT: [[TMP65:%.*]] = add i64 [[TMP33]], 1071 384; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP65]], i64 5) 385; CHECK-OUTLINE-NEXT: br label [[TMP66]] 386; CHECK-OUTLINE: 66: 387; CHECK-OUTLINE-NEXT: ret void 388; CHECK-OUTLINE: ehcleanup: 389; CHECK-OUTLINE-NEXT: [[TMP67:%.*]] = cleanuppad within none [] 390; CHECK-OUTLINE-NEXT: [[TMP68:%.*]] = add i64 [[TMP33]], 1068 391; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_04(i64 [[TMP68]], i64 1) [ "funclet"(token [[TMP67]]) ] 392; CHECK-OUTLINE-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[TMP24]]) 393; CHECK-OUTLINE-NEXT: call void @__asan_store1(i64 [[TMP23]]) [ "funclet"(token [[TMP67]]) ] 394; CHECK-OUTLINE-NEXT: store volatile i8 0, ptr [[TMP24]], align 1 395; CHECK-OUTLINE-NEXT: [[TMP69:%.*]] = add i64 [[TMP33]], 1068 396; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_f8(i64 [[TMP69]], i64 1) [ "funclet"(token [[TMP67]]) ] 397; CHECK-OUTLINE-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[TMP24]]) 398; CHECK-OUTLINE-NEXT: call void @DeInit(ptr [[TMP14]]) [ "funclet"(token [[TMP67]]) ] 399; CHECK-OUTLINE-NEXT: [[TMP70:%.*]] = call ptr @__asan_memset(ptr [[TMP16]], i32 0, i64 4) [ "funclet"(token [[TMP67]]) ] 400; CHECK-OUTLINE-NEXT: [[TMP71:%.*]] = call ptr @__asan_memcpy(ptr [[TMP18]], ptr [[TMP16]], i64 4) [ "funclet"(token [[TMP67]]) ] 401; CHECK-OUTLINE-NEXT: [[TMP72:%.*]] = call ptr @__asan_memmove(ptr [[TMP20]], ptr [[TMP16]], i64 4) [ "funclet"(token [[TMP67]]) ] 402; CHECK-OUTLINE-NEXT: call void @__sanitizer_ptr_cmp(i64 [[TMP15]], i64 [[TMP17]]) [ "funclet"(token [[TMP67]]) ] 403; CHECK-OUTLINE-NEXT: call void @__sanitizer_ptr_sub(i64 [[TMP15]], i64 [[TMP17]]) [ "funclet"(token [[TMP67]]) ] 404; CHECK-OUTLINE-NEXT: [[TMP73:%.*]] = ptrtoint ptr [[PTRPARAM]] to i64 405; CHECK-OUTLINE-NEXT: call void @__asan_storeN(i64 [[TMP73]], i64 8) [ "funclet"(token [[TMP67]]) ] 406; CHECK-OUTLINE-NEXT: store i64 0, ptr [[PTRPARAM]], align 1 407; CHECK-OUTLINE-NEXT: [[TMP74:%.*]] = call i64 @llvm.get.dynamic.area.offset.i64() 408; CHECK-OUTLINE-NEXT: [[TMP75:%.*]] = ptrtoint ptr [[TMP0]] to i64 409; CHECK-OUTLINE-NEXT: [[TMP76:%.*]] = add i64 [[TMP75]], [[TMP74]] 410; CHECK-OUTLINE-NEXT: [[TMP77:%.*]] = load i64, ptr [[TMP0]], align 8 411; CHECK-OUTLINE-NEXT: call void @__asan_allocas_unpoison(i64 [[TMP77]], i64 [[TMP76]]) [ "funclet"(token [[TMP67]]) ] 412; CHECK-OUTLINE-NEXT: store i64 1172321806, ptr [[TMP27]], align 8 413; CHECK-OUTLINE-NEXT: [[TMP78:%.*]] = icmp ne i64 [[TMP7]], 0 414; CHECK-OUTLINE-NEXT: br i1 [[TMP78]], label [[TMP79:%.*]], label [[TMP80:%.*]] 415; CHECK-OUTLINE: 79: 416; CHECK-OUTLINE-NEXT: call void @__asan_stack_free_8(i64 [[TMP7]], i64 8608) [ "funclet"(token [[TMP67]]) ] 417; CHECK-OUTLINE-NEXT: br label [[TMP83:%.*]] 418; CHECK-OUTLINE: 80: 419; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP33]], i64 4) [ "funclet"(token [[TMP67]]) ] 420; CHECK-OUTLINE-NEXT: [[TMP81:%.*]] = add i64 [[TMP33]], 1028 421; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP81]], i64 42) [ "funclet"(token [[TMP67]]) ] 422; CHECK-OUTLINE-NEXT: [[TMP82:%.*]] = add i64 [[TMP33]], 1071 423; CHECK-OUTLINE-NEXT: call void @__asan_set_shadow_00(i64 [[TMP82]], i64 5) [ "funclet"(token [[TMP67]]) ] 424; CHECK-OUTLINE-NEXT: br label [[TMP83]] 425; CHECK-OUTLINE: 83: 426; CHECK-OUTLINE-NEXT: cleanupret from [[TMP67]] unwind to caller 427; 428 429 430entry: 431 ; Large enough local alloca to have asan generate a __asan_stack_free_#() call 432 %largeObj = alloca [2048 x i32], align 16 433 %tmpInt1 = alloca i32, align 4 434 %tmpInt2 = alloca i32, align 4 435 %tmpInt3 = alloca i32, align 4 436 437 ; Creating %lifetimeInt and %lifetimeArr, and managing their lifetimes 438 ; to make asan generate stack poisoning calls 439 %lifetimeInt = alloca i32, align 4 440 call void @llvm.lifetime.start.p0(i64 4, ptr %lifetimeInt) 441 store volatile i8 0, ptr %lifetimeInt 442 call void @llvm.lifetime.end.p0(i64 4, ptr %lifetimeInt) 443 %lifetimeArr = alloca i32, align 4 444 445 ; Dynamic alloca to generate a @__asan_allocas_unpoison call in ehcleanup 446 %tmpVolatilei64 = alloca i64, align 8 447 store volatile i64 0, ptr %tmpVolatilei64, align 8 448 %tmpCopyi64 = load i64, ptr %tmpVolatilei64, align 8 449 %tmpVolatilei8 = alloca i8, i64 %tmpCopyi64, align 32 450 store volatile i8 0, ptr %tmpVolatilei8 451 452 invoke void @MayThrowFunc() 453 to label %invoke.cont unwind label %ehcleanup 454invoke.cont: ; preds = %entry 455 call void @DeInit(ptr %largeObj) 456 ret void 457 458ehcleanup: ; preds = %entry 459 %0 = cleanuppad within none [] 460 461 ; Make asan add a call to __asan_unpoison_stack_memory 462 call void @llvm.lifetime.start.p0(i64 4, ptr %lifetimeArr) 463 ; Make asan add a call to __asan_report_store1 464 store volatile i8 0, ptr %lifetimeArr 465 ; Make asan add a call to __asan_poison_stack_memory 466 call void @llvm.lifetime.end.p0(i64 4, ptr %lifetimeArr) 467 468 call void @DeInit(ptr %largeObj) [ "funclet"(token %0) ] 469 call void @llvm.memset.p0.i64(ptr align 4 %tmpInt1, i8 0, i64 4, i1 false) 470 call void @llvm.memcpy.p0.p0.i64(ptr align 4 %tmpInt2, ptr align 4 %tmpInt1, i64 4, i1 false) 471 call void @llvm.memmove.p0.p0.i64(ptr align 4 %tmpInt3, ptr align 4 %tmpInt1, i64 4, i1 false) 472 %cmpAddr = icmp ule ptr %tmpInt1, %tmpInt2 473 %addr1 = ptrtoint ptr %tmpInt1 to i64 474 %addr2 = ptrtoint ptr %tmpInt2 to i64 475 %subAddr = sub i64 %addr1, %addr2 476 477 store i64 0, ptr %ptrParam, align 1 478 479 %cmp = icmp ne i64 %subAddr, 0 480 br i1 %cmp, label %ehexit, label %noreturncall 481 482noreturncall: 483 call void @NoReturn(ptr null, ptr null) noreturn [ "funclet"(token %0) ] 484 unreachable 485 486ehexit: 487 cleanupret from %0 unwind to caller 488 489; Ensure unreachable basic block doesn't make the compiler assert, as it's a special case for coloring computation. 490nopredecessor: 491 call void @llvm.memset.p0.i64(ptr align 4 %tmpInt1, i8 0, i64 4, i1 false) 492 unreachable 493} 494 495; Non-Windows personality, ensure no funclet gets attached to asan runtime call. 496define void @OtherPersonality(ptr %ptrParam) sanitize_address personality ptr @dummyPersonality { 497; CHECK-LABEL: define void @OtherPersonality( 498; CHECK-SAME: ptr [[PTRPARAM:%.*]]) #[[ATTR4:[0-9]+]] personality ptr @dummyPersonality { 499; CHECK-NEXT: entry: 500; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__asan_shadow_memory_dynamic_address, align 8 501; CHECK-NEXT: [[ASAN_LOCAL_STACK_BASE:%.*]] = alloca i64, align 8 502; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__asan_option_detect_stack_use_after_return, align 4 503; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 504; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]] 505; CHECK: 3: 506; CHECK-NEXT: [[TMP4:%.*]] = call i64 @__asan_stack_malloc_0(i64 64) 507; CHECK-NEXT: br label [[TMP5]] 508; CHECK: 5: 509; CHECK-NEXT: [[TMP6:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[TMP4]], [[TMP3]] ] 510; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[TMP6]], 0 511; CHECK-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP10:%.*]] 512; CHECK: 8: 513; CHECK-NEXT: [[MYALLOCA:%.*]] = alloca i8, i64 64, align 32 514; CHECK-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[MYALLOCA]] to i64 515; CHECK-NEXT: br label [[TMP10]] 516; CHECK: 10: 517; CHECK-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP6]], [[TMP5]] ], [ [[TMP9]], [[TMP8]] ] 518; CHECK-NEXT: store i64 [[TMP11]], ptr [[ASAN_LOCAL_STACK_BASE]], align 8 519; CHECK-NEXT: [[TMP12:%.*]] = add i64 [[TMP11]], 32 520; CHECK-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP12]] to ptr 521; CHECK-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP11]] to ptr 522; CHECK-NEXT: store i64 1102416563, ptr [[TMP14]], align 8 523; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[TMP11]], 8 524; CHECK-NEXT: [[TMP16:%.*]] = inttoptr i64 [[TMP15]] to ptr 525; CHECK-NEXT: store i64 ptrtoint (ptr @___asan_gen_stack.1 to i64), ptr [[TMP16]], align 8 526; CHECK-NEXT: [[TMP17:%.*]] = add i64 [[TMP11]], 16 527; CHECK-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr 528; CHECK-NEXT: store i64 ptrtoint (ptr @OtherPersonality to i64), ptr [[TMP18]], align 8 529; CHECK-NEXT: [[TMP19:%.*]] = lshr i64 [[TMP11]], 3 530; CHECK-NEXT: [[TMP20:%.*]] = add i64 [[TMP19]], [[TMP0]] 531; CHECK-NEXT: [[TMP21:%.*]] = add i64 [[TMP20]], 0 532; CHECK-NEXT: call void @__asan_set_shadow_f1(i64 [[TMP21]], i64 4) 533; CHECK-NEXT: [[TMP22:%.*]] = add i64 [[TMP20]], 4 534; CHECK-NEXT: call void @__asan_set_shadow_04(i64 [[TMP22]], i64 1) 535; CHECK-NEXT: [[TMP23:%.*]] = add i64 [[TMP20]], 5 536; CHECK-NEXT: call void @__asan_set_shadow_f3(i64 [[TMP23]], i64 3) 537; CHECK-NEXT: invoke void @MayThrowFunc() 538; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[EHCLEANUP:%.*]] 539; CHECK: invoke.cont: 540; CHECK-NEXT: store i64 1172321806, ptr [[TMP14]], align 8 541; CHECK-NEXT: [[TMP24:%.*]] = icmp ne i64 [[TMP6]], 0 542; CHECK-NEXT: br i1 [[TMP24]], label [[TMP25:%.*]], label [[TMP26:%.*]] 543; CHECK: 25: 544; CHECK-NEXT: call void @__asan_stack_free_0(i64 [[TMP6]], i64 64) 545; CHECK-NEXT: br label [[TMP28:%.*]] 546; CHECK: 26: 547; CHECK-NEXT: [[TMP27:%.*]] = add i64 [[TMP20]], 0 548; CHECK-NEXT: call void @__asan_set_shadow_00(i64 [[TMP27]], i64 8) 549; CHECK-NEXT: br label [[TMP28]] 550; CHECK: 28: 551; CHECK-NEXT: ret void 552; CHECK: ehcleanup: 553; CHECK-NEXT: [[TMP29:%.*]] = cleanuppad within none [] 554; CHECK-NEXT: [[TMP30:%.*]] = call ptr @__asan_memset(ptr [[TMP13]], i32 0, i64 4) 555; CHECK-NEXT: store i64 1172321806, ptr [[TMP14]], align 8 556; CHECK-NEXT: [[TMP31:%.*]] = icmp ne i64 [[TMP6]], 0 557; CHECK-NEXT: br i1 [[TMP31]], label [[TMP32:%.*]], label [[TMP33:%.*]] 558; CHECK: 32: 559; CHECK-NEXT: call void @__asan_stack_free_0(i64 [[TMP6]], i64 64) 560; CHECK-NEXT: br label [[TMP35:%.*]] 561; CHECK: 33: 562; CHECK-NEXT: [[TMP34:%.*]] = add i64 [[TMP20]], 0 563; CHECK-NEXT: call void @__asan_set_shadow_00(i64 [[TMP34]], i64 8) 564; CHECK-NEXT: br label [[TMP35]] 565; CHECK: 35: 566; CHECK-NEXT: cleanupret from [[TMP29]] unwind to caller 567; 568entry: 569 %tmpInt = alloca i32, align 4 570 invoke void @MayThrowFunc() 571 to label %invoke.cont unwind label %ehcleanup 572invoke.cont: ; preds = %entry 573 ret void 574 575ehcleanup: ; preds = %entry 576 %0 = cleanuppad within none [] 577 call void @llvm.memset.p0.i64(ptr align 4 %tmpInt, i8 0, i64 4, i1 false) 578 cleanupret from %0 unwind to caller 579} 580;. 581; CHECK-INLINE: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575} 582;. 583