LLVM的项目结构

      所有LLVM项目都有统一的目录结构。让我们比较一下LLVM和GCC,即GNU编译器集合。几十年来,GCC几乎为您能想到的每一个系统都提供了成熟的编译器。但除了编译器,没有任何工具可以用这些代码,原因是它不为重用而设计,而LLVM截然不同。

      LLVM的每个功能都有明确的API定义,并放在自己的库中。clang项目有一个库,可以将C/ C++源文件写入token流。解析器库将该令牌流转换为抽象语法树(由库支持)。语义分析、代码生成,甚至编译器驱动程序都作为库提供。众所周知的clang工具,只是一个链接到这些库的应用程序。这样做的好处很明显: 想要构建一个需要C++文件抽象语法树(AST)的工具时,可以重用这些库的功能来构建AST。不需要语义分析和生成代码,也不需要链接这些库。所有LLVM项目都遵循这个原则,包括核心库!

      每个项目都有类似的结构。因为CMake用于生成构建文件,所以每个项目都用CMakeList.txt来描述项目的构建。如果需要额外的CMake模块或支持文件,可以将它们存储在cmake子目录中,而现成的模块则放在cmake/modules中。

      库和工具大多是用C++编写的。源文件放在lib目录下,头文件放在include目录下。因为一个项目通常由几个库组成,所以lib目录中有每个库的目录。如果有必要,还会套娃,例如:在llvm/lib目录中有Target目录,该目录包含特定于目标的更加底层的操作。除了一些源文件外,每个目标还有子目录,这些子目录会再次编译成库。每个目录都有一CMakeLists.txt文件,该文件描述了如何构建库以及哪些子目录还包含源代码。

      include目录有级别。为了使包含文件的名称唯一,路径名包含项目名称,并且是include略下的第一个子目录。只有在这个文件夹中,lib目录的结构才会重复。

      应用程序的源码位于tools和utils目录中,utils目录中是在编译或测试期间使用的内部应用程序。它们通常不是用户安装的一部分,tools目录包含用于最终用户的应用程序。这两个目录中,每个应用程序都有自己的子目录。与lib目录一样,每个包含source的子目录都有CMakeLists.txt。

      编译器必须正确的生成代码,这需要通过测试套件来实现。unittest目录包含使用Google Test框架的单元测试。这主要用于单个函数和无法通过其他方式测试的独立功能。test目录中是LIT测试,这些测试使用llvm-lit实用程序执行测试。llvm-lit扫描文件中的shell命令并执行它们。该文件包含用作测试输入的源代码,例如:LLVM IR。文件中嵌入编译命令,由llvm-lit执行。然后,在FileCheck工具的帮助下,验证该步骤的输出。这个程序从文件中读取检查语句,并将它们与另一个文件进行匹配。LIT测试本身位于test目录下的子目录中,对于lib的目录结构的遵循不是很严格。

      文档(通常是reStructuredText)放在docs目录中。如果项目提供了示例,则位于examples目录中。

      根据项目的需要,还可以有其他目录。值得注意的是,提供运行时库的项目将源代码放在src目录中,并使用lib目录作为库导出定义。compiler-rt和libclc项目包含与体系结构相关的代码,它总是放在以目标体系结构命名的子目录中(例如,i386或ptx)。

      总之,提供样例库并带有驱动工具项目的总体结构如下所示:

我们自己的项目也将遵循这个结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/329152.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【问题记录】使用命令语句从kaggle中下载数据集

从Kaggle中下载Tusimple数据集 1.服务器环境中安装kaggle 使用命令:pip install kaggle 2.复制下载API 具体命令如下: kaggle datasets download -d manideep1108/tusimple3.配置kaggle.json文件 如果直接使用命令会报错: root:~# kagg…

FPGA——时序分析与约束(Quartus II)

FPGA时序分析与约束 FPGA结构基础数据传输模型Quartus II 时序报告Quartus II 中TimeQuest的操作实操 时序分析:通过分析FPGA内部各个存储器之间的数据和时钟传输路径,来分析数据延迟和时钟延迟的关系,保证所有寄存器都可以正确寄存数据。 数…

直流继电器 JT3-22/5 线圈电压DC220V电磁式 柜内固定安装 JOSEF约瑟

JT3系列直流继电器 系列型号 JT3-42/3电磁继电器;JT3A-40/3电磁继电器 JT3-11/3电磁继电器;JT3A-03/3电磁继电器 JT3-30/3电磁继电器;JT3A-20/3电磁继电器 JT3-02/3电磁继电器;JT3A-12/3电磁继电器 JT3-22/1电磁继电器;JT3A-24/1电磁继电器 JT3-42/1电磁继电器;JT3A-31/1电磁…

gin-vue-admin二开使用雪花算法生成唯一标识 id

场景介绍 需求场景: 总部采集分支的数据,由于分支的 id 是子增的主键 id,所以会出现重复的 id,但是这个 id 需要作为标识,没有实际作用,这里选择的是分布式 id 雪花算法生成 id 存储用来标识,这…

NAS入门(学习笔记)

文章目录 AutoMLNAS初期NAS当前NAS框架One-Shot NAS权重共享策略 Zero-Shot NASZen-NASNASWOTEPENAS 参考资料 AutoML 深度学习使特征学习自动化 AutoML 使深度学习自动化 自动化机器学习 (automated machine learning) 是一种自动化的数据驱动方法, 并做出一系列决策。 按…

数据分析-Pandas如何整合多张数据表

数据分析-Pandas如何整合多张数据表 数据表,时间序列数据在数据分析建模中很常见,例如天气预报,空气状态监测,股票交易等金融场景。数据分析过程中重新调整,重塑数据表是很重要的技巧,此处选择Titanic数据…

vue-cli解决跨域

在vue.config.js中 找到devServer 在devServer中创建proxy代理 proxy:{ path(路径中包含这个path就会导航到target的目标接口):{ target:"目标接口" } } 例: 1 同源策略只针对于浏览器,代理服务器到后端接…

Linux中的定时任务(案例:定时备份和清空)

前言 Linux中的定时任务(案例:定时备份和清空) crontab 命令 Linux crontab 是用来定期执行程序的命令, 当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分钟会定期检查是否有要执行的工作,如果有…

CentOS Linux操作系统源码安装最新Redis版本,使用JSON数据类型踩入新坑

最近有空查阅了redis官网,发现redis数据类型不止Strings、Lists、Sets、Hashes、Sorted sets,还多了几种,决定先试用下JSON数据类型 1、安装Redis软件 JSON数据类型,对Redis版本有要求,需要大于4.0版本。下图是华为云…

基础+常用的数据结构

基础 java基础 JDK 和 JRE JDK,它是功能齐全的 Java SDK,是提供给开发者使用,能够创建和编译 Java 程序的开发套件。它包含了 JRE,同时还包含了编译 java 源码的编译器 javac 以及一些其他工具比如 javadoc(文档注释工具&#…

前端下载文件流,设置返回值类型responseType:‘blob‘无效的问题

前言: 本是一个非常简单的请求,即是下载文件。通常的做法如下: 1.前端通过Vue Axios向后端请求,同时在请求中设置响应体为Blob格式。 2.后端相应前端的请求,同时返回Blob格式的文件给到前端(如果没有步骤…

java农业信息化技术一体化服务农产品商城平台springboot+vue

农业信息化服务平台,能够推进农村农业信息化的发展,提升农业和农村信息化水平,促进先进农业技术在农业生产中的推广应用,推动农业向现代化、集约化发展。同时,进一步探索农村信息化建设的新模式,以技术规划来支撑农业未来信息化管理的发展。 开发软件有很多种可以用&#xff0c…

【深度学习】RTX2060 2080如何安装CUDA,如何使用onnx runtime

文章目录 如何在Python环境下配置RTX 2060与CUDA 101. 安装最新的NVIDIA显卡驱动2. 使用conda安装CUDA Toolkit3. 验证onnxruntime与CUDA版本4. 验证ONNX需求版本5. 安装ONNX与onnxruntime6. 编写ONNX推理代码 如何在Python环境下配置RTX 2060与CUDA 10 RTX 2060虽然是一款较早…

虚拟环境的搭建

优点 1、使不同应用开发环境相互独立 2、环境升级不影响其他应用,也不会影响全局的python环境 3、防止出现包管理混乱及包版本冲突# 什么是虚拟环境,为什么要有它?它解决了什么问题-操作系统装了python3.8-使用django 2.2.2开发了一个项目-使…

解密IP代理池:匿名访问与反爬虫的利器

当今互联网环境中,为了应对反爬虫、匿名访问或绕过某些地域限制等需求,IP代理池成为了一种常用的解决方案。IP代理池是一个包含多个可用代理IP地址的集合,可以通过该代理池随机选择可用IP地址来进行网络请求。 IP代理池是一组可用的代理IP地址…

【经典算法】有趣的算法之---粒子群算法梳理

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 粒子群算法 粒子群算法(Particle Swarm Optimization,PSO)是一种用于解决优化问题的元启发式算法。它通过模拟鸟群或…

Kafka-消费者-KafkaConsumer分析-ConsumerNetworkClient

前面介绍过NetworkClient的实现,它依赖于KSelector、InFlightRequests、Metadata等组件,负责管理客户端与Kafka集群中各个Node节点之间的连接,通过KSelector法实现了发送请求的功能,并通过一系列handle*方法处理请求响应、超时请求…

8x8离散余弦的快速精确实现使用数据流单指令多数据扩展指令集进行转换MMX 说明书

1.https://www.cs.cmu.edu/~barbic/cs-740/ap922.pdf 2.FFmpeg: libavcodec/x86/fdct.c Source File 再学FDCT快速精确实现协议改写浮点FDCT, ffmpeg的dct使用的就是这个快速精确协议。 3.http://dspace.fcu.edu.tw/bitstream/2377/30265/1/ICM%204-1.pdf 我想如把所有余弦…

VC++中使用OpenCV读取图像、读取本地视频、读取摄像头并实时显示

VC中使用OpenCV读取图像、读取本地视频、读取摄像头并实时显示 最近闲着跟着油管博主murtazahassan,学习了一下LEARN OPENCV C in 4 HOURS | Including 3x Projects | Computer Vision,对应的Github源代码地址为:Learn-OpenCV-cpp-in-4-Hour…

.net core 6 使用注解自动注入实例,无需构造注入 autowrite4net

像java使用autowrite一样使用 1、前提先注册到ioc容器当中 builder.Services.AddScoped 2、nuget引入AutoWrite4Net 3、启用 //启用自动注入 app.UseAutoWrite(); 4、在类上使用注解 [StartAutoWrite] public class NacosController : ControllerBase 5、实例上使用注解 …