[docs] Add detailed documentation for hole check elision pipeline [v8/v8 : main]

0 views
Skip to first unread message

Toon Verwaest (Gerrit)

unread,
Apr 20, 2026, 12:50:30 PM (8 days ago) Apr 20
to Leszek Swirski, v8-re...@googlegroups.com
Attention needed from Leszek Swirski

Toon Verwaest voted

Auto-Submit+1
Commit-Queue+1
Open in Gerrit

Related details

Attention is currently required from:
  • Leszek Swirski
Submit Requirements:
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: v8/v8
Gerrit-Branch: main
Gerrit-Change-Id: I071fec31c5b5070aa92bf97106d435c3c6d8af7e
Gerrit-Change-Number: 7776196
Gerrit-PatchSet: 2
Gerrit-Owner: Toon Verwaest <verw...@chromium.org>
Gerrit-Reviewer: Leszek Swirski <les...@chromium.org>
Gerrit-Reviewer: Toon Verwaest <verw...@chromium.org>
Gerrit-Attention: Leszek Swirski <les...@chromium.org>
Gerrit-Comment-Date: Mon, 20 Apr 2026 16:50:25 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
satisfied_requirement
unsatisfied_requirement
open
diffy

Toon Verwaest (Gerrit)

unread,
Apr 21, 2026, 7:34:47 AM (8 days ago) Apr 21
to Olivier Flückiger, v8-s...@luci-project-accounts.iam.gserviceaccount.com, Leszek Swirski, v8-re...@googlegroups.com
Attention needed from Leszek Swirski and Olivier Flückiger

Toon Verwaest voted and added 1 comment

Votes added by Toon Verwaest

Auto-Submit+1

1 comment

Patchset-level comments
File-level comment, Patchset 3 (Latest):
Toon Verwaest . resolved

ptal

Open in Gerrit

Related details

Attention is currently required from:
  • Leszek Swirski
  • Olivier Flückiger
Submit Requirements:
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: v8/v8
Gerrit-Branch: main
Gerrit-Change-Id: I071fec31c5b5070aa92bf97106d435c3c6d8af7e
Gerrit-Change-Number: 7776196
Gerrit-PatchSet: 3
Gerrit-Owner: Toon Verwaest <verw...@chromium.org>
Gerrit-Reviewer: Leszek Swirski <les...@chromium.org>
Gerrit-Reviewer: Olivier Flückiger <ol...@chromium.org>
Gerrit-Reviewer: Toon Verwaest <verw...@chromium.org>
Gerrit-Attention: Olivier Flückiger <ol...@chromium.org>
Gerrit-Attention: Leszek Swirski <les...@chromium.org>
Gerrit-Comment-Date: Tue, 21 Apr 2026 11:34:42 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: Yes
satisfied_requirement
unsatisfied_requirement
open
diffy

Olivier Flückiger (Gerrit)

unread,
Apr 21, 2026, 10:17:19 AM (7 days ago) Apr 21
to Toon Verwaest, Olivier Flückiger, v8-s...@luci-project-accounts.iam.gserviceaccount.com, Leszek Swirski, v8-re...@googlegroups.com
Attention needed from Leszek Swirski, Olivier Flückiger and Toon Verwaest

Message from Olivier Flückiger

I have reviewed the documentation in this CL. Here are my comments:

1. **Broken Links in `hole-check-elision.md`**:
The links to the other steps use absolute file URLs pointing to a local home directory (e.g., `file:///usr/local/google/home/verwaest/...`). These should be changed to relative links so they work correctly in the Gerrit UI and for other users.
* `docs/parsing/hole-check-elision.md` lines 43-45 should use relative paths like `hole-check-elimination-parser.md`.
2. **Minor Spec Precision in `hole-check-elimination-parser.md`**:
Line 35 states: "Function declarations are hoisted to the top of their scope (per FunctionDeclarationInstantiation), while class declarations are not (BlockDeclarationInstantiation)."
Technically, if a class declaration is at the top level of a function, its binding is instantiated in `FunctionDeclarationInstantiation` (Step 35), not `BlockDeclarationInstantiation`. Both result in the same TDZ behavior (created but not initialized), but for strict accuracy, it might be worth noting or just saying "lexically scoped declarations".

Overall, the documentation is excellent and very detailed!

Open in Gerrit

Related details

Attention is currently required from:
  • Leszek Swirski
  • Olivier Flückiger
  • Toon Verwaest
Submit Requirements:
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: v8/v8
Gerrit-Branch: main
Gerrit-Change-Id: I071fec31c5b5070aa92bf97106d435c3c6d8af7e
Gerrit-Change-Number: 7776196
Gerrit-PatchSet: 3
Gerrit-Owner: Toon Verwaest <verw...@chromium.org>
Gerrit-Reviewer: Leszek Swirski <les...@chromium.org>
Gerrit-Reviewer: Olivier Flückiger <ol...@chromium.org>
Gerrit-Reviewer: Toon Verwaest <verw...@chromium.org>
Gerrit-Attention: Olivier Flückiger <ol...@chromium.org>
Gerrit-Attention: Leszek Swirski <les...@chromium.org>
Gerrit-Comment-Date: Tue, 21 Apr 2026 14:17:15 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: No
satisfied_requirement
unsatisfied_requirement
open
diffy

Toon Verwaest (Gerrit)

unread,
Apr 21, 2026, 10:30:43 AM (7 days ago) Apr 21
to Olivier Flückiger, Olivier Flückiger, v8-s...@luci-project-accounts.iam.gserviceaccount.com, Leszek Swirski, v8-re...@googlegroups.com
Attention needed from Leszek Swirski and Olivier Flückiger

Toon Verwaest voted and added 1 comment

Votes added by Toon Verwaest

Auto-Submit+1

1 comment

Patchset-level comments
File-level comment, Patchset 4 (Latest):
Toon Verwaest . resolved

addressed, thanks!

Open in Gerrit

Related details

Attention is currently required from:
  • Leszek Swirski
  • Olivier Flückiger
Submit Requirements:
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: v8/v8
Gerrit-Branch: main
Gerrit-Change-Id: I071fec31c5b5070aa92bf97106d435c3c6d8af7e
Gerrit-Change-Number: 7776196
Gerrit-PatchSet: 4
Gerrit-Owner: Toon Verwaest <verw...@chromium.org>
Gerrit-Reviewer: Leszek Swirski <les...@chromium.org>
Gerrit-Reviewer: Olivier Flückiger <ol...@chromium.org>
Gerrit-Reviewer: Toon Verwaest <verw...@chromium.org>
Gerrit-CC: Olivier Flückiger <ol...@google.com>
Gerrit-Attention: Olivier Flückiger <ol...@chromium.org>
Gerrit-Attention: Leszek Swirski <les...@chromium.org>
Gerrit-Comment-Date: Tue, 21 Apr 2026 14:30:40 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: Yes
satisfied_requirement
unsatisfied_requirement
open
diffy

Toon Verwaest (Gerrit)

unread,
Apr 22, 2026, 8:04:48 AM (6 days ago) Apr 22
to Olivier Flückiger, Olivier Flückiger, v8-s...@luci-project-accounts.iam.gserviceaccount.com, Leszek Swirski, v8-re...@googlegroups.com
Attention needed from Leszek Swirski and Olivier Flückiger

Toon Verwaest voted Commit-Queue+2

Commit-Queue+2
Gerrit-Comment-Date: Wed, 22 Apr 2026 12:04:44 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
satisfied_requirement
unsatisfied_requirement
open
diffy

Olivier Flückiger (Gerrit)

unread,
Apr 22, 2026, 2:05:59 PM (6 days ago) Apr 22
to Toon Verwaest, Olivier Flückiger, v8-s...@luci-project-accounts.iam.gserviceaccount.com, Leszek Swirski, v8-re...@googlegroups.com
Attention needed from Leszek Swirski, Olivier Flückiger and Toon Verwaest

Message from Olivier Flückiger

The documentation provides an excellent and deep overview of V8's hole check elision pipeline. The structural progression from Parser -> Ignition -> Optimizing compilers is very clear.

I have reviewed the files and identified a few technical inaccuracies, mostly stemming from JS semantics in the examples and some nuanced compiler behaviors, that should be addressed before landing.

### `docs/parsing/hole-checks-bytecode.md`

1. **Example Code Inaccuracy (`let x, y;`)**: The examples consistently use `let x, y;` at the beginning of the functions. In JS, a declaration without an initializer implicitly initializes the variables to `undefined` immediately. Because of this, their `initializer_position` occurs before any accesses in the function body. The Parser (`src/ast/scopes.cc`) will statically evaluate `var->initializer_position() >= access_position` as FALSE, and mark the accesses as `HoleCheckMode::kElided`. The Bytecode Generator will NEVER see `kRequired` for these accesses, rendering the examples mechanically incorrect as illustrations of Ignition's dynamic elision. To fix this, restructure the examples to use cross-closure accesses to uninitialized variables (where the parser cannot statically prove initialization).
2. **Loop Execution Reasoning**: In the loops section, the document states: "V8 cannot guarantee that the loop body executes even once. Therefore, any hole checks performed inside the loop are conservatively forgotten." While true for `while`/`for`, this reasoning fails for `do...while` loops, which *are* guaranteed to execute at least once. However, V8 still conservatively forgets checks in `do...while` loops. The true technical reason is that V8's single-pass loop analysis (`VisitIterationBodyInHoleCheckElisionScope`) unconditionally wraps the body of *all* iteration statements in a `HoleCheckElisionScope`, which always discards its bitmap state upon destruction rather than merging it outward.
3. **Missing Second Strategy**: The document states "To maintain this bitmap correctly across control flow, V8 uses two primary strategies:" and introduces "1. Scoped State Preservation (`HoleCheckElisionScope`)", but the document abruptly ends. It is missing the second strategy: State Merging (via `HoleCheckElisionMergeScope`), which performs the set-intersection of the bitmaps at convergence points (crucial for understanding the `try/catch` and `switch` examples).

### `docs/parsing/hole-checks-optimized.md`

1. **Example Code Inaccuracy**: Similar to the previous file, the example in "Maglev's Implicit Control-Flow Elision" uses `let x;` which implicitly initializes the variable to `undefined`, bypassing the TDZ entirely.
2. **Turboshaft Lowering Context**: The Turboshaft section explains that hole checks are lowered into a standard comparison `RootEqual(value, RootIndex::kTheHoleValue)`. It would be helpful to explicitly mention that this lowering happens during the translation phase from Maglev IR to Turboshaft IR (`TurboLevGraphBuilder::Process(maglev::ThrowReferenceErrorIfHole...)`), as Maglev is now the frontend for Turboshaft.
3. **"Constant" Tracking Terminology**: In the section "Constant Tracking via Hole Elision and `maybe_assigned`", the document states that if a variable is not `maybe_assigned` and passes a hole check, Maglev will "specialize the load to a constant in the graph". This is slightly misleading. Maglev uses `known_node_aspects().GetContextCachedValue()` to cache and reuse the exact same `ValueNode` for all subsequent loads. While this eliminates redundant `LoadContextSlot` operations and their associated hole checks, the reused node is not necessarily a compiler *constant* (unless the original assignment was a constant); it is simply a reused graph node. Changing "constant" to "cached node" or "reused graph node" would be more technically accurate.

Open in Gerrit

Related details

Attention is currently required from:
  • Leszek Swirski
  • Olivier Flückiger
  • Toon Verwaest
Submit Requirements:
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: v8/v8
Gerrit-Branch: main
Gerrit-Change-Id: I071fec31c5b5070aa92bf97106d435c3c6d8af7e
Gerrit-Change-Number: 7776196
Gerrit-PatchSet: 4
Gerrit-Owner: Toon Verwaest <verw...@chromium.org>
Gerrit-Reviewer: Leszek Swirski <les...@chromium.org>
Gerrit-Reviewer: Olivier Flückiger <ol...@chromium.org>
Gerrit-Reviewer: Toon Verwaest <verw...@chromium.org>
Gerrit-CC: Olivier Flückiger <ol...@google.com>
Gerrit-Attention: Toon Verwaest <verw...@chromium.org>
Gerrit-Attention: Olivier Flückiger <ol...@chromium.org>
Gerrit-Attention: Leszek Swirski <les...@chromium.org>
Gerrit-Comment-Date: Wed, 22 Apr 2026 18:05:54 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: No
satisfied_requirement
unsatisfied_requirement
open
diffy

Olivier Flückiger (Gerrit)

unread,
Apr 23, 2026, 12:06:08 PM (5 days ago) Apr 23
to Toon Verwaest, Olivier Flückiger, v8-s...@luci-project-accounts.iam.gserviceaccount.com, Leszek Swirski, v8-re...@googlegroups.com
Attention needed from Leszek Swirski and Toon Verwaest

Olivier Flückiger added 9 comments

File docs/parsing/hole-check-elimination-parser.md
Line 55, Patchset 4 (Latest):To fix this, when V8 encounters a variable access inside a nested closure, it resolves the reference by recursively walking the scope chain outward, updating an `access_position` along the way. This adjusted position projects the inner access onto the boundary of the outer scope.
Olivier Flückiger . unresolved

Something is missing here. What do you mean exactly by "to fix this". So Far we have not seen a problem statement. You have introduced that nested closures pose challenges. I guess you are referring back to the "naive" resolution algorithm from "the baseline" breaking down? A bit of glue text is needed here and maybe a concrete example of what goes wrong.

Line 134, Patchset 4 (Latest):This leads to a fascinating nuance: `inner` is a function expression, so it is *not* lexically hoisted within its own outer scope (`hoisted`). However, because `hoisted`'s scope is elided, the runtime context chain connects `inner` directly to `outer`.
Olivier Flückiger . unresolved

```suggestion
Since `inner` is a function expression it is *not* lexically hoisted within its own outer scope (`hoisted`). Still, because `hoisted`'s scope is elided, the runtime context chain connects `inner` directly to `outer`.
```

Line 153, Patchset 4 (Latest):When a scope walk is short-circuited by a `cache_scope` hit, the recursive traversal is skipped. As a direct consequence, the `access_position` that gets passed down to the hole-check logic is "stale" — it has **not** been adjusted by the intermediate scopes because they were skipped.
Olivier Flückiger . unresolved

This part I don't understand. Why exactly is it stale. Where does the cache come from? From an earlier compile? This whole explanation went too fast.

Line 200, Patchset 4 (Latest):## The Mechanics of `eval` Scopes
Olivier Flückiger . unresolved

This part should go to the beginning of the section.

File docs/parsing/hole-check-elision.md
Line 35, Patchset 4 (Latest): console.log(x); // Safe only if cond was true!
Olivier Flückiger . unresolved

hmm, but that is not the same as the above. x is just `undefined` here if the branch is not taken. this is not a TDZ. It does not throw.

Maybe you meant something like this:
```
function testTDZ(cond) {
switch(cond) {
case true:
let x = 1;
return x;
case false:
return x; // Throws ReferenceError: Cannot access 'x' before initialization
}
}
```
File docs/parsing/hole-checks-bytecode.md
Line 7, Patchset 4 (Latest):While the Parser (Step 1) performs a structural analysis to determine if a variable *ever* needs a hole check, the Bytecode Generator performs a **local, flow-sensitive analysis** to avoid emitting redundant check bytecodes within the same function.
Olivier Flückiger . unresolved

```suggestion
While the [Parser](hole-check-elimination-parser.md) performs a structural analysis to determine if a variable *ever* needs a hole check, the Bytecode Generator performs a **local, flow-sensitive analysis** to avoid emitting redundant check bytecodes within the same function.
```

Line 22, Patchset 4 (Latest): console.log(x); // 1. Check 'x' required.
Olivier Flückiger . unresolved

As mentioned elsewhere, this `x` is initialized to `undefined`. No hole check required here.

Line 50, Patchset 4 (Latest): let x;
Olivier Flückiger . unresolved

again, this `x` is initialized here.

Line 75, Patchset 4 (Latest):### 3. `switch` Statements
Olivier Flückiger . unresolved

===========> Reviewed up to here. I think we need to clarify that we are talking about the same thing before I continue.

Open in Gerrit

Related details

Attention is currently required from:
  • Leszek Swirski
  • Toon Verwaest
Submit Requirements:
    • requirement satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: v8/v8
    Gerrit-Branch: main
    Gerrit-Change-Id: I071fec31c5b5070aa92bf97106d435c3c6d8af7e
    Gerrit-Change-Number: 7776196
    Gerrit-PatchSet: 4
    Gerrit-Owner: Toon Verwaest <verw...@chromium.org>
    Gerrit-Reviewer: Leszek Swirski <les...@chromium.org>
    Gerrit-Reviewer: Olivier Flückiger <ol...@chromium.org>
    Gerrit-Reviewer: Toon Verwaest <verw...@chromium.org>
    Gerrit-CC: Olivier Flückiger <ol...@google.com>
    Gerrit-Attention: Toon Verwaest <verw...@chromium.org>
    Gerrit-Attention: Leszek Swirski <les...@chromium.org>
    Gerrit-Comment-Date: Thu, 23 Apr 2026 16:06:04 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Toon Verwaest (Gerrit)

    unread,
    10:39 AM (9 hours ago) 10:39 AM
    to Code Review Nudger, Olivier Flückiger, Olivier Flückiger, v8-s...@luci-project-accounts.iam.gserviceaccount.com, Leszek Swirski, v8-re...@googlegroups.com
    Attention needed from Leszek Swirski and Olivier Flückiger

    Toon Verwaest added 11 comments

    Patchset-level comments
    Toon Verwaest . resolved

    Thanks for the review! I hope this is more clear. Too much pseudocode :)

    File docs/parsing/hole-check-elimination-parser.md
    Line 35, Patchset 4 (Latest): let x = 10; // initializer_position = Pos 65
    Toon Verwaest . resolved

    This `let x = 10` should be moved under `MyClass` and we should smply leave a comment that `// essentially let x = hole at this point` That comment should end up above inner()

    Line 55, Patchset 4 (Latest):To fix this, when V8 encounters a variable access inside a nested closure, it resolves the reference by recursively walking the scope chain outward, updating an `access_position` along the way. This adjusted position projects the inner access onto the boundary of the outer scope.
    Olivier Flückiger . resolved

    Something is missing here. What do you mean exactly by "to fix this". So Far we have not seen a problem statement. You have introduced that nested closures pose challenges. I guess you are referring back to the "naive" resolution algorithm from "the baseline" breaking down? A bit of glue text is needed here and maybe a concrete example of what goes wrong.

    Toon Verwaest

    I guess it should be "To implement variable resolution of `x` without unnecessarily introducing hole checks.

    Line 134, Patchset 4 (Latest):This leads to a fascinating nuance: `inner` is a function expression, so it is *not* lexically hoisted within its own outer scope (`hoisted`). However, because `hoisted`'s scope is elided, the runtime context chain connects `inner` directly to `outer`.
    Olivier Flückiger . resolved

    ```suggestion
    Since `inner` is a function expression it is *not* lexically hoisted within its own outer scope (`hoisted`). Still, because `hoisted`'s scope is elided, the runtime context chain connects `inner` directly to `outer`.
    ```

    Toon Verwaest

    Acknowledged

    Line 153, Patchset 4 (Latest):When a scope walk is short-circuited by a `cache_scope` hit, the recursive traversal is skipped. As a direct consequence, the `access_position` that gets passed down to the hole-check logic is "stale" — it has **not** been adjusted by the intermediate scopes because they were skipped.
    Olivier Flückiger . resolved

    This part I don't understand. Why exactly is it stale. Where does the cache come from? From an earlier compile? This whole explanation went too fast.

    Toon Verwaest

    The entry in the cache. The cache is explained right above. Scope resolution caches resolved variables in its scope-tree basically where the tree turns into a linear line of scope-info backed Scopes (just outside of the currently compiled function).

    Line 200, Patchset 4 (Latest):## The Mechanics of `eval` Scopes
    Olivier Flückiger . resolved

    This part should go to the beginning of the section.

    Toon Verwaest

    Acknowledged

    File docs/parsing/hole-check-elision.md
    Line 35, Patchset 4 (Latest): console.log(x); // Safe only if cond was true!
    Olivier Flückiger . resolved

    hmm, but that is not the same as the above. x is just `undefined` here if the branch is not taken. this is not a TDZ. It does not throw.

    Maybe you meant something like this:
    ```
    function testTDZ(cond) {
    switch(cond) {
    case true:
    let x = 1;
    return x;
    case false:
    return x; // Throws ReferenceError: Cannot access 'x' before initialization
    }
    }
    ```
    Toon Verwaest

    Same as above, what I meant is to put a `// let x = hole` at line 31 and a real `let x;` under console.log.

    File docs/parsing/hole-checks-bytecode.md
    Line 7, Patchset 4 (Latest):While the Parser (Step 1) performs a structural analysis to determine if a variable *ever* needs a hole check, the Bytecode Generator performs a **local, flow-sensitive analysis** to avoid emitting redundant check bytecodes within the same function.
    Olivier Flückiger . resolved

    ```suggestion
    While the [Parser](hole-check-elimination-parser.md) performs a structural analysis to determine if a variable *ever* needs a hole check, the Bytecode Generator performs a **local, flow-sensitive analysis** to avoid emitting redundant check bytecodes within the same function.
    ```

    Toon Verwaest

    Acknowledged

    Line 22, Patchset 4 (Latest): console.log(x); // 1. Check 'x' required.
    Olivier Flückiger . resolved

    As mentioned elsewhere, this `x` is initialized to `undefined`. No hole check required here.

    Toon Verwaest

    Same as above.

    Olivier Flückiger . resolved

    again, this `x` is initialized here.

    Toon Verwaest

    Same as above.

    Line 75, Patchset 4 (Latest):### 3. `switch` Statements
    Olivier Flückiger . resolved

    ===========> Reviewed up to here. I think we need to clarify that we are talking about the same thing before I continue.

    Toon Verwaest

    Acknowledged

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Leszek Swirski
    • Olivier Flückiger
    Submit Requirements:
      • requirement satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: v8/v8
      Gerrit-Branch: main
      Gerrit-Change-Id: I071fec31c5b5070aa92bf97106d435c3c6d8af7e
      Gerrit-Change-Number: 7776196
      Gerrit-PatchSet: 4
      Gerrit-Owner: Toon Verwaest <verw...@chromium.org>
      Gerrit-Reviewer: Leszek Swirski <les...@chromium.org>
      Gerrit-Reviewer: Olivier Flückiger <ol...@chromium.org>
      Gerrit-Reviewer: Toon Verwaest <verw...@chromium.org>
      Gerrit-CC: Code Review Nudger <android-build...@prod.google.com>
      Gerrit-Attention: Olivier Flückiger <ol...@chromium.org>
      Gerrit-Attention: Leszek Swirski <les...@chromium.org>
      Gerrit-Comment-Date: Tue, 28 Apr 2026 14:39:46 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Olivier Flückiger <ol...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy
      Reply all
      Reply to author
      Forward
      0 new messages