我开始为16位PIC单片机(PIC24,dsPIC30 / 33)编写LLVM后端。复制并重命名来自Lanai的东西,删除很多,添加一些并使后端知道clang我可以翻译
short foo(void) { return 6*7; }
到
mov #0x2A, W0
ret
这正是我想要的。
DataLayout设置为" e-m:e-p:16:16-i16:16-a:0:16-n16-S16"寄存器定义为
def GPR : RegisterClass<"PIC", [i16], 16, (sequence "W%u", 0, 15)>;
并添加为
addRegisterClass(MVT::i16, &PIC::GPRRegClass);
但是,当我将上述返回类型更改为&#39; int&#39;时,我得到&#34; 返回操作数#1的未处理类型i16 &#34;这很奇怪,因为i16是目前处理的唯一类型:
def RetCC_PIC16 : CallingConv<[
// Use W0 to return 16-bit value.
CCIfType<[i16], CCAssignToReg<[W0]>>
]>;
编译在LowerReturn()
中止CCInfo.AnalyzeReturn(Outs, RetCC_PIC16);
我错过了什么?我还需要做些什么来告诉clang / llvm使用哪个int大小以及如何返回它?
标识符GPRRegClass来自哪里,它实际上是否正确?
答案 0 :(得分:1)
解决:我正确设置int的大小后,这个消失了;见How to tell clang that my LLVM Target should use 16-bit 'int'?