1806761a7SFangrui Song; RUN: llc < %s -mtriple=avr -filetype=asm | FileCheck %s -check-prefix=CHECK-ASM 2806761a7SFangrui Song; RUN: llc < %s -mtriple=avr -filetype=obj | llvm-objdump -Dr - \ 32ccb9417SDylan McKay; RUN: | FileCheck %s -check-prefix=CHECK-OBJ 42ccb9417SDylan McKay 52ccb9417SDylan McKay; Somewhat pruned test case from rustc using trait objects 62ccb9417SDylan McKay 72ccb9417SDylan McKay%TraitObjectA = type {} 82ccb9417SDylan McKay 92ccb9417SDylan McKay; CHECK-ASM-LABEL: vtable.0: 102ccb9417SDylan McKay; CHECK-ASM-NEXT: .short pm(drop_in_place2) 112ccb9417SDylan McKay; CHECK-ASM-NEXT: .short 0 122ccb9417SDylan McKay; CHECK-ASM-NEXT: .short 1 132ccb9417SDylan McKay; CHECK-ASM-NEXT: .short pm(trait_fn2) 142ccb9417SDylan McKay 152ccb9417SDylan McKay; CHECK-OBJ-LABEL: <vtable.0>: 162ccb9417SDylan McKay; CHECK-OBJ-NEXT: 00 00 172ccb9417SDylan McKay; CHECK-OBJ-NEXT: R_AVR_16_PM .text 182ccb9417SDylan McKay; CHECK-OBJ-NEXT: 00 00 192ccb9417SDylan McKay; CHECK-OBJ-NEXT: 01 00 00 00 202ccb9417SDylan McKay; CHECK-OBJ-NEXT: R_AVR_16_PM .text 212ccb9417SDylan McKay@vtable.0 = private constant { 22*7bdc80f3SNikita Popov ptr addrspace(1), 232ccb9417SDylan McKay i16, 242ccb9417SDylan McKay i16, 25*7bdc80f3SNikita Popov ptr addrspace(1) 262ccb9417SDylan McKay } { 27*7bdc80f3SNikita Popov ptr addrspace(1) 282ccb9417SDylan McKay @drop_in_place2, 292ccb9417SDylan McKay i16 0, 302ccb9417SDylan McKay i16 1, 31*7bdc80f3SNikita Popov ptr addrspace(1) 322ccb9417SDylan McKay @trait_fn2 332ccb9417SDylan McKay }, align 1 342ccb9417SDylan McKay 352ccb9417SDylan McKay; CHECK-ASM-LABEL: vtable.1: 362ccb9417SDylan McKay; CHECK-ASM-NEXT: .short pm(drop_in_place1) 372ccb9417SDylan McKay; CHECK-ASM-NEXT: .short 0 382ccb9417SDylan McKay; CHECK-ASM-NEXT: .short 1 392ccb9417SDylan McKay; CHECK-ASM-NEXT: .short pm(trait_fn1) 402ccb9417SDylan McKay 412ccb9417SDylan McKay; CHECK-OBJ-LABEL: <vtable.1>: 422ccb9417SDylan McKay; CHECK-OBJ-NEXT: 00 00 432ccb9417SDylan McKay; CHECK-OBJ-NEXT: R_AVR_16_PM .text 442ccb9417SDylan McKay; CHECK-OBJ-NEXT: 00 00 452ccb9417SDylan McKay; CHECK-OBJ-NEXT: 01 00 00 00 462ccb9417SDylan McKay; CHECK-OBJ-NEXT: R_AVR_16_PM .text 472ccb9417SDylan McKay@vtable.1 = private constant { 48*7bdc80f3SNikita Popov ptr addrspace(1), 492ccb9417SDylan McKay i16, 502ccb9417SDylan McKay i16, 51*7bdc80f3SNikita Popov ptr addrspace(1) 522ccb9417SDylan McKay } { 53*7bdc80f3SNikita Popov ptr addrspace(1) 542ccb9417SDylan McKay @drop_in_place1, 552ccb9417SDylan McKay i16 0, 562ccb9417SDylan McKay i16 1, 57*7bdc80f3SNikita Popov ptr addrspace(1) 582ccb9417SDylan McKay @trait_fn1 592ccb9417SDylan McKay }, align 1 602ccb9417SDylan McKay 612ccb9417SDylan McKaydefine internal fastcc i8 @TraitObjectA_method(i1 zeroext %choice) addrspace(1) { 622ccb9417SDylan McKaystart: 632ccb9417SDylan McKay %b = alloca %TraitObjectA, align 1 642ccb9417SDylan McKay 65*7bdc80f3SNikita Popov %c = select i1 %choice, ptr @vtable.0, 66*7bdc80f3SNikita Popov ptr @vtable.1 67*7bdc80f3SNikita Popov %b2 = bitcast ptr %b to ptr 682ccb9417SDylan McKay 69*7bdc80f3SNikita Popov %res = call fastcc addrspace(1) i8 @call_trait_object(ptr nonnull align 1 %b2, ptr noalias readonly align 1 dereferenceable(6) %c) 702ccb9417SDylan McKay ret i8 %res 712ccb9417SDylan McKay} 722ccb9417SDylan McKay 73*7bdc80f3SNikita Popovdefine internal fastcc i8 @call_trait_object(ptr nonnull align 1 %a, ptr noalias nocapture readonly align 1 dereferenceable(6) %b) addrspace(1) { 742ccb9417SDylan McKaystart: 75*7bdc80f3SNikita Popov %b2 = getelementptr inbounds [3 x i16], ptr %b, i16 0, i16 3 76*7bdc80f3SNikita Popov %c = bitcast ptr %b2 to ptr 77*7bdc80f3SNikita Popov %d = load ptr addrspace(1), ptr %c, align 1, !invariant.load !1, !nonnull !1 78*7bdc80f3SNikita Popov %res = tail call addrspace(1) i8 %d(ptr nonnull align 1 %a) 792ccb9417SDylan McKay ret i8 %res 802ccb9417SDylan McKay} 812ccb9417SDylan McKay 82*7bdc80f3SNikita Popovdefine internal void @drop_in_place1(ptr nocapture %a) addrspace(1) { 832ccb9417SDylan McKaystart: 842ccb9417SDylan McKay ret void 852ccb9417SDylan McKay} 862ccb9417SDylan McKay 87*7bdc80f3SNikita Popovdefine internal i8 @trait_fn1(ptr noalias nocapture nonnull readonly align 1 %self) addrspace(1) { 882ccb9417SDylan McKaystart: 892ccb9417SDylan McKay ret i8 89 902ccb9417SDylan McKay} 912ccb9417SDylan McKay 92*7bdc80f3SNikita Popovdefine internal void @drop_in_place2(ptr nocapture %a) addrspace(1) { 932ccb9417SDylan McKaystart: 942ccb9417SDylan McKay ret void 952ccb9417SDylan McKay} 962ccb9417SDylan McKay 97*7bdc80f3SNikita Popovdefine internal i8 @trait_fn2(ptr noalias nocapture nonnull readonly align 1 %self) addrspace(1) { 982ccb9417SDylan McKaystart: 992ccb9417SDylan McKay ret i8 79 1002ccb9417SDylan McKay} 1012ccb9417SDylan McKay 1022ccb9417SDylan McKay!1 = !{} 103