From ce504865ad232f95f2ebd6c431ac3a191cd0f5db Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 8 Feb 2017 16:09:32 +0000 Subject: [PATCH] [MS] Fix C++ destructor thunk line info for a declaration Sometimes the MS ABI needs to emit thunks for declarations that don't have bodies. Destructor thunks make calls to inlinable functions, so they need line info or LLVM will complain. Fixes PR31893 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@294465 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenFunction.cpp | 7 ++++++- test/CodeGenCXX/debug-info-ms-dtor-thunks.cpp | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/CodeGenCXX/debug-info-ms-dtor-thunks.cpp diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index 126390957f..00d5b5fe68 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -1089,8 +1089,13 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn, if (FD->hasAttr()) DebugInfo = nullptr; // disable debug info indefinitely for this function + // The function might not have a body if we're generating thunks for a + // function declaration. SourceRange BodyRange; - if (Stmt *Body = FD->getBody()) BodyRange = Body->getSourceRange(); + if (Stmt *Body = FD->getBody()) + BodyRange = Body->getSourceRange(); + else + BodyRange = FD->getLocation(); CurEHLocation = BodyRange.getEnd(); // Use the location of the start of the function to determine where diff --git a/test/CodeGenCXX/debug-info-ms-dtor-thunks.cpp b/test/CodeGenCXX/debug-info-ms-dtor-thunks.cpp new file mode 100644 index 0000000000..096d2d603b --- /dev/null +++ b/test/CodeGenCXX/debug-info-ms-dtor-thunks.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -triple i686--windows -emit-llvm -debug-info-kind=line-tables-only -x c++ %s -fms-extensions -o - | FileCheck %s + +struct __declspec(dllexport) S { virtual ~S(); }; +struct __declspec(dllexport) T { virtual ~T(); }; +struct __declspec(dllexport) U : S, T { virtual ~U(); }; + +// CHECK-LABEL: define {{.*}} @"\01??_GS@@UAEPAXI@Z" +// CHECK: call x86_thiscallcc void @"\01??_DS@@UAE@XZ"(%struct.S* %this1){{.*}}!dbg !{{[0-9]+}} + +// CHECK-LABEL: define {{.*}} @"\01??_GT@@UAEPAXI@Z" +// CHECK: call x86_thiscallcc void @"\01??_DT@@UAE@XZ"(%struct.T* %this1){{.*}}!dbg !{{[0-9]+}} + +// CHECK-LABEL: define {{.*}} @"\01??_GU@@UAEPAXI@Z" +// CHECK: call x86_thiscallcc void @"\01??_DU@@UAE@XZ"(%struct.U* %this1){{.*}}!dbg !{{[0-9]+}} -- 2.40.0