Files
clang-p2996/clang/test/CodeGen/debug-info-codeview-heapallocsite.c
Nikita Popov cac4d7ff46 [CodeGen] Only consider innermost cast for !heapallocsite
Without opaque pointers, this code determined !heapallocsite based
on the innermost cast of the allocation call. With opaque pointers,
the casts no longer generate an instruction, so the outermost cast
is used. Add an explicit check for nested casts to prevent this.

Differential Revision: https://reviews.llvm.org/D145788
2023-05-09 09:49:42 +02:00

27 lines
1.0 KiB
C

// RUN: %clang_cc1 -triple x86_64-windows-msvc -debug-info-kind=limited -gcodeview -fdeclspec -S -emit-llvm %s -o - | FileCheck %s
struct Foo;
struct Bar;
__declspec(allocator) void *alloc_void(void);
__declspec(allocator) struct Foo *alloc_foo(void);
void call_alloc(void) {
struct Foo *p = alloc_void();
struct Foo *w = alloc_foo();
struct Foo *q = (struct Foo*)alloc_void();
struct Foo *r = (struct Foo*)(struct Bar*)alloc_void();
}
// CHECK-LABEL: define {{.*}}void @call_alloc
// CHECK: call ptr {{.*}}@alloc_void{{.*}} !heapallocsite [[DBG1:!.*]]
// CHECK: call ptr {{.*}}@alloc_foo{{.*}} !heapallocsite [[DBG2:!.*]]
// CHECK: call ptr {{.*}}@alloc_void{{.*}} !heapallocsite [[DBG2]]
// CHECK: call ptr {{.*}}@alloc_void{{.*}} !heapallocsite [[DBG3:!.*]]
// CHECK: [[DBG2]] = !DICompositeType(tag: DW_TAG_structure_type,
// CHECK-SAME: name: "Foo"
// CHECK: [[DBG3]] = !DICompositeType(tag: DW_TAG_structure_type,
// CHECK-SAME: name: "Bar"
// CHECK: [[DBG1]] = !{}