1Test the linker line tables on roughly the following example: 2 3==> foo.h <== 4void bar(void); 5inline void foo(void) { 6 bar(); 7} 8==> pdb_lines_1.c <== 9#include "foo.h" 10int main(void) { 11 foo(); 12 return 42; 13} 14==> pdb_lines_2.c <== 15void bar(void) { 16} 17 18$ clang-cl -fdebug-compilation-dir . -no-canonical-prefixes -c -Z7 pdb_lines*.c 19$ obj2yaml pdb_lines_1.obj > pdb_lines_1_relative.yaml 20$ obj2yaml pdb_lines_2.obj > pdb_lines_2_relative.yaml 21 22/pdbsourcepath: only sets the directory that relative paths are considered 23relative to, so this test needs to pass relative paths to lld-link for: 241. The input obj files 252. The /pdb: switch 263. The lld-link invocation itself 27To achieve this, put all inputs of the lld-link invocation (including lld-link 28itself) in a temp directory that's cwd and then make sure to only use relative 29arguments when calling ./lld-link below. 30RUN: rm -rf %t 31RUN: mkdir %t 32RUN: cp lld-link %t/lld-link 33RUN: cd %t 34 35RUN: yaml2obj %S/Inputs/pdb_lines_1_relative.yaml -o %t/pdb_lines_1_relative.obj 36RUN: yaml2obj %S/Inputs/pdb_lines_2_relative.yaml -o %t/pdb_lines_2_relative.obj 37RUN: ./lld-link -debug "-pdbsourcepath:c:\src" -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb pdb_lines_1_relative.obj pdb_lines_2_relative.obj 38RUN: llvm-pdbutil pdb2yaml -ipi-stream -modules -module-files -module-syms -subsections=lines,fc %t/out.pdb | FileCheck %s 39RUN: ./lld-link -debug "-pdbsourcepath:/usr/src" -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb pdb_lines_1_relative.obj pdb_lines_2_relative.obj 40RUN: llvm-pdbutil pdb2yaml -ipi-stream -modules -module-files -module-syms -subsections=lines,fc %t/out.pdb | FileCheck --check-prefix=POSIX %s 41 42Also check without -pdbsourcepath 43RUN: ./lld-link -debug -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb pdb_lines_1_relative.obj pdb_lines_2_relative.obj 44RUN: llvm-pdbutil pdb2yaml -modules -module-files -module-syms -subsections=lines,fc %t/out.pdb | FileCheck --check-prefix=ABSOLUTE %s 45 46Clean up copy of large binary copied into temp directory to avoid bloat. 47RUN: rm -f ./lld-link || true 48 49CHECK-LABEL: - Module: 'c:\src\pdb_lines_1_relative.obj' 50CHECK-NEXT: ObjFile: 'c:\src\pdb_lines_1_relative.obj' 51CHECK: SourceFiles: 52CHECK-NEXT: - 'c:\src\pdb_lines_1.c' 53CHECK-NEXT: - 'c:\src\foo.h' 54CHECK: Subsections: 55CHECK: - FileName: 'c:\src\pdb_lines_1.c' 56CHECK: - FileName: 'c:\src\foo.h' 57CHECK: - !FileChecksums 58CHECK: - FileName: 'c:\src\pdb_lines_1.c' 59CHECK: - FileName: 'c:\src\foo.h' 60 61CHECK-LABEL: - Module: 'c:\src\pdb_lines_2_relative.obj' 62CHECK-NEXT: ObjFile: 'c:\src\pdb_lines_2_relative.obj' 63CHECK: SourceFiles: 64CHECK-NEXT: - 'c:\src\pdb_lines_2.c' 65CHECK: Subsections: 66CHECK: - FileName: 'c:\src\pdb_lines_2.c' 67CHECK: - !FileChecksums 68CHECK: - FileName: 'c:\src\pdb_lines_2.c' 69 70CHECK-LABEL: - Kind: S_ENVBLOCK 71CHECK-NEXT: EnvBlockSym: 72CHECK-NEXT: Entries: 73CHECK-NEXT: - cwd 74CHECK-NEXT: - 'c:\src' 75CHECK-NEXT: - exe 76CHECK-NEXT: - 'c:\src\lld-link' 77CHECK-NEXT: - pdb 78CHECK-NEXT: - 'c:\src\out.pdb' 79CHECK-NEXT: - cmd 80CHECK-NEXT: - '-debug -pdbsourcepath:c:\src -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb' 81 82CHECK-LABEL: IpiStream: 83 84CHECK: - Kind: LF_STRING_ID 85CHECK-NEXT: StringId: 86CHECK-NEXT: Id: 0 87CHECK-NEXT: String: . 88CHECK-NEXT: - Kind: LF_STRING_ID 89CHECK-NEXT: StringId: 90CHECK-NEXT: Id: 0 91CHECK-NEXT: String: pdb_lines_1.c 92CHECK-NEXT: - Kind: LF_STRING_ID 93CHECK-NEXT: StringId: 94CHECK-NEXT: Id: 0 95CHECK-NEXT: String: 'buildninjaRel\bin\clang-cl.exe' 96 97POSIX-LABEL: - Module: '/usr/src/pdb_lines_1_relative.obj' 98POSIX-NEXT: ObjFile: '/usr/src/pdb_lines_1_relative.obj' 99POSIX: SourceFiles: 100POSIX-NEXT: - '/usr/src/pdb_lines_1.c' 101POSIX-NEXT: - '/usr/src/foo.h' 102POSIX: Subsections: 103POSIX: - FileName: '/usr/src/pdb_lines_1.c' 104POSIX: - FileName: '/usr/src/foo.h' 105POSIX: - !FileChecksums 106POSIX: - FileName: '/usr/src/pdb_lines_1.c' 107POSIX: - FileName: '/usr/src/foo.h' 108 109POSIX-LABEL: - Module: '/usr/src/pdb_lines_2_relative.obj' 110POSIX-NEXT: ObjFile: '/usr/src/pdb_lines_2_relative.obj' 111POSIX: SourceFiles: 112POSIX-NEXT: - '/usr/src/pdb_lines_2.c' 113POSIX: Subsections: 114POSIX: - FileName: '/usr/src/pdb_lines_2.c' 115POSIX: - !FileChecksums 116POSIX: - FileName: '/usr/src/pdb_lines_2.c' 117 118POSIX-LABEL: - Kind: S_ENVBLOCK 119POSIX-NEXT: EnvBlockSym: 120POSIX-NEXT: Entries: 121POSIX-NEXT: - cwd 122POSIX-NEXT: - '/usr/src' 123POSIX-NEXT: - exe 124POSIX-NEXT: - '/usr/src/lld-link' 125POSIX-NEXT: - pdb 126POSIX-NEXT: - '/usr/src/out.pdb' 127POSIX-NEXT: - cmd 128POSIX-NEXT: - '-debug -pdbsourcepath:/usr/src -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb' 129 130ABSOLUTE-LABEL: StringTable: 131ABSOLUTE-NOT: {{/|\\}}.{{/|\\}}pdb_lines_1.c 132 133POSIX-LABEL: IpiStream: 134POSIX: - Kind: LF_STRING_ID 135POSIX-NEXT: StringId: 136POSIX-NEXT: Id: 0 137POSIX-NEXT: String: . 138POSIX-NEXT: - Kind: LF_STRING_ID 139POSIX-NEXT: StringId: 140POSIX-NEXT: Id: 0 141POSIX-NEXT: String: pdb_lines_1.c 142POSIX-NEXT: - Kind: LF_STRING_ID 143POSIX-NEXT: StringId: 144POSIX-NEXT: Id: 0 145POSIX-NEXT: String: 'buildninjaRel\bin\clang-cl.exe' 146