brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · 94bbd9e Raw
152 lines · plain
1; RUN: opt -passes=lower-global-dtors -S < %s | FileCheck %s --implicit-check-not=llvm.global_dtors2 3; Test that @llvm.global_dtors is properly lowered into @llvm.global_ctors,4; grouping dtor calls by priority and associated symbol.5 6declare void @orig_ctor()7declare void @orig_dtor0()8declare void @orig_dtor1a()9declare void @orig_dtor1b()10declare void @orig_dtor1c0()11declare void @orig_dtor1c1a()12declare void @orig_dtor1c1b()13declare void @orig_dtor1c2a()14declare void @orig_dtor1c2b()15declare void @orig_dtor1c3()16declare void @orig_dtor1d()17declare void @orig_dtor65535()18declare void @orig_dtor65535c0()19declare void @after_the_null()20 21@associatedc0 = external global i822@associatedc1 = external global i823@associatedc2 = global i8 4224@associatedc3 = global i8 8425 26@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [27  { i32, ptr, ptr } { i32 200, ptr @orig_ctor, ptr null }28]29 30@llvm.global_dtors = appending global [14 x { i32, ptr, ptr }] [31  { i32, ptr, ptr } { i32 0, ptr @orig_dtor0, ptr null },32  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1a, ptr null },33  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1b, ptr null },34  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1c0, ptr @associatedc0 },35  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1c1a, ptr @associatedc1 },36  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1c1b, ptr @associatedc1 },37  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1c2a, ptr @associatedc2 },38  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1c2b, ptr @associatedc2 },39  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1c3, ptr @associatedc3 },40  { i32, ptr, ptr } { i32 1, ptr @orig_dtor1d, ptr null },41  { i32, ptr, ptr } { i32 65535, ptr @orig_dtor65535c0, ptr @associatedc0 },42  { i32, ptr, ptr } { i32 65535, ptr @orig_dtor65535, ptr null },43  { i32, ptr, ptr } { i32 65535, ptr null, ptr null },44  { i32, ptr, ptr } { i32 65535, ptr @after_the_null, ptr null }45]46 47; CHECK: @associatedc0 = external global i848; CHECK: @associatedc1 = external global i849; CHECK: @associatedc2 = global i8 4250; CHECK: @associatedc3 = global i8 8451; CHECK: @__dso_handle = extern_weak hidden constant i852 53; CHECK-LABEL: @llvm.global_ctors = appending global [10 x { i32, ptr, ptr }] [54; CHECK-SAME:  { i32, ptr, ptr } { i32 200, ptr @orig_ctor, ptr null },55; CHECK-SAME:  { i32, ptr, ptr } { i32 0, ptr @register_call_dtors.0, ptr null },56; CHECK-SAME:  { i32, ptr, ptr } { i32 1, ptr @"register_call_dtors.1$0", ptr null },57; CHECK-SAME:  { i32, ptr, ptr } { i32 1, ptr @"register_call_dtors.1$1.associatedc0", ptr @associatedc0 },58; CHECK-SAME:  { i32, ptr, ptr } { i32 1, ptr @"register_call_dtors.1$2.associatedc1", ptr @associatedc1 },59; CHECK-SAME:  { i32, ptr, ptr } { i32 1, ptr @"register_call_dtors.1$3.associatedc2", ptr @associatedc2 },60; CHECK-SAME:  { i32, ptr, ptr } { i32 1, ptr @"register_call_dtors.1$4.associatedc3", ptr @associatedc3 },61; CHECK-SAME:  { i32, ptr, ptr } { i32 1, ptr @"register_call_dtors.1$5", ptr null },62; CHECK-SAME:  { i32, ptr, ptr } { i32 65535, ptr @"register_call_dtors$0.associatedc0", ptr @associatedc0 },63; CHECK-SAME:  { i32, ptr, ptr } { i32 65535, ptr @"register_call_dtors$1", ptr null }]64 65; CHECK: declare void @orig_ctor()66; CHECK: declare void @orig_dtor0()67; --- other dtors here ---68; CHECK: declare void @after_the_null()69 70; CHECK: declare i32 @__cxa_atexit(ptr, ptr, ptr)71 72; CHECK-LABEL: define private void @call_dtors.0(ptr %0)73; CHECK:       call void @orig_dtor0()74; CHECK-NEXT:  ret void75 76; CHECK-LABEL: define private void @register_call_dtors.0()77; CHECK:       %call = call i32 @__cxa_atexit(ptr @call_dtors.0, ptr null, ptr @__dso_handle)78; CHECK-NEXT:  %0 = icmp ne i32 %call, 079; CHECK-NEXT:  br i1 %0, label %fail, label %return80; CHECK-EMPTY:81; CHECK-NEXT:  fail:82; CHECK-NEXT:    call void @llvm.trap()83; CHECK-NEXT:    unreachable84; CHECK-EMPTY:85; CHECK-NEXT:  return:86; CHECK-NEXT:    ret void87 88; CHECK-LABEL: define private void @"call_dtors.1$0"(ptr %0)89; CHECK:       call void @orig_dtor1b()90; CHECK-NEXT:  call void @orig_dtor1a()91; CHECK-NEXT:  ret void92 93; CHECK-LABEL: define private void @"register_call_dtors.1$0"()94; CHECK:       %call = call i32 @__cxa_atexit(ptr @"call_dtors.1$0", ptr null, ptr @__dso_handle)95 96; CHECK-LABEL: define private void @"call_dtors.1$1.associatedc0"(ptr %0)97; CHECK:       call void @orig_dtor1c0()98; CHECK-NEXT:  ret void99 100; CHECK-LABEL: define private void @"register_call_dtors.1$1.associatedc0"()101; CHECK:       %call = call i32 @__cxa_atexit(ptr @"call_dtors.1$1.associatedc0", ptr null, ptr @__dso_handle)102 103; CHECK-LABEL: define private void @"call_dtors.1$2.associatedc1"(ptr %0)104; CHECK:       call void @orig_dtor1c1b()105; CHECK-NEXT:  call void @orig_dtor1c1a()106; CHECK-NEXT:  ret void107 108; CHECK-LABEL: define private void @"register_call_dtors.1$2.associatedc1"()109; CHECK:       %call = call i32 @__cxa_atexit(ptr @"call_dtors.1$2.associatedc1", ptr null, ptr @__dso_handle)110 111; CHECK-LABEL: define private void @"call_dtors.1$3.associatedc2"(ptr %0)112; CHECK:       call void @orig_dtor1c2b()113; CHECK-NEXT:  call void @orig_dtor1c2a()114; CHECK-NEXT:  ret void115 116; CHECK-LABEL: define private void @"register_call_dtors.1$3.associatedc2"()117; CHECK:       %call = call i32 @__cxa_atexit(ptr @"call_dtors.1$3.associatedc2", ptr null, ptr @__dso_handle)118 119; CHECK-LABEL: define private void @"call_dtors.1$4.associatedc3"(ptr %0)120; CHECK:       call void @orig_dtor1c3()121; CHECK-NEXT:  ret void122 123; CHECK-LABEL: define private void @"register_call_dtors.1$4.associatedc3"()124; CHECK:       %call = call i32 @__cxa_atexit(ptr @"call_dtors.1$4.associatedc3", ptr null, ptr @__dso_handle)125 126; CHECK-LABEL: define private void @"call_dtors.1$5"(ptr %0)127; CHECK:       call void @orig_dtor1d()128; CHECK-NEXT:  ret void129 130; CHECK-LABEL: define private void @"register_call_dtors.1$5"()131; CHECK:       %call = call i32 @__cxa_atexit(ptr @"call_dtors.1$5", ptr null, ptr @__dso_handle)132 133; CHECK-LABEL: define private void @"call_dtors$0.associatedc0"(ptr %0)134; CHECK:       call void @orig_dtor65535c0()135; CHECK-NEXT:  ret void136 137; CHECK-LABEL: define private void @"register_call_dtors$0.associatedc0"()138; CHECK:       %call = call i32 @__cxa_atexit(ptr @"call_dtors$0.associatedc0", ptr null, ptr @__dso_handle)139 140; CHECK-LABEL: define private void @"call_dtors$1"(ptr %0)141; CHECK:       call void @orig_dtor65535()142; CHECK-NEXT:  ret void143 144; CHECK-LABEL: define private void @"register_call_dtors$1"()145; CHECK:       %call = call i32 @__cxa_atexit(ptr @"call_dtors$1", ptr null, ptr @__dso_handle)146 147 148; This function is listed after the null terminator, so it should149; be excluded.150 151; CHECK-NOT: after_the_null152