blob: a69ca1a19c9626fb37341625bf536f54a35bf0e9 [file] [log] [blame] [edit]
// RUN: %clang_cc1 -std=c++20 -triple aarch64-none-linux-android21 -fclangir -emit-cir %s -o %t.cir
// RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR
// RUN: %clang_cc1 -std=c++20 -triple aarch64-none-linux-android21 -fclangir -emit-llvm %s -o %t.ll
// RUN: FileCheck --input-file=%t.ll %s --check-prefix=LLVM
class a {
public:
static char *b(int);
};
int h=0;
class f {
public:
const char *b();
a g;
};
const char *f::b() { return g.b(h); }
void fn1() { f f1; }
// CIR: ty_a = !cir.struct<class "a" {!cir.int<u, 8>} #cir.record.decl.ast>
// CIR: ty_f = !cir.struct<class "f" {!cir.struct<class "a" {!cir.int<u, 8>} #cir.record.decl.ast>}>
// CIR: cir.global external @h = #cir.int<0>
// CIR: cir.func private @_ZN1a1bEi(!s32i) -> !cir.ptr<!s8i>
// CIR: cir.func @_ZN1f1bEv(%arg0: !cir.ptr<!ty_f> loc{{.*}}) -> !cir.ptr<!s8i>
// CIR: [[H_PTR:%.*]] = cir.get_global @h : !cir.ptr<!s32i> loc(#loc18)
// CIR: [[H_VAL:%.*]] = cir.load [[H_PTR]] : !cir.ptr<!s32i>, !s32i
// CIR: [[RET1_VAL:%.*]] = cir.call @_ZN1a1bEi([[H_VAL]]) : (!s32i) -> !cir.ptr<!s8i>
// CIR: cir.store [[RET1_VAL]], [[RET1_P:%.*]] : !cir.ptr<!s8i>, !cir.ptr<!cir.ptr<!s8i>>
// CIR: [[RET1_VAL2:%.*]] = cir.load [[RET1_P]] : !cir.ptr<!cir.ptr<!s8i>>, !cir.ptr<!s8i>
// %7 = cir.load %1 : !cir.ptr<!cir.ptr<!s8i>>, !cir.ptr<!s8i>
// CIR: cir.return [[RET1_VAL2]] : !cir.ptr<!s8i>
// CIR: cir.func @_Z3fn1v()
// CIR: [[CLS_F:%.*]] = cir.alloca !ty_f, !cir.ptr<!ty_f>, ["f1"] {alignment = 1 : i64}
// CIR: cir.return
// LLVM: %class.f = type { %class.a }
// LLVM: %class.a = type { i8 }
// LLVM: @h = global i32 0
// LLVM: declare {{.*}} ptr @_ZN1a1bEi(i32)
// LLVM: define dso_local ptr @_ZN1f1bEv(ptr [[ARG0:%.*]])
// LLVM: [[ARG0_SAVE:%.*]] = alloca ptr, i64 1, align 8
// LLVM: [[RET_SAVE:%.*]] = alloca ptr, i64 1, align 8
// LLVM: store ptr [[ARG0]], ptr [[ARG0_SAVE]], align 8,
// LLVM: [[ARG0_LOAD:%.*]] = load ptr, ptr [[ARG0_SAVE]], align 8
// LLVM: [[FUNC_PTR:%.*]] = getelementptr %class.f, ptr [[ARG0_LOAD]], i32 0, i32 0,
// LLVM: [[VAR_H:%.*]] = load i32, ptr @h, align 4
// LLVM: [[RET_VAL:%.*]] = call ptr @_ZN1a1bEi(i32 [[VAR_H]]),
// LLVM: store ptr [[RET_VAL]], ptr [[RET_SAVE]], align 8,
// LLVM: [[RET_VAL2:%.*]] = load ptr, ptr [[RET_SAVE]], align 8
// LLVM: ret ptr [[RET_VAL2]]
// LLVM: define dso_local void @_Z3fn1v()
// LLVM: [[FUNC_PTR:%.*]] = alloca %class.f, i64 1, align 1
// LLVM: ret void