对于我的PIC后端,我想要' int'是16位。我/我的目标如何告诉clang什么应该是' int'?仅定义16位寄存器似乎还不够。
目前" clang -O2 -emit-llvm -target pic"转换
int foo(int a, int b) { return a + b; }
使用32位整数到此IR代码:
; ModuleID = '../test/sum.c'
source_filename = "../test/sum.c"
target datalayout = "e-m:e-p:16:16-i16:16-a:0:16-n16-S16"
target triple = "pic"
; Function Attrs: norecurse nounwind readnone
define i32 @foo(i32 %a, i32 %b) local_unnamed_addr #0 {
entry:
%add = add nsw i32 %b, %a
ret i32 %add
}
attributes #0 = { norecurse nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = !{!"clang version 4.0.0 (http://llvm.org/git/clang.git 92920e1616528c259756dd8190d4a47058fae127) (http://llvm.org/git/llvm.git 7ca31361200d6bc8a75fa06f112083a8be544287)"}
这可能是也可能不是" 返回操作数#1的原因是未处理的类型i16 "我在PIC Backend: 16-bit registers / return type中描述的消息。但是,在转向其他问题之前,我应该得到clang输出中使用的类型。
答案 0 :(得分:0)
求助:clang从其自己的Target中获取int(和其他类型)的大小,在clang / lib / Basics / Targets.cpp中定义。原生尺寸设置" -n16"是否足以覆盖(默认?)i32设置。代替:
IntWidth = 32;
IntAlign = 32;
在我的目标构造函数中可以解决问题。
这也解决了奇怪的'未处理的返回类型i16'问题。不知道为什么。
答案 1 :(得分:-1)
我强烈建议养成使用ISO / IEC 9899包含文件<stdint.h>
和<stdbool.h>
的习惯。在您的情况下,您可以声明
int16_t foo(int16_t a, int16_t b) { return a + b; }
并保证变量和返回值是16位有符号整数,与目标处理器无关。查看文件内容,或ISO文档附录B.17(搜索ISO / IEC 9899,您将轻松找到pdf文档),查看所有类型选项。
这些包含文件(连同变量名称的前缀,如u16foo和i32bar,向我澄清标识符的大小和签名)已经保存了我的皮肤太多次,无法计算。