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