zequanwu created this revision. zequanwu added reviewers: hans, aaron.ballman, ayzhao, aganea. Herald added a subscriber: hiraditya. Herald added a project: All. zequanwu requested review of this revision. Herald added projects: clang, LLVM. Herald added subscribers: llvm-commits, cfe-commits.
This fixes two problems: 1. When crossing compiling for windows on linux, source file path in debug info is concatenated with directory by host native separator ('/'). For windows local build, they are concatenated by '\'. This causes non-determinism bug. The solution here is to let `-ffile-reproducible` to control if we should use host native separator or not. 2. Objectfile path in CodeView also uses host native separator when generated. Make it always to use `\` unless the it's absolute path in posix style. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D147256 Files: clang/lib/CodeGen/CGDebugInfo.cpp clang/test/CodeGen/debug-info-slash.c llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp llvm/test/DebugInfo/COFF/build-info.ll Index: llvm/test/DebugInfo/COFF/build-info.ll =================================================================== --- llvm/test/DebugInfo/COFF/build-info.ll +++ llvm/test/DebugInfo/COFF/build-info.ll @@ -10,6 +10,16 @@ ; CHECK: {{.*}} | S_BUILDINFO [size = 8] BuildId = `[[INFO_IDX]]` +; Test path is canalized to windows backslash style when output object file name +; is not starting with '/'. +; RUN: rm -rf %t-dir +; RUN: mkdir %t-dir +; RUN: cd %t-dir +; RUN: llc -filetype=obj -mtriple i686-pc-windows-msvc %s -o ../build-info.o +; RUN: llvm-readobj --codeview ../build-info.o | FileCheck %s --check-prefix=OBJ + +; OBJ: ObjectName: ..\build-info.o + ; ModuleID = 'D:\src\scopes\foo.cpp' source_filename = "D:\5Csrc\5Cscopes\5Cfoo.cpp" target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" Index: llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -791,7 +791,11 @@ // Don't emit the filename if we're writing to stdout or to /dev/null. PathRef = {}; } else { - llvm::sys::path::remove_dots(PathStore, /*remove_dot_dot=*/true); + llvm::sys::path::Style Style = + llvm::sys::path::is_absolute(PathRef, llvm::sys::path::Style::posix) + ? llvm::sys::path::Style::posix + : llvm::sys::path::Style::windows_backslash; + llvm::sys::path::remove_dots(PathStore, /*remove_dot_dot=*/true, Style); PathRef = PathStore; } Index: clang/test/CodeGen/debug-info-slash.c =================================================================== --- /dev/null +++ clang/test/CodeGen/debug-info-slash.c @@ -0,0 +1,6 @@ +// RUN: %clang -target x86_64-pc-win32 -ffile-reproducible -emit-llvm -S -g %s -o - | FileCheck --check-prefix=WIN %s +// RUN: %clang -target x86_64-linux-gnu -ffile-reproducible -emit-llvm -S -g %s -o - | FileCheck --check-prefix=LINUX %s +int main() { return 0; } + +// WIN: !DIFile(filename: "{{.*}}clang/test/CodeGen\\debug-info-slash.c" +// LINUX: !DIFile(filename: "{{.*}}clang/test/CodeGen/debug-info-slash.c" Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -528,6 +528,7 @@ // Get absolute path name. SourceManager &SM = CGM.getContext().getSourceManager(); auto &CGO = CGM.getCodeGenOpts(); + const LangOptions &LO = CGM.getLangOpts(); std::string MainFileName = CGO.MainFileName; if (MainFileName.empty()) MainFileName = "<stdin>"; @@ -542,9 +543,15 @@ MainFileDir = std::string(MainFile->getDir().getName()); if (!llvm::sys::path::is_absolute(MainFileName)) { llvm::SmallString<1024> MainFileDirSS(MainFileDir); - llvm::sys::path::append(MainFileDirSS, MainFileName); - MainFileName = - std::string(llvm::sys::path::remove_leading_dotslash(MainFileDirSS)); + llvm::sys::path::Style Style = + LO.UseTargetPathSeparator + ? (CGM.getTarget().getTriple().isOSWindows() + ? llvm::sys::path::Style::windows_backslash + : llvm::sys::path::Style::posix) + : llvm::sys::path::Style::native; + llvm::sys::path::append(MainFileDirSS, Style, MainFileName); + MainFileName = std::string( + llvm::sys::path::remove_leading_dotslash(MainFileDirSS, Style)); } // If the main file name provided is identical to the input file name, and // if the input file is a preprocessed source, use the module name for @@ -560,7 +567,6 @@ } llvm::dwarf::SourceLanguage LangTag; - const LangOptions &LO = CGM.getLangOpts(); if (LO.CPlusPlus) { if (LO.ObjC) LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus;
Index: llvm/test/DebugInfo/COFF/build-info.ll =================================================================== --- llvm/test/DebugInfo/COFF/build-info.ll +++ llvm/test/DebugInfo/COFF/build-info.ll @@ -10,6 +10,16 @@ ; CHECK: {{.*}} | S_BUILDINFO [size = 8] BuildId = `[[INFO_IDX]]` +; Test path is canalized to windows backslash style when output object file name +; is not starting with '/'. +; RUN: rm -rf %t-dir +; RUN: mkdir %t-dir +; RUN: cd %t-dir +; RUN: llc -filetype=obj -mtriple i686-pc-windows-msvc %s -o ../build-info.o +; RUN: llvm-readobj --codeview ../build-info.o | FileCheck %s --check-prefix=OBJ + +; OBJ: ObjectName: ..\build-info.o + ; ModuleID = 'D:\src\scopes\foo.cpp' source_filename = "D:\5Csrc\5Cscopes\5Cfoo.cpp" target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" Index: llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -791,7 +791,11 @@ // Don't emit the filename if we're writing to stdout or to /dev/null. PathRef = {}; } else { - llvm::sys::path::remove_dots(PathStore, /*remove_dot_dot=*/true); + llvm::sys::path::Style Style = + llvm::sys::path::is_absolute(PathRef, llvm::sys::path::Style::posix) + ? llvm::sys::path::Style::posix + : llvm::sys::path::Style::windows_backslash; + llvm::sys::path::remove_dots(PathStore, /*remove_dot_dot=*/true, Style); PathRef = PathStore; } Index: clang/test/CodeGen/debug-info-slash.c =================================================================== --- /dev/null +++ clang/test/CodeGen/debug-info-slash.c @@ -0,0 +1,6 @@ +// RUN: %clang -target x86_64-pc-win32 -ffile-reproducible -emit-llvm -S -g %s -o - | FileCheck --check-prefix=WIN %s +// RUN: %clang -target x86_64-linux-gnu -ffile-reproducible -emit-llvm -S -g %s -o - | FileCheck --check-prefix=LINUX %s +int main() { return 0; } + +// WIN: !DIFile(filename: "{{.*}}clang/test/CodeGen\\debug-info-slash.c" +// LINUX: !DIFile(filename: "{{.*}}clang/test/CodeGen/debug-info-slash.c" Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -528,6 +528,7 @@ // Get absolute path name. SourceManager &SM = CGM.getContext().getSourceManager(); auto &CGO = CGM.getCodeGenOpts(); + const LangOptions &LO = CGM.getLangOpts(); std::string MainFileName = CGO.MainFileName; if (MainFileName.empty()) MainFileName = "<stdin>"; @@ -542,9 +543,15 @@ MainFileDir = std::string(MainFile->getDir().getName()); if (!llvm::sys::path::is_absolute(MainFileName)) { llvm::SmallString<1024> MainFileDirSS(MainFileDir); - llvm::sys::path::append(MainFileDirSS, MainFileName); - MainFileName = - std::string(llvm::sys::path::remove_leading_dotslash(MainFileDirSS)); + llvm::sys::path::Style Style = + LO.UseTargetPathSeparator + ? (CGM.getTarget().getTriple().isOSWindows() + ? llvm::sys::path::Style::windows_backslash + : llvm::sys::path::Style::posix) + : llvm::sys::path::Style::native; + llvm::sys::path::append(MainFileDirSS, Style, MainFileName); + MainFileName = std::string( + llvm::sys::path::remove_leading_dotslash(MainFileDirSS, Style)); } // If the main file name provided is identical to the input file name, and // if the input file is a preprocessed source, use the module name for @@ -560,7 +567,6 @@ } llvm::dwarf::SourceLanguage LangTag; - const LangOptions &LO = CGM.getLangOpts(); if (LO.CPlusPlus) { if (LO.ObjC) LangTag = llvm::dwarf::DW_LANG_ObjC_plus_plus;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits