博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用LLVM来开发自己的编译器(二)——流程控制
阅读量:7297 次
发布时间:2019-06-30

本文共 1400 字,大约阅读时间需要 4 分钟。

hot3.png

##增加新的类型和运算 这里先增加char型和bool型。char型代表一个unicode字符,因为c的wchar_t是32位的,所以这里用i32来实现char型。char可以看成是32位整型,可以和long型或double型互相转换,可以进行数值的运算。bool型代表真假值,这里用i1来实现,只有两个值true和false。

例子:

char c = 'A'; //普通字符c = '\t';     //转义字符c = '\u4e2d'; //unicode码bool b = true;b = false;

数值型(char,long,double)的运算原来只有+、-、*、/,这里增加%(求余)、>、<、==、!=、>=、<=等运算。bool型支持逻辑运算&&、||、!和比较运算==、!=。

##if-else分支 定义if-else的语法如下:

if (expression) {    .....} else {    .....}if (expression) {    .....}

ir的br指令是实现流程控制的最重要指令,使用它来进行基本块间的跳转。br可以直接跳转,如br label %bb1,执行过程跳转到基本块bb1上;br也可以是有条件跳转,如br i1 %cond, label %then, label %else,如果cond等于1就跳转到基本块then上,如果等于0就跳到else上。这样代码和ir的对应关系如下:

在此输入图片描述

使用irBuilder.CreateCondBr(condVal, thenBB, elseBB)irBuilder.CreateBr(outBB)可以生成对应的指令。

##for循环 定义for循环的语法如下:

for(statement; expression; statement){    .....}

for循环也是用br来实现。它的对应比if-else的要稍微复杂些: 在此输入图片描述

##局部变量 for和if-else的代码块都应该产生新的作用域,里面定义的变量外面是不可见的。在代码块里定义的变量需要分配新的内存,但显然不能在for的里面出现alloca指令,因为这样会不断的申请栈上的内存。这里的策略是把所有的栈内存分配都放在函数的开头(clang也是这样做的),所以函数的开头要有一个alloc基本块,用来插入alloca指令,这样就可以在代码块内重复的使用对应的内存。例如: 在此输入图片描述

##完整代码

##例子 ####test.sp

long main(){	printL(fibonacci(10));println(); //55	printL(fibonacci(20));println(); //6765	printC('\u4e60');	printC('\u8fd1');	printC('\u5e73');	println();	return 0;}long fibonacci(long n){	if(n < 0)		return 0;	if(n == 0)		return 0;	else if(n == 1)		return 1;	else		return fibonacci(n-1)+fibonacci(n-2);}

转载于:https://my.oschina.net/linlifeng/blog/113720

你可能感兴趣的文章
docker 8 docker的镜像命令
查看>>
CentOS 7 开放3306端口访问
查看>>
执行力
查看>>
关于毛刺
查看>>
微信小程序自定义微信客服按钮
查看>>
Ural 1014 Product of Digits NYOJ 270 数的分解 解题报告
查看>>
SPOJ1812 LCS2 - Longest Common Substring II
查看>>
CSS属性(display)
查看>>
具体数学第二版第二章习题(1)
查看>>
第十四章 字符、字符串、编码
查看>>
注意!ASP.NET MVC 3 的一个 OutputCache 问题
查看>>
单行文本垂直居中
查看>>
Remove Element
查看>>
C语言 结构体
查看>>
蓝桥杯-历届试题-公式求值
查看>>
快速排序
查看>>
冒泡排序
查看>>
(七)Action访问Servlet API
查看>>
POJ2960 S-Nim(博弈论:sg函数)
查看>>
$().each()和$.each()
查看>>