代码之家  ›  专栏  ›  技术社区  ›  Alkis Mavridis

llvm:指针操作的值

  •  0
  • Alkis Mavridis  · 技术社区  · 8 年前

    我试着学习llvm汇编语言。

    clang -S -emit-llvm simple.c
    

    我现在正在努力学习如何使用指针。所以我测试了下面的C函数:

    int getVal(int* ptr) { return *ptr; }
    

    生成了以下llvm:

    define i32 @getVal(i32*) #0 {
      %2 = alloca i32*, align 8
      store i32* %0, i32** %2, align 8
      %3 = load i32*, i32** %2, align 8
      %4 = load i32, i32* %3, align 4
      ret i32 %4
    }
    

    关于llvm代码的问题:

    1. 我看到定义的下一个变量是%2,这意味着跳过了%1。我注意到这样做(跳过)会导致编译错误。那么,为什么这个代码是有效的呢?
    2. 这段代码的实际逻辑是什么?为什么涉及存储指令和i32**类型?在llvm中实现“get value of”操作有更简单的方法吗?
    1 回复  |  直到 8 年前
        1
  •  1
  •   Chirag Patel    8 年前
    1. 存储操作所指的%0是什么?这是指函数参数吗?我遇到的所有其他函数的变量都以%1开始,而不是%0。这里有什么区别?

    在LLVM中,函数定义包含基本锁的列表,这些基本锁可以选择以标签开头。如果未提供显式标签,则隐式编号标签与在未命名临时项中使用的计数器相同。

    1. 我看到定义的下一个变量是%2,这意味着跳过了%1。我注意到这样做(跳过)会导致编译错误。那么,为什么这个代码是有效的呢?

    此代码有效,因为%0隐式用于参数,而%1用于标记basicBlock,如果遇到任何问题,请发布错误消息。

    1. 这段代码的实际逻辑是什么?为什么涉及存储指令和i32**类型?在llvm中实现“get value of”操作有更简单的方法吗?

    define i32 @getVal(i32*) #0 {
      %2 = load i32, i32* %0
      ret i32 %2
    }
    

    如果你想了解更多关于LLVM lang的信息,这里有一个非常好的文档。 LLVM Lang Ref

    还有我列出的要点,你可以在函数,标识符部分找到。

    推荐文章