[llvm] [dsymutil] Use DebugMapFilter when parsing --allow/--disallow YAML input (PR #185061)

via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 6 09:42:23 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-debuginfo

Author: Roy Shi (royitaqi)

<details>
<summary>Changes</summary>

PR https://github.com/llvm/llvm-project/pull/182083 forgot to switch over to use the newly added `DebugMapFilter` class when parsing the `--allow/--disallow` YAML input. It was still using `ObjectFileList`/`ObjectFileEntry`, which was added initially in the same PR and was later intended to be removed by https://github.com/llvm/llvm-project/pull/182083/changes/27e5c1eefa39580e356dbce67a8635e2723495a9 (which also didn't happen).

This patch does the switch over and removes.

---
Full diff: https://github.com/llvm/llvm-project/pull/185061.diff


3 Files Affected:

- (modified) llvm/tools/dsymutil/DebugMap.cpp (+23-7) 
- (modified) llvm/tools/dsymutil/DebugMap.h (+42-1) 
- (modified) llvm/tools/dsymutil/dsymutil.cpp (+4-31) 


``````````diff
diff --git a/llvm/tools/dsymutil/DebugMap.cpp b/llvm/tools/dsymutil/DebugMap.cpp
index 220666cf0af48..a25367b0047c3 100644
--- a/llvm/tools/dsymutil/DebugMap.cpp
+++ b/llvm/tools/dsymutil/DebugMap.cpp
@@ -230,17 +230,33 @@ SequenceTraits<std::vector<std::unique_ptr<dsymutil::DebugMapObjectFilter>>>::
   return seq.size();
 }
 
-dsymutil::DebugMapObject &
+dsymutil::DebugMapObjectFilter &
 SequenceTraits<std::vector<std::unique_ptr<dsymutil::DebugMapObjectFilter>>>::
     element(IO &io,
             std::vector<std::unique_ptr<dsymutil::DebugMapObjectFilter>> &seq,
             size_t index) {
-  auto &Objects = reinterpret_cast<
-      std::vector<std::unique_ptr<dsymutil::DebugMapObject>> &>(seq);
-  return SequenceTraits<
-      std::vector<std::unique_ptr<dsymutil::DebugMapObject>>>::element(io,
-                                                                       Objects,
-                                                                       index);
+  if (index >= seq.size()) {
+    seq.resize(index + 1);
+    seq[index].reset(new dsymutil::DebugMapObjectFilter);
+  }
+  return *seq[index];
+}
+
+void MappingTraits<dsymutil::DebugMapObjectFilter>::mapping(
+    IO &io, dsymutil::DebugMapObjectFilter &DMOF) {
+  io.mapRequired("filename", DMOF.Filename);
+}
+
+void MappingTraits<dsymutil::DebugMapFilter>::mapping(
+    IO &io, dsymutil::DebugMapFilter &DMF) {
+  io.mapRequired("objects", DMF.Objects);
+}
+
+void MappingTraits<std::unique_ptr<dsymutil::DebugMapFilter>>::mapping(
+    IO &io, std::unique_ptr<dsymutil::DebugMapFilter> &DMF) {
+  if (!DMF)
+    DMF.reset(new DebugMapFilter());
+  io.mapRequired("objects", DMF->Objects);
 }
 
 void MappingTraits<dsymutil::DebugMap>::mapping(IO &io,
diff --git a/llvm/tools/dsymutil/DebugMap.h b/llvm/tools/dsymutil/DebugMap.h
index 5176ed74793bd..ad63d3f2c7b26 100644
--- a/llvm/tools/dsymutil/DebugMap.h
+++ b/llvm/tools/dsymutil/DebugMap.h
@@ -51,8 +51,37 @@ class DebugMapObject;
 class DebugMapObjectFilter;
 
 class DebugMapFilter {
+  using ObjectContainer = std::vector<std::unique_ptr<DebugMapObjectFilter>>;
+
+public:
+  virtual ~DebugMapFilter() = default;
+  using const_iterator = ObjectContainer::const_iterator;
+
+  iterator_range<const_iterator> objects() const {
+    return make_range(begin(), end());
+  }
+
+  const_iterator begin() const { return Objects.begin(); }
+
+  const_iterator end() const { return Objects.end(); }
+
 protected:
   std::vector<std::unique_ptr<DebugMapObjectFilter>> Objects;
+
+private:
+  friend class DebugMap;
+
+  /// For YAML IO support.
+  ///@{
+  friend yaml::MappingTraits<std::unique_ptr<DebugMapFilter>>;
+  friend yaml::MappingTraits<DebugMapFilter>;
+
+  DebugMapFilter() = default;
+
+public:
+  DebugMapFilter(DebugMapFilter &&) = default;
+  DebugMapFilter &operator=(DebugMapFilter &&) = default;
+  ///@}
 };
 
 /// The DebugMap object stores the list of object files to query for debug
@@ -278,13 +307,17 @@ struct SequenceTraits<std::vector<std::unique_ptr<dsymutil::DebugMapObject>>> {
           size_t index);
 };
 
+template <> struct MappingTraits<dsymutil::DebugMapObjectFilter> {
+  static void mapping(IO &io, dsymutil::DebugMapObjectFilter &DMO);
+};
+
 template <>
 struct SequenceTraits<
     std::vector<std::unique_ptr<dsymutil::DebugMapObjectFilter>>> {
   static size_t
   size(IO &io,
        std::vector<std::unique_ptr<dsymutil::DebugMapObjectFilter>> &seq);
-  static dsymutil::DebugMapObject &
+  static dsymutil::DebugMapObjectFilter &
   element(IO &,
           std::vector<std::unique_ptr<dsymutil::DebugMapObjectFilter>> &seq,
           size_t index);
@@ -298,6 +331,14 @@ template <> struct MappingTraits<std::unique_ptr<dsymutil::DebugMap>> {
   static void mapping(IO &io, std::unique_ptr<dsymutil::DebugMap> &DM);
 };
 
+template <> struct MappingTraits<dsymutil::DebugMapFilter> {
+  static void mapping(IO &io, dsymutil::DebugMapFilter &DMF);
+};
+
+template <> struct MappingTraits<std::unique_ptr<dsymutil::DebugMapFilter>> {
+  static void mapping(IO &io, std::unique_ptr<dsymutil::DebugMapFilter> &DMF);
+};
+
 } // end namespace yaml
 } // end namespace llvm
 
diff --git a/llvm/tools/dsymutil/dsymutil.cpp b/llvm/tools/dsymutil/dsymutil.cpp
index 2f32a48b38804..108b840ce1c68 100644
--- a/llvm/tools/dsymutil/dsymutil.cpp
+++ b/llvm/tools/dsymutil/dsymutil.cpp
@@ -59,33 +59,6 @@ using namespace llvm::dsymutil;
 using namespace object;
 using namespace llvm::dwarf_linker;
 
-/// YAML structure for --allow / --disallow object list files.
-struct ObjectFileEntry {
-  std::string Filename;
-};
-
-struct ObjectFileList {
-  std::vector<ObjectFileEntry> Objects;
-};
-
-LLVM_YAML_IS_SEQUENCE_VECTOR(ObjectFileEntry)
-
-namespace llvm {
-namespace yaml {
-template <> struct MappingTraits<ObjectFileEntry> {
-  static void mapping(IO &IO, ObjectFileEntry &Entry) {
-    IO.mapRequired("filename", Entry.Filename);
-  }
-};
-
-template <> struct MappingTraits<ObjectFileList> {
-  static void mapping(IO &IO, ObjectFileList &List) {
-    IO.mapOptional("objects", List.Objects);
-  }
-};
-} // namespace yaml
-} // namespace llvm
-
 namespace {
 enum ID {
   OPT_INVALID = 0, // This is not an option ID.
@@ -754,15 +727,15 @@ int dsymutil_main(int argc, char **argv, const llvm::ToolContext &) {
       StringRef Content = (*BufOrErr)->getBuffer();
       if (!Content.trim().empty()) {
         yaml::Input YAMLIn(Content);
-        ObjectFileList ObjList;
-        YAMLIn >> ObjList;
+        std::unique_ptr<DebugMapFilter> DebugMapFilter;
+        YAMLIn >> DebugMapFilter;
         if (YAMLIn.error())
           return make_error<StringError>(
               Twine("cannot parse allow/disallow file '") + FilePath + "'",
               YAMLIn.error());
-        for (const auto &Entry : ObjList.Objects) {
+        for (const auto &Entry : *DebugMapFilter) {
           SmallString<80> Path(Options.LinkOpts.PrependPath);
-          sys::path::append(Path, Entry.Filename);
+          sys::path::append(Path, Entry->getObjectFilename());
           Result.insert(Path);
         }
       }

``````````

</details>


https://github.com/llvm/llvm-project/pull/185061


More information about the llvm-commits mailing list