103 lines · plain
1; RUN: llc < %s -mtriple=avr -filetype=asm | FileCheck %s -check-prefix=CHECK-ASM2; RUN: llc < %s -mtriple=avr -filetype=obj | llvm-objdump -Dr - \3; RUN: | FileCheck %s -check-prefix=CHECK-OBJ4 5; Somewhat pruned test case from rustc using trait objects6 7%TraitObjectA = type {}8 9; CHECK-ASM-LABEL: vtable.0:10; CHECK-ASM-NEXT: .short pm(drop_in_place2)11; CHECK-ASM-NEXT: .short 012; CHECK-ASM-NEXT: .short 113; CHECK-ASM-NEXT: .short pm(trait_fn2)14 15; CHECK-OBJ-LABEL: <vtable.0>:16; CHECK-OBJ-NEXT: 00 0017; CHECK-OBJ-NEXT: R_AVR_16_PM .text18; CHECK-OBJ-NEXT: 00 0019; CHECK-OBJ-NEXT: 01 00 00 0020; CHECK-OBJ-NEXT: R_AVR_16_PM .text21@vtable.0 = private constant {22 ptr addrspace(1),23 i16,24 i16,25 ptr addrspace(1)26 } {27 ptr addrspace(1)28 @drop_in_place2,29 i16 0,30 i16 1,31 ptr addrspace(1)32 @trait_fn233 }, align 134 35; CHECK-ASM-LABEL: vtable.1:36; CHECK-ASM-NEXT: .short pm(drop_in_place1)37; CHECK-ASM-NEXT: .short 038; CHECK-ASM-NEXT: .short 139; CHECK-ASM-NEXT: .short pm(trait_fn1)40 41; CHECK-OBJ-LABEL: <vtable.1>:42; CHECK-OBJ-NEXT: 00 0043; CHECK-OBJ-NEXT: R_AVR_16_PM .text44; CHECK-OBJ-NEXT: 00 0045; CHECK-OBJ-NEXT: 01 00 00 0046; CHECK-OBJ-NEXT: R_AVR_16_PM .text47@vtable.1 = private constant {48 ptr addrspace(1),49 i16,50 i16,51 ptr addrspace(1)52 } {53 ptr addrspace(1)54 @drop_in_place1,55 i16 0,56 i16 1,57 ptr addrspace(1)58 @trait_fn159 }, align 160 61define internal fastcc i8 @TraitObjectA_method(i1 zeroext %choice) addrspace(1) {62start:63 %b = alloca %TraitObjectA, align 164 65 %c = select i1 %choice, ptr @vtable.0,66 ptr @vtable.167 %b2 = bitcast ptr %b to ptr68 69 %res = call fastcc addrspace(1) i8 @call_trait_object(ptr nonnull align 1 %b2, ptr noalias readonly align 1 dereferenceable(6) %c)70 ret i8 %res71}72 73define internal fastcc i8 @call_trait_object(ptr nonnull align 1 %a, ptr noalias nocapture readonly align 1 dereferenceable(6) %b) addrspace(1) {74start:75 %b2 = getelementptr inbounds [3 x i16], ptr %b, i16 0, i16 376 %c = bitcast ptr %b2 to ptr77 %d = load ptr addrspace(1), ptr %c, align 1, !invariant.load !1, !nonnull !178 %res = tail call addrspace(1) i8 %d(ptr nonnull align 1 %a)79 ret i8 %res80}81 82define internal void @drop_in_place1(ptr nocapture %a) addrspace(1) {83start:84 ret void85}86 87define internal i8 @trait_fn1(ptr noalias nocapture nonnull readonly align 1 %self) addrspace(1) {88start:89 ret i8 8990}91 92define internal void @drop_in_place2(ptr nocapture %a) addrspace(1) {93start:94 ret void95}96 97define internal i8 @trait_fn2(ptr noalias nocapture nonnull readonly align 1 %self) addrspace(1) {98start:99 ret i8 79100}101 102!1 = !{}103