我希望创建的输出程序集列表包含对指令模式定义中使用的符号的显式外部引用。例如,对于TIC6X平台,只要“divsi3_insn”扩展为“call __c6xabi_divi”指令,那么它应该伴随“.global __c6xabi_divi”伪操作。我的理解是,我可以通过类似的东西实现这一目标:
" .global __c6xabi_divi\; call __c6xabi_divi"
但是,只有在沿途的某个地方不会尝试将执行与前面的指令并行化时,这才会起作用,例如
stw .d2t2 B3, *+B15(32)
|| .global __c6xabi_divi ;; this will fail the assembler
call __c6xabi_divi
我没有注意到前一条指令与后续模板扩展并行化的情况,但这并不能证明它可以100%处理。
无论如何,如果以上是首选的方式,我自己很难对gcc内部进行判断。有人会对此发表评论吗?或者可能有更好的方法来实现所描述的效果?
提前谢谢你,
答案 0 :(得分:0)
好的,我想出了以下内容。指令模式中的简单输出模板,例如
"%|%.\\tcall\\t%$\\t__c6xabi_divi"
必须替换为以下代码(ofc,它可以被提取到一个单独的函数):
{
tree id = build_libfunc_function("_c6xabi_divi");
mark_referenced(DECL_ASSEMBLER_NAME (id));
assemble_external(id);
return "%|%.\\tcall\\t%$\\t__c6xabi_divi";
}