Previous: Adding a new GIMPLE statement code, Up: GIMPLE


12.11 语句和操作数遍历

有两个函数可以用于遍历语句和序列:分别为walk_gimple_stmtwalk_gimple_seq。还有第三个函数用于遍历语句中的操作数:walk_gimple_op

— GIMPLE function: tree walk_gimple_stmt (gimple_stmt_iterator *gsi, walk_stmt_fn callback_stmt, walk_tree_fn callback_op, struct walk_stmt_info *wi)

该函数用于在GSI中遍历当前语句,并可选的使用WI中存放的遍历状态。如果WINULL,则在遍历中不保存状态。

回调函数CALLBACK_STMT被调用。如果CALLBACK_STMT返回真,则意味着回调函数已经处理了语句的所有操作数,并且无需遍历它的操作数。

如果CALLBACK_STMTNULL或者返回假,则CALLBACK_OP会在语句的每个操作数上被调用,通过walk_gimple_op。如果walk_gimple_op对任意操作数返回了非NULL,则剩下的操作数将不被扫描。

返回值为对walk_gimple_op最后调用所返回的值,或者如果没有指定CALLBACK_OP则返回NULL_TREE

— GIMPLE function: tree walk_gimple_op (gimple stmt, walk_tree_fn callback_op, struct walk_stmt_info *wi)

使用该函数来遍历语句STMT的操作数。每个操作数通过walk_tree来遍历,并使用WI中可选的状态信息。

CALLBACK_OPSTMT的每个操作数上被调用,通过walk_treewalk_tree的其它参数必须存放在WI中。对于每个操作数OPwalk_tree被调用为:

              walk_tree (&OP, CALLBACK_OP, WI, WI- PSET)

如果CALLBACK_OP对于一个操作数返回非NULL,则剩下的操作数不再被扫描。返回值为对walk_tree最后调用所返回的值,或者如果没有指定CALLBACK_OP则返回NULL_TREE

— GIMPLE function: tree walk_gimple_seq (gimple_seq seq, walk_stmt_fn callback_stmt, walk_tree_fn callback_op, struct walk_stmt_info *wi)

该函数遍历序列SEQ中的所有语句,在每个语句上调用walk_gimple_stmtWIwalk_gimple_stmt中的一样。如果walk_gimple_stmt返回非NULL,则停止遍历,并返回值。否则,所有语句都被遍历并返回NULL_TREE