Learn LLVM ___DAY_1

Learn LLVM ___DAY_1

看到哪儿,想到哪儿,写到哪儿,别嫌弃乱七八糟…
IR 是一种语言,表达形式很好,模块化做得很好。
LLVM 静态的分为三部分:前端,优化,后端。
分成三段有这样模块化有极大的好处:1.针对新的语言,提升前端。
2.针对新的设备,提升后端。
中间的优化部分使用通用的,非常有利于开发LLVM项目。
你所写的程序会被编译成IR语言,然后再优化,再选择后端再生成相应的可执行代码,而这里就显出了IR的好处,就是LLVM的优化功能可以反复的给IR使用,因为不论你之前使用的什么语言编写的代码,都会编译成同意的IR语言,你就可以看到IR,然后再选择后端。

helloworld 的 IR

C语言代码:

#include <stdio.h>
int main( )
{
printf(“Hello World!\n”);
}

Hello World 程序的 LLVM 字节代码:

@.str = private constant [13 x i8] c"Hello World!\00", align 1 ;

define i32 @main() ssp {
entry:
%retval = alloca i32
%0 = alloca i32 ;%0 是用寄存器0, alloca i32 申请一个32位 的寄存器吗?
%“alloca point” = bitcast i32 0 to i32
%1 = call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @.str, i64 0, i64 0)) ;@是索引 这种自定义类 ;的元素 然后赋值给 i32 吗 get_element_ptr inbounds(string,int,int) ,应该是索引"helloworld"吧?我猜的
store i32 0, i32* %0, align 4 ;将上面获取的i32存储
%2 = load i32* %0, align 4 ;再加载到寄存器2里 ,应该是寄存器的问题 不能直接给,要先压入栈,再弹 ;给寄存器,可能是因为是变量的原因,不是立即数
store i32 %2, i32* %retval, align 4 ;%retval第一行
br label %return
return:
%retval1 = load i32* %retval
ret i32 %retval1
}

declare i32 @puts(i8*)

有点像dalvik和汇编揉在一起,个人感觉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值