|
|
|
/* @generated */
|
|
|
|
digraph cfg {
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_1" [label="1: Start neg_bool\nFormals: a:_Bool\nLocals: 0$?%__sil_tmpSIL_temp_conditional___n$0:int \n DECLARE_LOCALS(&return,&0$?%__sil_tmpSIL_temp_conditional___n$0); [line 14, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_1" -> "neg_bool.e953d6477eaaeafaa430423a26fbaac9_4" ;
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_1" -> "neg_bool.e953d6477eaaeafaa430423a26fbaac9_5" ;
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_2" [label="2: Exit neg_bool \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_3" [label="3: + \n " ]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_3" -> "neg_bool.e953d6477eaaeafaa430423a26fbaac9_8" ;
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_4" [label="4: Prune (true branch, boolean exp) \n n$1=*&a:_Bool [line 14, column 33]\n PRUNE(n$1, true); [line 14, column 33]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_4" -> "neg_bool.e953d6477eaaeafaa430423a26fbaac9_6" ;
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_5" [label="5: Prune (false branch, boolean exp) \n n$1=*&a:_Bool [line 14, column 33]\n PRUNE(!n$1, false); [line 14, column 33]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_5" -> "neg_bool.e953d6477eaaeafaa430423a26fbaac9_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
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_6" [label="6: ConditionalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:int=0 [line 14, column 32]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_6" -> "neg_bool.e953d6477eaaeafaa430423a26fbaac9_3" ;
|
[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
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_7" [label="7: ConditionalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:int=1 [line 14, column 32]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_7" -> "neg_bool.e953d6477eaaeafaa430423a26fbaac9_3" ;
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_8" [label="8: Return Stmt \n n$2=*&0$?%__sil_tmpSIL_temp_conditional___n$0:int [line 14, column 32]\n *&return:int=n$2 [line 14, column 25]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_bool.e953d6477eaaeafaa430423a26fbaac9_8" -> "neg_bool.e953d6477eaaeafaa430423a26fbaac9_2" ;
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_1" [label="1: Start neg_char\nFormals: a:char\nLocals: 0$?%__sil_tmpSIL_temp_conditional___n$0:int \n DECLARE_LOCALS(&return,&0$?%__sil_tmpSIL_temp_conditional___n$0); [line 12, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_1" -> "neg_char.53ef6b31d84386046a4728d1c45b5f7a_4" ;
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_1" -> "neg_char.53ef6b31d84386046a4728d1c45b5f7a_5" ;
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_2" [label="2: Exit neg_char \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_3" [label="3: + \n " ]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_3" -> "neg_char.53ef6b31d84386046a4728d1c45b5f7a_8" ;
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_4" [label="4: Prune (true branch, boolean exp) \n n$1=*&a:char [line 12, column 32]\n PRUNE(n$1, true); [line 12, column 32]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_4" -> "neg_char.53ef6b31d84386046a4728d1c45b5f7a_6" ;
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_5" [label="5: Prune (false branch, boolean exp) \n n$1=*&a:char [line 12, column 32]\n PRUNE(!n$1, false); [line 12, column 32]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_5" -> "neg_char.53ef6b31d84386046a4728d1c45b5f7a_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
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_6" [label="6: ConditionalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:int=0 [line 12, column 31]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_6" -> "neg_char.53ef6b31d84386046a4728d1c45b5f7a_3" ;
|
[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
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_7" [label="7: ConditionalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:int=1 [line 12, column 31]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_7" -> "neg_char.53ef6b31d84386046a4728d1c45b5f7a_3" ;
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_8" [label="8: Return Stmt \n n$2=*&0$?%__sil_tmpSIL_temp_conditional___n$0:int [line 12, column 31]\n *&return:int=n$2 [line 12, column 24]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_char.53ef6b31d84386046a4728d1c45b5f7a_8" -> "neg_char.53ef6b31d84386046a4728d1c45b5f7a_2" ;
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_1" [label="1: Start neg_int\nFormals: a:int\nLocals: 0$?%__sil_tmpSIL_temp_conditional___n$0:int \n DECLARE_LOCALS(&return,&0$?%__sil_tmpSIL_temp_conditional___n$0); [line 10, column 1]\n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_1" -> "neg_int.2aa25aca565c41dd997912d11504462c_4" ;
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_1" -> "neg_int.2aa25aca565c41dd997912d11504462c_5" ;
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_2" [label="2: Exit neg_int \n " color=yellow style=filled]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_3" [label="3: + \n " ]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_3" -> "neg_int.2aa25aca565c41dd997912d11504462c_8" ;
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_4" [label="4: Prune (true branch, boolean exp) \n n$1=*&a:int [line 10, column 30]\n PRUNE(n$1, true); [line 10, column 30]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_4" -> "neg_int.2aa25aca565c41dd997912d11504462c_6" ;
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_5" [label="5: Prune (false branch, boolean exp) \n n$1=*&a:int [line 10, column 30]\n PRUNE(!n$1, false); [line 10, column 30]\n " shape="invhouse"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_5" -> "neg_int.2aa25aca565c41dd997912d11504462c_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
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_6" [label="6: ConditionalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:int=0 [line 10, column 29]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_6" -> "neg_int.2aa25aca565c41dd997912d11504462c_3" ;
|
[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
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_7" [label="7: ConditionalStmt Branch \n *&0$?%__sil_tmpSIL_temp_conditional___n$0:int=1 [line 10, column 29]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_7" -> "neg_int.2aa25aca565c41dd997912d11504462c_3" ;
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_8" [label="8: Return Stmt \n n$2=*&0$?%__sil_tmpSIL_temp_conditional___n$0:int [line 10, column 29]\n *&return:int=n$2 [line 10, column 22]\n " shape="box"]
|
|
|
|
|
|
|
|
|
|
|
|
"neg_int.2aa25aca565c41dd997912d11504462c_8" -> "neg_int.2aa25aca565c41dd997912d11504462c_2" ;
|
|
|
|
}
|