Skip to content

Commit

Permalink
Relanding r357928 with fixed debuginfo check.
Browse files Browse the repository at this point in the history
[MS] Add metadata for __declspec(allocator)

Original summary:
Emit !heapallocsite in the metadata for calls to functions marked with
__declspec(allocator). Eventually this will be emitted as S_HEAPALLOCSITE debug
info in codeview.

Differential Revision: https://reviews.llvm.org/D60237

llvm-svn: 358307
  • Loading branch information
amykhuang committed Apr 12, 2019
1 parent 65132e2 commit 0d0334f
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 7 deletions.
16 changes: 9 additions & 7 deletions clang/lib/CodeGen/CGCall.cpp
Expand Up @@ -3791,6 +3791,8 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,

llvm::FunctionType *IRFuncTy = getTypes().GetFunctionType(CallInfo);

const Decl *TargetDecl = Callee.getAbstractInfo().getCalleeDecl().getDecl();

#ifndef NDEBUG
if (!(CallInfo.isVariadic() && CallInfo.getArgStruct())) {
// For an inalloca varargs function, we don't expect CallInfo to match the
Expand Down Expand Up @@ -4279,11 +4281,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
// Apply always_inline to all calls within flatten functions.
// FIXME: should this really take priority over __try, below?
if (CurCodeDecl && CurCodeDecl->hasAttr<FlattenAttr>() &&
!(Callee.getAbstractInfo().getCalleeDecl().getDecl() &&
Callee.getAbstractInfo()
.getCalleeDecl()
.getDecl()
->hasAttr<NoInlineAttr>())) {
!(TargetDecl && TargetDecl->hasAttr<NoInlineAttr>())) {
Attrs =
Attrs.addAttribute(getLLVMContext(), llvm::AttributeList::FunctionIndex,
llvm::Attribute::AlwaysInline);
Expand Down Expand Up @@ -4367,11 +4365,16 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,

// Suppress tail calls if requested.
if (llvm::CallInst *Call = dyn_cast<llvm::CallInst>(CI)) {
const Decl *TargetDecl = Callee.getAbstractInfo().getCalleeDecl().getDecl();
if (TargetDecl && TargetDecl->hasAttr<NotTailCalledAttr>())
Call->setTailCallKind(llvm::CallInst::TCK_NoTail);
}

// Add metadata for calls to MSAllocator functions
// FIXME: Get the type that the return value is cast to.
if (getDebugInfo() && TargetDecl &&
TargetDecl->hasAttr<MSAllocatorAttr>())
getDebugInfo()->addHeapAllocSiteMetadata(CI, RetTy, Loc);

// 4. Finish the call.

// If the call doesn't return, finish the basic block and clear the
Expand Down Expand Up @@ -4528,7 +4531,6 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
} ();

// Emit the assume_aligned check on the return value.
const Decl *TargetDecl = Callee.getAbstractInfo().getCalleeDecl().getDecl();
if (Ret.isScalar() && TargetDecl) {
if (const auto *AA = TargetDecl->getAttr<AssumeAlignedAttr>()) {
llvm::Value *OffsetValue = nullptr;
Expand Down
14 changes: 14 additions & 0 deletions clang/lib/CodeGen/CGDebugInfo.cpp
Expand Up @@ -1959,6 +1959,20 @@ llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D,
return T;
}

void CGDebugInfo::addHeapAllocSiteMetadata(llvm::Instruction *CI,
QualType D,
SourceLocation Loc) {
llvm::MDNode *node;
if (D.getTypePtr()->isVoidPointerType()) {
node = llvm::MDNode::get(CGM.getLLVMContext(), None);
} else {
QualType PointeeTy = D.getTypePtr()->getPointeeType();
node = getOrCreateType(PointeeTy, getOrCreateFile(Loc));
}

CI->setMetadata("heapallocsite", node);
}

void CGDebugInfo::completeType(const EnumDecl *ED) {
if (DebugKind <= codegenoptions::DebugLineTablesOnly)
return;
Expand Down
4 changes: 4 additions & 0 deletions clang/lib/CodeGen/CGDebugInfo.h
Expand Up @@ -476,6 +476,10 @@ class CGDebugInfo {
/// Emit standalone debug info for a type.
llvm::DIType *getOrCreateStandaloneType(QualType Ty, SourceLocation Loc);

/// Add heapallocsite metadata for MSAllocator calls.
void addHeapAllocSiteMetadata(llvm::Instruction *CallSite, QualType Ty,
SourceLocation Loc);

void completeType(const EnumDecl *ED);
void completeType(const RecordDecl *RD);
void completeRequiredType(const RecordDecl *RD);
Expand Down
27 changes: 27 additions & 0 deletions clang/test/CodeGen/debug-info-codeview-heapallocsite.c
@@ -0,0 +1,27 @@
// RUN: %clang_cc1 -triple x86_64-windows-msvc -debug-info-kind=limited -gcodeview -fdeclspec -S -emit-llvm < %s | FileCheck %s

struct Foo {
int x;
};

__declspec(allocator) void *alloc_void();
__declspec(allocator) struct Foo *alloc_foo();

void call_alloc_void() {
struct Foo *p = (struct Foo*)alloc_void();
}

void call_alloc_foo() {
struct Foo *p = alloc_foo();
}

// CHECK-LABEL: define {{.*}}void @call_alloc_void
// CHECK: call i8* {{.*}}@alloc_void{{.*}} !heapallocsite [[DBG1:!.*]]

// CHECK-LABEL: define {{.*}}void @call_alloc_foo
// CHECK: call %struct.Foo* {{.*}}@alloc_foo{{.*}} !heapallocsite [[DBG2:!.*]]

// CHECK: [[DBG1]] = !{}
// CHECK: [[DBG2]] = distinct !DICompositeType(tag: DW_TAG_structure_type,
// CHECK-SAME: name: "Foo"

0 comments on commit 0d0334f

Please sign in to comment.