[PATCH] D96678: [llvm-dwp] Join dwo paths correctly when DWOPath is absolute

Simonas Kazlauskas via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 14 16:56:38 PST 2021


nagisa created this revision.
nagisa added reviewers: alexshap, dblaikie.
nagisa requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added subscribers: llvm-commits, sstefan1.
Herald added a project: LLVM.

When the `DWOPath` is absolute, we want to use `DWOPath` as is, without prepending any other
components to the path. The `sys::path::append` does not join, but rather unconditionally appends
the paths, so something like `sys::path::append("/tmp", "/tmp/banana")` will result in
`/tmp/tmp/banana` rather than the desired `/tmp/banana`.

This then causes `llvm-dwp` to fail in a following situation:

  $ clang -gsplit-dwarf /tmp/banana/test.c -c -o /tmp/outdir/foo.o
  $ clang outdir/foo.o -o outdir/hm
  $ llvm-dwarfdump outdir/hm | grep -C2 foo.dwo
                    DW_AT_comp_dir    ("/tmp")
                    DW_AT_GNU_pubnames  (true)
                    DW_AT_GNU_dwo_name    ("/tmp/outdir/foo.dwo")
                                  DW_AT_GNU_dwo_id    (0xde4d396f3bf0e257)
                    DW_AT_low_pc  (0x0000000000401100)
  $ strace -o trace llvm-dwp -e outdir/hm -o outdir/hm.dwp
  error: No such file or directory
  $ cat trace | grep foo.dwo
  openat(AT_FDCWD, "/tmp/tmp/outdir/foo.dwo", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D96678

Files:
  llvm/tools/llvm-dwp/llvm-dwp.cpp


Index: llvm/tools/llvm-dwp/llvm-dwp.cpp
===================================================================
--- llvm/tools/llvm-dwp/llvm-dwp.cpp
+++ llvm/tools/llvm-dwp/llvm-dwp.cpp
@@ -526,8 +526,8 @@
     std::string DWOCompDir =
         dwarf::toString(Die.find(dwarf::DW_AT_comp_dir), "");
     if (!DWOCompDir.empty()) {
-      SmallString<16> DWOPath;
-      sys::path::append(DWOPath, DWOCompDir, DWOName);
+      SmallString<16> DWOPath{std::move(DWOName)};
+      sys::fs::make_absolute(DWOCompDir, DWOPath);
       DWOPaths.emplace_back(DWOPath.data(), DWOPath.size());
     } else {
       DWOPaths.push_back(std::move(DWOName));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D96678.323651.patch
Type: text/x-patch
Size: 642 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210215/aa3d4bf6/attachment.bin>


More information about the llvm-commits mailing list