Index: lld/COFF/PDB.cpp =================================================================== --- lld/COFF/PDB.cpp +++ lld/COFF/PDB.cpp @@ -292,13 +292,22 @@ sys::fs::make_absolute(FileName); return; } - // Only apply native and dot removal to the relative file path. We want to - // leave the path the user specified untouched since we assume they specified - // it for a reason. - sys::path::remove_dots(FileName, /*remove_dot_dots=*/true); + // Try to guess whether /PDBSOURCEPATH is a unix path or a windows path. + // Since PDB's are more of a Windows thing, we make this conservative and only + // decide that it's a unix path if we're fairly certain. Specifically, if + // it starts with a forward slash. SmallString<128> AbsoluteFileName = Config->PDBSourcePath; sys::path::append(AbsoluteFileName, FileName); + sys::path::Style guessed_style = AbsoluteFileName.startswith("/") + ? sys::path::Style::posix + : sys::path::Style::windows; + if (guessed_style == sys::path::Style::windows) + std::replace(AbsoluteFileName.begin(), AbsoluteFileName.end(), '/', '\\'); + else + std::replace(AbsoluteFileName.begin(), AbsoluteFileName.end(), '\\', '/'); + sys::path::remove_dots(AbsoluteFileName, true, guessed_style); + FileName = std::move(AbsoluteFileName); } Index: lld/test/COFF/Inputs/pdb-source-path.yaml =================================================================== --- /dev/null +++ lld/test/COFF/Inputs/pdb-source-path.yaml @@ -0,0 +1,289 @@ +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 16 + SectionData: 50C744240400000000B80400000059C3 + - Name: .data + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] + Alignment: 4 + SectionData: '' + - Name: .bss + Characteristics: [ IMAGE_SCN_CNT_UNINITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] + Alignment: 4 + SectionData: '' + - Name: .xdata + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: '0101010001020000' + - Name: .drectve + Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ] + Alignment: 1 + SectionData: 202F44454641554C544C49423A6C6962636D742E6C6962202F44454641554C544C49423A6F6C646E616D65732E6C6962 + - Name: '.debug$S' + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: 04000000F1000000300000002E003C1101000000D00009000000000000002823000000000000636C616E672076657273696F6E20392E302E30200000F1000000500000002A00471100000000000000000000000010000000000000000000000002100000000000000000006D61696E001E0012100800000000000000000000000000000000000000000000400100000002004F11F20000002800000000000000000000001000000000000000020000001C00000000000000010000000900000002000000F400000018000000010000001001A9C577F6E03D4F6115131AEB7488A7AA0000F300000010000000002E5C2E2E5C746573742E6363000000F10000000800000006004C1105100000 + Subsections: + - !Symbols + Records: + - Kind: S_COMPILE3 + Compile3Sym: + Flags: [ ] + Machine: X64 + FrontendMajor: 9 + FrontendMinor: 0 + FrontendBuild: 0 + FrontendQFE: 0 + BackendMajor: 9000 + BackendMinor: 0 + BackendBuild: 0 + BackendQFE: 0 + Version: 'clang version 9.0.0 ' + - !Symbols + Records: + - Kind: S_GPROC32_ID + ProcSym: + CodeSize: 16 + DbgStart: 0 + DbgEnd: 0 + FunctionType: 4098 + Flags: [ ] + DisplayName: main + - Kind: S_FRAMEPROC + FrameProcSym: + TotalFrameBytes: 8 + PaddingFrameBytes: 0 + OffsetToPadding: 0 + BytesOfCalleeSavedRegisters: 0 + OffsetOfExceptionHandler: 0 + SectionIdOfExceptionHandler: 0 + Flags: [ ] + - Kind: S_PROC_ID_END + ScopeEndSym: {} + - !Lines + CodeSize: 16 + Flags: [ ] + RelocOffset: 0 + RelocSegment: 0 + Blocks: + - FileName: '.\..\test.cc' + Lines: + - Offset: 0 + LineStart: 1 + IsStatement: false + EndDelta: 0 + - Offset: 9 + LineStart: 2 + IsStatement: false + EndDelta: 0 + Columns: [] + - !FileChecksums + Checksums: + - FileName: '.\..\test.cc' + Kind: MD5 + Checksum: A9C577F6E03D4F6115131AEB7488A7AA + - !StringTable + Strings: + - '.\..\test.cc' + - '' + - '' + - !Symbols + Records: + - Kind: S_BUILDINFO + BuildInfoSym: + BuildId: 4101 + Relocations: + - VirtualAddress: 100 + SymbolName: main + Type: IMAGE_REL_AMD64_SECREL + - VirtualAddress: 104 + SymbolName: main + Type: IMAGE_REL_AMD64_SECTION + - VirtualAddress: 156 + SymbolName: main + Type: IMAGE_REL_AMD64_SECREL + - VirtualAddress: 160 + SymbolName: main + Type: IMAGE_REL_AMD64_SECTION + - Name: '.debug$T' + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: 0400000006000112000000000E0008107400000000000000001000001200011600000000011000006D61696E00F3F2F10A000516000000002E00F2F112000516000000002E2E5C746573742E636300F11A00031605000310000000000000041000000000000000000000F2F1 + Types: + - Kind: LF_ARGLIST + ArgList: + ArgIndices: [ ] + - Kind: LF_PROCEDURE + Procedure: + ReturnType: 116 + CallConv: NearC + Options: [ None ] + ParameterCount: 0 + ArgumentList: 4096 + - Kind: LF_FUNC_ID + FuncId: + ParentScope: 0 + FunctionType: 4097 + Name: main + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: . + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: '..\test.cc' + - Kind: LF_BUILDINFO + BuildInfo: + ArgIndices: [ 4099, 0, 4100, 0, 0 ] + - Name: .pdata + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: '000000001000000000000000' + Relocations: + - VirtualAddress: 0 + SymbolName: main + Type: IMAGE_REL_AMD64_ADDR32NB + - VirtualAddress: 4 + SymbolName: main + Type: IMAGE_REL_AMD64_ADDR32NB + - VirtualAddress: 8 + SymbolName: .xdata + Type: IMAGE_REL_AMD64_ADDR32NB + - Name: .llvm_addrsig + Characteristics: [ IMAGE_SCN_LNK_REMOVE ] + Alignment: 1 + SectionData: '' +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 16 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 518985864 + Number: 1 + - Name: .data + Value: 0 + SectionNumber: 2 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 0 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 2 + - Name: .bss + Value: 0 + SectionNumber: 3 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 0 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 3 + - Name: .xdata + Value: 0 + SectionNumber: 4 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 8 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 448359300 + Number: 4 + - Name: .drectve + Value: 0 + SectionNumber: 5 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 48 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 149686238 + Number: 5 + - Name: '.debug$S' + Value: 0 + SectionNumber: 6 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 268 + NumberOfRelocations: 4 + NumberOfLinenumbers: 0 + CheckSum: 4146173213 + Number: 6 + - Name: '.debug$T' + Value: 0 + SectionNumber: 7 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 108 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 2549554256 + Number: 7 + - Name: .pdata + Value: 0 + SectionNumber: 8 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 12 + NumberOfRelocations: 3 + NumberOfLinenumbers: 0 + CheckSum: 2092642603 + Number: 8 + - Name: .llvm_addrsig + Value: 0 + SectionNumber: 9 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 0 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 9 + - Name: '@feat.00' + Value: 0 + SectionNumber: -1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: .file + Value: 0 + SectionNumber: -2 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_FILE + File: test.cc +... Index: lld/test/COFF/pdb-source-path.test =================================================================== --- /dev/null +++ lld/test/COFF/pdb-source-path.test @@ -0,0 +1,26 @@ +Test that /PDBSOURCEPATH correctly resolves absolute / relative paths + +==> test.cc <== +int main() { + return 4; +} + +Note the relative path to source file and -fdebug-compilation-dir +$ clang-cl /Zi -Xclang -fdebug-compilation-dir -Xclang . -c ..\test.cc +$ lld-link lld-link test.obj /debug /pdbsourcepath:C:\foo\bar + +RUN: yaml2obj %S/Inputs/pdb-source-path.yaml -o %t.obj + +RUN: rm -f %t.win.exe %t.win.pdb +RUN: lld-link -debug -out:%t.win.exe -nodefaultlib -entry:main -pdbsourcepath:C:/foo/bar %t.obj +RUN: llvm-pdbutil dump -files %t.win.pdb | FileCheck --check-prefix=WIN %s + +RUN: rm -f %t.nix.exe %t.nix.pdb +RUN: lld-link -debug -out:%t.nix.exe -nodefaultlib -entry:main -pdbsourcepath:/usr/bin %t.obj +RUN: llvm-pdbutil dump -files %t.nix.pdb | FileCheck --check-prefix=NIX %s + +WIN: Mod 0000 | `C:\foo\bar\foo.obj`: +WIN-NEXT: - (MD5: A9C577F6E03D4F6115131AEB7488A7AA) C:\foo\test.cc + +NIX: Mod 0000 | `/usr/bin/foo.obj`: +NIX-NEXT: - (MD5: A9C577F6E03D4F6115131AEB7488A7AA) /usr/test.cc