[llvm] 0675fa4 - [llvm-dwp] Adds --prioritize-discard-path to explicitly control dwp overflow order. (#180909)

via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 11 21:22:37 PST 2026


Author: Liu Ke
Date: 2026-02-12T13:22:33+08:00
New Revision: 0675fa48f6001385faf2774d27a7413267fd736a

URL: https://github.com/llvm/llvm-project/commit/0675fa48f6001385faf2774d27a7413267fd736a
DIFF: https://github.com/llvm/llvm-project/commit/0675fa48f6001385faf2774d27a7413267fd736a.diff

LOG: [llvm-dwp] Adds --prioritize-discard-path to explicitly control dwp overflow order. (#180909)

Adds `--prioritize-discard-path` for llvm-dwp to explicitly specify the
path of DWO files to be prioritized for discarding when dwp overflows.
As described in [[this
RFC](https://discourse.llvm.org/t/rfc-debuginfo-mitigating-non-deterministic-dwp-overflow/89587)].

Added: 
    llvm/test/tools/llvm-dwp/X86/prioritize_discard_path_soft_stop.test

Modified: 
    llvm/tools/llvm-dwp/Opts.td
    llvm/tools/llvm-dwp/llvm-dwp.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-dwp/X86/prioritize_discard_path_soft_stop.test b/llvm/test/tools/llvm-dwp/X86/prioritize_discard_path_soft_stop.test
new file mode 100644
index 0000000000000..c684ecf88d752
--- /dev/null
+++ b/llvm/test/tools/llvm-dwp/X86/prioritize_discard_path_soft_stop.test
@@ -0,0 +1,41 @@
+UNSUPPORTED: true
+## Manual test to illustrate overflow ordering using existing Inputs.
+## It builds two .dwo files from prepared sources and shows that the second
+## argument causes the overflow and gets discarded under soft-stop.
+## Requires large disk space and time.
+RUN: rm -rf %t && mkdir -p %t/prefix %t/other
+RUN: cp %S/../Inputs/overflow/debug_info_v4.s %t/prefix/hello_v4.s
+RUN: cp %S/../Inputs/overflow/main_v4.s %t/other/main_v4.s
+
+## Build hello and main into separate .dwo files.
+RUN: llvm-mc --triple=x86_64-unknown-linux --filetype=obj \
+RUN:   --split-dwarf-file=%t/prefix/hello.dwo -dwarf-version=4 \
+RUN:   %t/prefix/hello_v4.s -o %t/prefix/hello.o
+RUN: llvm-mc --triple=x86_64-unknown-linux --filetype=obj \
+RUN:   --split-dwarf-file=%t/other/main.dwo -dwarf-version=4 \
+RUN:   %t/other/main_v4.s -o %t/other/main.o
+
+## Case 1: main then hello -> overflow occurs on hello; hello is discarded; only main remains.
+RUN: llvm-dwp %t/other/main.dwo %t/prefix/hello.dwo \
+RUN:   -continue-on-cu-index-overflow=soft-stop \
+RUN:   -o %t/out1.dwp 2>&1 | FileCheck %s --check-prefix=WARN
+RUN: llvm-dwarfdump -debug-info %t/out1.dwp | FileCheck %s --check-prefix=DWO-NAME-MAIN
+
+## Case 2: hello then main -> overflow occurs on main; main is discarded; only hello remains.
+RUN: llvm-dwp %t/prefix/hello.dwo %t/other/main.dwo \
+RUN:   -continue-on-cu-index-overflow=soft-stop \
+RUN:   -o %t/out2.dwp 2>&1 | FileCheck %s --check-prefix=WARN
+RUN: llvm-dwarfdump -debug-info %t/out2.dwp | FileCheck %s --check-prefix=DWO-NAME-HELLO
+
+## Optional: demonstrate --prioritize-discard-path aligns with desired discard priority.
+RUN: llvm-dwp %t/prefix/hello.dwo %t/other/main.dwo \
+RUN:   -continue-on-cu-index-overflow=soft-stop \
+RUN:   --prioritize-discard-path=%t/prefix \
+RUN:   -o %t/out3.dwp 2>&1 | FileCheck %s --check-prefix=WARN
+RUN: llvm-dwarfdump -debug-info %t/out3.dwp | FileCheck %s --check-prefix=DWO-NAME-MAIN
+
+WARN: warning: {{.*}}overflow 4G{{.*}}
+DWO-NAME-MAIN: DW_AT_GNU_dwo_name {{.*}}"main.dwo"
+DWO-NAME-MAIN-NOT: DW_AT_GNU_dwo_name {{.*}}"hello.dwo"
+DWO-NAME-HELLO: DW_AT_GNU_dwo_name {{.*}}"hello.dwo"
+DWO-NAME-HELLO-NOT: DW_AT_GNU_dwo_name {{.*}}"main.dwo"

diff  --git a/llvm/tools/llvm-dwp/Opts.td b/llvm/tools/llvm-dwp/Opts.td
index d4474ac073fd7..f22ab6e700017 100644
--- a/llvm/tools/llvm-dwp/Opts.td
+++ b/llvm/tools/llvm-dwp/Opts.td
@@ -31,3 +31,8 @@ def dwarf64StringOffsets_EQ
                "forces all .debug_str_offsets tables to be emitted as DWARF64. "
                "This is used for testing.">,
       Values<"disabled,enabled,always">;
+
+def prioritizeDiscardPath : Joined<["-", "--"], "prioritize-discard-path=">,
+  HelpText<"In soft-stop mode, prefer discarding DWO files whose real paths start "
+           "with the given prefix when CU index overflow occurs.">,
+  MetaVarName<"<path>">;

diff  --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp
index 2892450398bb6..dd45db1f05c50 100644
--- a/llvm/tools/llvm-dwp/llvm-dwp.cpp
+++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp
@@ -220,6 +220,35 @@ int llvm_dwp_main(int argc, char **argv, const llvm::ToolContext &) {
     return 0;
   }
 
+  StringRef DiscardPrefix = Args.getLastArgValue(OPT_prioritizeDiscardPath, "");
+  if (OverflowOptValue == OnCuIndexOverflow::SoftStop &&
+      !DiscardPrefix.empty()) {
+    SmallString<256> CanonicalDiscardPrefix(DiscardPrefix);
+    if (std::error_code EC =
+            sys::fs::real_path(DiscardPrefix, CanonicalDiscardPrefix)) {
+      WithColor::warning() << "invalid --prioritize-discard-path '"
+                           << DiscardPrefix << "': " << EC.message()
+                           << "; ignoring option.\n";
+    } else {
+      StringRef PrefixRef(CanonicalDiscardPrefix);
+      auto IsNonDiscarded = [&](const std::string &Name) {
+        SmallString<256> CanonicalDWO;
+        if (sys::fs::real_path(Name, CanonicalDWO))
+          return true;
+        StringRef DWORef(CanonicalDWO);
+        if (!DWORef.starts_with(PrefixRef))
+          return true;
+        if (DWORef.size() == PrefixRef.size())
+          return false;
+        if (sys::path::is_separator(DWORef[PrefixRef.size()]))
+          return false;
+        return true;
+      };
+      std::stable_partition(DWOFilenames.begin(), DWOFilenames.end(),
+                            IsNonDiscarded);
+    }
+  }
+
   std::string ErrorStr;
   StringRef Context = "dwarf streamer init";
 


        


More information about the llvm-commits mailing list