【问题标题】:convert string to long in LLVM assembly code在 LLVM 汇编代码中将字符串转换为 long
【发布时间】:2014-05-30 05:46:30
【问题描述】:

我正在尝试在 LLVM 汇编代码中将字符串转换为整数。该代码在 atoi 上运行良好,但我想切换到 strtol。

这是代码:

; initialise a number
@number0 = private unnamed_addr constant [2 x i8] c"5\00"
%str = getelementptr [2 x i8]* @number0, i64 0, i64 0 

; the endpointer that indicates an error
%endptr = alloca i8*

; the actual call of strtol
%addr = getelementptr i8* %str, i64 0
%new_long = call i64 @strtol(i8* %addr, i8** %endptr)

; debug printing
%after_casting = getelementptr [18 x i8]* @after_casting, i64 0, i64 0
call i64(i8*, ...)* @printf(i8* %after_casting, i64 %new_long)

现在,调试 printf 消息打印 0。我猜 endptr 传递有问题。我做错了什么?

【问题讨论】:

    标签: llvm atoi llvm-ir strtol


    【解决方案1】:

    当想知道这样的事情时,只需使用 LLVM IR 发射运行 Clang。例如这个 C 代码:

    int main ()
    {
      char szNumbers[] = "2001";
      char * pEnd;
      long int li1;
      li1 = strtol (szNumbers,&pEnd,10);
      printf ("%ld\n", li1);
      return 0;
    }
    

    变成这个 IR:

    @main.szNumbers = private unnamed_addr constant [5 x i8] c"2001\00", align 1
    @.str = private unnamed_addr constant [5 x i8] c"%ld\0A\00", align 1
    
    ; Function Attrs: nounwind uwtable
    define i32 @main() #0 {
    entry:
      %szNumbers = alloca [5 x i8], align 1
      %pEnd = alloca i8*, align 8
      %0 = getelementptr inbounds [5 x i8]* %szNumbers, i64 0, i64 0
      call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* getelementptr inbounds ([5 x i8]* @main.szNumbers, i64 0, i64 0), i64 5, i32 1, i1 false)
      %call = call i64 @strtol(i8* %0, i8** %pEnd, i32 10) #1
      %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([5 x i8]* @.str, i64 0, i64 0), i64 %call) #1
      ret i32 0
    }
    

    【讨论】:

    • 嗯。执行您的代码打印 0。但是 - 只要我在 strtol 调用之前的行中添加一个 printf 调用,我就会得到一个很好的结果。注意:在调用 i64 @strtol 之前没有额外的 printf 我得到 0 - 2001。这很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2013-01-22
    • 2016-07-31
    • 2020-12-02
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多