|
|
Chromium Code Reviews|
Created:
3 years, 6 months ago by jensj Modified:
3 years, 6 months ago CC:
reviews_dartlang.org, vm-dev_dartlang.org Target Ref:
refs/heads/master Visibility:
Public. |
DescriptionFix to 32-bit kernel.
BUG=
R=paulberry@google.com, vegorov@google.com
Committed: https://github.com/dart-lang/sdk/commit/840b3700b735ff23664721f18f229b6e82a8bdc7
Patch Set 1 #
Messages
Total messages: 7 (2 generated)
jensj@google.com changed reviewers: + kmillikin@google.com, paulberry@google.com, vegorov@google.com
LGTM we might want to search through the whole flow graph builder looking for the same problem.
lgtm This fixes the crashes I was experiencing, thanks
Description was changed from ========== Fix to 32-bit kernel. BUG= ========== to ========== Fix to 32-bit kernel. BUG= R=paulberry@google.com, vegorov@google.com Committed: https://github.com/dart-lang/sdk/commit/840b3700b735ff23664721f18f229b6e82a8bdc7 ==========
Message was sent while issue was closed.
Committed patchset #1 (id:1) manually as 840b3700b735ff23664721f18f229b6e82a8bdc7 (presubmit successful).
Message was sent while issue was closed.
I went through the remaining cases of "fragment + fragment" (see diff below,
though I don't suggest we do that) --- and the rest seems fine to me...
```
diff --git a/runtime/vm/kernel_binary_flowgraph.cc
b/runtime/vm/kernel_binary_flowgraph.cc
index 33c85883c0..e64daa3cdb 100644
--- a/runtime/vm/kernel_binary_flowgraph.cc
+++ b/runtime/vm/kernel_binary_flowgraph.cc
@@ -3430,3 +3430,3 @@ FlowGraph*
StreamingFlowGraphBuilder::BuildGraphOfFunction(
// TODO(29737): This sequence should be generated in order.
- body = instructions + body;
+ body = instructions ^ body;
flow_graph_builder_->context_depth_ = current_context_depth;
@@ -3459,3 +3459,3 @@ FlowGraph*
StreamingFlowGraphBuilder::BuildGraphOfFunction(
// TODO(29737): This sequence should be generated in order.
- body = DebugStepCheck(check_pos) + body;
+ body = DebugStepCheck(check_pos) ^ body;
flow_graph_builder_->context_depth_ = current_context_depth;
@@ -4851,3 +4851,3 @@ Fragment
StreamingFlowGraphBuilder::BuildVariableSet(TokenPosition* p) {
if (NeedsDebugStepCheck(stack(), position)) {
- instructions = DebugStepCheck(position) + instructions;
+ instructions = DebugStepCheck(position) ^ instructions;
}
@@ -4868,3 +4868,3 @@ Fragment
StreamingFlowGraphBuilder::BuildVariableSet(uint8_t payload,
if (NeedsDebugStepCheck(stack(), position)) {
- instructions = DebugStepCheck(position) + instructions;
+ instructions = DebugStepCheck(position) ^ instructions;
}
@@ -4887,3 +4887,3 @@ Fragment
StreamingFlowGraphBuilder::BuildPropertyGet(TokenPosition* p) {
- return instructions + InstanceCall(position, getter_name, Token::kGET, 1);
+ return instructions ^ InstanceCall(position, getter_name, Token::kGET, 1);
}
@@ -4909,3 +4909,3 @@ Fragment
StreamingFlowGraphBuilder::BuildPropertySet(TokenPosition* p) {
instructions += InstanceCall(position, setter_name, Token::kSET, 2);
- return instructions + Drop();
+ return instructions ^ Drop();
}
@@ -4941,3 +4941,3 @@ Fragment
StreamingFlowGraphBuilder::BuildDirectPropertyGet(TokenPosition* p) {
instructions += PushArgument();
- return instructions + StaticCall(position, target, 1);
+ return instructions ^ StaticCall(position, target, 1);
}
@@ -4967,3 +4967,3 @@ Fragment
StreamingFlowGraphBuilder::BuildDirectPropertySet(TokenPosition* p) {
- return instructions + Drop();
+ return instructions ^ Drop();
}
@@ -4990,3 +4990,3 @@ Fragment
StreamingFlowGraphBuilder::BuildStaticGet(TokenPosition* p) {
Fragment instructions = Constant(field);
- return instructions + LoadStaticField();
+ return instructions ^ LoadStaticField();
} else {
@@ -5023,3 +5023,3 @@ Fragment
StreamingFlowGraphBuilder::BuildStaticSet(TokenPosition* p) {
if (NeedsDebugStepCheck(stack(), position)) {
- instructions = DebugStepCheck(position) + instructions;
+ instructions = DebugStepCheck(position) ^ instructions;
}
@@ -5029,3 +5029,3 @@ Fragment
StreamingFlowGraphBuilder::BuildStaticSet(TokenPosition* p) {
instructions += LoadLocal(variable);
- return instructions + StoreStaticField(position, field);
+ return instructions ^ StoreStaticField(position, field);
} else {
@@ -5047,3 +5047,3 @@ Fragment
StreamingFlowGraphBuilder::BuildStaticSet(TokenPosition* p) {
// Drop the unused result & leave the stored value on the stack.
- return instructions + Drop();
+ return instructions ^ Drop();
}
@@ -5109,3 +5109,3 @@ Fragment
StreamingFlowGraphBuilder::BuildMethodInvocation(TokenPosition* p) {
token_kind == Token::kEQ ? Token::kEQ_STRICT : Token::kNE_STRICT;
- return instructions +
+ return instructions ^
StrictCompare(strict_cmp_kind, /*number_check = */ true);
@@ -5168,3 +5168,3 @@ Fragment
StreamingFlowGraphBuilder::BuildDirectMethodInvocation(
token_kind == Token::kEQ ? Token::kEQ_STRICT : Token::kNE_STRICT;
- return instructions +
+ return instructions ^
StrictCompare(strict_cmp_kind, /*number_check = */ true);
@@ -5182,3 +5182,3 @@ Fragment
StreamingFlowGraphBuilder::BuildDirectMethodInvocation(
++argument_count;
- return instructions + StaticCall(TokenPosition::kNoSource, target,
+ return instructions ^ StaticCall(TokenPosition::kNoSource, target,
argument_count, argument_names);
@@ -5359,3 +5359,3 @@ Fragment
StreamingFlowGraphBuilder::BuildConstructorInvocation(
instructions += StaticCall(position, target, argument_count, argument_names);
- return instructions + Drop();
+ return instructions ^ Drop();
}
@@ -5411,3 +5411,4 @@ Fragment
StreamingFlowGraphBuilder::BuildLogicalExpression(
- return Fragment(instructions.entry, join) +
+ // Safe because the first one is side-effect-free, right?
+ return Fragment(instructions.entry, join) ^
LoadLocal(parsed_function()->expression_temp_var());
@@ -5447,3 +5448,4 @@ Fragment
StreamingFlowGraphBuilder::BuildConditionalExpression(
- return Fragment(instructions.entry, join) +
+ // Safe because the first one is side-effect-free, right?
+ return Fragment(instructions.entry, join) ^
LoadLocal(parsed_function()->expression_temp_var());
@@ -5658,3 +5660,3 @@ Fragment
StreamingFlowGraphBuilder::BuildThrow(TokenPosition* p) {
if (NeedsDebugStepCheck(stack(), position)) {
- instructions = DebugStepCheck(position) + instructions;
+ instructions = DebugStepCheck(position) ^ instructions;
}
@@ -5713,3 +5715,3 @@ Fragment StreamingFlowGraphBuilder::BuildListLiteral(bool
is_const,
- return instructions + StaticCall(position, factory_method, 2);
+ return instructions ^ StaticCall(position, factory_method, 2);
}
@@ -5774,3 +5776,3 @@ Fragment StreamingFlowGraphBuilder::BuildMapLiteral(bool
is_const,
- return instructions + StaticCall(position, factory_method, 2);
+ return instructions ^ StaticCall(position, factory_method, 2);
}
@@ -6317,3 +6319,3 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement()
{
body_join = block.DestinationDirect(i);
- body_fragments[i] = Fragment(body_join) + body_fragments[i];
+ body_fragments[i] = Fragment(body_join) ^ body_fragments[i];
}
@@ -6559,3 +6561,3 @@ Fragment StreamingFlowGraphBuilder::BuildTryCatch() {
- Fragment(catch_entry) + catch_handler_body;
+ Fragment(catch_entry) ^ catch_handler_body;
catch_body = Fragment(next_catch_entry);
@@ -6782,3 +6784,3 @@ Fragment
StreamingFlowGraphBuilder::BuildVariableDeclaration() {
if (NeedsDebugStepCheck(stack(), debug_position)) {
- instructions = DebugStepCheck(debug_position) + instructions;
+ instructions = DebugStepCheck(debug_position) ^ instructions;
}
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index f9f4e35119..e5172d357c 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -61,3 +61,3 @@ Fragment Fragment::closed() {
-Fragment operator+(const Fragment& first, const Fragment& second) {
+Fragment operator^(const Fragment& first, const Fragment& second) {
Fragment result = first;
@@ -997,3 +997,3 @@ Fragment FlowGraphBuilder::BranchIfTrue(TargetEntryInstr**
then_entry,
Fragment instructions = Constant(Bool::True());
- return instructions + BranchIfEqual(then_entry, otherwise_entry, negate);
+ return instructions ^ BranchIfEqual(then_entry, otherwise_entry, negate);
}
@@ -1005,3 +1005,3 @@ Fragment FlowGraphBuilder::BranchIfNull(TargetEntryInstr**
then_entry,
Fragment instructions = NullConstant();
- return instructions + BranchIfEqual(then_entry, otherwise_entry, negate);
+ return instructions ^ BranchIfEqual(then_entry, otherwise_entry, negate);
}
@@ -1954,3 +1954,3 @@ Fragment FlowGraphBuilder::NativeFunctionBody(intptr_t
first_positional_offset,
}
- return body + Return(TokenPosition::kNoSource);
+ return body ^ Return(TokenPosition::kNoSource);
}
diff --git a/runtime/vm/kernel_to_il.h b/runtime/vm/kernel_to_il.h
index 959197744a..80afb369a2 100644
--- a/runtime/vm/kernel_to_il.h
+++ b/runtime/vm/kernel_to_il.h
@@ -188,3 +188,3 @@ class Fragment {
-Fragment operator+(const Fragment& first, const Fragment& second);
+Fragment operator^(const Fragment& first, const Fragment& second);
Fragment operator<<(const Fragment& fragment, Instruction* next);
```
|
||||||||||||||||||||||||||||||||||||||||||||||
