Test the linker line tables on roughly the following example: ==> foo.h <== void bar(void); inline void foo(void) { bar(); } ==> pdb_lines_1.c <== #include "foo.h" int main(void) { foo(); return 42; } ==> pdb_lines_2.c <== void bar(void) { } $ clang-cl -Xclang -fdebug-compilation-dir -Xclang . -c -Z7 pdb_lines*.c /pdbsourcepath: only sets the directory that relative paths are considered relative to, so this test needs to pass relative paths to lld-link for: 1. The input obj files 2. The /pdb: switch 3. The lld-link invocation itself To achieve this, put all inputs of the lld-link invocation (including lld-link itself) in a temp directory that's cwd and then make sure to only use relative arguments when calling ./lld-link below. RUN: rm -rf %t RUN: mkdir %t RUN: cp lld-link %t/lld-link RUN: cd %t RUN: yaml2obj %S/Inputs/pdb_lines_1_relative.yaml -o %t/pdb_lines_1_relative.obj RUN: yaml2obj %S/Inputs/pdb_lines_2_relative.yaml -o %t/pdb_lines_2_relative.obj RUN: ./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 RUN: llvm-pdbutil pdb2yaml -modules -module-files -module-syms -subsections=lines,fc %t/out.pdb | FileCheck %s RUN: ./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 RUN: llvm-pdbutil pdb2yaml -modules -module-files -module-syms -subsections=lines,fc %t/out.pdb | FileCheck --check-prefix=POSIX %s CHECK-LABEL: - Module: 'c:\src\pdb_lines_1_relative.obj' CHECK-NEXT: ObjFile: 'c:\src\pdb_lines_1_relative.obj' CHECK: SourceFiles: CHECK-NEXT: - 'c:\src\pdb_lines_1.c' CHECK-NEXT: - 'c:\src\foo.h' CHECK: Subsections: CHECK: - FileName: 'c:\src\pdb_lines_1.c' CHECK: - FileName: 'c:\src\foo.h' CHECK: - !FileChecksums CHECK: - FileName: 'c:\src\pdb_lines_1.c' CHECK: - FileName: 'c:\src\foo.h' CHECK-LABEL: - Module: 'c:\src\pdb_lines_2_relative.obj' CHECK-NEXT: ObjFile: 'c:\src\pdb_lines_2_relative.obj' CHECK: SourceFiles: CHECK-NEXT: - 'c:\src\pdb_lines_2.c' CHECK: Subsections: CHECK: - FileName: 'c:\src\pdb_lines_2.c' CHECK: - !FileChecksums CHECK: - FileName: 'c:\src\pdb_lines_2.c' CHECK-LABEL: - Kind: S_ENVBLOCK CHECK-NEXT: EnvBlockSym: CHECK-NEXT: Entries: CHECK-NEXT: - cwd CHECK-NEXT: - 'c:\src' CHECK-NEXT: - exe CHECK-NEXT: - 'c:\src\lld-link' CHECK-NEXT: - pdb CHECK-NEXT: - 'c:\src\out.pdb' CHECK-NEXT: - cmd CHECK-NEXT: - '-debug -pdbsourcepath:c:\src -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb pdb_lines_1_relative.obj pdb_lines_2_relative.obj' POSIX-LABEL: - Module: '/usr/src/pdb_lines_1_relative.obj' POSIX-NEXT: ObjFile: '/usr/src/pdb_lines_1_relative.obj' POSIX: SourceFiles: POSIX-NEXT: - '/usr/src/pdb_lines_1.c' POSIX-NEXT: - '/usr/src/foo.h' POSIX: Subsections: POSIX: - FileName: '/usr/src/pdb_lines_1.c' POSIX: - FileName: '/usr/src/foo.h' POSIX: - !FileChecksums POSIX: - FileName: '/usr/src/pdb_lines_1.c' POSIX: - FileName: '/usr/src/foo.h' POSIX-LABEL: - Module: '/usr/src/pdb_lines_2_relative.obj' POSIX-NEXT: ObjFile: '/usr/src/pdb_lines_2_relative.obj' POSIX: SourceFiles: POSIX-NEXT: - '/usr/src/pdb_lines_2.c' POSIX: Subsections: POSIX: - FileName: '/usr/src/pdb_lines_2.c' POSIX: - !FileChecksums POSIX: - FileName: '/usr/src/pdb_lines_2.c' POSIX-LABEL: - Kind: S_ENVBLOCK POSIX-NEXT: EnvBlockSym: POSIX-NEXT: Entries: POSIX-NEXT: - cwd POSIX-NEXT: - '/usr/src' POSIX-NEXT: - exe POSIX-NEXT: - '/usr/src/lld-link' POSIX-NEXT: - pdb POSIX-NEXT: - '/usr/src/out.pdb' POSIX-NEXT: - cmd POSIX-NEXT: - '-debug -pdbsourcepath:/usr/src -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb pdb_lines_1_relative.obj pdb_lines_2_relative.obj'