Author: Xiangling Liao Date: 2020-07-16T10:43:10-04:00 New Revision: 69f3378ad65b41c979acc1bcb4968d2247e6adf7
URL: https://github.com/llvm/llvm-project/commit/69f3378ad65b41c979acc1bcb4968d2247e6adf7 DIFF: https://github.com/llvm/llvm-project/commit/69f3378ad65b41c979acc1bcb4968d2247e6adf7.diff LOG: [AIX]Generate debug info for static init related functions Set the debug location for static init related functions(__dtor and __finalize) so we can generate valid debug info on AIX by invoking -g with clang or -debug-info-kind=limited with clang_cc1. This also works for any other future targets who may use sinit and sterm functions for static initialization, where a direct call to dtor will be generated within finalize function body. This patch also aims at validating that the debug info generated is correct for AIX sinit related functions. Differential Revision: https://reviews.llvm.org/D83702 Added: clang/test/CodeGenCXX/aix-static-init-debug-info.cpp Modified: clang/lib/CodeGen/CGDeclCXX.cpp clang/lib/CodeGen/ItaniumCXXABI.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index 5a8500364295..4e941021daa3 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -246,7 +246,8 @@ llvm::Function *CodeGenFunction::createAtExitStub(const VarDecl &VD, CodeGenFunction CGF(CGM); CGF.StartFunction(GlobalDecl(&VD, DynamicInitKind::AtExit), - CGM.getContext().VoidTy, fn, FI, FunctionArgList()); + CGM.getContext().VoidTy, fn, FI, FunctionArgList(), + VD.getLocation(), VD.getInit()->getExprLoc()); llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr); diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 80de2a6e3950..12d00c7d59a3 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -4567,7 +4567,8 @@ void XLCXXABI::emitCXXStermFinalizer(const VarDecl &D, llvm::Function *dtorStub, CodeGenFunction CGF(CGM); CGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, StermFinalizer, FI, - FunctionArgList()); + FunctionArgList(), D.getLocation(), + D.getInit()->getExprLoc()); // The unatexit subroutine unregisters __dtor functions that were previously // registered by the atexit subroutine. If the referenced function is found, diff --git a/clang/test/CodeGenCXX/aix-static-init-debug-info.cpp b/clang/test/CodeGenCXX/aix-static-init-debug-info.cpp new file mode 100644 index 000000000000..39de0cdd513a --- /dev/null +++ b/clang/test/CodeGenCXX/aix-static-init-debug-info.cpp @@ -0,0 +1,64 @@ +// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -emit-llvm -x c++ \ +// RUN: -debug-info-kind=limited < %s | \ +// RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s + +// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -emit-llvm -x c++ \ +// RUN: -debug-info-kind=limited < %s | \ +// RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s + +struct X { + X(); + ~X(); +}; + +X v; + +// CHECK: define internal void @__cxx_global_var_init() [[ATTR:#[0-9]+]] !dbg ![[DBGVAR16:[0-9]+]] { +// CHECK: entry: +// CHECK: call void @_ZN1XC1Ev(%struct.X* @v), !dbg ![[DBGVAR19:[0-9]+]] +// CHECK: %0 = call i32 @atexit(void ()* @__dtor_v) [[ATTR:#[0-9]+]], !dbg ![[DBGVAR19]] +// CHECK: ret void, !dbg ![[DBGVAR19]] +// CHECK: } + +// CHECK: define internal void @__dtor_v() [[ATTR:#[0-9]+]] !dbg ![[DBGVAR20:[0-9]+]] { +// CHECK: entry: +// CHECK: call void @_ZN1XD1Ev(%struct.X* @v), !dbg ![[DBGVAR21:[0-9]+]] +// CHECK: ret void, !dbg ![[DBGVAR21]] +// CHECK: } + +// CHECK: define internal void @__finalize_v() [[ATTR:#[0-9]+]] !dbg ![[DBGVAR22:[0-9]+]] { +// CHECK: entry: +// CHECK: %0 = call i32 @unatexit(void ()* @__dtor_v) [[ATTR:#[0-9]+]], !dbg ![[DBGVAR24:[0-9]+]] +// CHECK: %needs_destruct = icmp eq i32 %0, 0, !dbg ![[DBGVAR24]] +// CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end, !dbg ![[DBGVAR24]] + +// CHECK: destruct.call: +// CHECK: call void @__dtor_v(), !dbg ![[DBGVAR24]] +// CHECK: br label %destruct.end, !dbg ![[DBGVAR24]] + +// CHECK: destruct.end: +// CHECK: ret void, !dbg ![[DBGVAR24]] +// CHECK: } + +// CHECK: define void @__sinit80000000_clang_c3236cbaa79f2bae3a15e6379a05f625() [[ATTR:#[0-9]+]] !dbg ![[DBGVAR25:[0-9]+]] { +// CHECK: entry: +// CHECK: call void @__cxx_global_var_init(), !dbg ![[DBGVAR26:[0-9]+]] +// CHECK: ret void +// CHECK: } + +// CHECK: define void @__sterm80000000_clang_c3236cbaa79f2bae3a15e6379a05f625() [[ATTR:#[0-9]+]] !dbg ![[DBGVAR27:[0-9]+]] { +// CHECK: entry: +// CHECK: call void @__finalize_v(), !dbg ![[DBGVAR28:[0-9]+]] +// CHECK: ret void +// CHECK: } + +// CHECK: ![[DBGVAR16]] = distinct !DISubprogram(name: "__cxx_global_var_init", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: 14, type: !{{[0-9]+}}, scopeLine: 14, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}}) +// CHECK: ![[DBGVAR19]] = !DILocation(line: 14, column: 3, scope: ![[DBGVAR16]]) +// CHECK: ![[DBGVAR20]] = distinct !DISubprogram(name: "__dtor_v", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: 14, type: !{{[0-9]+}}, scopeLine: 14, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}}) +// CHECK: ![[DBGVAR21]] = !DILocation(line: 14, column: 3, scope: ![[DBGVAR20]]) +// CHECK: ![[DBGVAR22]] = distinct !DISubprogram(linkageName: "__finalize_v", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: 14, type: !{{[0-9]+}}, scopeLine: 14, flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}}) +// CHECK: ![[DBGVAR24]] = !DILocation(line: 14, column: 3, scope: ![[DBGVAR22]]) +// CHECK: ![[DBGVAR25]] = distinct !DISubprogram(linkageName: "__sinit80000000_clang_c3236cbaa79f2bae3a15e6379a05f625", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, type: !{{[0-9]+}}, flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}}) +// CHECK: ![[DBGVAR26]] = !DILocation(line: 0, scope: ![[DBGVAR25]]) +// CHECK: ![[DBGVAR27]] = distinct !DISubprogram(linkageName: "__sterm80000000_clang_c3236cbaa79f2bae3a15e6379a05f625", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, type: !{{[0-9]+}}, flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: !{{[0-9]+}}, retainedNodes: !{{[0-9]+}}) +// CHECK: ![[DBGVAR28]] = !DILocation(line: 0, scope: ![[DBGVAR27]]) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits