我正在尝试使用插件生成带有以下代码的标签:
tree lab = build_decl (gimple_location (gsi_stmt (gsi)),
LABEL_DECL, NULL_TREE, void_type_node);
DECL_ARTIFICIAL (lab) = 0;
DECL_IGNORED_P (lab) = 1;
DECL_CONTEXT (lab) = current_function_decl;
DECL_NAME(lab) = get_identifier("test_text");
location_t loc = gimple_location (gsi_stmt (gsi));
tree label = create_artificial_label (loc);
gsi_insert_before (&gsi, gimple_build_label (lab), GSI_SAME_STMT);
虽然这在我尝试为我的英特尔处理器生成代码时有效,但如果我在交叉编译器中运行此插件以用于 arm,则标签的名称将更改为具有随机名称的本地符号。例如,我得到的是“.L4:”,而不是“test_text:”。此外,还添加了一条附加指令。
下面是在未启用标签生成代码的情况下生成的代码示例。
ldrb r3, [fp, #-5] @ zero_extendqisi2
add r2, r2, r3
movw r3, #:lower16:b1
movt r3, #:upper16:b1
str r2, [r3, #4]
现在,它遵循使用第一个显示的代码生成的代码(在树中生成标签和 gimple 表示)。您可以看到 test_text 标签被替换为 .L5 并且在标签下方添加了一条添加指令。这怎么可能?
ldrb r3, [fp, #-5] @ zero_extendqisi2
add r2, r2, r3
.L5:
add fp, fp, #4
movw r3, #:lower16:b1
movt r3, #:upper16:b1
str r2, [r3, #4]
CFG 通过后我正在运行我的插件。另外,我正在使用 Linaro 交叉编译器 arm-eabi-gcc 6.3.1 版。
此致
编辑1:还发现,通过使用-fdump-tree-optimized,直到这个阶段一切都很好。*.optmized 文件的部分输出:
<bb 4>:
_8 = i_2 % 3;
_9 = _8 == 0;
test_text:
div_3 = _9;
_11 = i_2 % 5;