LLVM IR打印一个数字

时间:2015-06-27 19:09:48

标签: assembly llvm bytecode

我正在尝试打印一个数字,但是我收到错误,说我的打印功能错误了:

lead()

这是错误:

m2 <- structure(c(16659.1964, 16662.0615, 16639.4316, 8046.004, 495.3461, 
1682.8678, 46129.599, 46105.731, 45986.194, 16460.859, 1143.432, 
3879.721, 53180.211, 53185.511, 53043.683, 17660.545, 4671.55, 
4858.802, 37259.453, 37191.243, 37157.778, 20728.696, 1563.926, 
3062.387, 61108.754, 61115.984, 60889.781, 25369.899, 2078.405, 
4577.366, 77946.898, 77913.992, 77855.132, 26558.286, 4993.391, 
8218.718, 87433.948, 87379.138, 87213.507, 27932.843, 3479.066, 
7966.32), .Dim = 6:7, .Dimnames = list(c("hsa-let-7a-5p|hsa-let-7a-1", 
"hsa-let-7a-5p|hsa-let-7a-2", "hsa-let-7a-5p|hsa-let-7a-3", 
"hsa-let-7b-5p|hsa-let-7b", 
"hsa-let-7c-5p|hsa-let-7c", "hsa-let-7d-5p|hsa-let-7d"), c("124G", 
"124R", "126R", "126G", "26R", "26G", "243G")))

还有其他一些打印功能可以解决这个问题吗?

1 个答案:

答案 0 :(得分:5)

LLVM IR没有隐式强制转换(显式强制转换是单独的指令)。 您的%d变量的类型为i32,来自第一条指令(错误消息为'%d' defined with type 'i8',可能您的示例不是您的真实代码?)。

对于printf函数,它恰好是C printf。你应该传递完全相同的参数 - 一个格式字符串(i8*指向null终止"%d")和一个数字。

对于字符串,您应该定义全局

@formatString = private constant [2 x i8] c"%d" 

并将其作为第一个参数传递给printf

%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @formatString , i32 0, i32 0), i32 %d)

完整代码:

@formatString = private constant [2 x i8] c"%d" 

define i32 @main() {
entry:
  %d = shl i32 2, 3
  %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @formatString , i32 0, i32 0), i32 %d)
  ret i32 1
}

declare i32 @printf(i8*, ...)