Next: , Up: GIMPLE


12.1 元组表示

GIMPLE指令为可变大小的元组,并由两部分组成:一个描述指令和位置的头,一个具有所有操作数的可变长度的身体。元组被组织成一个层次结构,并有3个主要类别。

12.1.1 gimple_statement_base (gsbase)

这是层次结构的根,其存放了大多GIMPLE语句所需要的基本信息。有一些域并不与所有的GIMPLE语句相关,但是被挪到基础结构中是为了利用其它域剩下的空位(从而使得结构体更加紧凑)。结构体在64位主机上占用4个字(32个字节 ):

Field Size (bits)
code 8
subcode 16
no_warning 1
visited 1
nontemporal_move 1
plf 2
modified 1
has_volatile_ops 1
references_memory_p 1
uid 32
location 32
num_ops 32
bb 64
block 63
Total size 32 bytes

12.1.2 gimple_statement_with_ops

该元组实际分成两部分:gimple_statement_with_ops_basegimple_statement_with_ops。这是为了适应操作数向量的分配方法。操作数向量被定义为有1个元素的数组。所以,要分配动态数目的操作数,内存分配器(gimple_alloc)只是简单的分配足够的内存来存放结构体本身,以及在结构体尾部加上N - 1个操作数。例如,要为有3个操作数的元组分配空间,gimple_alloc预留了sizeof (struct gimple_statement_with_ops) + 2 * sizeof (tree)个字节。

另一方面,该元组中的一些域需要与gimple_statement_with_memory_ops元组共享。所以,这些公共域被放在gimple_statement_with_ops_base中,然后由其它两个元组来继承。

gsbase 256
addresses_taken 64
def_ops 64
use_ops 64
op num_ops * 64
Total size 56 + 8 * num_ops bytes

12.1.3 gimple_statement_with_memory_ops

该元组本质上等同于gimple_statement_with_ops,除了其包含4个额外的域,来存放与内存存储和加载相关的向量。类似于先前的情况,结构体被分成两部分,用来容纳操作数向量(gimple_statement_with_memory_ops_basegimple_statement_with_memory_ops)。

Field Size (bits)
gsbase 256
addresses_taken 64
def_ops 64
use_ops 64
vdef_ops 64
vuse_ops 64
stores 64
loads 64
op num_ops * 64
Total size 88 + 8 * num_ops bytes

所有其它元组按照这三个基本元组来定义。每个元组会增加一些域。gimple类型被定义成所有这些结构体的联合体(为了清晰,省略掉了GTY标记):

     union gimple_statement_d
     {
       struct gimple_statement_base gsbase;
       struct gimple_statement_with_ops gsops;
       struct gimple_statement_with_memory_ops gsmem;
       struct gimple_statement_omp omp;
       struct gimple_statement_bind gimple_bind;
       struct gimple_statement_catch gimple_catch;
       struct gimple_statement_eh_filter gimple_eh_filter;
       struct gimple_statement_phi gimple_phi;
       struct gimple_statement_resx gimple_resx;
       struct gimple_statement_try gimple_try;
       struct gimple_statement_wce gimple_wce;
       struct gimple_statement_asm gimple_asm;
       struct gimple_statement_omp_critical gimple_omp_critical;
       struct gimple_statement_omp_for gimple_omp_for;
       struct gimple_statement_omp_parallel gimple_omp_parallel;
       struct gimple_statement_omp_task gimple_omp_task;
       struct gimple_statement_omp_sections gimple_omp_sections;
       struct gimple_statement_omp_single gimple_omp_single;
       struct gimple_statement_omp_continue gimple_omp_continue;
       struct gimple_statement_omp_atomic_load gimple_omp_atomic_load;
       struct gimple_statement_omp_atomic_store gimple_omp_atomic_store;
     };