From 0336cc05e718cd394cfd22ab519f9a9a4c998b08 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 27 Apr 2016 16:10:29 +0000 Subject: [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 --- .../test/tools/llvm-symbolizer/pdb/Inputs/test.cpp | 4 +++ .../test/tools/llvm-symbolizer/pdb/Inputs/test.exe | Bin 126464 -> 22528 bytes .../test/tools/llvm-symbolizer/pdb/Inputs/test.pdb | Bin 1626112 -> 405504 bytes llvm/test/tools/llvm-symbolizer/pdb/pdb.test | 32 ++++++++++++--------- 4 files changed, 22 insertions(+), 14 deletions(-) (limited to 'llvm/test/tools/llvm-symbolizer') 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 Binary files a/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.exe and b/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.exe 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 Binary files a/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.pdb and b/llvm/test/tools/llvm-symbolizer/pdb/Inputs/test.pdb 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 -- cgit v1.2.3