Docs / design / pdg-design · Edit on GitHub

Program Dependence Graph (PDG) — Engineering Design

Program dependence graph — data and control dependencies between statements within a function. Foundation for slicing, taint, and dataflow visualization.

Dataflow tab — PDG graph (gbuilder)

Figure 1: Dataflow tab in PDG mode — variable selector, control/data edge toggles, and Sigma PDG layout.


1. Goals

GoalHow
Statement-level depsData edges (def-use) + control edges
Slice foundationBackward/forward slice = graph reachability
Interactive explorationDashboard variable filter + statement list
CLI exportinspect SYMBOL pdg with `--edge-layer data

2. Architecture overview

flowchart TB
  CFG[ControlFlowGraph]
  PDG[ProgramDependenceGraph]
  CFG --> PDG

  subgraph edges["PDG edges"]
    DATA[Data dependence]
    CTRL[Control dependence]
  end

  PDG --> DATA
  PDG --> CTRL

  subgraph consumers["Consumers"]
    SLICE[Program slice]
    TAINT[Taint flows]
    DF[DataflowView]
  end

  PDG --> SLICE
  PDG --> TAINT
  PDG --> DF

PDG is built after CFG dominator analysis (crates/rgctl-analysis/src/pdg.rs).

Opt-in fidelity (hybrid CPG P3)

Flag / optionEffect
discover --with-dfg-loopsSets PdgBuildOptions::classify_loop_carried — tags DataDependency.loop_carried when the use block can reach the def block on the CFG (loop-carried)
cpg flows --with-aliasOn-demand may-alias expansion (alias::may_alias_names) for copies + field bases; does not rewrite the PDG archive

Default discover --with-cfg leaves loop_carried = false on all edges.


3. Dashboard dataflow mode

ControlEffect
Variable dropdownHighlight def-use neighborhood for one name
Include controlAdd control-dependence edges
Include CFG overlaySuperimpose block structure
Statement listClick row ↔ graph node

Exported via dataflow_index.json + shared slice/{id}.json PDG payloads.


4. Rust implementation map

ComponentPath
PDG constructioncrates/rgctl-analysis/src/pdg.rs
Dominators (input)crates/rgctl-analysis/src/dominance.rs
Slicingcrates/rgctl-analysis/src/slicing.rs
CLIsrc/cli/inspect.rs
Dashboard enginedashboard/src/dataflowEngine.ts

5. Dashboard implementation

PiecePath
Tabdashboard/src/DataflowView.tsx
View modedataflow (PDG) vs dominator (see dominance design)
LegendsPDG_NODE_LEGEND, PDG_EDGE_LEGEND in viewLegendData.ts
WorkerloadCfgDetail + bundle PDG from slice/

6. CLI usage

rgctl discover . --cfg
rgctl inspect process pdg --edge-layer data
rgctl inspect process pdg --def-use
rgctl -f mermaid inspect process pdg
rgctl slice src/Foo.java --line 42 --variable x --view pdg

7. Testing

LayerLocation
PDG unit testscrates/rgctl-analysis/src/pdg.rs
Dataflow exporttests/dashboard_harness.rs (dataflow_index.json)

Screenshots: capture-design-screenshots.mjsdocs/images/design/pdg/.


8. Related docs