如何告诉clang我的LLVM目标应该使用16位' int'?

时间:2016-09-16 06:25:56

标签: clang llvm pic llvm-clang

对于我的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输出中使用的类型。

2 个答案:

答案 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,向我澄清标识符的大小和签名)已经保存了我的皮肤太多次,无法计算。