brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 0f84f83 Raw
62 lines · cpp
1// RUN: %clang_cc1 -triple=x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s2 3extern "C" void* memcpy(void*, const void*, decltype(sizeof(int)));4void func();5 6namespace std {7  template <class T>8  class reference_wrapper {9    T* ptr;10 11  public:12    T& get() { return *ptr; }13  };14} // namespace std15 16struct Callable {17  void operator()() {}18 19  void func();20};21 22extern "C" void call1() {23  __builtin_invoke(func);24  __builtin_invoke(Callable{});25  __builtin_invoke(memcpy, nullptr, nullptr, 0);26 27  // CHECK:      define dso_local void @call128  // CHECK-NEXT: entry:29  // CHECK-NEXT:   %ref.tmp = alloca %struct.Callable, align 130  // CHECK-NEXT:   call void @_Z4funcv()31  // CHECK-NEXT:   call void @_ZN8CallableclEv(ptr noundef nonnull align 1 dereferenceable(1) %ref.tmp)32  // CHECK-NEXT:   call void @llvm.memcpy.p0.p0.i64(ptr align 1 null, ptr align 1 null, i64 0, i1 false)33  // CHECK-NEXT:   ret void34}35 36extern "C" void call_memptr(std::reference_wrapper<Callable> wrapper) {37  __builtin_invoke(&Callable::func, wrapper);38 39  // CHECK:      define dso_local void @call_memptr40  // CHECK-NEXT: entry:41  // CHECK-NEXT:   %wrapper = alloca %"class.std::reference_wrapper", align 842  // CHECK-NEXT:   %coerce.dive = getelementptr inbounds nuw %"class.std::reference_wrapper", ptr %wrapper, i32 0, i32 043  // CHECK-NEXT:   store ptr %wrapper.coerce, ptr %coerce.dive, align 844  // CHECK-NEXT:   %call = call noundef nonnull align 1 dereferenceable(1) ptr @_ZNSt17reference_wrapperI8CallableE3getEv(ptr noundef nonnull align 8 dereferenceable(8) %wrapper)45  // CHECK-NEXT:   %0 = getelementptr inbounds i8, ptr %call, i64 046  // CHECK-NEXT:   br i1 false, label %memptr.virtual, label %memptr.nonvirtual47  // CHECK-EMPTY:48  // CHECK-NEXT: memptr.virtual:49  // CHECK-NEXT:   %vtable = load ptr, ptr %0, align 850  // CHECK-NEXT:   %1 = getelementptr i8, ptr %vtable, i64 sub (i64 ptrtoint (ptr @_ZN8Callable4funcEv to i64), i64 1), !nosanitize !251  // CHECK-NEXT:   %memptr.virtualfn = load ptr, ptr %1, align 8, !nosanitize !252  // CHECK-NEXT:   br label %memptr.end53  // CHECK-EMPTY:54  // CHECK-NEXT: memptr.nonvirtual:55  // CHECK-NEXT:   br label %memptr.end56  // CHECK-EMPTY:57  // CHECK-NEXT: memptr.end:58  // CHECK-NEXT:   %2 = phi ptr [ %memptr.virtualfn, %memptr.virtual ], [ inttoptr (i64 ptrtoint (ptr @_ZN8Callable4funcEv to i64) to ptr), %memptr.nonvirtual ]59  // CHECK-NEXT:   call void %2(ptr noundef nonnull align 1 dereferenceable(1) %0)60  // CHECK-NEXT:   ret void61}62