12.9 序列迭代器
序列迭代器为一些便利的结构,用于在序列中迭代语句。给定序列SEQ,典型的对gimple序列迭代器的使用为:
gimple_stmt_iterator gsi;
for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple g = gsi_stmt (gsi);
/* Do something with gimple statement G. */
}
也可以向后迭代:
for (gsi = gsi_last (seq); !gsi_end_p (gsi); gsi_prev (&gsi))
在基本块上进行前向和后向迭代可以通过配合使用gsi_start_bb和gsi_last_bb。
在下面的介绍中,我们有时会用到enum gsi_iterator_update。对于该枚举的有效操作有:
GSI_NEW_STMT
只有当增加单个语句被时才有效。将迭代器移动到该处。
GSI_SAME_STMT
将迭代器放在相同的语句处。
GSI_CONTINUE_LINKING
将迭代器移动到在相同方向上,适合链接其它语句的位置。
下面为一个函数列表,用于操作和使用语句迭代器。
— GIMPLE function: gimple_stmt_iterator
gsi_start (
gimple_seq seq)
返回一个新的迭代器,指向序列SEQ的第一个语句。如果SEQ为空,则迭代器的基本块为NULL。当迭代器总是需要正确设置基本块的时候,使用gsi_start_bb。
— GIMPLE function: gimple_stmt_iterator
gsi_start_bb (
basic_block bb)
返回一个新的迭代器,指向基本块BB中的第一条语句。
— GIMPLE function: gimple_stmt_iterator
gsi_last (
gimple_seq seq)
返回一个新的迭代器,初始化为指向序列SEQ中的最后一条语句。如果SEQ为空,则迭代器的基本块为NULL。当迭代器总是需要正确设置基本块的时候,使用gsi_last_bb。
— GIMPLE function: gimple_stmt_iterator
gsi_last_bb (
basic_block bb)
返回一个新的迭代器,指向基本块BB中的最后一条语句。
— GIMPLE function: bool
gsi_end_p (
gimple_stmt_iterator i)
如果位于I的结尾,则返回TRUE。
— GIMPLE function: bool
gsi_one_before_end_p (
gimple_stmt_iterator i)
如果是I的结尾之前的一个语句,则返回TRUE。
— GIMPLE function: void
gsi_next (
gimple_stmt_iterator *i)
将迭代器前进到下一个gimple语句。
— GIMPLE function: void
gsi_prev (
gimple_stmt_iterator *i)
将迭代器前进到前一个gimple语句。
— GIMPLE function: gimple
gsi_stmt (
gimple_stmt_iterator i)
返回当前的stmt。
— GIMPLE function: gimple_stmt_iterator
gsi_after_labels (
basic_block bb)
返回一个块语句迭代器,指向块BB中的第一个非标号的语句。
— GIMPLE function: gimple
*gsi_stmt_ptr (
gimple_stmt_iterator *i)
返回指向当前stmt的指针。
— GIMPLE function: basic_block
gsi_bb (
gimple_stmt_iterator i)
返回与该迭代器关联的基本块。
— GIMPLE function: gimple_seq
gsi_seq (
gimple_stmt_iterator i)
返回与该迭代器关联的序列。
— GIMPLE function: void
gsi_remove (
gimple_stmt_iterator *i, bool remove_eh_info)
从序列中移除当前stmt。迭代器被更新为指向下一条语句。当REMOVE_EH_INFO为真,则我们将迭代器I指向的语句从EH表中移除。否则我们不修改EH表。通常当语句将从IL中被移除,并不被插入到其它地方的时候,REMOVE_EH_INFO应该为真。
— GIMPLE function: void
gsi_link_seq_before (
gimple_stmt_iterator *i, gimple_seq seq, enum gsi_iterator_update mode)
将语句序列SEQ链接在由迭代器I指向的语句之前。MODE指出了插入操作之后,迭代器要做什么(参见上面的enum gsi_iterator_update)。
— GIMPLE function: void
gsi_link_before (
gimple_stmt_iterator *i, gimple g, enum gsi_iterator_update mode)
将语句G链接在由迭代器I指向的语句之前。根据MODE来更新迭代器I。
— GIMPLE function: void
gsi_link_seq_after (
gimple_stmt_iterator *i, gimple_seq seq, enum gsi_iterator_update mode)
将序列SEQ链接在由迭代器I指向的语句之后。MODE与在gsi_insert_after中的相同。
— GIMPLE function: void
gsi_link_after (
gimple_stmt_iterator *i, gimple g, enum gsi_iterator_update mode)
将语句G链接在由迭代器I指向的语句之后。MODE与在gsi_insert_after中的相同。
— GIMPLE function: gimple_seq
gsi_split_seq_after (
gimple_stmt_iterator i)
将I之后的所有语句移送到新的序列中。返回该新的序列。
— GIMPLE function: gimple_seq
gsi_split_seq_before (
gimple_stmt_iterator *i)
将I之前的所有语句移送到新的序列中。返回该新的序列。
— GIMPLE function: void
gsi_replace (
gimple_stmt_iterator *i, gimple stmt, bool update_eh_info)
将由I指向的语句替换为STMT。如果UPDATE_EH_INFO为真,则原来语句的异常处理信息被移送到新的语句中。
— GIMPLE function: void
gsi_insert_before (
gimple_stmt_iterator *i, gimple stmt, enum gsi_iterator_update mode)
在由迭代器I指向的语句之前插入语句STMT,更新STMT的基本块并扫描新的操作数。MODE描述了插入操作之后,如何更新迭代器I(参见enum gsi_iterator_update)。
— GIMPLE function: void
gsi_insert_seq_before (
gimple_stmt_iterator *i, gimple_seq seq, enum gsi_iterator_update mode)
类似于gsi_insert_before,不过是对于SEQ中的所有语句。
— GIMPLE function: void
gsi_insert_after (
gimple_stmt_iterator *i, gimple stmt, enum gsi_iterator_update mode)
在由迭代器I指向的语句之后插入语句STMT,更新STMT的基本块并扫描新的操作数。MODE描述了插入操作之后,如何更新迭代器I(参见enum gsi_iterator_update)。
— GIMPLE function: void
gsi_insert_seq_after (
gimple_stmt_iterator *i, gimple_seq seq, enum gsi_iterator_update mode)
类似于gsi_insert_after,不过是对于SEQ中的所有语句。
— GIMPLE function: gimple_stmt_iterator
gsi_for_stmt (
gimple stmt)
查找STMT的迭代器。
— GIMPLE function: void
gsi_move_after (
gimple_stmt_iterator *from, gimple_stmt_iterator *to)
将语句移送到FROM处,使得其正好位于TO处的语句之后。
— GIMPLE function: void
gsi_move_before (
gimple_stmt_iterator *from, gimple_stmt_iterator *to)
将语句移送到FROM处,使得其正好位于TO处的语句之前。
— GIMPLE function: void
gsi_move_to_bb_end (
gimple_stmt_iterator *from, basic_block bb)
将FROM处的语句移送到基本块BB的结尾。
— GIMPLE function: void
gsi_insert_on_edge (
edge e, gimple stmt)
将STMT增加到边E的待定列表中。直到调用gsi_commit_edge_inserts()之前,不会进行实际的插入操作。
— GIMPLE function: void
gsi_insert_seq_on_edge (
edge e, gimple_seq seq)
将SEQ中语句序列增加到边E的待定列表中。直到调用gsi_commit_edge_inserts()之前,不会进行实际的插入操作。
— GIMPLE function: basic_block
gsi_insert_on_edge_immediate (
edge e, gimple stmt)
类似于gsi_insert_on_edge+gsi_commit_edge_inserts。如果需要创建一个新的块,则将其返回。
— GIMPLE function: void
gsi_commit_one_edge_insert (
edge e, basic_block *new_bb)
提交在边E上进行的插入操作。如果创建了新的基本块,则将NEW_BB设置为该块,否则将其设置为NULL。
— GIMPLE function: void
gsi_commit_edge_inserts (
void)
该函数将提交所有要进行的边插入操作,并在需要的时候创建新的基本块。