summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2016-04-27 16:10:29 +0000
committerReid Kleckner <rnk@google.com>2016-04-27 16:10:29 +0000
commit0336cc05e718cd394cfd22ab519f9a9a4c998b08 (patch)
treef9a992b369a5c359b90467a097be779c83825a64 /llvm
parent5b759f82fa0a48eb828d59efd5fa2b923eb94a3d (diff)
downloadbcm5719-llvm-0336cc05e718cd394cfd22ab519f9a9a4c998b08.tar.gz
bcm5719-llvm-0336cc05e718cd394cfd22ab519f9a9a4c998b08.zip
[PDB] Fix function names for private symbols in PDBs
Summary: llvm-symbolizer wants to get linkage names of functions for historical reasons. Linkage names are only recorded in the PDB for public symbols, and the linkage name is apparently stored separately in some "public symbol" record. We had a workaround in PDBContext which would look for such symbols when the user requested linkage names. However, when given an address that was truly in a private function and public funciton, we would accidentally find nearby public symbols and return those function names. The fix is to look for both function symbols and public symbols and only prefer the public symbol name if the addresses of the symbols agree. Fixes PR27492 Reviewers: zturner Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D19571 llvm-svn: 267732
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/DebugInfo/PDB/PDBContext.cpp26
-rw-r--r--llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.cpp4
-rw-r--r--llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.exebin126464 -> 22528 bytes
-rw-r--r--llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.pdbbin1626112 -> 405504 bytes
-rw-r--r--llvm/test/tools/llvm-symbolizer/pdb/pdb.test32
5 files changed, 34 insertions, 28 deletions
diff --git a/llvm/lib/DebugInfo/PDB/PDBContext.cpp b/llvm/lib/DebugInfo/PDB/PDBContext.cpp
index 561a91ea08b..73c56162430 100644
--- a/llvm/lib/DebugInfo/PDB/PDBContext.cpp
+++ b/llvm/lib/DebugInfo/PDB/PDBContext.cpp
@@ -96,26 +96,24 @@ std::string PDBContext::getFunctionName(uint64_t Address,
if (NameKind == DINameKind::None)
return std::string();
+ std::unique_ptr<PDBSymbol> FuncSymbol =
+ Session->findSymbolByAddress(Address, PDB_SymType::Function);
+ auto *Func = dyn_cast_or_null<PDBSymbolFunc>(FuncSymbol.get());
+
if (NameKind == DINameKind::LinkageName) {
// It is not possible to get the mangled linkage name through a
// PDBSymbolFunc. For that we have to specifically request a
// PDBSymbolPublicSymbol.
auto PublicSym =
Session->findSymbolByAddress(Address, PDB_SymType::PublicSymbol);
- if (auto PS = dyn_cast_or_null<PDBSymbolPublicSymbol>(PublicSym.get()))
- return PS->getName();
+ if (auto *PS = dyn_cast_or_null<PDBSymbolPublicSymbol>(PublicSym.get())) {
+ // If we also have a function symbol, prefer the use of public symbol name
+ // only if it refers to the same address. The public symbol uses the
+ // linkage name while the function does not.
+ if (!Func || Func->getVirtualAddress() == PS->getVirtualAddress())
+ return PS->getName();
+ }
}
- auto FuncSymbol =
- Session->findSymbolByAddress(Address, PDB_SymType::Function);
-
- // This could happen either if there was no public symbol (e.g. not
- // external) or the user requested the short name. In the former case,
- // although they technically requested the linkage name, if the linkage
- // name is not available we fallback to at least returning a non-empty
- // string.
- if (auto Func = dyn_cast_or_null<PDBSymbolFunc>(FuncSymbol.get()))
- return Func->getName();
-
- return std::string();
+ return Func ? Func->getName() : std::string();
}
diff --git a/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.cpp b/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.cpp
index e317ed33589..bf97594fa4c 100644
--- a/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.cpp
+++ b/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.cpp
@@ -10,11 +10,15 @@ struct Foo {
void foo() {
}
+static void private_symbol() {
+}
+
int main() {
foo();
NS::Foo f;
f.bar();
+ private_symbol();
}
extern "C" {
diff --git a/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.exe b/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.exe
index a4f148e67c2..935f92cdb84 100644
--- a/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.exe
+++ b/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.exe
Binary files differ
diff --git a/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.pdb b/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.pdb
index d26d33a862d..9d9086874e5 100644
--- a/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.pdb
+++ b/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.pdb
Binary files differ
diff --git a/llvm/test/tools/llvm-symbolizer/pdb/pdb.test b/llvm/test/tools/llvm-symbolizer/pdb/pdb.test
index e8ed1f4b395..a97b35eab9c 100644
--- a/llvm/test/tools/llvm-symbolizer/pdb/pdb.test
+++ b/llvm/test/tools/llvm-symbolizer/pdb/pdb.test
@@ -13,33 +13,37 @@ RUN: | %python -c 'import sys;print("\n".join([hex(int(x, 16) - 0x400000) for x
RUN: | llvm-symbolizer -obj="%p/Inputs/test.exe" -demangle=false --relative-address \
RUN: | FileCheck %s --check-prefix=CHECK-NO-DEMANGLE
-ADDR: 0x401000
-ADDR: 0x401010
-ADDR: 0x401070
-ADDR: 0x401030
-ADDR: 0x401040
-ADDR: 0x401050
-ADDR: 0x401060
-ADDR: 0x500000
+ADDR: 0x401380
+ADDR: 0x401390
+ADDR: 0x4013A0
+ADDR: 0x4013C0
+ADDR: 0x4013D0
+ADDR: 0x4013E0
+ADDR: 0x4013F0
+ADDR: 0x401420
CHECK: foo(void)
CHECK-NEXT: test.cpp:10
-CHECK: main
+CHECK: {{^private_symbol$}}
CHECK-NEXT: test.cpp:13:0
-CHECK: NS::Foo::bar(void)
-CHECK-NEXT: test.cpp:6:0
+CHECK: {{^main}}
+CHECK-NEXT: test.cpp:16:0
CHECK: {{^foo_cdecl$}}
CHECK: {{^foo_stdcall$}}
CHECK: {{^foo_fastcall$}}
CHECK: {{^foo_vectorcall$}}
+CHECK: NS::Foo::bar(void)
+CHECK-NEXT: test.cpp:6:0
CHECK-NO-DEMANGLE: ?foo@@YAXXZ
CHECK-NO-DEMANGLE-NEXT: test.cpp:10
-CHECK-NO-DEMANGLE: _main
+CHECK-NO-DEMANGLE: private_symbol
CHECK-NO-DEMANGLE-NEXT: test.cpp:13
-CHECK-NO-DEMANGLE: ?bar@Foo@NS@@QAEXXZ
-CHECK-NO-DEMANGLE-NEXT: test.cpp:6
+CHECK-NO-DEMANGLE: _main
+CHECK-NO-DEMANGLE-NEXT: test.cpp:16
CHECK-NO-DEMANGLE: _foo_cdecl
CHECK-NO-DEMANGLE: _foo_stdcall@0
CHECK-NO-DEMANGLE: @foo_fastcall@0
CHECK-NO-DEMANGLE: foo_vectorcall@@0
+CHECK-NO-DEMANGLE: ?bar@Foo@NS@@QAEXXZ
+CHECK-NO-DEMANGLE-NEXT: test.cpp:6
OpenPOWER on IntegriCloud