r274246 - [codeview] Emit qualified display names if -gline-tables-only is on

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 30 11:05:47 PDT 2016


David and Paul,

Do you think I should enable this behavior for DWARF as well? We only emit
a DW_TAG_subprogram when a function is inlined or contains inlined
functions, which might not be that many. IIRC Paul did something similar
with DW_AT_linkage_name, and the object file size cost wasn't that bad.

Reid

On Thu, Jun 30, 2016 at 10:41 AM, Reid Kleckner via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: rnk
> Date: Thu Jun 30 12:41:31 2016
> New Revision: 274246
>
> URL: http://llvm.org/viewvc/llvm-project?rev=274246&view=rev
> Log:
> [codeview] Emit qualified display names if -gline-tables-only is on
>
> When -gmlt is on, we don't emit namespace or class scope information,
> and the CodeView emission code in LLVM can't compute the fully qualified
> name. If we know LLVM won't be able to get the name right, go ahead and
> emit the qualified name in the frontend.
>
> We could change our -gmlt emission strategy to include those scopes when
> emitting codeview, but that would increase memory usage and slow down
> LTO and add more complexity to debug info emission.
>
> The same problem exists when you debug a -gmlt binary with GDB, so we
> should consider removing '&& EmitCodeView' from the condition here at
> some point in the future after evaluating the impact on object file
> size.
>
> Modified:
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>     cfe/trunk/test/CodeGenCXX/debug-info-codeview-display-name.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=274246&r1=274245&r2=274246&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Thu Jun 30 12:41:31 2016
> @@ -185,17 +185,27 @@ StringRef CGDebugInfo::getFunctionName(c
>    FunctionTemplateSpecializationInfo *Info =
>        FD->getTemplateSpecializationInfo();
>
> -  if (!Info && FII)
> +  // Emit the unqualified name in normal operation. LLVM and the debugger
> can
> +  // compute the fully qualified name from the scope chain. If we're only
> +  // emitting line table info, there won't be any scope chains, so emit
> the
> +  // fully qualified name here so that stack traces are more accurate.
> +  // FIXME: Do this when emitting DWARF as well as when emitting CodeView
> after
> +  // evaluating the size impact.
> +  bool UseQualifiedName = DebugKind ==
> codegenoptions::DebugLineTablesOnly &&
> +                          CGM.getCodeGenOpts().EmitCodeView;
> +
> +  if (!Info && FII && !UseQualifiedName)
>      return FII->getName();
>
> -  // Otherwise construct human readable name for debug info.
>    SmallString<128> NS;
>    llvm::raw_svector_ostream OS(NS);
>    PrintingPolicy Policy(CGM.getLangOpts());
>    Policy.MSVCFormatting = CGM.getCodeGenOpts().EmitCodeView;
> +  if (!UseQualifiedName)
> +    FD->printName(OS);
> +  else
> +    FD->printQualifiedName(OS, Policy);
>
> -  // Print the unqualified name with some template arguments.
> -  FD->printName(OS);
>    // Add any template specialization args.
>    if (Info) {
>      const TemplateArgumentList *TArgs = Info->TemplateArguments;
>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-codeview-display-name.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-codeview-display-name.cpp?rev=274246&r1=274245&r2=274246&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-codeview-display-name.cpp
> (original)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-codeview-display-name.cpp Thu Jun
> 30 12:41:31 2016
> @@ -1,14 +1,22 @@
> -// RUN: %clang_cc1 -fblocks -debug-info-kind=limited -gcodeview
> -emit-llvm %s -o - -triple=x86_64-pc-win32 -std=c++98 | \
> -// RUN:  grep 'DISubprogram' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' |
> FileCheck %s
> +// RUN: %clang_cc1 -fblocks -debug-info-kind=limited -gcodeview
> -emit-llvm %s \
> +// RUN:       -o - -triple=x86_64-pc-win32 -std=c++98 | \
> +// RUN:    grep 'DISubprogram' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' |
> \
> +// RUN:    FileCheck %s --check-prefix=CHECK --check-prefix=UNQUAL
> +// RUN: %clang_cc1 -fblocks -debug-info-kind=line-tables-only -gcodeview
> -emit-llvm %s \
> +// RUN:       -o - -triple=x86_64-pc-win32 -std=c++98 | \
> +// RUN:    grep 'DISubprogram' | sed -e 's/.*name: "\([^"]*\)".*/"\1"/' |
> \
> +// RUN:    FileCheck %s --check-prefix=CHECK --check-prefix=QUAL
>
>  void freefunc() { }
>  // CHECK-DAG: "freefunc"
>
>  namespace N {
>    int b() { return 0; }
> -// CHECK-DAG: "b"
> +// UNQUAL-DAG: "b"
> +// QUAL-DAG: "N::b"
>    namespace { void func() { } }
> -// CHECK-DAG: "func"
> +// UNQUAL-DAG: "func"
> +// QUAL-DAG: "N::`anonymous namespace'::func"
>  }
>
>  void _c(void) {
> @@ -19,19 +27,24 @@ void _c(void) {
>  struct foo {
>    int operator+(int);
>    foo(){}
> -// CHECK-DAG: "foo"
> +// UNQUAL-DAG: "foo"
> +// QUAL-DAG: "foo::foo"
>
>    ~foo(){}
> -// CHECK-DAG: "~foo"
> +// UNQUAL-DAG: "~foo"
> +// QUAL-DAG: "foo::~foo"
>
>    foo(int i){}
> -// CHECK-DAG: "foo"
> +// UNQUAL-DAG: "foo"
> +// QUAL-DAG: "foo::foo"
>
>    foo(char *q){}
> -// CHECK-DAG: "foo"
> +// UNQUAL-DAG: "foo"
> +// QUAL-DAG: "foo::foo"
>
>    static foo* static_method() { return 0; }
> -// CHECK-DAG: "static_method"
> +// UNQUAL-DAG: "static_method"
> +// QUAL-DAG: "foo::static_method"
>
>  };
>
> @@ -40,7 +53,8 @@ void use_foo() {
>    foo::static_method();
>  }
>
> -// CHECK-DAG: "operator+"
> +// UNQUAL-DAG: "operator+"
> +// QUAL-DAG: "foo::operator+"
>  int foo::operator+(int a) { return a; }
>
>  // PR17371
> @@ -60,11 +74,17 @@ void OverloadedNewDelete::operator delet
>  void OverloadedNewDelete::operator delete[](void *) { }
>  int OverloadedNewDelete::operator+(int x) { return x; };
>
> -// CHECK-DAG: "operator new"
> -// CHECK-DAG: "operator new[]"
> -// CHECK-DAG: "operator delete"
> -// CHECK-DAG: "operator delete[]"
> -// CHECK-DAG: "operator+"
> +// UNQUAL-DAG: "operator new"
> +// UNQUAL-DAG: "operator new[]"
> +// UNQUAL-DAG: "operator delete"
> +// UNQUAL-DAG: "operator delete[]"
> +// UNQUAL-DAG: "operator+"
> +// QUAL-DAG: "OverloadedNewDelete::operator new"
> +// QUAL-DAG: "OverloadedNewDelete::operator new[]"
> +// QUAL-DAG: "OverloadedNewDelete::operator delete"
> +// QUAL-DAG: "OverloadedNewDelete::operator delete[]"
> +// QUAL-DAG: "OverloadedNewDelete::operator+"
> +
>
>  template <typename T, void (*)(void)>
>  void fn_tmpl() {}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160630/a2c2387c/attachment-0001.html>


More information about the cfe-commits mailing list