[PATCH] D147256: [DebugInfo] Fix file path separator when targeting windows.
Zequan Wu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 30 12:13:56 PDT 2023
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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147256.509771.patch
Type: text/x-patch
Size: 3878 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230330/21270b26/attachment.bin>
More information about the llvm-commits
mailing list