[clang] Fix absolute file paths with -fdebug-prefix-map

Previously if you passed an absolute path to clang, where only part of
the path to the file was remapped, it would result in the file's DIFile
being stored with a duplicate path, for example:

```
!DIFile(filename: "./ios/Sources/bar.c", directory: "./ios/Sources")
```

This change handles absolute paths, specifically in the case they are
remapped to something relative, and uses the dirname for the directory,
and basename for the filename.

This also adds a test verifying this behavior for more standard uses as
well.

Differential Revision: https://reviews.llvm.org/D111352
This commit is contained in:
Keith Smiley 2021-10-07 13:25:21 -07:00
parent b4498e6b8d
commit a23a596793
2 changed files with 20 additions and 0 deletions

View File

@ -446,6 +446,9 @@ CGDebugInfo::createFile(StringRef FileName,
Dir = DirBuf;
File = FileBuf;
}
} else if (llvm::sys::path::is_absolute(FileName)) {
Dir = llvm::sys::path::parent_path(RemappedFile);
File = llvm::sys::path::filename(RemappedFile);
} else {
Dir = CurDir;
File = RemappedFile;

View File

@ -0,0 +1,17 @@
// RUN: mkdir -p %t.nested/dir && cd %t.nested/dir
// RUN: cp %s %t.nested/dir/main.c
// RUN: %clang_cc1 -debug-info-kind=standalone -fdebug-prefix-map=%t.nested=. %t.nested/dir/main.c -emit-llvm -o - | FileCheck %s
//
// RUN: %clang_cc1 -debug-info-kind=standalone -fdebug-prefix-map=%p=. %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-DIRECT
//
// RUN: cd %p
// RUN: %clang_cc1 -debug-info-kind=standalone -fdebug-compilation-dir=. relative-debug-prefix-map.c -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-DIRECT
// CHECK: !DIFile(filename: "main.c", directory: "./dir")
// CHECK-DIRECT: !DIFile(filename: "relative-debug-prefix-map.c", directory: ".")
int main(int argc, char **argv) {
(void)argc;
(void)argv;
return 0;
}