[llvm-branch-commits] [llvm] [ctxprof] add conversion to yaml to llvm-ctxprof-utils (PR #123131)

Mircea Trofin via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Jan 15 14:29:54 PST 2025


https://github.com/mtrofin created https://github.com/llvm/llvm-project/pull/123131

None

>From c8e600b9969239c2491fd97f011172f4032524bb Mon Sep 17 00:00:00 2001
From: Mircea Trofin <mtrofin at google.com>
Date: Wed, 15 Jan 2025 14:10:19 -0800
Subject: [PATCH] [ctxprof] add conversion to yaml to llvm-ctxprof-utils

---
 .../tools/llvm-ctxprof-util/Inputs/valid.yaml | 26 ++++++------
 .../llvm-ctxprof-util/llvm-ctxprof-util.test  |  4 +-
 .../llvm-ctxprof-util/llvm-ctxprof-util.cpp   | 41 ++++++++++++++++---
 3 files changed, 51 insertions(+), 20 deletions(-)

diff --git a/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.yaml b/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.yaml
index 6080c2414d64a0..9bbf82d59c9134 100644
--- a/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.yaml
+++ b/llvm/test/tools/llvm-ctxprof-util/Inputs/valid.yaml
@@ -1,13 +1,13 @@
-- Guid: 1000
-  Counters: [1, 2, 3]
-  Callsites:  - []
-              - 
-                - Guid: 2000
-                  Counters: [4, 5]
-                - Guid: 18446744073709551613
-                  Counters: [6, 7, 8]
-              - 
-                - Guid: 3000
-                  Counters: [40, 50]
-- Guid: 18446744073709551612
-  Counters: [5, 9, 10]
+
+- Guid:            1000
+  Counters:        [ 1, 2, 3 ]
+  Callsites:
+    - [  ]
+    - - Guid:            2000
+        Counters:        [ 4, 5 ]
+      - Guid:            18446744073709551613
+        Counters:        [ 6, 7, 8 ]
+    - - Guid:            3000
+        Counters:        [ 40, 50 ]
+- Guid:            18446744073709551612
+  Counters:        [ 5, 9, 10 ]
diff --git a/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util.test b/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util.test
index 91ebd1de59bb54..30bc8bce054101 100644
--- a/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util.test
+++ b/llvm/test/tools/llvm-ctxprof-util/llvm-ctxprof-util.test
@@ -4,7 +4,9 @@
 ; RUN: llvm-ctxprof-util fromYAML --input %S/Inputs/empty.yaml -output %t/empty.bitstream
 ; RUN: llvm-bcanalyzer --dump %t/empty.bitstream | FileCheck %s --check-prefix=EMPTY
 
-; RUN: llvm-ctxprof-util fromYAML --input %S/Inputs/valid.yaml -output %t/valid.bitstream
+; RUN: llvm-ctxprof-util fromYAML -input %S/Inputs/valid.yaml -output %t/valid.bitstream
+; RUN: llvm-ctxprof-util toYAML -input %t/valid.bitstream -output %t/valid2.yaml
+; RUN: diff %t/valid2.yaml %S/Inputs/valid.yaml
 
 ; For the valid case, check against a reference output.
 ; Note that uint64_t are printed as signed values by llvm-bcanalyzer:
diff --git a/llvm/tools/llvm-ctxprof-util/llvm-ctxprof-util.cpp b/llvm/tools/llvm-ctxprof-util/llvm-ctxprof-util.cpp
index cfa14b22c14698..314144ac6624c9 100644
--- a/llvm/tools/llvm-ctxprof-util/llvm-ctxprof-util.cpp
+++ b/llvm/tools/llvm-ctxprof-util/llvm-ctxprof-util.cpp
@@ -13,6 +13,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/IR/GlobalValue.h"
+#include "llvm/ProfileData/PGOCtxProfReader.h"
 #include "llvm/ProfileData/PGOCtxProfWriter.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Error.h"
@@ -23,6 +24,7 @@
 using namespace llvm;
 
 static cl::SubCommand FromYAML("fromYAML", "Convert from yaml");
+static cl::SubCommand ToYAML("toYAML", "Convert to yaml");
 
 static cl::opt<std::string> InputFilename(
     "input", cl::value_desc("input"), cl::init("-"),
@@ -35,15 +37,16 @@ static cl::opt<std::string> InputFilename(
         "'Contexts', optional. An array containing arrays of contexts. The "
         "context array at a position 'i' is the set of callees at that "
         "callsite index. Use an empty array to indicate no callees."),
-    cl::sub(FromYAML));
+    cl::sub(FromYAML), cl::sub(ToYAML));
 
 static cl::opt<std::string> OutputFilename("output", cl::value_desc("output"),
                                            cl::init("-"),
                                            cl::desc("Output file"),
-                                           cl::sub(FromYAML));
+                                           cl::sub(FromYAML), cl::sub(ToYAML));
 
+namespace {
 // Save the bitstream profile from the JSON representation.
-Error convertFromYAML() {
+Error convertFromYaml() {
   auto BufOrError =
       MemoryBuffer::getFileOrSTDIN(InputFilename, /*IsText=*/true);
   if (!BufOrError)
@@ -61,11 +64,30 @@ Error convertFromYAML() {
   return llvm::createCtxProfFromYAML(BufOrError.get()->getBuffer(), Out);
 }
 
+Error convertToYaml() {
+  auto BufOrError = MemoryBuffer::getFileOrSTDIN(InputFilename);
+  if (!BufOrError)
+    return createFileError(InputFilename, BufOrError.getError());
+
+  std::error_code EC;
+  raw_fd_ostream Out(OutputFilename, EC);
+  if (EC)
+    return createStringError(EC, "failed to open output");
+  PGOCtxProfileReader Reader(BufOrError.get()->getBuffer());
+  auto Prof = Reader.loadContexts();
+  if (!Prof)
+    return Prof.takeError();
+  llvm::convertCtxProfToYaml(Out, *Prof);
+  Out << "\n";
+  return Error::success();
+}
+} // namespace
+
 int main(int argc, const char **argv) {
   cl::ParseCommandLineOptions(argc, argv, "LLVM Contextual Profile Utils\n");
   ExitOnError ExitOnErr("llvm-ctxprof-util: ");
-  if (FromYAML) {
-    if (auto E = convertFromYAML()) {
+  auto HandleErr = [&](Error E) -> int {
+    if (E) {
       handleAllErrors(std::move(E), [&](const ErrorInfoBase &E) {
         E.log(errs());
         errs() << "\n";
@@ -73,7 +95,14 @@ int main(int argc, const char **argv) {
       return 1;
     }
     return 0;
-  }
+  };
+
+  if (FromYAML)
+    return HandleErr(convertFromYaml());
+
+  if (ToYAML)
+    return HandleErr(convertToYaml());
+
   cl::PrintHelpMessage();
   return 1;
 }



More information about the llvm-branch-commits mailing list