r371080 - [DebugInfo] Add debug location to stubs generated by CGDeclCXX and mark them as artificial

Alexandre Ganea via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 9 15:15:17 PDT 2019


Hi David,

I've reverted the patch in r371113. It was causing crashes in asan on Linux & Darwin.
Before re-landing the patch, it needs this: https://reviews.llvm.org/D67283

Alex.

-----Message d'origine-----
De : David Blaikie <dblaikie at gmail.com> 
Envoyé : September 9, 2019 6:12 PM
À : Erik Pilkington <erik.pilkington at gmail.com>
Cc : Alexandre Ganea <alexandre.ganea at ubisoft.com>; cfe-commits <cfe-commits at lists.llvm.org>
Objet : Re: r371080 - [DebugInfo] Add debug location to stubs generated by CGDeclCXX and mark them as artificial

Any resolution/discussion on this crash?

On Thu, Sep 5, 2019 at 12:49 PM Erik Pilkington via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>
> Hi Alexandre,
>
> Looks like this commit is causing crashes on darwin, can you take a 
> look please? Here is a failing bot: 
> http://lab.llvm.org:8080/green/job/clang-stage1-RA/1671/
>
> Thanks!
> Erik
>
> On Thu, Sep 5, 2019 at 11:23 AM Alexandre Ganea via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: aganea
>> Date: Thu Sep  5 08:24:49 2019
>> New Revision: 371080
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=371080&view=rev
>> Log:
>> [DebugInfo] Add debug location to stubs generated by CGDeclCXX and 
>> mark them as artificial
>>
>> Differential Revision: https://reviews.llvm.org/D66328
>>
>> Added:
>>     cfe/trunk/test/CodeGenCXX/debug-info-atexit-stub.cpp
>>     cfe/trunk/test/CodeGenCXX/debug-info-destroy-helper.cpp
>> Modified:
>>     cfe/trunk/include/clang/AST/GlobalDecl.h
>>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>>     cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
>>     cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp
>>     cfe/trunk/test/CodeGenCXX/debug-info-line.cpp
>>
>> Modified: cfe/trunk/include/clang/AST/GlobalDecl.h
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Globa
>> lDecl.h?rev=371080&r1=371079&r2=371080&view=diff
>> =====================================================================
>> =========
>> --- cfe/trunk/include/clang/AST/GlobalDecl.h (original)
>> +++ cfe/trunk/include/clang/AST/GlobalDecl.h Thu Sep  5 08:24:49 2019
>> @@ -31,6 +31,7 @@ enum class DynamicInitKind : unsigned {
>>    NoStub = 0,
>>    Initializer,
>>    AtExit,
>> +  GlobalArrayDestructor
>>  };
>>
>>  /// GlobalDecl - represents a global declaration. This can either be 
>> a
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo
>> .cpp?rev=371080&r1=371079&r2=371080&view=diff
>> =====================================================================
>> =========
>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Thu Sep  5 08:24:49 2019
>> @@ -1910,7 +1910,8 @@ StringRef CGDebugInfo::getDynamicInitial
>>                                                   llvm::Function *InitFn) {
>>    // If we're not emitting codeview, use the mangled name. For Itanium, this is
>>    // arbitrary.
>> -  if (!CGM.getCodeGenOpts().EmitCodeView)
>> +  if (!CGM.getCodeGenOpts().EmitCodeView ||
>> +      StubKind == DynamicInitKind::GlobalArrayDestructor)
>>      return InitFn->getName();
>>
>>    // Print the normal qualified name for the variable, then break 
>> off the last @@ -1935,6 +1936,7 @@ StringRef 
>> CGDebugInfo::getDynamicInitial
>>
>>    switch (StubKind) {
>>    case DynamicInitKind::NoStub:
>> +  case DynamicInitKind::GlobalArrayDestructor:
>>      llvm_unreachable("not an initializer");
>>    case DynamicInitKind::Initializer:
>>      OS << "`dynamic initializer for '"; @@ -3569,7 +3571,8 @@ void 
>> CGDebugInfo::EmitFunctionStart(Glob
>>    if (Name.startswith("\01"))
>>      Name = Name.substr(1);
>>
>> -  if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>()) {
>> +  if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>() ||
>> +      (isa<VarDecl>(D) && GD.getDynamicInitKind() != 
>> + DynamicInitKind::NoStub)) {
>>      Flags |= llvm::DINode::FlagArtificial;
>>      // Artificial functions should not silently reuse CurLoc.
>>      CurLoc = SourceLocation();
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.c
>> pp?rev=371080&r1=371079&r2=371080&view=diff
>> =====================================================================
>> =========
>> --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Thu Sep  5 08:24:49 2019
>> @@ -247,6 +247,8 @@ llvm::Function *CodeGenFunction::createA
>>
>>    CGF.StartFunction(GlobalDecl(&VD, DynamicInitKind::AtExit),
>>                      CGM.getContext().VoidTy, fn, FI, 
>> FunctionArgList());
>> +  // Emit an artificial location for this function.
>> +  auto AL = ApplyDebugLocation::CreateArtificial(CGF);
>>
>>    llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr);
>>
>> @@ -642,8 +644,9 @@ void CodeGenFunction::GenerateCXXGlobalV
>>
>>    StartFunction(GlobalDecl(D, DynamicInitKind::Initializer),
>>                  getContext().VoidTy, Fn, getTypes().arrangeNullaryFunction(),
>> -                FunctionArgList(), D->getLocation(),
>> -                D->getInit()->getExprLoc());
>> +                FunctionArgList());
>> +  // Emit an artificial location for this function.
>> +  auto AL = ApplyDebugLocation::CreateArtificial(*this);
>>
>>    // Use guarded initialization if the global variable is weak. This
>>    // occurs for, e.g., instantiated static data members and @@ 
>> -768,7 +771,10 @@ llvm::Function *CodeGenFunction::generat
>>
>>    CurEHLocation = VD->getBeginLoc();
>>
>> -  StartFunction(VD, getContext().VoidTy, fn, FI, args);
>> +  StartFunction(GlobalDecl(VD, DynamicInitKind::GlobalArrayDestructor),
>> +                getContext().VoidTy, fn, FI, args);  // Emit an 
>> + artificial location for this function.
>> +  auto AL = ApplyDebugLocation::CreateArtificial(*this);
>>
>>    emitDestroy(addr, type, destroyer, useEHCleanupForArray);
>>
>>
>> Added: cfe/trunk/test/CodeGenCXX/debug-info-atexit-stub.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-i
>> nfo-atexit-stub.cpp?rev=371080&view=auto
>> =====================================================================
>> =========
>> --- cfe/trunk/test/CodeGenCXX/debug-info-atexit-stub.cpp (added)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-atexit-stub.cpp Thu Sep  5 
>> +++ 08:24:49 2019
>> @@ -0,0 +1,20 @@
>> +// RUN: %clang_cc1 -emit-llvm %s -triple x86_64-windows-msvc 
>> +-gcodeview -debug-info-kind=limited -o - | FileCheck %s
>> +
>> +struct a {
>> +  ~a();
>> +};
>> +template <typename b> struct c : a {
>> +  c(void (b::*)());
>> +};
>> +struct B {
>> +  virtual void e();
>> +};
>> +c<B> *d() { static c<B> f(&B::e); return &f; }
>> +
>> +// CHECK: define internal void 
>> +@"??__Ff@?1??d@@YAPEAU?$c at UB@@@@XZ at YAXXZ"()
>> +// CHECK-SAME: !dbg ![[SUBPROGRAM:[0-9]+]] { // CHECK: call void 
>> +@"??1?$c at UB@@@@QEAA at XZ"(%struct.c* 
>> +@"?f@?1??d@@YAPEAU?$c at UB@@@@XZ at 4U2@A"), !dbg ![[LOCATION:[0-9]+]] // 
>> +CHECK-NEXT: ret void, !dbg ![[LOCATION]] // CHECK: ![[SUBPROGRAM]] = distinct !DISubprogram(name: "`dynamic atexit destructor for 'f'"
>> +// CHECK-SAME: flags: DIFlagArtificial // CHECK: ![[LOCATION]] = 
>> +!DILocation(line: 0, scope: ![[SUBPROGRAM]])
>> \ No newline at end of file
>>
>> Added: cfe/trunk/test/CodeGenCXX/debug-info-destroy-helper.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-i
>> nfo-destroy-helper.cpp?rev=371080&view=auto
>> =====================================================================
>> =========
>> --- cfe/trunk/test/CodeGenCXX/debug-info-destroy-helper.cpp (added)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-destroy-helper.cpp Thu Sep  
>> +++ 5 08:24:49 2019
>> @@ -0,0 +1,24 @@
>> +// RUN: %clang_cc1 -emit-llvm %s -triple x86_64-windows-msvc 
>> +-gcodeview -debug-info-kind=limited -o - | FileCheck %s
>> +
>> +struct b {
>> +  b(char *);
>> +  ~b();
>> +};
>> +struct a {
>> +  ~a();
>> +};
>> +struct {
>> +  b c;
>> +  const a &d;
>> +} e[]{nullptr, {}};
>> +
>> +// CHECK: define internal void @__cxx_global_array_dtor(i8* %0) // 
>> +CHECK-SAME: !dbg ![[SUBPROGRAM:[0-9]+]] { // CHECK: 
>> +arraydestroy.body // CHECK: %arraydestroy.elementPast = // 
>> +CHECK-SAME: !dbg ![[LOCATION:[0-9]+]] // CHECK: call void 
>> +@"??1<unnamed-type-e>@@QEAA at XZ"(%struct.anon* %arraydestroy.element) 
>> +// CHECK-SAME: !dbg ![[LOCATION]] // CHECK: ![[SUBPROGRAM]] = 
>> +distinct !DISubprogram(name: "__cxx_global_array_dtor"
>> +// CHECK-SAME: flags: DIFlagArtificial // CHECK: ![[LOCATION]] = 
>> +!DILocation(line: 0,
>>
>> Modified: cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-i
>> nfo-global-ctor-dtor.cpp?rev=371080&r1=371079&r2=371080&view=diff
>> =====================================================================
>> =========
>> --- cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp 
>> (original)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp Thu Sep  
>> +++ 5 08:24:49 2019
>> @@ -29,25 +29,26 @@ template <typename U>  A 
>> FooTpl<T>::sdm_tpl(sizeof(U) + sizeof(T));  template A 
>> FooTpl<int>::sdm_tpl<int>;
>>
>> -// CHECK-NOKEXT: !DISubprogram(name: "__cxx_global_var_init",{{.*}} 
>> line: 15,{{.*}} DISPFlagLocalToUnit | DISPFlagDefinition -// 
>> CHECK-NOKEXT: !DISubprogram(name: "__dtor_glob",{{.*}} line: 
>> 15,{{.*}} DISPFlagLocalToUnit | DISPFlagDefinition -// CHECK-NOKEXT: 
>> !DISubprogram(name: "__cxx_global_var_init.1",{{.*}} line: 16,{{.*}} 
>> DISPFlagLocalToUnit | DISPFlagDefinition -// CHECK-NOKEXT: 
>> !DISubprogram(name: "__cxx_global_array_dtor",{{.*}} line: 16,{{.*}} 
>> DISPFlagLocalToUnit | DISPFlagDefinition -// CHECK-NOKEXT: 
>> !DISubprogram(name: "__dtor_array",{{.*}} line: 16,{{.*}} 
>> DISPFlagLocalToUnit | DISPFlagDefinition -// CHECK-NOKEXT: 
>> !DISubprogram(name: "__dtor__ZZ3foovE4stat",{{.*}} line: 19,{{.*}} 
>> DISPFlagLocalToUnit | DISPFlagDefinition
>> +// CHECK-NOKEXT: !DISubprogram(name: "__cxx_global_var_init",{{.*}} 
>> +flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | 
>> +DISPFlagDefinition // CHECK-NOKEXT: !DISubprogram(name: 
>> +"__dtor_glob",{{.*}} flags: DIFlagArtificial, spFlags: 
>> +DISPFlagLocalToUnit | DISPFlagDefinition // CHECK-NOKEXT: 
>> +!DISubprogram(name: "__cxx_global_var_init.1",{{.*}} flags: 
>> +DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition 
>> +// CHECK-NOKEXT: !DISubprogram(name: 
>> +"__cxx_global_array_dtor",{{.*}} flags: DIFlagArtificial, spFlags: 
>> +DISPFlagLocalToUnit | DISPFlagDefinition // CHECK-NOKEXT: 
>> +!DISubprogram(name: "__dtor_array",{{.*}} flags: DIFlagArtificial, 
>> +spFlags: DISPFlagLocalToUnit | DISPFlagDefinition // CHECK-NOKEXT: 
>> +!DISubprogram(name: "__dtor__ZZ3foovE4stat",{{.*}} flags: 
>> +DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
>>  // CHECK-NOKEXT: !DISubprogram({{.*}} DISPFlagLocalToUnit | 
>> DISPFlagDefinition
>>
>>  // CHECK-KEXT: !DISubprogram({{.*}} DISPFlagLocalToUnit | 
>> DISPFlagDefinition
>>
>> -// CHECK-MSVC: !DISubprogram(name: "`dynamic initializer for 
>> 'glob'",{{.*}} line: 15,{{.*}}: DISPFlagLocalToUnit | 
>> DISPFlagDefinition -// CHECK-MSVC: !DISubprogram(name: "`dynamic 
>> atexit destructor for 'glob'",{{.*}} line: 15,{{.*}}: 
>> DISPFlagLocalToUnit | DISPFlagDefinition -// CHECK-MSVC: 
>> !DISubprogram(name: "`dynamic initializer for 'array'",{{.*}} line: 
>> 16,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition -// CHECK-MSVC: 
>> !DISubprogram(name: "__cxx_global_array_dtor",{{.*}} line: 16,{{.*}}: 
>> DISPFlagLocalToUnit | DISPFlagDefinition -// CHECK-MSVC: 
>> !DISubprogram(name: "`dynamic atexit destructor for 'array'",{{.*}} 
>> line: 16,{{.*}}: DISPFlagLocalToUnit | DISPFlagDefinition -// 
>> CHECK-MSVC: !DISubprogram(name: "`dynamic atexit destructor for 
>> 'stat'",{{.*}} line: 19,{{.*}}: DISPFlagLocalToUnit | 
>> DISPFlagDefinition
>> +// CHECK-MSVC: !DISubprogram(name: "`dynamic initializer for 
>> +'glob'",{{.*}} flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit 
>> +| DISPFlagDefinition // CHECK-MSVC: !DISubprogram(name: "`dynamic 
>> +atexit destructor for 'glob'",{{.*}} flags: DIFlagArtificial, 
>> +spFlags: DISPFlagLocalToUnit | DISPFlagDefinition // CHECK-MSVC: 
>> +!DISubprogram(name: "`dynamic initializer for 'array'",{{.*}} flags: 
>> +DIFlagArtificial, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition 
>> +// CHECK-MSVC: !DISubprogram(name: "__cxx_global_array_dtor",{{.*}} 
>> +flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | 
>> +DISPFlagDefinition // CHECK-MSVC: !DISubprogram(name: "`dynamic 
>> +atexit destructor for 'array'",{{.*}} flags: DIFlagArtificial, 
>> +spFlags: DISPFlagLocalToUnit | DISPFlagDefinition // CHECK-MSVC: 
>> +!DISubprogram(name: "`dynamic atexit destructor for 'stat'",{{.*}} 
>> +flags: DIFlagArtificial, spFlags: DISPFlagLocalToUnit | 
>> +DISPFlagDefinition
>>
>>  // MSVC does weird stuff when templates are involved, so we don't 
>> match exactly,  // but these names are reasonable.
>>  // FIXME: These should not be marked DISPFlagLocalToUnit.
>> -// CHECK-MSVC: !DISubprogram(name: "FooTpl<int>::`dynamic 
>> initializer for 'sdm_tpl<int>'",{{.*}} line: 29,{{.*}}: 
>> DISPFlagLocalToUnit | DISPFlagDefinition -// CHECK-MSVC: 
>> !DISubprogram(name: "FooTpl<int>::`dynamic atexit destructor for 
>> 'sdm_tpl<int>'",{{.*}} line: 29,{{.*}}: DISPFlagLocalToUnit | 
>> DISPFlagDefinition
>> +// CHECK-MSVC: !DISubprogram(name: "FooTpl<int>::`dynamic 
>> +initializer for 'sdm_tpl<int>'",{{.*}} flags: DIFlagArtificial, 
>> +spFlags: DISPFlagLocalToUnit | DISPFlagDefinition // CHECK-MSVC: 
>> +!DISubprogram(name: "FooTpl<int>::`dynamic atexit destructor for 
>> +'sdm_tpl<int>'",{{.*}} flags: DIFlagArtificial, spFlags: 
>> +DISPFlagLocalToUnit | DISPFlagDefinition // CHECK-MSVC: 
>> +!DISubprogram(linkageName: 
>> +"_GLOBAL__sub_I_debug_info_global_ctor_dtor.cpp",{{.*}} flags: 
>> +DIFlagArtificial
>> \ No newline at end of file
>>
>> Modified: cfe/trunk/test/CodeGenCXX/debug-info-line.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-i
>> nfo-line.cpp?rev=371080&r1=371079&r2=371080&view=diff
>> =====================================================================
>> =========
>> --- cfe/trunk/test/CodeGenCXX/debug-info-line.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-line.cpp Thu Sep  5 08:24:49 
>> +++ 2019
>> @@ -314,7 +314,7 @@ void f25() {
>>  // CHECK: [[DBG_F9]] = !DILocation(line: 1000,  // CHECK: 
>> [[DBG_F10_STORE]] = !DILocation(line: 1100,  // CHECK: 
>> [[DBG_GLBL_CTOR_B]] = !DILocation(line: 1200, -// CHECK: 
>> [[DBG_GLBL_DTOR_B]] = !DILocation(line: 1200,
>> +// CHECK: [[DBG_GLBL_DTOR_B]] = !DILocation(line: 0,
>>  // CHECK: [[DBG_F11]] = !DILocation(line: 1300,  // CHECK: 
>> [[DBG_F12]] = !DILocation(line: 1400,  // CHECK: [[DBG_F13]] = 
>> !DILocation(line: 1500,
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list