brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 13acb47 Raw
130 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir2// RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR3// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll4// RUN: FileCheck --input-file=%t-cir.ll %s --check-prefix=LLVM5// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll6// RUN: FileCheck --input-file=%t.ll %s --check-prefix=OGCG7 8// TODO(cir): The constructors in this test case are only here because we don't9//            have support for zero-initialization of base classes yet. We should10//            fix that soon.11 12struct Base {13  Base();14  void f();15  int a;16};17 18struct Derived : Base {19  Derived();20  double b;21};22 23void f() {24  Derived d;25  d.f();26}27 28// CIR: cir.func {{.*}} @_Z1fv()29// CIR:   %[[D:.*]] = cir.alloca !rec_Derived, !cir.ptr<!rec_Derived>, ["d", init]30// CIR:   cir.call @_ZN7DerivedC1Ev(%[[D]]) : (!cir.ptr<!rec_Derived>) -> ()31// CIR:   %[[D_BASE:.*]] = cir.base_class_addr %[[D]] : !cir.ptr<!rec_Derived> nonnull [0] -> !cir.ptr<!rec_Base>32// CIR:   cir.call @_ZN4Base1fEv(%[[D_BASE]]) : (!cir.ptr<!rec_Base>) -> ()33 34// LLVM: define {{.*}}void @_Z1fv()35// LLVM:   %[[D:.*]] = alloca %struct.Derived36// LLVM:   call void @_ZN7DerivedC1Ev(ptr %[[D]])37// LLVM:   call void @_ZN4Base1fEv(ptr %[[D]])38 39// OGCG: define {{.*}}void @_Z1fv()40// OGCG:   %[[D:.*]] = alloca %struct.Derived41// OGCG:   call void @_ZN7DerivedC1Ev(ptr {{.*}} %[[D]])42// OGCG:   call void @_ZN4Base1fEv(ptr {{.*}} %[[D]])43 44void useBase(Base *base);45void callBaseUsingDerived(Derived *derived) {46  useBase(derived);47}48 49 50// CIR: cir.func {{.*}} @_Z20callBaseUsingDerivedP7Derived(%[[DERIVED_ARG:.*]]: !cir.ptr<!rec_Derived> {{.*}})51// CIR:   %[[DERIVED_ADDR:.*]] = cir.alloca !cir.ptr<!rec_Derived>, !cir.ptr<!cir.ptr<!rec_Derived>>, ["derived", init]52// CIR:   cir.store %[[DERIVED_ARG]], %[[DERIVED_ADDR]]53// CIR:   %[[DERIVED:.*]] = cir.load{{.*}} %[[DERIVED_ADDR]]54// CIR:   %[[DERIVED_BASE:.*]] = cir.base_class_addr %[[DERIVED]] : !cir.ptr<!rec_Derived> nonnull [0] -> !cir.ptr<!rec_Base>55// CIR:   cir.call @_Z7useBaseP4Base(%[[DERIVED_BASE]]) : (!cir.ptr<!rec_Base>) -> ()56 57// LLVM: define {{.*}} void @_Z20callBaseUsingDerivedP7Derived(ptr %[[DERIVED_ARG:.*]])58// LLVM:   %[[DERIVED_ADDR:.*]] = alloca ptr59// LLVM:   store ptr %[[DERIVED_ARG]], ptr %[[DERIVED_ADDR]]60// LLVM:   %[[DERIVED:.*]] = load ptr, ptr %[[DERIVED_ADDR]]61// LLVM:   call void @_Z7useBaseP4Base(ptr %[[DERIVED]])62 63// OGCG: define {{.*}} void @_Z20callBaseUsingDerivedP7Derived(ptr {{.*}} %[[DERIVED_ARG:.*]])64// OGCG:   %[[DERIVED_ADDR:.*]] = alloca ptr65// OGCG:   store ptr %[[DERIVED_ARG]], ptr %[[DERIVED_ADDR]]66// OGCG:   %[[DERIVED:.*]] = load ptr, ptr %[[DERIVED_ADDR]]67// OGCG:   call void @_Z7useBaseP4Base(ptr {{.*}} %[[DERIVED]])68 69Base *returnBaseFromDerived(Derived* derived) {70  return derived;71}72 73// CIR: cir.func {{.*}} @_Z21returnBaseFromDerivedP7Derived(%[[DERIVED_ARG:.*]]: !cir.ptr<!rec_Derived> {{.*}}) -> !cir.ptr<!rec_Base>74// CIR:   %[[DERIVED_ADDR:.*]] = cir.alloca !cir.ptr<!rec_Derived>, !cir.ptr<!cir.ptr<!rec_Derived>>, ["derived", init]75// CIR:   %[[BASE_ADDR:.*]] = cir.alloca !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>>, ["__retval"]76// CIR:   cir.store %[[DERIVED_ARG]], %[[DERIVED_ADDR]]77// CIR:   %[[DERIVED:.*]] = cir.load{{.*}} %[[DERIVED_ADDR]]78// CIR:   %[[DERIVED_BASE:.*]] = cir.base_class_addr %[[DERIVED]] : !cir.ptr<!rec_Derived> nonnull [0] -> !cir.ptr<!rec_Base>79// CIR:   cir.store %[[DERIVED_BASE]], %[[BASE_ADDR]]80// CIR:   %[[BASE:.*]] = cir.load{{.*}} %[[BASE_ADDR]]81// CIR:   cir.return %[[BASE]] : !cir.ptr<!rec_Base>82 83// LLVM: define {{.*}} ptr @_Z21returnBaseFromDerivedP7Derived(ptr %[[DERIVED_ARG:.*]])84// LLVM:   %[[DERIVED_ADDR:.*]] = alloca ptr85// LLVM:   store ptr %[[DERIVED_ARG]], ptr %[[DERIVED_ADDR]]86// LLVM:   %[[DERIVED:.*]] = load ptr, ptr %[[DERIVED_ADDR]]87 88// OGCG: define {{.*}} ptr @_Z21returnBaseFromDerivedP7Derived(ptr {{.*}} %[[DERIVED_ARG:.*]])89// OGCG:   %[[DERIVED_ADDR:.*]] = alloca ptr90// OGCG:   store ptr %[[DERIVED_ARG]], ptr %[[DERIVED_ADDR]]91// OGCG:   %[[DERIVED:.*]] = load ptr, ptr %[[DERIVED_ADDR]]92 93volatile Derived derivedObj;94 95void test_volatile_store() {96  derivedObj.a = 0;97}98 99// CIR: cir.func {{.*}} @_Z19test_volatile_storev()100// CIR:   %[[ZERO:.*]] = cir.const #cir.int<0> : !s32i101// CIR:   %[[DERIVED_OBJ:.*]] = cir.get_global @derivedObj : !cir.ptr<!rec_Derived>102// CIR:   %[[DERIVED_OBJ_BASE:.*]] = cir.base_class_addr %[[DERIVED_OBJ]] : !cir.ptr<!rec_Derived> nonnull [0] -> !cir.ptr<!rec_Base>103// CIR:   %[[DERIVED_OBJ_A:.*]] = cir.get_member %[[DERIVED_OBJ_BASE]][0] {name = "a"} : !cir.ptr<!rec_Base> -> !cir.ptr<!s32i>104// CIR:   cir.store volatile {{.*}} %[[ZERO]], %[[DERIVED_OBJ_A]] : !s32i, !cir.ptr<!s32i>105 106// LLVM: define {{.*}} void @_Z19test_volatile_storev()107// LLVM:   store volatile i32 0, ptr @derivedObj108 109// OGCG: define {{.*}} void @_Z19test_volatile_storev()110// OGCG:   store volatile i32 0, ptr @derivedObj111 112void test_volatile_load() {113  [[maybe_unused]] int val = derivedObj.a;114}115 116// CIR: cir.func {{.*}} @_Z18test_volatile_loadv()117// CIR:   %[[DERIVED_OBJ:.*]] = cir.get_global @derivedObj : !cir.ptr<!rec_Derived>118// CIR:   %[[DERIVED_OBJ_BASE:.*]] = cir.base_class_addr %[[DERIVED_OBJ]] : !cir.ptr<!rec_Derived> nonnull [0] -> !cir.ptr<!rec_Base>119// CIR:   %[[DERIVED_OBJ_A:.*]] = cir.get_member %[[DERIVED_OBJ_BASE]][0] {name = "a"} : !cir.ptr<!rec_Base> -> !cir.ptr<!s32i>120// CIR:   %[[VAL:.*]] = cir.load volatile {{.*}} %[[DERIVED_OBJ_A]] : !cir.ptr<!s32i>, !s32i121 122// LLVM: define {{.*}} void @_Z18test_volatile_loadv()123// LLVM:   %[[VAL_ADDR:.*]] = alloca i32124// LLVM:   %[[DERIVED_OBJ:.*]] = load volatile i32, ptr @derivedObj125 126// OGCG: define {{.*}} void @_Z18test_volatile_loadv()127// OGCG:   %[[VAL_ADDR:.*]] = alloca i32128// OGCG:   %[[DERIVED_OBJ:.*]] = load volatile i32, ptr @derivedObj129// OGCG:   store i32 %[[DERIVED_OBJ]], ptr %[[VAL_ADDR]]130