Gcc 生成对机器描述中指令模式中使用的内部函数的外部引用

Gcc 生成对机器描述中指令模式中使用的内部函数的外部引用,gcc,intrinsics,Gcc,Intrinsics,我希望创建的输出程序集列表包含对指令模式定义中使用的符号的显式外部引用。例如,对于TIC6X平台,每当“divsi3_insn”扩展为“call_uuc6xabi_divi”指令时,它都应该伴随着“.global_uuc6xabi_divi”伪操作。我的理解是,我可以用类似的东西来实现这一点: " .global __c6xabi_divi\; call __c6xabi_divi" 然而,只有在沿途某个地方没有尝试与前面的指令并行执行时,这才有效,例如 stw .d2t2 B3, *

我希望创建的输出程序集列表包含对指令模式定义中使用的符号的显式外部引用。例如,对于TIC6X平台,每当“divsi3_insn”扩展为“call_uuc6xabi_divi”指令时,它都应该伴随着“.global_uuc6xabi_divi”伪操作。我的理解是,我可以用类似的东西来实现这一点:

" .global __c6xabi_divi\; call __c6xabi_divi"
然而,只有在沿途某个地方没有尝试与前面的指令并行执行时,这才有效,例如

  stw .d2t2   B3, *+B15(32)
|| .global __c6xabi_divi    ;; this will fail the assembler
  call __c6xabi_divi
我没有注意到前面的指令与后续模板扩展并行化的情况,但这并不能证明它在100%的情况下都能工作

不管怎么说,我还没来得及自己来判断上述是否是一种更可取的方式。有人对此发表评论吗?或者也许有更好的方法来达到所描述的效果


提前谢谢你,

好的,我有以下想法。指令模式中的简单输出模板,例如

"%|%.\\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";
}