- 博客(77)
- 资源 (6)
- 收藏
- 关注
原创 LLVM理论篇之编译器中端
在-O3的基础上添加-fno-signed-zeros、-freciprocal-math、-ffp-contract=fast、-menable-unsafe-fp-math、-menable-no-nans、-menable-no-infs、-mreassociate、-fno-trapping-math、-ffast-math、-ffinite-math-only等。(2)函数(Function)就是编译语言中的函数,包括函数签名和若干个基本块,函数内的第一个本块叫入口基本块(entry)。
2024-08-11 20:00:00
1740
原创 LLVM理论篇之编译器前端
运算符*的两个运算对象分别是b和3,如果b是float变量,3是整型常数,语义分析阶段执行类型审查之后,会自动将整型量转化成float,以完成同类型的数据运算,体现在语法分析所得到的语法树上,即增加一个运算符结点。词法分析是对源代码从左到右逐个将字符读入编译器,并扫描和分解字符流,从而识别出一个个单词,并确定单词的类型,将识别出的单词转换为统一的语法单元形式,也就是token。LLVM前端通过对源程序的预处理,构成源程序的字符流扫描与分解,将单词序列提取为各类语法短语,生成抽象语法树,最终转换为中间代码。
2024-08-09 20:00:00
1218
原创 LLVM理论篇之编译器结构
编译器完成源程序到目标程序的翻译工作,这是一个复杂的整体过程。从概念上讲,一个编译程序的整体过程可以分为3个阶段,每个阶段将程序的一种语言表示形式转换成另一种语言表示形式,并且各个阶段在逻辑上是紧密相连的。典型的划分方法是将编译器划分成前端、中端、后端三个阶段。编译器的整体结构如下示意图。编译器结构示意图。
2024-08-07 20:05:32
467
原创 数据结构之栈、队列
若用有N个元素的数组表示队列,随着一系列进队和出队运算,队列的结点移向存放队列的数组的尾端,会出现数组的前端空着,而队列空间已用完的情况。一种可行的解决办法是当发生这样的情况时,把队列中的结点移到数组的前端,修改头指针和尾指针。可以用顺序存储线性表来表示队列,为了指明当前执行出队运算的队首位置,需要一个指针变量head(称为头指针),为了指明当前执行进队运算的队尾位置,也需要一个指针变量tail(称为尾指针)。列首结点,链表的末尾结点是队列的队尾结点,队尾结点的链接指针值为NULL.队列的头指针head。
2024-04-23 19:30:00
442
原创 数据结构之线性表
线性表是最简单、最常用的一种数据结构,它是由相同类型的结点组成的有限序列。一个由n个结点a0,a1,…,an–1组成的线性表可记为(a0,a1,…,an–1)。线性表的结点个数为线性表的长度,长度为0的线性表称为空表。对于非空线性表,a0是线性表的第一个结点,an–1是线性表的最后一个结点。线性表的结点构成一个序列,对序列中两相邻结点ai和ai+1,称ai是ai+1的前驱结点,ai+1是ai的后继结点。其中a0没有前驱结点,an–1没有后继结点。
2024-04-22 19:30:00
888
原创 LLVM实战之使用DragonEgg
DragonEgg是一个GCC插件,它使得GCC能够使用LLVM优化器和代码生成器来取代GCC自己的优化器和代码生成器。前提需要GCC 4.5及以上版本,目标机器为x86-32/x86-64以及ARM处理器。当然,也需要下载DragonEgg源码并构建dragonegg.so动态链接库文件。
2024-04-21 19:00:00
407
原创 LLVM实战之使用Go语言前端
llgo编译器是基于LLVM的仅用Go语言前端,用它可以把Go语言程序编译成LLVM汇编码。前提是需要下载llgo二进制文件或者通过源码来构建llgo,并且把它的路径添加到PATH环境变量中。
2024-04-19 08:45:00
577
原创 LLVM实战之执行LLVM bitcode
本文介绍如何执行之前得到的LLVM bitcode文件。前提是安装lli工具,用它来执行LLVM bitcode。
2024-04-15 19:02:45
394
原创 LLVM实战之将LLVM bitcode转回为LLVM汇编码
本文将介绍如何通过反汇编工具llvm-dis把LLVM bitcode转回为LLVM IR。前提是已经安装llvm-dis工具(在LLVM工具链中)。
2024-02-09 19:00:00
727
原创 LLVM实战之LLVM bitcode转换成目标平台汇编码
本文将介绍如何将LLVM bitcode文件转换成目标机器的汇编码。当然,前提还是需要安装LLVM工具链的LLVM静态编译器llc。
2024-02-07 19:30:00
561
原创 LLVM实战之将.ll文件转换成bitcode文件
本文将介绍如何从LLVM 的.ll文件来生成bitcode。LLVM bitcode(也称为字节码——bytecode)由两部分组成:位流(bitstream,可类比字节流),以及将LLVM IR编码成位流的编码格式。同样,这一步骤的前提是安装llvm-as工具,并添加到PATH环境变量中。
2024-02-05 19:00:00
796
原创 LLVM实战之C源码编译
本文将展示使用Clang(C语言前端),把C语言源码转换成LLVM IR。当然首先需要安装Clang并且把它添加到PATH环境中。
2024-02-03 22:27:52
749
原创 LLVM实战之交叉编译
所谓交叉编译指的是能够在一个平台(例如x86)编译并构建二进制文件,而在另一个平台(例如ARM)运行。编译二进制文件的机器称为主机(host),而运行生成的二进制文件的平台称为目标平台(target)。为相同平台(主机与目标机器相同)编译代码称为本机编译(native assembler),而当主机与目标机器为不同平台时编译代码称为交叉编译(cross-compiler)。本文会讲述LLVM交叉编译的技术,可以为主机平台不同的平台编译LLVM,因此能够在所需要的特定目标平台使用构建的二进制文件。
2024-01-31 20:00:00
792
原创 LLVM实战之模块化设计
Pass之间耦合很小,而Pass之间的依赖信息由LLVM Pass管理器(Pass Manager)来统一管理,在Pass运行的时候会进行解析。它允许自定义选择各个Pass(遍)的执行顺序,也能够自定义选择哪些优化Pass——也就是说,有一些优化对目前的系统是没有帮助的,只有部分优化会针对目前系统。从结果中可以看出,运行deadargelim pass,对第一个函数没有任何影响,但优化对第2个函数有所影响——前一次优化中没有修改的部分代码在本次优化中被改变,无用的参数被消除了。(1)准备测试case。
2024-01-29 20:30:00
1655
原创 LLVM编译器的结构
前端通常执行以下任务:1)词法分析器(,简称Lexer从左到右逐行扫描源文件的字符,识别出各个单词并确定单词的类型,同时删除注释、空格等之类字符判断源字符串是否符合格式要求,然后把识别出的单词转化成统计的token形式。(2) 语法分析器从token序列中识别出各类短语,拼接成语法分析树,主要检查token组成的句子结构是不是符合语法结构。(3) 语义分析器。
2024-01-27 20:31:54
1071
原创 LLVM的编译链工具
通常我们在命令行上调用的clang工具,是Clang驱动程序,因为LLVM本质上只是一个编译器框架,所以需要一个驱动程序把整个编译器的功能串起来,clang能够监控整个编译器的流程,即能够调用到Clang和LLVM的各种库,最终实现编译的功能。来指定输出是汇编文件还是目标文件,若生成是目标文件,llc会调用LLVM中的汇编输出的代码库来工作(注意这个汇编器和gcc的汇编器也不同,它输入的是MI,是一种后端的中间表示)。clang能够调用起来整个编译器的流程,也就是上边其他工具调用的库,它很多都同样会调用。
2024-01-19 19:00:00
1271
原创 LLVM的项目结构
LIT测试本身位于test目录下的子目录中,对于lib的目录结构的遵循不是很严格。LLVM的每个功能都有明确的API定义,并放在自己的库中。如果有必要,还会套娃,例如:在llvm/lib目录中有Target目录,该目录包含特定于目标的更加底层的操作。这两个目录中,每个应用程序都有自己的子目录。值得注意的是,提供运行时库的项目将源代码放在src目录中,并使用lib目录作为库导出定义。如果需要额外的CMake模块或支持文件,可以将它们存储在cmake子目录中,而现成的模块则放在cmake/modules中。
2024-01-17 19:00:00
493
原创 LLVM代码内容
LLVM库包含所有LLVM顶层项目,可以分为以下几类:• LLVM核心库和附加内容• 编译器和工具• 运行时库LLVM是一个编译器框架。LLVM作为编译器框架,是需要各种功能模块支撑起来的。可以将clang和lld都看做是LLVM的组成部分。框架的意思是,你可以基于LLVM提供的功能开发自己的模块,并集成在LLVM系统上,增加它的功能,或者就单纯自己开发软件工具,而利用LLVM来支撑底层实现。
2024-01-14 19:00:00
1020
原创 计算机基础知识——校验码概述
一种编码,如果所有可能的码字都是合法码字,如ASCII,当码字中的一位发生错误时,这个错误的码仍然在编码体系中,这样我们称这种编码的码距小,如果我们把编码体系变得稀疏一点,使得很多的信号值不在编码体系之内,这样,合法的码字如果出现错误,可能就变成了不合法的编码,这样的编码的码距就大。如果出现1位错误,则至少有一个方程不为0.海明码的特殊之处在于,只要将①②③3个方程左边计算数据按③②①排列,得到的二进制数值就是该数据中出错的位,例如第6位出错,则③②①为110等于二进制的6。值,提高了编码效率。
2024-01-06 19:00:00
2871
原创 计算机基础知识——数据的表示概述
将八进制数转换为二进制数,只要将每个八进制数转换为3位二进制数即可,将十六进制数转换为二进制数,只要将每个十六进制数转换为4位二进制数即可。定点数的小数点是隐含的,固定在某个位置。首先计算两个数的指数差,把指数小的向指数大的对齐,并将尾数右移指数差的位数,这样两个浮点数就完成了对阶的操作。10,即可以用到的数码个数为10,它们是0,1,2,3,4,5,6,7,8,9.二进制数的基数为2,可用的数码个数为2,它们是0和1。将二进制数转换为八进制数,只有将每3个二进制数转换为八进制数即可,将二进制数转换为十。
2024-01-05 22:24:13
1077
原创 软件设计师考试的知识点
数组、顺序表与链表、队列与栈、字符串、二叉树的存储与特性、二叉树遍历、排序二叉树、最优二叉树、图的概念与存储、图的遍历、图的拓扑排序、二分查找、哈希查找、常见的排序算法、常见算法策略。数据的表示、CPU组成、CISC与RISC、流水线技术、层次化存储、I/O数据传输控制方式、可靠性分析、校验方法、计算机性能指标。各种程序语言的特点比较、编译与解释、编译器处理过程、错误管理、传值与传址、有限自动机、正规式、后缀表达式。OSI模型、TCP/IP协议族、子网划分、常用的网络命令、URL。Java语法+设计模式。
2024-01-04 22:40:57
455
原创 opencv笔记:高斯滤波和中值滤波对椒盐噪声的处理
椒盐噪声又叫冲击噪声(或者脉冲噪声)。在图像上表现为离散分布的纯白色或者黑色像素点,出现的位置通常是随机的,不连续的。由于在正常情况下,在图像中不太可能出现最大/最小值的灰度像素,因此这个样的像素点可以被当成噪声。椒盐噪声产生的原因可能是环境的干扰(如电磁干扰)、传感器(ADC)内部时序错误等。
2023-06-01 20:30:00
4813
原创 FreeRTOS的二值信号量和互斥量之间的区别和联系
FreeRTOS是一款广泛应用于嵌入式系统中的实时操作系统,其中信号量(Semaphore)是常见的用于多线程条件同步和资源保护的机制。FreeRTOS中的信号量分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。在实际应用中,选择正确的同步机制对于系统性能和稳定性至关重要。因此,我们需要详细了解FreeRTOS二值信号量和互斥锁
2023-05-28 20:00:00
3845
3
原创 简单说明芯片的启动过程和程序执行过程
启动代码主要完成两方面的工作,一是初始化执行环境,例如中断向量表、堆栈、I/O等;二是初始化c库和用户应用程序。
2023-05-20 22:55:25
4479
原创 python 自动化操作excel
出于近期处理数据比较多,重复的数据操作很繁琐且意义不大,打算使用python来处理这些事情,所以初步学习下python处理表格。
2022-12-24 16:44:51
724
2
原创 图像处理经典算法--SIFT尺度不变特征转换
SIFT(Scale-invariant feature transform 尺度不变特征变换)是一种传统的图像提取算法
2022-10-28 23:09:19
1816
原创 相机标定基础--相关坐标系
为了能够更好的描述和计算相机标定过程中图像上的像素点与空间三维点之间的关系,首先定义了四个坐标系:世界坐标系、相机坐标系、图像平面坐标系、像素坐标系
2022-09-12 19:00:00
4016
1
VS2015调试vector的文件
2018-11-14
opencv_contrib
2018-10-09
在win7+VS2015下的头文件unistd.hunistd.h
2018-03-22
ImageWarp图像扭曲
2017-12-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人