Index: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -114,6 +114,16 @@ StringRef Dir = File->getDirectory(), Filename = File->getFilename(); + // If this is a Unix-style path, just use it as is. Don't try to canonicalize + // it textually because one of the path components could be a symlink. + if (!Dir.empty() && Dir[0] == '/') { + Filepath = Dir; + if (Dir.back() != '/') + Filepath += '/'; + Filepath += Filename; + return Filepath; + } + // Clang emits directory and relative filename info into the IR, but CodeView // operates on full paths. We could change Clang to emit full paths too, but // that would increase the IR size and probably not needed for other users. Index: llvm/trunk/test/DebugInfo/COFF/enum.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/enum.ll +++ llvm/trunk/test/DebugInfo/COFF/enum.ll @@ -26,12 +26,12 @@ ; CHECK-NEXT: StringId (0x1002) { ; CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605) ; CHECK-NEXT: Id: 0x0 -; CHECK-NEXT: StringData: \ +; CHECK-NEXT: StringData: /foo/bar.cpp ; CHECK-NEXT: } ; CHECK-NEXT: UdtSourceLine (0x1003) { ; CHECK-NEXT: TypeLeafKind: LF_UDT_SRC_LINE (0x1606) ; CHECK-NEXT: UDT: E (0x1001) -; CHECK-NEXT: SourceFile: \ (0x1002) +; CHECK-NEXT: SourceFile: /foo/bar.cpp (0x1002) ; CHECK-NEXT: LineNumber: 1 ; CHECK_NEXT } @@ -51,7 +51,7 @@ !3 = !DIFile(filename: "-", directory: "/") !4 = !{!5} !5 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "E", file: !6, line: 1, baseType: !7, size: 32, align: 32, elements: !8) -!6 = !DIFile(filename: "", directory: "/") +!6 = !DIFile(filename: "bar.cpp", directory: "/foo") !7 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) !8 = !{!9} !9 = !DIEnumerator(name: "BLAH", value: 0) Index: llvm/trunk/test/DebugInfo/COFF/types-array-advanced.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/types-array-advanced.ll +++ llvm/trunk/test/DebugInfo/COFF/types-array-advanced.ll @@ -142,12 +142,12 @@ ; CHECK: StringId (0x100D) { ; CHECK: TypeLeafKind: LF_STRING_ID (0x1605) ; CHECK: Id: 0x0 -; CHECK: StringData: \t.cpp +; CHECK: StringData: /t.cpp ; CHECK: } ; CHECK: UdtSourceLine (0x100E) { ; CHECK: TypeLeafKind: LF_UDT_SRC_LINE (0x1606) ; CHECK: UDT: incomplete_struct (0x100C) -; CHECK: SourceFile: \t.cpp (0x100D) +; CHECK: SourceFile: /t.cpp (0x100D) ; CHECK: LineNumber: 4 ; CHECK: } ; CHECK: Modifier (0x100F) { Index: llvm/trunk/test/DebugInfo/COFF/types-non-virtual-methods.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/types-non-virtual-methods.ll +++ llvm/trunk/test/DebugInfo/COFF/types-non-virtual-methods.ll @@ -121,12 +121,12 @@ ; CHECK: StringId (0x1008) { ; CHECK: TypeLeafKind: LF_STRING_ID (0x1605) ; CHECK: Id: 0x0 -; CHECK: StringData: \t.cpp +; CHECK: StringData: /t.cpp ; CHECK: } ; CHECK: UdtSourceLine (0x1009) { ; CHECK: TypeLeafKind: LF_UDT_SRC_LINE (0x1606) ; CHECK: UDT: A (0x1007) -; CHECK: SourceFile: \t.cpp (0x1008) +; CHECK: SourceFile: /t.cpp (0x1008) ; CHECK: LineNumber: 1 ; CHECK: } ; CHECK: Class (0x100A) { @@ -241,7 +241,7 @@ ; CHECK: UdtSourceLine (0x1014) { ; CHECK: TypeLeafKind: LF_UDT_SRC_LINE (0x1606) ; CHECK: UDT: B (0x1013) -; CHECK: SourceFile: \t.cpp (0x1008) +; CHECK: SourceFile: /t.cpp (0x1008) ; CHECK: LineNumber: 11 ; CHECK: } ; CHECK: ]