[lld] r336405 - [PDB] Sort globals symbols by name in GSI hash buckets.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 5 19:33:58 PDT 2018


Author: zturner
Date: Thu Jul  5 19:33:58 2018
New Revision: 336405

URL: http://llvm.org/viewvc/llvm-project?rev=336405&view=rev
Log:
[PDB] Sort globals symbols by name in GSI hash buckets.

It seems like the debugger first computes a symbol's bucket,
and then does a binary search of entries in the bucket using the
symbol's name in order to find it.  If the bucket entries are not
in sorted order, this obviously won't work.  After this patch a
couple of simple test cases show that we generate an exactly
identical GSI hash stream, which is very nice.

Added:
    lld/trunk/test/COFF/Inputs/globals-dia-vfunc-collision.obj   (with props)
    lld/trunk/test/COFF/Inputs/globals-dia-vfunc-collision2.obj   (with props)
    lld/trunk/test/COFF/Inputs/globals-dia-vfunc-simple.obj   (with props)
    lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision.test
    lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision2.test
    lld/trunk/test/COFF/pdb-globals-dia-vfunc-simple.test

Added: lld/trunk/test/COFF/Inputs/globals-dia-vfunc-collision.obj
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/globals-dia-vfunc-collision.obj?rev=336405&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lld/trunk/test/COFF/Inputs/globals-dia-vfunc-collision.obj
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lld/trunk/test/COFF/Inputs/globals-dia-vfunc-collision2.obj
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/globals-dia-vfunc-collision2.obj?rev=336405&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lld/trunk/test/COFF/Inputs/globals-dia-vfunc-collision2.obj
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lld/trunk/test/COFF/Inputs/globals-dia-vfunc-simple.obj
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/globals-dia-vfunc-simple.obj?rev=336405&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lld/trunk/test/COFF/Inputs/globals-dia-vfunc-simple.obj
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision.test?rev=336405&view=auto
==============================================================================
--- lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision.test (added)
+++ lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision.test Thu Jul  5 19:33:58 2018
@@ -0,0 +1,42 @@
+REQUIRES: diasdk
+
+Input object file reconstruction:
+
+; // main.cpp
+; struct S {
+;   // Function names are chosen specifically to generate hash collisions in the
+;   // GSI hash table.
+;   virtual int A307() { return 102; }
+;   virtual int A400() { return 12; }
+;   virtual int A206() { return 201; }
+;   virtual int A105() { return 300; }
+; };
+; 
+; struct T : public S {
+;   int A105() override { return 300; }
+;   int A307() override { return 102; }
+;   int A206() override { return 201; }
+;   int A400() override { return 12; }
+; };
+; 
+; int main(int argc, char **argv) {
+;   T s;
+;   return s.A105() + s.A206() + s.A307() + s.A400();
+; }
+
+clang-cl /Z7 /GS- /GR- /c main.cpp /Foglobals-dia-vfunc-collision.obj
+
+RUN: lld-link /debug /nodefaultlib /entry:main /out:%t.exe %S/Inputs/globals-dia-vfunc-collision.obj
+RUN: llvm-pdbutil pretty -classes %t.pdb | FileCheck %s
+
+CHECK: struct T
+CHECK: func [0x000010c0+ 0 - 0x000010dd-29 | sizeof= 29] (FPO) virtual int __cdecl A105()
+CHECK: func [0x00001100+ 0 - 0x0000111b-27 | sizeof= 27] (FPO) virtual int __cdecl A307()
+CHECK: func [0x000010e0+ 0 - 0x000010fd-29 | sizeof= 29] (FPO) virtual int __cdecl A206()
+CHECK: func [0x00001120+ 0 - 0x0000113b-27 | sizeof= 27] (FPO) virtual int __cdecl A400()
+
+CHECK: struct S
+CHECK: func [0x00001160+ 0 - 0x0000116c-12 | sizeof= 12] (FPO) virtual int __cdecl A307()
+CHECK: func [0x00001170+ 0 - 0x0000117c-12 | sizeof= 12] (FPO) virtual int __cdecl A400()
+CHECK: func [0x00001180+ 0 - 0x0000118c-12 | sizeof= 12] (FPO) virtual int __cdecl A206()
+CHECK: func [0x00001190+ 0 - 0x0000119c-12 | sizeof= 12] (FPO) virtual int __cdecl A105()

Added: lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision2.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision2.test?rev=336405&view=auto
==============================================================================
--- lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision2.test (added)
+++ lld/trunk/test/COFF/pdb-globals-dia-vfunc-collision2.test Thu Jul  5 19:33:58 2018
@@ -0,0 +1,25 @@
+REQUIRES: diasdk
+
+Input object file reconstruction:
+
+; // main.cpp
+; struct S {
+;   // Function names are chosen specifically to generate hash collisions in the
+;   // GSI hash table.
+;   virtual int A132() { return 102; }
+;   virtual int A1001() { return 300; }
+; };
+; 
+; int main(int argc, char **argv) {
+;   S s;
+;   return s.A132();
+; }
+
+clang-cl /Z7 /GS- /GR- /c main.cpp /Foglobals-dia-vfunc-collision2.obj
+
+RUN: lld-link /debug /nodefaultlib /entry:main /out:%t.exe %S/Inputs/globals-dia-vfunc-collision2.obj
+RUN: llvm-pdbutil pretty -classes %t.pdb | FileCheck %s
+
+CHECK: struct S
+CHECK: func [0x00001060+ 0 - 0x0000106c-12 | sizeof= 12] (FPO) virtual int __cdecl A132()
+CHECK: func [0x00001070+ 0 - 0x0000107c-12 | sizeof= 12] (FPO) virtual int __cdecl A1001()

Added: lld/trunk/test/COFF/pdb-globals-dia-vfunc-simple.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/pdb-globals-dia-vfunc-simple.test?rev=336405&view=auto
==============================================================================
--- lld/trunk/test/COFF/pdb-globals-dia-vfunc-simple.test (added)
+++ lld/trunk/test/COFF/pdb-globals-dia-vfunc-simple.test Thu Jul  5 19:33:58 2018
@@ -0,0 +1,26 @@
+REQUIRES: diasdk
+
+Input object file reconstruction:
+
+; // main.cpp
+; struct Base {
+;   virtual int V2() { return 42; }
+; };
+; 
+; struct Derived : public Base {
+;   int V2() override { return 42; }
+; };
+; 
+; int main()
+; {
+;   Derived D;
+;   return D.V2();
+; }
+
+clang-cl /Z7 /GS- /GR- /c main.cpp /Foglobals-dia-vfunc-simple.obj
+
+RUN: lld-link /debug /nodefaultlib /entry:main /out:%t.exe %S/Inputs/globals-dia-vfunc-simple.obj
+RUN: llvm-pdbutil pretty -classes %t.pdb | FileCheck %s
+
+CHECK: func [0x00001070+ 0 - 0x0000107c-12 | sizeof= 12] (FPO) virtual int __cdecl V2()
+CHECK: func [0x000010a0+ 0 - 0x000010ac-12 | sizeof= 12] (FPO) virtual int __cdecl V2()




More information about the llvm-commits mailing list