编译器架构的王者LLVM——(10)变量的存储与读取

本文介绍了LLVM平台在编译过程中变量的存储与读取,包括内置符号表的使用、栈上变量空间的分配、AllocaInst语句、变量的存储与读取操作,以及如何构建赋值语句。详细讲解了LLVM中Load和Store指令的运用,以及在处理赋值语句时的策略。
摘要由CSDN通过智能技术生成

LLVM平台,短短几年间,改变了众多编程语言的走向,也催生了一大批具有特色的编程语言的出现,不愧为编译器架构的王者,也荣获2012年ACM软件系统奖 —— 题记

版权声明:本文为 西风逍遥游 原创文章,转载请注明出处 西风世界 http://blog.csdn.net/xfxyy_sxfancy

变量的存储与读取

变量是一款编程语言中的核心,说编译语言是一种符号处理工具,其实是有些道理的。栈式符号表可以方便的记录编译过程中的变量和语法符号,我们上节已经了解了其中的实现方法。那么,还有没有其他的办法能够简单的实现变量的存取呢?

LLVM的内置符号表

其实LLVM还提供了一个内部符号表,这个和我们的符号表不一样,它的符号是以函数为界的,函数内的是局部符号,外面的是全局符号。这个符号表的作用,主要是供LLVM找到各个底层的语法元素而设计的,所以它的功能较为有限。

例如下面这段字节码:

define void @print(i64 %k1) {
entry:
    ...
}

我们可以通过符号表,找到k1这个元素。

这个符号表的获取也很简单,只要你有basicblock,你就能够找到这个符号表的指针:

    BasicBlock* bb = context->getNowBlock();
    ValueSymbolTable* st = bb->getValueSymbolTable();
    Value* v = st->lookup(value);

栈上变量空间的分配,AllocaInst语句

AllocaInst是LLVM的一条标准语句,负责栈上空间的分配,你无需考虑栈的增长的操作,它会自动帮你完成,并返回给你对应空间的指针。

千万不要认为这个语句能够动态分配堆内存,堆内存实际上是通过调用Malloc语句来分配的。

    %k = alloca i64

以上语句,会让k的类型变为你分配类型的指针。

这个语句的C++接口非常的好用,像这样:

AllocaInst *alloc = new AllocaInst(t, var_name, context->getNowBlock());

t对

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值