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

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 7 15:45:55 PDT 2016


Yeah - is this necessary for CodeView? (does something break, or do you
just get simple names where you'd prefer full mangled or qualified names)

It was chosen pretty deliberately to do it this way (use unqualified names)
for gmlt to keep size down. Have you got numbers for the size delta for
CodeView with this change? I'd really prefer to make the same choice for
both - it'd seem a bit arbitrary to choose our size optimization based on
differences in the kind of workloads we happen to have on these two
platforms.

- David

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/20160707/13257c3d/attachment.html>


More information about the cfe-commits mailing list