本文介绍了llvm:指针操作的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

我尝试使用llvm汇编语言.由于我没有找到任何教程,因此我的学习方法是编写简单的C函数,然后让clang通过以下方式显示相应的llvm代码:

I try to learm llvm assembly language.Since I did not find any tutorial for it, my way to learn is writing simple C functions, and let clang reveal the corresponding llvm code with:

clang -S -emit-llvm simple.c

我现在正在尝试学习如何使用指针.因此,我测试了以下C函数:

I am now trying to learn how to use pointers. So I tested the following C function:

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代码的疑问:

My questions on the llvm code:

  1. 存储操作所引用的%0是什么?这是指函数参数吗?我遇到的所有其他函数都以%1(而不是%0)开始其变量.这里有什么区别?
  2. 我看到定义的下一个变量是%2,这意味着%1被跳过.而且我注意到这样做(跳过)会导致编译错误.那么这段代码是如何有效的呢?
  3. 此代码的实际逻辑是什么?为什么要涉及存储指令和i32 **类型?有没有更简单的方法在llvm中实现获取值"操作?

推荐答案

  1. 存储操作所引用的%0是什么?这是指函数参数吗?我遇到的所有其他函数都以%1(而不是%0)开始其变量.这里有什么区别?

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

In LLVM function definition contains list of basicBlocks which optionally may start with a label. and if the explicit label is not provided then the implicit numbered labeled is provided from the same counter as used in unnamed temporaries.

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

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

This code is valid as %0 is implicitly used for argument and %1 is used to label the basicBlock, Kindly post the error messages if you are facing any issues with that.

  1. 此代码的实际逻辑是什么?为什么要涉及存储指令和i32 **类型?有没有更简单的方法在llvm中实现获取值"操作?

我不是一个lang语专家,但是优化是llvm的责任.为了更简单的使用方式,

I am not a clang-expert to say but optimization is llvm's responsibility. for simpler way you can use,

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

如果您想了解有关LLVM lang的更多信息,可以使用非常好的文档. LLVM语言参考

There is a very nice documentation available if you want to learn more about LLVM lang. LLVM Lang Ref

我列出的要点,也可以在功能",标识符"部分中找到.

Also the points i have listed, you can find in Functions, Identifier sections.

这篇关于llvm:指针操作的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-06 08:32