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

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 6 01:53:07 PDT 2018


On Fri, Jul 6, 2018 at 4:33 AM, Zachary Turner via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> 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/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()

In Chromium's build this failed [1] because DIA was printing the qualified name:

<stdin>:10:2: note: possible intended match here
 func [0x000010c0+ 0 - 0x000010dd-29 | sizeof= 29] (FPO) virtual int
__cdecl T::A105()
 ^

Maybe because the bot uses a different DIA version. I've relaxed the
check a little in r336424.

 [1] https://logs.chromium.org/v/?s=chromium%2Fbb%2Ftryserver.chromium.win%2Fwin_upload_clang%2F365%2F%2B%2Frecipes%2Fsteps%2Fpackage_clang%2F0%2Fstdout


More information about the llvm-commits mailing list