自定义GlobalISel-only LLVM后端:目标机交互错误排查求助
背景
我正在为一款暂未被支持的处理器开发仅基于GlobalISel的自定义LLVM后端,目前已能执行以下命令并生成有效的目标汇编:
clang -target xxx -emit-llvm file.c llc -march=xxx -global-isel -stop-after=irtranslator file.ll -o - llc -march=xxx -global-isel -debug-only=instruction-select,xxx-gisel file.ll -o -
问题
但通过Clang驱动执行以下命令时:
clang -fglobal-isel --target=xxx -S file.c
出现错误:
error: unable to interface with target machine
调试
我不确定如何解决该问题。错误来自BackendUtils.cpp,原因是目标未实现TargetMachine→addPassesToEmitFile()方法。手动重写该方法后错误消失,但生成的汇编文件为空(未添加任何Pass)。不过其他后端似乎并未重写此方法,因为IRTranslator、RegBankSelect等Pass应被自动调用。
我尚未在clang/lib/CodeGen/Targets/中实现xxx.cpp,不清楚其中逻辑的作用——它似乎用于定义ABI和调用约定,但我已在llvm/Target/XXX/XXXCallingConvention.td和llvm/Target/XXX/GlobalISel/XXXCallLowering.cpp中完成了相关定义,不确定这是否是相关问题,也不确定是否需要重复实现,以及这些信息是否对Clang和LLVM都必要。
求助
这是个特定问题,若需要更多细节可随时提供,恳请各位提供帮助,谢谢!
内容的提问来源于stack exchange,提问作者Aidan Goldfarb
相关产品推荐
相关产品推荐

