Skip to content

Should seafoam use graal-igvutil.jar? #109

@eregon

Description

@eregon

I recently learned about mx igvutil:

$ cd graal/compiler
$ mx igvutil --help       

USAGE:
  mx igvutil <SUBCOMMAND>

ARGS:
  <SUBCOMMAND>
    flatten
      group graphs across multiple files/dumps by name or some other graph property, e.g. date, type or compilationId.

    filter
      export graph data to JSON, optionally selecting a subset of graph/node properties

    list
      print IGV file contents in a tree-like format

    Pass the --help flag after <SUBCOMMAND> for more help on the selected subcommand.
$ mx igvutil list ../../../seafoam/examples/ruby/example_if.bgv
../../../seafoam/examples/ruby/example_if.bgv
└─ Truffle::Object#example_if
   ├─ AST
   │  └─ 0: After Profiling
   └─ Graal Graphs
      ├─ Call Tree
      │  ├─ 0: Before Inline
      │  └─ 1: After Inline
      ├─ 0: After Partial Evaluation
      ├─ 1: After TruffleTier
      ├─ 2: Before phase Lowering
      ├─ 3: After high tier
      ├─ 4: After mid tier
      └─ 5: After low tier
$ mx igvutil filter ../../../seafoam/examples/ruby/example_if.bgv|head -n 70
{
  "vm.uuid": "50612",
  "type": "",
  "version.truffleruby": "27b9496c44430040a92a25c4551efd3aba48698e",
  "version.tools": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
  "version.truffle": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
  "version.compiler": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
  "version.sulong": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
  "version.java-benchmarks": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
  "version.sdk": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
  "version.regex": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
  "truffle.compilation.id": "org.graalvm.compiler.truffle.compiler.TruffleCompilerImpl$TruffleCompilationImpl@1f4bc6a1",
  "version.jvmci": "5a392551261f",
  "elements": [
    {
      "name": "Truffle::Object#example_if",
      "type": "",
      "version.truffleruby": "27b9496c44430040a92a25c4551efd3aba48698e",
      "version.tools": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
      "version.truffle": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
      "version.compiler": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
      "version.sulong": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
      "version.java-benchmarks": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
      "version.sdk": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
      "version.regex": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
      "truffle.compilation.id": "org.graalvm.compiler.truffle.compiler.TruffleCompilerImpl$TruffleCompilationImpl@1f4bc6a1",
      "version.jvmci": "5a392551261f",
      "elements": [
        {
          "name": "AST",
          "type": "",
          "version.truffleruby": "27b9496c44430040a92a25c4551efd3aba48698e",
          "version.tools": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
          "version.truffle": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
          "version.compiler": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
          "version.sulong": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
          "version.java-benchmarks": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
          "version.sdk": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
          "version.regex": "fd344ebb6fd78982f8a316e8567d34af1a0943c2",
          "version.jvmci": "5a392551261f",
          "elements": [
            {
              "id": 0,
              "name": "0: After Profiling",
              "graph_type": "defaultType",
              "nodes": {
                "0": {
                  "id": 0,
                  "idx": "0",
                  "cost": "NodeCost.MONOMORPHIC",
                  "instrumentationBits": "0",
                  "language": "org.truffleruby.RubyLanguage@3712ed79",
                  "label": "RubyRoot",
                  "split": "Split.HEURISTIC",
                  "frameDescriptor": "FrameDescriptor@786c6b3e{0:condition, 1:x, 2:y, 3:(self), 4:%__method_block_arg__, 5:a}",
                  "callTarget": "Object#example_if",
                  "sourceSection": "SourceSection(source=ruby_examples.rb [67:1 - 76:3], index=1006, length=139, characters=def example_if(condition, x, y)\\n  if condition\\n    Primitive.blackhole x\\n    a = x\\n  else\\n    Primitive.blackhole y\\n    a = y\\n  end\\n  a\\nend)",
                  "lock": "java.util.concurrent.locks.ReentrantLock@110a593[Unlocked]",
                  "sharedMethodInfo": "Object#example_if ruby_examples.rb:67",
                  "engineRef": "org.truffleruby.RubyLanguage@3712ed79",
                  "name": "RubyRoot",
                  "class": "org.truffleruby.language.RubyRootNode",
                  "block": "0"
                },
                "1": {
                  "id": 1,
                  "idx": "1",
                  "sourceCharIndex": 1006,
                  "cost": "NodeCost.MONOMORPHIC",
                  "unsupportedOperationBehavior": "UnsupportedOperationBehavior.TYPE_ERROR",

mv -v shows it uses some jars from the compiler suite:

.../bin/java -cp graal/sdk/mxbuild/jdk26/dists/jdk17/collections.jar:graal/sdk/mxbuild/jdk26/dists/jdk11/word.jar:graal/truffle/mxbuild/jdk26/dists/jdk17/truffle-compiler.jar:graal/compiler/mxbuild/jdk26/dists/jdk21/graal.jar:graal/compiler/mxbuild/jdk26/dists/jdk21/graal-igvutil.jar org.graalvm.igvutil.IgvUtility filter ../../../seafoam/examples/ruby/example_if.bgv

If the JSON has all the required information it would mean no need to maintain https://github.com/Shopify/seafoam/blob/main/lib/seafoam/bgv/bgv_parser.rb and related anymore, in exchange of having to depend on these jars and a JVM.

BTW the JSON output above has tons of hints that it's a truffleruby graph, IIRC at some point Seafoam wanted a way to detect if it's a Ruby graph, e.g. to do Ruby arguments transformation (to T(1) etc).

cc @nirvdrum

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions