rnk created this revision.
rnk added a reviewer: akhuang.
Herald added a reviewer: MaskRay.
Herald added a project: clang.
rnk updated this revision to Diff 267767.
rnk added a comment.
- revert lld change
Clang marks calls to operator new as heap allocation sites, but the
operator declared at global scope returns void. There is no explicit
cast in the code, so the compiler has to write down the allocated type
itself.
Also generalize a cast to use CallBase, so that we mark heap alloc sites
when exceptions are enabled.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D80966
Files:
clang/lib/CodeGen/CGCall.cpp
clang/lib/CodeGen/CGDebugInfo.cpp
clang/lib/CodeGen/CGDebugInfo.h
clang/lib/CodeGen/CGExprCXX.cpp
clang/lib/CodeGen/CGExprScalar.cpp
clang/test/CodeGen/debug-info-codeview-heapallocsite.c
clang/test/CodeGenCXX/debug-info-codeview-heapallocsite.cpp
Index: clang/test/CodeGenCXX/debug-info-codeview-heapallocsite.cpp
===================================================================
--- /dev/null
+++ clang/test/CodeGenCXX/debug-info-codeview-heapallocsite.cpp
@@ -0,0 +1,34 @@
+// RUN: %clang_cc1 -fexceptions -triple x86_64-windows-msvc -debug-info-kind=limited -gcodeview -fdeclspec -S -emit-llvm %s -o - | FileCheck %s
+
+struct Foo {
+ int x;
+};
+struct Bar {
+ int y;
+};
+extern Foo *gv_foo;
+extern Bar *gv_bar;
+extern "C" void doit() {
+ gv_foo = new Foo();
+ gv_bar = new Bar();
+}
+
+// CHECK-LABEL: define {{.*}}void @doit
+// CHECK: call {{.*}} i8* {{.*}}@"??2@YAPEAX_K@Z"(i64 4) {{.*}} !heapallocsite [[DBG_FOO:!.*]]
+// CHECK: call {{.*}} i8* {{.*}}@"??2@YAPEAX_K@Z"(i64 4) {{.*}} !heapallocsite [[DBG_BAR:!.*]]
+
+extern "C" void useinvoke() {
+ struct HasDtor {
+ ~HasDtor() { delete gv_foo; }
+ } o;
+ gv_foo = new Foo();
+}
+
+// CHECK-LABEL: define {{.*}}void @useinvoke
+// CHECK: invoke {{.*}} i8* {{.*}}@"??2@YAPEAX_K@Z"(i64 4)
+// CHECK-NEXT: to label {{.*}} unwind label {{.*}} !heapallocsite [[DBG_FOO]]
+
+// CHECK: [[DBG_FOO]] = distinct !DICompositeType(tag: DW_TAG_structure_type,
+// CHECK-SAME: name: "Foo"
+// CHECK: [[DBG_BAR]] = distinct !DICompositeType(tag: DW_TAG_structure_type,
+// CHECK-SAME: name: "Bar"
Index: clang/test/CodeGen/debug-info-codeview-heapallocsite.c
===================================================================
--- clang/test/CodeGen/debug-info-codeview-heapallocsite.c
+++ clang/test/CodeGen/debug-info-codeview-heapallocsite.c
@@ -1,19 +1,22 @@
-// RUN: %clang_cc1 -triple x86_64-windows-msvc -debug-info-kind=limited -gcodeview -fdeclspec -S -emit-llvm < %s | FileCheck %s
+// 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();
+__declspec(allocator) struct Foo *alloc_foo();
void call_alloc() {
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 i8* {{.*}}@alloc_void{{.*}} !heapallocsite [[DBG1:!.*]]
-// CHECK: call i8* {{.*}}@alloc_void{{.*}} !heapallocsite [[DBG2:!.*]]
+// CHECK: call %struct.Foo* {{.*}}@alloc_foo{{.*}} !heapallocsite [[DBG2:!.*]]
+// CHECK: call i8* {{.*}}@alloc_void{{.*}} !heapallocsite [[DBG2]]
// CHECK: call i8* {{.*}}@alloc_void{{.*}} !heapallocsite [[DBG3:!.*]]
// CHECK: [[DBG1]] = !{}
Index: clang/lib/CodeGen/CGExprScalar.cpp
===================================================================
--- clang/lib/CodeGen/CGExprScalar.cpp
+++ clang/lib/CodeGen/CGExprScalar.cpp
@@ -2090,11 +2090,15 @@
}
}
- // Update heapallocsite metadata when there is an explicit cast.
- if (llvm::CallInst *CI = dyn_cast<llvm::CallInst>(Src))
- if (CI->getMetadata("heapallocsite") && isa<ExplicitCastExpr>(CE))
- CGF.getDebugInfo()->
- addHeapAllocSiteMetadata(CI, CE->getType(), CE->getExprLoc());
+ // Update heapallocsite metadata when there is an explicit pointer cast.
+ if (auto *CI = dyn_cast<llvm::CallBase>(Src)) {
+ if (CI->getMetadata("heapallocsite") && isa<ExplicitCastExpr>(CE)) {
+ QualType PointeeType = DestTy->getPointeeType();
+ if (!PointeeType.isNull())
+ CGF.getDebugInfo()->addHeapAllocSiteMetadata(CI, PointeeType,
+ CE->getExprLoc());
+ }
+ }
return Builder.CreateBitCast(Src, DstTy);
}
Index: clang/lib/CodeGen/CGExprCXX.cpp
===================================================================
--- clang/lib/CodeGen/CGExprCXX.cpp
+++ clang/lib/CodeGen/CGExprCXX.cpp
@@ -1638,6 +1638,13 @@
RValue RV =
EmitNewDeleteCall(*this, allocator, allocatorType, allocatorArgs);
+ // Set !heapallocsite metadata on the call to operator new.
+ if (getDebugInfo()) {
+ if (auto *newCall = dyn_cast<llvm::CallBase>(RV.getScalarVal()))
+ getDebugInfo()->addHeapAllocSiteMetadata(newCall, allocType,
+ E->getExprLoc());
+ }
+
// If this was a call to a global replaceable allocation function that does
// not take an alignment argument, the allocator is known to produce
// storage that's suitably aligned for any object that fits, up to a known
Index: clang/lib/CodeGen/CGDebugInfo.h
===================================================================
--- clang/lib/CodeGen/CGDebugInfo.h
+++ clang/lib/CodeGen/CGDebugInfo.h
@@ -509,7 +509,7 @@
llvm::DIType *getOrCreateStandaloneType(QualType Ty, SourceLocation Loc);
/// Add heapallocsite metadata for MSAllocator calls.
- void addHeapAllocSiteMetadata(llvm::Instruction *CallSite, QualType Ty,
+ void addHeapAllocSiteMetadata(llvm::CallBase *CallSite, QualType AllocatedTy,
SourceLocation Loc);
void completeType(const EnumDecl *ED);
Index: clang/lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- clang/lib/CodeGen/CGDebugInfo.cpp
+++ clang/lib/CodeGen/CGDebugInfo.cpp
@@ -2145,16 +2145,14 @@
return T;
}
-void CGDebugInfo::addHeapAllocSiteMetadata(llvm::Instruction *CI,
- QualType D,
+void CGDebugInfo::addHeapAllocSiteMetadata(llvm::CallBase *CI,
+ QualType AllocatedTy,
SourceLocation Loc) {
llvm::MDNode *node;
- if (D.getTypePtr()->isVoidPointerType()) {
+ if (AllocatedTy->isVoidType())
node = llvm::MDNode::get(CGM.getLLVMContext(), None);
- } else {
- QualType PointeeTy = D.getTypePtr()->getPointeeType();
- node = getOrCreateType(PointeeTy, getOrCreateFile(Loc));
- }
+ else
+ node = getOrCreateType(AllocatedTy, getOrCreateFile(Loc));
CI->setMetadata("heapallocsite", node);
}
Index: clang/lib/CodeGen/CGCall.cpp
===================================================================
--- clang/lib/CodeGen/CGCall.cpp
+++ clang/lib/CodeGen/CGCall.cpp
@@ -4950,7 +4950,7 @@
// Add metadata for calls to MSAllocator functions
if (getDebugInfo() && TargetDecl &&
TargetDecl->hasAttr<MSAllocatorAttr>())
- getDebugInfo()->addHeapAllocSiteMetadata(CI, RetTy, Loc);
+ getDebugInfo()->addHeapAllocSiteMetadata(CI, RetTy->getPointeeType(), Loc);
// 4. Finish the call.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits