[llvm] [llvm-pdbutil] Add output file option for pdb2yaml (PR #82300)

via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 10 14:17:42 PDT 2024


https://github.com/nikitalita updated https://github.com/llvm/llvm-project/pull/82300

>From bbf8986b19d7d3e54a99566fe2e9eb884fbf5f4f Mon Sep 17 00:00:00 2001
From: nikitalita <69168929+nikitalita at users.noreply.github.com>
Date: Thu, 2 Nov 2023 05:10:17 -0700
Subject: [PATCH 1/2] [llvm-pdbutil] Add output file option for pdb2yaml

---
 llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp |  7 +++--
 llvm/tools/llvm-pdbutil/YAMLOutputStyle.h   |  2 +-
 llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp    | 35 +++++++++++++++++++--
 3 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp
index 80b76657facc7c..10700aadfabc56 100644
--- a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp
@@ -37,11 +37,14 @@ static bool checkModuleSubsection(opts::ModuleSubsection MS) {
                 });
 }
 
-YAMLOutputStyle::YAMLOutputStyle(PDBFile &File)
-    : File(File), Out(outs()), Obj(File.getAllocator()) {
+YAMLOutputStyle::YAMLOutputStyle(PDBFile &File, raw_ostream &OS)
+    : File(File), Out(OS), Obj(File.getAllocator()) {
   Out.setWriteDefaultValues(!opts::pdb2yaml::Minimal);
 }
 
+YAMLOutputStyle::YAMLOutputStyle(PDBFile &File)
+    : YAMLOutputStyle::YAMLOutputStyle(File, llvm::outs()) {}
+
 Error YAMLOutputStyle::dump() {
   if (opts::pdb2yaml::StreamDirectory)
     opts::pdb2yaml::StreamMetadata = true;
diff --git a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.h b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.h
index 5d53e0b65d03c9..b8badecfca405a 100644
--- a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.h
+++ b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.h
@@ -21,7 +21,7 @@ namespace pdb {
 class YAMLOutputStyle : public OutputStyle {
 public:
   YAMLOutputStyle(PDBFile &File);
-
+  YAMLOutputStyle(PDBFile &File, raw_ostream &Output);
   Error dump() override;
 
 private:
diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
index fa870666fe61a3..e1336501103dfc 100644
--- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
+++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
@@ -716,6 +716,10 @@ cl::opt<bool> DumpModuleSyms("module-syms", cl::desc("dump module symbols"),
 cl::list<std::string> InputFilename(cl::Positional,
                                     cl::desc("<input PDB file>"), cl::Required,
                                     cl::sub(PdbToYamlSubcommand));
+cl::opt<std::string> PdbYamlOutputFile(
+    "yaml", cl::desc("the name of the yaml file to write (default stdout)"),
+    cl::sub(PdbToYamlSubcommand));
+
 } // namespace pdb2yaml
 
 namespace merge {
@@ -893,8 +897,35 @@ static void pdb2Yaml(StringRef Path) {
   std::unique_ptr<IPDBSession> Session;
   auto &File = loadPDB(Path, Session);
 
-  auto O = std::make_unique<YAMLOutputStyle>(File);
-
+  std::unique_ptr<YAMLOutputStyle> O;
+  std::unique_ptr<raw_fd_ostream> OutputFile;
+  if (!opts::pdb2yaml::PdbYamlOutputFile.empty()) {
+    std::error_code EC;
+    if (!sys::fs::exists(opts::pdb2yaml::PdbYamlOutputFile)) {
+      auto ParentPath =
+          sys::path::parent_path(opts::pdb2yaml::PdbYamlOutputFile);
+      if (!ParentPath.empty()) {
+        EC = sys::fs::create_directories(
+            sys::path::parent_path(opts::pdb2yaml::PdbYamlOutputFile));
+        if (EC) {
+          errs() << "Error creating directory: "
+                 << sys::path::parent_path(opts::pdb2yaml::PdbYamlOutputFile)
+                 << "\n";
+          exit(1);
+        }
+      }
+    }
+    OutputFile = std::make_unique<raw_fd_ostream>(
+        opts::pdb2yaml::PdbYamlOutputFile, EC, sys::fs::FA_Write);
+    if (EC || !OutputFile) {
+      errs() << "Error opening file for writing: "
+             << opts::pdb2yaml::PdbYamlOutputFile << "\n";
+      exit(1);
+    }
+    O = std::make_unique<YAMLOutputStyle>(File, *OutputFile);
+  } else {
+    O = std::make_unique<YAMLOutputStyle>(File);
+  }
   ExitOnErr(O->dump());
 }
 

>From 84b392717f322d6cd1bed8f3fde8591f4f0716ab Mon Sep 17 00:00:00 2001
From: nikitalita <69168929+nikitalita at users.noreply.github.com>
Date: Wed, 10 Apr 2024 14:17:01 -0700
Subject: [PATCH 2/2] [llvm-pdbutil] add --yaml test

---
 llvm/test/tools/llvm-pdbutil/type-server-no-dbi.test | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-pdbutil/type-server-no-dbi.test b/llvm/test/tools/llvm-pdbutil/type-server-no-dbi.test
index 8b1f0b61b76d8a..a0cf133417880d 100644
--- a/llvm/test/tools/llvm-pdbutil/type-server-no-dbi.test
+++ b/llvm/test/tools/llvm-pdbutil/type-server-no-dbi.test
@@ -1,6 +1,6 @@
 
 RUN: llvm-pdbutil dump -all %p/Inputs/TypeServerTest.pdb | FileCheck %s --check-prefix=NO-DBI
-RUN: llvm-pdbutil pdb2yaml -all %p/Inputs/TypeServerTest.pdb > %t
+RUN: llvm-pdbutil pdb2yaml -all %p/Inputs/TypeServerTest.pdb --yaml %t
 RUN: FileCheck --input-file=%t %s --check-prefix=NO-DBI-YAML
 
 NO-DBI-NOT: Native PDB Error: The specified stream could not be loaded.



More information about the llvm-commits mailing list