
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. llvm-svn: 274246
94 lines
2.4 KiB
C++
94 lines
2.4 KiB
C++
// 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; }
|
|
// UNQUAL-DAG: "b"
|
|
// QUAL-DAG: "N::b"
|
|
namespace { void func() { } }
|
|
// UNQUAL-DAG: "func"
|
|
// QUAL-DAG: "N::`anonymous namespace'::func"
|
|
}
|
|
|
|
void _c(void) {
|
|
N::func();
|
|
}
|
|
// CHECK-DAG: "_c"
|
|
|
|
struct foo {
|
|
int operator+(int);
|
|
foo(){}
|
|
// UNQUAL-DAG: "foo"
|
|
// QUAL-DAG: "foo::foo"
|
|
|
|
~foo(){}
|
|
// UNQUAL-DAG: "~foo"
|
|
// QUAL-DAG: "foo::~foo"
|
|
|
|
foo(int i){}
|
|
// UNQUAL-DAG: "foo"
|
|
// QUAL-DAG: "foo::foo"
|
|
|
|
foo(char *q){}
|
|
// UNQUAL-DAG: "foo"
|
|
// QUAL-DAG: "foo::foo"
|
|
|
|
static foo* static_method() { return 0; }
|
|
// UNQUAL-DAG: "static_method"
|
|
// QUAL-DAG: "foo::static_method"
|
|
|
|
};
|
|
|
|
void use_foo() {
|
|
foo f1, f2(1), f3((char*)0);
|
|
foo::static_method();
|
|
}
|
|
|
|
// UNQUAL-DAG: "operator+"
|
|
// QUAL-DAG: "foo::operator+"
|
|
int foo::operator+(int a) { return a; }
|
|
|
|
// PR17371
|
|
struct OverloadedNewDelete {
|
|
// __cdecl
|
|
void *operator new(__SIZE_TYPE__);
|
|
void *operator new[](__SIZE_TYPE__);
|
|
void operator delete(void *);
|
|
void operator delete[](void *);
|
|
// __thiscall
|
|
int operator+(int);
|
|
};
|
|
|
|
void *OverloadedNewDelete::operator new(__SIZE_TYPE__ s) { return 0; }
|
|
void *OverloadedNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; }
|
|
void OverloadedNewDelete::operator delete(void *) { }
|
|
void OverloadedNewDelete::operator delete[](void *) { }
|
|
int OverloadedNewDelete::operator+(int x) { return x; };
|
|
|
|
// 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() {}
|
|
|
|
template void fn_tmpl<int, freefunc>();
|
|
// CHECK-DAG: "fn_tmpl<int,&freefunc>"
|