| |
| # This test ensures that under /DEBUG:GHASH, IPI records LF_FUNC_ID/LF_MFUNC_ID |
| # have properly remapped indices to corresponding TPI records. |
| |
| RUN: lld-link %p/Inputs/precomp-ghash-precomp.obj \ |
| RUN: %p/Inputs/precomp-ghash-obj1.obj\ |
| RUN: %p/Inputs/precomp-ghash-obj2.obj /debug:ghash /out:%t.exe /pdb:%t.pdb /nodefaultlib /force |
| RUN: llvm-pdbutil dump -types -ids %t.pdb | FileCheck %s |
| |
| ; These object files were generated via the following inputs and commands: |
| ; ---------------------------------------------- |
| ; // precomp-ghash-obj.h |
| ; namespace NS { |
| ; struct Foo { |
| ; explicit Foo(int x) : X(x) {} |
| ; int X; |
| ; }; |
| ; |
| ; int func(const Foo &f); |
| ; } |
| ; ---------------------------------------------- |
| ; // precomp-ghash-obj1.cpp |
| ; #include "precomp-ghash-obj.h" |
| ; |
| ; int main(int argc, char **argv) { |
| ; NS::Foo f(argc); |
| ; return NS::func(f); |
| ; } |
| ; ---------------------------------------------- |
| ; // precomp-ghash-obj2.cpp |
| ; #include "precomp-ghash-obj.h" |
| ; |
| ; int NS::func(const Foo &f) { |
| ; return 2 * f.X; |
| ; } |
| ; ---------------------------------------------- |
| ; // precomp-ghash-precomp.cpp |
| ; #include "precomp-ghash-obj.h" |
| ; ---------------------------------------------- |
| ; $ cl /c /Z7 /GS- precomp-ghash-precomp.cpp /Ycprecomp-ghash-obj.h |
| ; $ cl /c /Z7 /GS- precomp-ghash-obj1.cpp /Yuprecomp-ghash-obj.h |
| ; $ cl /c /Z7 /GS- precomp-ghash-obj2.cpp /Yuprecomp-ghash-obj.h |
| |
| CHECK: Types (TPI Stream) |
| CHECK-NEXT: ============================================================ |
| CHECK: 0x1003 | LF_MFUNCTION |
| CHECK: 0x1377 | LF_PROCEDURE |
| CHECK: Types (IPI Stream) |
| CHECK-NEXT: ============================================================ |
| CHECK: 0x10A5 | LF_FUNC_ID [size = 20] |
| CHECK-NEXT: name = main, type = 0x1377, parent scope = <no type> |
| CHECK-NEXT: 0x10A6 | LF_MFUNC_ID [size = 20] |
| CHECK-NEXT: name = {ctor}, type = 0x1003, class type = 0x1000 |