Next: , Previous: GIMPLE sequences, Up: GIMPLE


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_bbgsi_last_bb

在下面的介绍中,我们有时会用到enum gsi_iterator_update。对于该枚举的有效操作有:

下面为一个函数列表,用于操作和使用语句迭代器。

— 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)

该函数将提交所有要进行的边插入操作,并在需要的时候创建新的基本块。