|
|
|
/* @generated */
|
|
|
|
digraph cfg {
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_1" [label="1: Start class_method_in_conditional\nFormals: \nLocals: c:objc_class* \n DECLARE_LOCALS(&return,&c); [line 103, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_1" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" ;
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_2" [label="2: Exit class_method_in_conditional \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_3" [label="3: Return Stmt \n *&return:_Bool=0 [line 108, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_3" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_2" ;
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_4" [label="4: + \n " ]
|
|
|
|
|
|
|
|
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_4" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_3" ;
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_5" [label="5: Prune (true branch, if) \n PRUNE(sizeof(t=objc_class), true); [line 105, column 7]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_5" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_7" ;
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_6" [label="6: Prune (false branch, if) \n PRUNE(!sizeof(t=objc_class), false); [line 105, column 7]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_6" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_4" ;
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_7" [label="7: Return Stmt \n *&return:_Bool=1 [line 106, column 5]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_7" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_2" ;
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" [label="8: DeclStmt \n n$3=_fun_foo() [line 104, column 13]\n *&c:objc_class*=n$3 [line 104, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_5" ;
|
|
|
|
"class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_8" -> "class_method_in_conditional.2a19b0bd8eafdb3235f52585a49ef84a_6" ;
|
|
|
|
"b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_1" [label="1: Start B_b_m\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 20, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_1" -> "b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_2" ;
|
|
|
|
"b_m#B#class.82af96ad418803b2f96fc1bfa1572c10_2" [label="2: Exit B_b_m \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_1" [label="1: Start A_call_alloc_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 57, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_1" -> "call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_3" ;
|
|
|
|
"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_2" [label="2: Exit A_call_alloc_class \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_3" [label="3: Call alloc \n n$5=_fun___objc_alloc_no_fail(sizeof(t=A):unsigned long) [line 58, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_3" -> "call_alloc_class#A#class.0cef99601cab56333305f5f96f227079_2" ;
|
|
|
|
"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_1" [label="1: Start A_call_alloc_instance\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 61, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_1" -> "call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_3" ;
|
|
|
|
"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_2" [label="2: Exit A_call_alloc_instance \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_3" [label="3: Call alloc \n n$7=_fun___objc_alloc_no_fail(sizeof(t=A):unsigned long) [line 62, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_3" -> "call_alloc_instance#A#instance.70a20314d55f22fb46408deb70d9aabb_2" ;
|
|
|
|
"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_1" [label="1: Start A_call_class_instance\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 65, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_1" -> "call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_3" ;
|
|
|
|
"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_2" [label="2: Exit A_call_class_instance \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_3" [label="3: Message Call: test_class \n n$9=_fun_C_test_class() [line 66, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_3" -> "call_class_instance#A#instance.eb1ae02cd94582eb1fc7cb426794f9f0_2" ;
|
|
|
|
"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_1" [label="1: Start A_call_class_instance_with_class_name\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 69, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_1" -> "call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_3" ;
|
|
|
|
"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_2" [label="2: Exit A_call_class_instance_with_class_name \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_3" [label="3: Message Call: test_class \n n$10=_fun_A_test_class() [line 70, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_3" -> "call_class_instance_with_class_name#A#instance.1baf88c0fb5549c04909fab0bed63c39_2" ;
|
|
|
|
"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_1" [label="1: Start A_call_test\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 46, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_1" -> "call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_3" ;
|
|
|
|
"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_2" [label="2: Exit A_call_test \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_3" [label="3: Message Call: test \n n$1=*&self:A* [line 47, column 4]\n n$2=_fun_A_test(n$1:A*) virtual [line 47, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_3" -> "call_test#A#instance.41031d78ab8c6914ebc9851c442cbd4e_2" ;
|
|
|
|
"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_1" [label="1: Start A_call_test_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 53, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_1" -> "call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_3" ;
|
|
|
|
"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_2" [label="2: Exit A_call_test_class \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_3" [label="3: Message Call: test_class \n n$4=_fun_C_test_class() [line 54, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_3" -> "call_test_class#A#class.cc4e8c6ada1c4f85dad976d179e36c9a_2" ;
|
|
|
|
"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_1" [label="1: Start A_calling_super\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 82, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_1" -> "calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_3" ;
|
|
|
|
"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_2" [label="2: Exit A_calling_super \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_3" [label="3: Message Call: test_class \n n$18=_fun_C_test_class() [line 83, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_3" -> "calling_super#A#class.0edc1d1d1c4ade7cd9adaa77e7322ad1_2" ;
|
|
|
|
"init#A#instance.eee79aaaddd644404e17691a7e7d809a_1" [label="1: Start A_init\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 86, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"init#A#instance.eee79aaaddd644404e17691a7e7d809a_1" -> "init#A#instance.eee79aaaddd644404e17691a7e7d809a_3" ;
|
|
|
|
"init#A#instance.eee79aaaddd644404e17691a7e7d809a_2" [label="2: Exit A_init \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"init#A#instance.eee79aaaddd644404e17691a7e7d809a_3" [label="3: Message Call: init \n n$19=*&self:A* [line 87, column 3]\n n$20=_fun_NSObject_init(n$19:A*) [line 87, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"init#A#instance.eee79aaaddd644404e17691a7e7d809a_3" -> "init#A#instance.eee79aaaddd644404e17691a7e7d809a_2" ;
|
|
|
|
"isC:#B#instance.d3c47b42de9626ee49d20d57a1f26839_1" [label="1: Start B_isC:\nFormals: self:B* aClass:objc_class*\nLocals: \n DECLARE_LOCALS(&return); [line 23, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"isC:#B#instance.d3c47b42de9626ee49d20d57a1f26839_1" -> "isC:#B#instance.d3c47b42de9626ee49d20d57a1f26839_3" ;
|
|
|
|
"isC:#B#instance.d3c47b42de9626ee49d20d57a1f26839_2" [label="2: Exit B_isC: \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"isC:#B#instance.d3c47b42de9626ee49d20d57a1f26839_3" [label="3: Return Stmt \n *&return:_Bool=1 [line 24, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"isC:#B#instance.d3c47b42de9626ee49d20d57a1f26839_3" -> "isC:#B#instance.d3c47b42de9626ee49d20d57a1f26839_2" ;
|
|
|
|
"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_1" [label="1: Start A_loggerName\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 90, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_1" -> "loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_3" ;
|
|
|
|
"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_2" [label="2: Exit A_loggerName \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_3" [label="3: Return Stmt \n n$22=_fun_NSStringFromClass(sizeof(t=A):unsigned long) [line 91, column 10]\n *&return:NSString*=n$22 [line 91, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_3" -> "loggerName#A#instance.36b9a42412bcf7d8d3f8397eb2bcb555_2" ;
|
|
|
|
"t#A#instance.e31b9a7bced712626784e2860af1a31b_1" [label="1: Start A_t\nFormals: self:A*\nLocals: b:B* \n DECLARE_LOCALS(&return,&b); [line 73, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"t#A#instance.e31b9a7bced712626784e2860af1a31b_1" -> "t#A#instance.e31b9a7bced712626784e2860af1a31b_4" ;
|
|
|
|
"t#A#instance.e31b9a7bced712626784e2860af1a31b_2" [label="2: Exit A_t \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"t#A#instance.e31b9a7bced712626784e2860af1a31b_3" [label="3: Message Call: b_m \n n$12=_fun_B_b_m() [line 75, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"t#A#instance.e31b9a7bced712626784e2860af1a31b_3" -> "t#A#instance.e31b9a7bced712626784e2860af1a31b_2" ;
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"t#A#instance.e31b9a7bced712626784e2860af1a31b_4" [label="4: DeclStmt \n n$13=_fun___objc_alloc_no_fail(sizeof(t=B):unsigned long) [line 74, column 10]\n n$14=_fun_NSObject_init(n$13:B*) virtual [line 74, column 10]\n *&b:B*=n$14 [line 74, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"t#A#instance.e31b9a7bced712626784e2860af1a31b_4" -> "t#A#instance.e31b9a7bced712626784e2860af1a31b_3" ;
|
|
|
|
"test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_1" [label="1: Start A_test\nFormals: self:A*\nLocals: \n DECLARE_LOCALS(&return); [line 43, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_1" -> "test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_2" ;
|
|
|
|
"test#A#instance.561395dd5ffb844cbbb6c52cf21ce047_2" [label="2: Exit A_test \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"test_class#A#class.97324b18f626e66a3c32cec03286eb8d_1" [label="1: Start A_test_class\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 50, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"test_class#A#class.97324b18f626e66a3c32cec03286eb8d_1" -> "test_class#A#class.97324b18f626e66a3c32cec03286eb8d_2" ;
|
|
|
|
"test_class#A#class.97324b18f626e66a3c32cec03286eb8d_2" [label="2: Exit A_test_class \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"use_class_in_other_ways:#A#instance.cbf4e00d3f8c81248ee881a47ed7e84f_1" [label="1: Start A_use_class_in_other_ways:\nFormals: self:A* object:B*\nLocals: \n DECLARE_LOCALS(&return); [line 78, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"use_class_in_other_ways:#A#instance.cbf4e00d3f8c81248ee881a47ed7e84f_1" -> "use_class_in_other_ways:#A#instance.cbf4e00d3f8c81248ee881a47ed7e84f_3" ;
|
|
|
|
"use_class_in_other_ways:#A#instance.cbf4e00d3f8c81248ee881a47ed7e84f_2" [label="2: Exit A_use_class_in_other_ways: \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"use_class_in_other_ways:#A#instance.cbf4e00d3f8c81248ee881a47ed7e84f_3" [label="3: Return Stmt \n n$16=*&object:B* [line 79, column 11]\n n$17=_fun_B_isC:(n$16:B*,sizeof(t=A):unsigned long) virtual [line 79, column 10]\n *&return:_Bool=n$17 [line 79, column 3]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"use_class_in_other_ways:#A#instance.cbf4e00d3f8c81248ee881a47ed7e84f_3" -> "use_class_in_other_ways:#A#instance.cbf4e00d3f8c81248ee881a47ed7e84f_2" ;
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_1" [label="1: Start A_used_in_binary_op:\nFormals: c:objc_class*\nLocals: \n DECLARE_LOCALS(&return); [line 94, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_1" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_5" ;
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_2" [label="2: Exit A_used_in_binary_op: \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_3" [label="3: + \n " ]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_3" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_4" ;
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_4" [label="4: between_join_and_exit \n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_4" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_2" ;
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_5" [label="5: BinaryOperatorStmt: NE \n n$23=*sizeof(t=A):objc_class* [line 95, column 7]\n n$24=*&c:objc_class* [line 95, column 15]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_5" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_6" ;
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_5" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_7" ;
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_6" [label="6: Prune (true branch, if) \n PRUNE((n$23 != n$24), true); [line 95, column 7]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_6" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_8" ;
|
[clang] enforce that `instruction` always returns one SIL expression
Summary:
Previously, the type of `trans_result` contained a list of SIL expressions.
However, most of the time we expect to get exactly one, and getting a different
number is a soft(!) error, usually returning `-1`.
This splits `trans_result` into `control`, which contains the information
needed for temporary computation (hence when we don't necessarily know the
return value yet), and a new version of `trans_result` that includes `control`,
the previous `exps` list but replaced by a single `return` expression instead,
and a couple other values that made sense to move out of `control`. This allows
some flexibility in the frontend compared to enforcing exactly one return
expression always: if they are not known yet we stick to `control` instead (see
eg `compute_controls_to_parent`).
This creates more garbage temporary identifiers, however they do not show up in
the final cfg. Instead, we see that temporary IDs are now often not
consecutive...
The most painful complication is in the treatment of `DeclRefExpr`, which was
actually returning *two* expressions: the method name and the `this` object.
Now the method name is a separate (optional) field in `trans_result`.
Reviewed By: mbouaziz
Differential Revision: D7881088
fbshipit-source-id: 41ad3b5
7 years ago
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_7" [label="7: Prune (false branch, if) \n PRUNE(!(n$23 != n$24), false); [line 95, column 7]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_7" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_9" ;
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_8" [label="8: Return Stmt \n *&return:int=1 [line 96, column 5]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_8" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_2" ;
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_9" [label="9: Return Stmt \n *&return:int=0 [line 98, column 5]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_9" -> "used_in_binary_op:#A#class.9f855a338b344f4b5060d2d4a2a955ed_2" ;
|
|
|
|
}
|