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)
该函数将提交所有要进行的边插入操作,并在需要的时候创建新的基本块。