Skip to content

Commit 2d982d3

Browse files
Stephen BelangerRafaelGSS
Stephen Belanger
authored andcommitted
deps: V8: backport 7857eb34db42
Original commit message: Reland^2 "Add ContinuationPreservedEmbedderData builtins to extras binding" This reverts commit cb1277e97a0ed32fd893be9f4e927f6e8b6c566c. > Original change's description: > > Add ContinuationPreservedEmbedderData builtins to extras binding > > > > Node.js and Deno wish to use CPED for AsyncLocalStorage and APM, which > > needs a high performance implementation. These builtins allow JavaScript > > to handle CPED performantly. > > > > Change-Id: I7577be80818524baa52791dfce57d442d7c0c933 > > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/5638129 > > Commit-Queue: snek <snek@chromium.org> > > Reviewed-by: Darius Mercadier <dmercadier@chromium.org> > > Reviewed-by: Leszek Swirski <leszeks@chromium.org> > > Reviewed-by: Nico Hartmann <nicohartmann@chromium.org> > > Cr-Commit-Position: refs/heads/main@{#94607} > > Change-Id: Ief390f0b99891c8de83b4c794180440f91cbaf1f > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/5649024 > Auto-Submit: Shu-yu Guo <syg@chromium.org> > Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> > Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> > Cr-Commit-Position: refs/heads/main@{#94608} Change-Id: I4943071ffe192084e83bfe3113cfe9c92ef31465 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/5677045 Reviewed-by: Darius Mercadier <dmercadier@chromium.org> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Commit-Queue: snek <snek@chromium.org> Cr-Commit-Position: refs/heads/main@{#94866} Refs: v8/v8@7857eb3 PR-URL: #53997 Refs: v8/v8@7857eb3 Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
1 parent 1061898 commit 2d982d3

28 files changed

+626
-62
lines changed

Diff for: deps/v8/src/builtins/base.tq

-1
Original file line numberDiff line numberDiff line change
@@ -1313,7 +1313,6 @@ extern macro ChangeUint32ToWord(uint32): uintptr; // Doesn't sign-extend.
13131313
extern macro ChangeInt32ToInt64(int32): int64; // Sign-extends.
13141314
extern macro ChangeUint32ToUint64(uint32): uint64; // Doesn't sign-extend.
13151315
extern macro LoadNativeContext(Context): NativeContext;
1316-
extern macro GetContinuationPreservedEmbedderData(): Object;
13171316
extern macro TruncateFloat64ToFloat16(float64): float16;
13181317
extern macro TruncateFloat32ToFloat16(float32): float16;
13191318
extern macro TruncateFloat64ToFloat32(float64): float32;

Diff for: deps/v8/src/builtins/promise-misc.tq

+23-4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ extern macro PromiseBuiltinsAssembler::IsIsolatePromiseHookEnabled(uint32):
3030

3131
extern macro PromiseBuiltinsAssembler::PromiseHookFlags(): uint32;
3232

33+
namespace macros {
34+
extern macro GetContinuationPreservedEmbedderData(): Object;
35+
extern macro SetContinuationPreservedEmbedderData(Object): void;
36+
}
37+
3338
namespace promise {
3439
extern macro IsFunctionWithPrototypeSlotMap(Map): bool;
3540

@@ -80,7 +85,7 @@ macro NewPromiseFulfillReactionJobTask(
8085
return new PromiseFulfillReactionJobTask{
8186
map: PromiseFulfillReactionJobTaskMapConstant(),
8287
continuation_preserved_embedder_data:
83-
GetContinuationPreservedEmbedderData(),
88+
macros::GetContinuationPreservedEmbedderData(),
8489
argument,
8590
context: handlerContext,
8691
handler,
@@ -108,7 +113,7 @@ macro NewPromiseRejectReactionJobTask(
108113
return new PromiseRejectReactionJobTask{
109114
map: PromiseRejectReactionJobTaskMapConstant(),
110115
continuation_preserved_embedder_data:
111-
GetContinuationPreservedEmbedderData(),
116+
macros::GetContinuationPreservedEmbedderData(),
112117
argument,
113118
context: handlerContext,
114119
handler,
@@ -303,7 +308,7 @@ macro NewPromiseReaction(
303308
return new PromiseReaction{
304309
map: PromiseReactionMapConstant(),
305310
continuation_preserved_embedder_data:
306-
GetContinuationPreservedEmbedderData(),
311+
macros::GetContinuationPreservedEmbedderData(),
307312
next: next,
308313
reject_handler: rejectHandler,
309314
fulfill_handler: fulfillHandler,
@@ -347,7 +352,7 @@ macro NewPromiseResolveThenableJobTask(
347352
return new PromiseResolveThenableJobTask{
348353
map: PromiseResolveThenableJobTaskMapConstant(),
349354
continuation_preserved_embedder_data:
350-
GetContinuationPreservedEmbedderData(),
355+
macros::GetContinuationPreservedEmbedderData(),
351356
context: nativeContext,
352357
promise_to_resolve: promiseToResolve,
353358
thenable,
@@ -452,4 +457,18 @@ transitioning macro BranchIfAccessCheckFailed(
452457
}
453458
} label HasAccess {}
454459
}
460+
461+
@if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA)
462+
transitioning javascript builtin GetContinuationPreservedEmbedderData(
463+
js-implicit context: Context, receiver: JSAny)(): JSAny {
464+
return UnsafeCast<JSAny>(macros::GetContinuationPreservedEmbedderData());
465+
}
466+
467+
@if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA)
468+
transitioning javascript builtin SetContinuationPreservedEmbedderData(
469+
js-implicit context: Context, receiver: JSAny)(data: Object): Undefined {
470+
macros::SetContinuationPreservedEmbedderData(data);
471+
return Undefined;
472+
}
473+
455474
}

Diff for: deps/v8/src/compiler/js-call-reducer.cc

+39
Original file line numberDiff line numberDiff line change
@@ -5108,6 +5108,12 @@ Reduction JSCallReducer::ReduceJSCall(Node* node,
51085108
case Builtin::kBigIntAsIntN:
51095109
case Builtin::kBigIntAsUintN:
51105110
return ReduceBigIntAsN(node, builtin);
5111+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
5112+
case Builtin::kGetContinuationPreservedEmbedderData:
5113+
return ReduceGetContinuationPreservedEmbedderData(node);
5114+
case Builtin::kSetContinuationPreservedEmbedderData:
5115+
return ReduceSetContinuationPreservedEmbedderData(node);
5116+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
51115117
default:
51125118
break;
51135119
}
@@ -8780,6 +8786,39 @@ Reduction JSCallReducer::ReduceJSCallMathMinMaxWithArrayLike(Node* node,
87808786
return ReplaceWithSubgraph(&a, subgraph);
87818787
}
87828788

8789+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
8790+
Reduction JSCallReducer::ReduceGetContinuationPreservedEmbedderData(
8791+
Node* node) {
8792+
JSCallNode n(node);
8793+
Effect effect = n.effect();
8794+
Control control = n.control();
8795+
8796+
Node* value = effect = graph()->NewNode(
8797+
simplified()->GetContinuationPreservedEmbedderData(), effect);
8798+
8799+
ReplaceWithValue(node, value, effect, control);
8800+
return Replace(node);
8801+
}
8802+
8803+
Reduction JSCallReducer::ReduceSetContinuationPreservedEmbedderData(
8804+
Node* node) {
8805+
JSCallNode n(node);
8806+
Effect effect = n.effect();
8807+
Control control = n.control();
8808+
8809+
if (n.ArgumentCount() == 0) return NoChange();
8810+
8811+
effect =
8812+
graph()->NewNode(simplified()->SetContinuationPreservedEmbedderData(),
8813+
n.Argument(0), effect);
8814+
8815+
Node* value = jsgraph()->UndefinedConstant();
8816+
8817+
ReplaceWithValue(node, value, effect, control);
8818+
return Replace(node);
8819+
}
8820+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
8821+
87838822
CompilationDependencies* JSCallReducer::dependencies() const {
87848823
return broker()->dependencies();
87858824
}

Diff for: deps/v8/src/compiler/js-call-reducer.h

+5
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ class V8_EXPORT_PRIVATE JSCallReducer final : public AdvancedReducer {
239239
base::Optional<Reduction> TryReduceJSCallMathMinMaxWithArrayLike(Node* node);
240240
Reduction ReduceJSCallMathMinMaxWithArrayLike(Node* node, Builtin builtin);
241241

242+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
243+
Reduction ReduceGetContinuationPreservedEmbedderData(Node* node);
244+
Reduction ReduceSetContinuationPreservedEmbedderData(Node* node);
245+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
246+
242247
// The pendant to ReplaceWithValue when using GraphAssembler-based reductions.
243248
Reduction ReplaceWithSubgraph(JSCallReducerAssembler* gasm, Node* subgraph);
244249
std::pair<Node*, Node*> ReleaseEffectAndControlFromAssembler(

Diff for: deps/v8/src/compiler/opcodes.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,14 @@
429429

430430
#define SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) V(SpeculativeToNumber)
431431

432+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
433+
#define SIMPLIFIED_CPED_OP_LIST(V) \
434+
V(GetContinuationPreservedEmbedderData) \
435+
V(SetContinuationPreservedEmbedderData)
436+
#else
437+
#define SIMPLIFIED_CPED_OP_LIST(V)
438+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
439+
432440
#define SIMPLIFIED_OTHER_OP_LIST(V) \
433441
V(Allocate) \
434442
V(AllocateRaw) \
@@ -534,7 +542,8 @@
534542
V(TransitionElementsKind) \
535543
V(TypeOf) \
536544
V(Unsigned32Divide) \
537-
V(VerifyType)
545+
V(VerifyType) \
546+
SIMPLIFIED_CPED_OP_LIST(V)
538547

539548
#define SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(V) \
540549
V(SpeculativeBigIntAdd) \

Diff for: deps/v8/src/compiler/simplified-lowering.cc

+11
Original file line numberDiff line numberDiff line change
@@ -4635,6 +4635,17 @@ class RepresentationSelector {
46354635
SetOutput<T>(node, LoadRepresentationOf(node->op()).representation());
46364636
return;
46374637

4638+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
4639+
case IrOpcode::kGetContinuationPreservedEmbedderData:
4640+
SetOutput<T>(node, MachineRepresentation::kTagged);
4641+
return;
4642+
4643+
case IrOpcode::kSetContinuationPreservedEmbedderData:
4644+
ProcessInput<T>(node, 0, UseInfo::AnyTagged());
4645+
SetOutput<T>(node, MachineRepresentation::kNone);
4646+
return;
4647+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
4648+
46384649
default:
46394650
FATAL(
46404651
"Representation inference: unsupported opcode %i (%s), node #%i\n.",

Diff for: deps/v8/src/compiler/simplified-operator.cc

+32
Original file line numberDiff line numberDiff line change
@@ -1339,6 +1339,26 @@ struct SimplifiedOperatorGlobalCache final {
13391339
kSpeculativeToBigIntBigInt64Operator;
13401340
SpeculativeToBigIntOperator<BigIntOperationHint::kBigInt>
13411341
kSpeculativeToBigIntBigIntOperator;
1342+
1343+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
1344+
struct GetContinuationPreservedEmbedderDataOperator : public Operator {
1345+
GetContinuationPreservedEmbedderDataOperator()
1346+
: Operator(IrOpcode::kGetContinuationPreservedEmbedderData,
1347+
Operator::kNoThrow | Operator::kNoDeopt | Operator::kNoWrite,
1348+
"GetContinuationPreservedEmbedderData", 0, 1, 0, 1, 1, 0) {}
1349+
};
1350+
GetContinuationPreservedEmbedderDataOperator
1351+
kGetContinuationPreservedEmbedderData;
1352+
1353+
struct SetContinuationPreservedEmbedderDataOperator : public Operator {
1354+
SetContinuationPreservedEmbedderDataOperator()
1355+
: Operator(IrOpcode::kSetContinuationPreservedEmbedderData,
1356+
Operator::kNoThrow | Operator::kNoDeopt | Operator::kNoRead,
1357+
"SetContinuationPreservedEmbedderData", 1, 1, 0, 0, 1, 0) {}
1358+
};
1359+
SetContinuationPreservedEmbedderDataOperator
1360+
kSetContinuationPreservedEmbedderData;
1361+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
13421362
};
13431363

13441364
namespace {
@@ -2198,6 +2218,18 @@ const Operator* SimplifiedOperatorBuilder::StoreField(
21982218
2, 1, 1, 0, 1, 0, store_access);
21992219
}
22002220

2221+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
2222+
const Operator*
2223+
SimplifiedOperatorBuilder::GetContinuationPreservedEmbedderData() {
2224+
return &cache_.kGetContinuationPreservedEmbedderData;
2225+
}
2226+
2227+
const Operator*
2228+
SimplifiedOperatorBuilder::SetContinuationPreservedEmbedderData() {
2229+
return &cache_.kSetContinuationPreservedEmbedderData;
2230+
}
2231+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
2232+
22012233
const Operator* SimplifiedOperatorBuilder::LoadMessage() {
22022234
return zone()->New<Operator>(IrOpcode::kLoadMessage, Operator::kEliminatable,
22032235
"LoadMessage", 1, 1, 1, 1, 1, 0);

Diff for: deps/v8/src/compiler/simplified-operator.h

+5
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,11 @@ class V8_EXPORT_PRIVATE SimplifiedOperatorBuilder final
12181218
const FastApiCallFunctionVector& c_candidate_functions,
12191219
FeedbackSource const& feedback, CallDescriptor* descriptor);
12201220

1221+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
1222+
const Operator* GetContinuationPreservedEmbedderData();
1223+
const Operator* SetContinuationPreservedEmbedderData();
1224+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
1225+
12211226
private:
12221227
Zone* zone() const { return zone_; }
12231228

Diff for: deps/v8/src/compiler/turboshaft/assembler.h

+10
Original file line numberDiff line numberDiff line change
@@ -3855,6 +3855,16 @@ class TurboshaftAssemblerOpInterface
38553855
}
38563856
#endif // V8_ENABLE_WEBASSEMBLY
38573857

3858+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
3859+
V<Object> GetContinuationPreservedEmbedderData() {
3860+
return ReduceIfReachableGetContinuationPreservedEmbedderData();
3861+
}
3862+
3863+
void SetContinuationPreservedEmbedderData(V<Object> data) {
3864+
ReduceIfReachableSetContinuationPreservedEmbedderData(data);
3865+
}
3866+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
3867+
38583868
template <typename Rep>
38593869
V<Rep> resolve(const V<Rep>& v) {
38603870
return v;

Diff for: deps/v8/src/compiler/turboshaft/graph-builder.cc

+8
Original file line numberDiff line numberDiff line change
@@ -2263,6 +2263,14 @@ OpIndex GraphBuilder::Process(
22632263
return OpIndex::Invalid();
22642264
}
22652265

2266+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
2267+
case IrOpcode::kGetContinuationPreservedEmbedderData:
2268+
return __ GetContinuationPreservedEmbedderData();
2269+
case IrOpcode::kSetContinuationPreservedEmbedderData:
2270+
__ SetContinuationPreservedEmbedderData(Map(node->InputAt(0)));
2271+
return OpIndex::Invalid();
2272+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
2273+
22662274
default:
22672275
std::cerr << "unsupported node type: " << *node->op() << "\n";
22682276
node->Print(std::cerr);

Diff for: deps/v8/src/compiler/turboshaft/machine-lowering-reducer-inl.h

+19
Original file line numberDiff line numberDiff line change
@@ -3164,6 +3164,25 @@ class MachineLoweringReducer : public Next {
31643164
}
31653165
}
31663166

3167+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
3168+
V<Object> REDUCE(GetContinuationPreservedEmbedderData)() {
3169+
return __ Load(
3170+
__ ExternalConstant(
3171+
ExternalReference::continuation_preserved_embedder_data(isolate_)),
3172+
LoadOp::Kind::RawAligned(), MemoryRepresentation::TaggedPointer());
3173+
}
3174+
3175+
OpIndex REDUCE(SetContinuationPreservedEmbedderData)(V<Object> data) {
3176+
__ Store(
3177+
__ ExternalConstant(
3178+
ExternalReference::continuation_preserved_embedder_data(isolate_)),
3179+
data, StoreOp::Kind::RawAligned(),
3180+
MemoryRepresentation::TaggedPointer(),
3181+
WriteBarrierKind::kNoWriteBarrier);
3182+
return OpIndex::Invalid();
3183+
}
3184+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
3185+
31673186
private:
31683187
V<Word32> BuildUint32Mod(V<Word32> left, V<Word32> right) {
31693188
Label<Word32> done(this);

Diff for: deps/v8/src/compiler/turboshaft/maglev-graph-building-phase.cc

+18
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,24 @@ class GraphBuilder {
994994
return maglev::ProcessResult::kContinue;
995995
}
996996

997+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
998+
maglev::ProcessResult Process(
999+
maglev::GetContinuationPreservedEmbedderData* node,
1000+
const maglev::ProcessingState&) {
1001+
V<Object> data = __ GetContinuationPreservedEmbedderData();
1002+
SetMap(node, data);
1003+
return maglev::ProcessResult::kContinue;
1004+
}
1005+
1006+
maglev::ProcessResult Process(
1007+
maglev::SetContinuationPreservedEmbedderData* node,
1008+
const maglev::ProcessingState&) {
1009+
V<Object> data = Map(node->input(0));
1010+
__ SetContinuationPreservedEmbedderData(data);
1011+
return maglev::ProcessResult::kContinue;
1012+
}
1013+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
1014+
9971015
template <typename NodeT>
9981016
maglev::ProcessResult Process(NodeT* node,
9991017
const maglev::ProcessingState& state) {

Diff for: deps/v8/src/compiler/turboshaft/operations.h

+50
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,19 @@ using Variable = SnapshotTable<OpIndex, VariableData>::Key;
175175
V(Switch) \
176176
V(Deoptimize)
177177

178+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
179+
#define TURBOSHAFT_CPED_OPERATION_LIST(V) \
180+
V(GetContinuationPreservedEmbedderData) \
181+
V(SetContinuationPreservedEmbedderData)
182+
#else
183+
#define TURBOSHAFT_CPED_OPERATION_LIST(V)
184+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
185+
178186
// These operations should be lowered to Machine operations during
179187
// MachineLoweringPhase.
180188
#define TURBOSHAFT_SIMPLIFIED_OPERATION_LIST(V) \
181189
TURBOSHAFT_INTL_OPERATION_LIST(V) \
190+
TURBOSHAFT_CPED_OPERATION_LIST(V) \
182191
V(ArgumentsLength) \
183192
V(BigIntBinop) \
184193
V(BigIntComparison) \
@@ -8115,6 +8124,47 @@ struct SetStackPointerOp : FixedArityOperationT<1, SetStackPointerOp> {
81158124

81168125
#endif // V8_ENABLE_WEBASSEMBLY
81178126

8127+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
8128+
struct GetContinuationPreservedEmbedderDataOp
8129+
: FixedArityOperationT<0, GetContinuationPreservedEmbedderDataOp> {
8130+
static constexpr OpEffects effects = OpEffects().CanReadOffHeapMemory();
8131+
8132+
base::Vector<const RegisterRepresentation> outputs_rep() const {
8133+
return RepVector<RegisterRepresentation::Tagged()>();
8134+
}
8135+
8136+
base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8137+
ZoneVector<MaybeRegisterRepresentation>& storage) const {
8138+
return {};
8139+
}
8140+
8141+
GetContinuationPreservedEmbedderDataOp() : Base() {}
8142+
8143+
void Validate(const Graph& graph) const {}
8144+
8145+
auto options() const { return std::tuple{}; }
8146+
};
8147+
8148+
struct SetContinuationPreservedEmbedderDataOp
8149+
: FixedArityOperationT<1, SetContinuationPreservedEmbedderDataOp> {
8150+
static constexpr OpEffects effects = OpEffects().CanWriteOffHeapMemory();
8151+
8152+
base::Vector<const RegisterRepresentation> outputs_rep() const { return {}; }
8153+
8154+
base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8155+
ZoneVector<MaybeRegisterRepresentation>& storage) const {
8156+
return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
8157+
}
8158+
8159+
explicit SetContinuationPreservedEmbedderDataOp(V<Object> value)
8160+
: Base(value) {}
8161+
8162+
void Validate(const Graph& graph) const {}
8163+
8164+
auto options() const { return std::tuple{}; }
8165+
};
8166+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
8167+
81188168
#define OPERATION_EFFECTS_CASE(Name) Name##Op::EffectsIfStatic(),
81198169
static constexpr base::Optional<OpEffects>
81208170
kOperationEffectsTable[kNumberOfOpcodes] = {

0 commit comments

Comments
 (0)