编译器架构的王者LLVM——(8)函数的调用及基本运算符

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

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

函数的调用及基本运算符

之前我们提到了函数的定义,那么,定义好的函数如何调用才行呢?今天我们就来了解一下,函数的调用。

函数调用的宏形式

我们去读之前对函数调用的语法树翻译形式:

    printf("%d\n", y);

会被翻译为:

            Node
                String call
                String printf
                String %d\n
                ID y

这个宏的名字是call,是个不定参数的:

    (call 函数名 参数表... )

于是我们就需要扫描参数表,获取全部调用参数。

调用宏的基本形式

调用宏其实很简单,就是不断循环判断有多少参数即可。

static Value* call_macro(CodeGenContext* context, Node* node) {
    // 参数一 函数名

    // 其余参数 要传入的参数
    for (Node* p = node->getNext(); p != NULL; p = p->getNext()) {
        // 循环获取参数
    }
}

另外我们查阅一下LLVM的文档,找到其中CallInst这个指令,LLVM的指令都派生自Instruction,可以发现构建的方法很简单:

    static CallInst * Create (Value *Func, ArrayRef< Value * > Args, const Twine &NameStr, BasicBlock *InsertAtEnd)

但是我们发现,Value中要传输的是一个Function对象,如何获取呢?当然还是从符号表中获取,我们下次会讲符号表的实现,这次也和上节一样,将接口先写出来。

    // 参数一 函数名
    Value* func =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值