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@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits