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)。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0到1:实验室设备借用小程序开发笔记

概论 实验室设备借用小程序,适合各大高校,科技园区,大型企业集团的实验室设备借用流程, 通过数字化的手段进一步提升相关单位设备保障水平,规范实验室和设备管理,用户通过手机小程序扫描设备的二维码,可以…

H.265流媒体播放器EasyPlayer.js集成后无法重新拉流的原因排查

流媒体播放器EasyPlayer是TSINGSEE青犀流媒体组件系列中关注度较高的产品,经过多年的发展和迭代,目前已经有多个应用版本,包括RTSP版、RTMP版、Pro版,以及js版,其中js版本作为网页播放器,受到了用户的广泛使…

自动化测试框架pytest系列之8个常用的装饰器函数

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 自动化测试框架pytest系列之强大的fixture功能,为什么fixture强大?一文拆解它的功能参数。(三)-CSDN博客 接上文 3.5 pytest的8…

c语言 编译与链接

编译与链接 翻译环境和执行环境翻译环境1.1预编译1.2编译1.3汇编(ASM)2.链接 执行环境最后给大家附上一张关于本节知识内容的图供大家更好理解~ ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/522d488885ba44d99aa504d6b21c88d5.png) &…

智慧校园大数据平台架构

平台架构 基础硬件层 基础硬件层是由一组低廉的PC或服务器组合构建而成。基础硬件层主要承载着数据的存储、运算、容错、调度和通信等任务,对基础应用层下达的指令进行执行和反馈。 数据集成 大数据特征表现在实时、交互、海量等方面,并且以半结构化、非结构化数据为主,价…

Java中的Socket你了解吗

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…

STM32F103标准外设库——RCC时钟(六)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

GitLab Runner 实现项目 CI/CD 发布

Gitlab Runner简介 Gitlab实现CICD的方式有很多,比如通过Jenkins,通过Gitlab Runner等,今天主要介绍后者。Gitlab在安装的时候,就默认包含了Gitlab CI的能力,但是该能力只是用于协调作业,并不能真的去执行…

【计算机网络】网络层——详解IP协议

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】 本专栏旨在分享学习计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌 目录 🐱一、I…

力扣电话号码的组合

文章目录 题目说明做题思路代码实现代码解析 题目链接 题目说明 首先我们先分析一下这个题目题目中说呢先给出一个字符串这个字符串其实就是这个九键数字我们要按照要求将数字所代表的字符进行自由组合形成一个字符串并且这个字符串的长度和输入的数字字符串长度相同&#xff0…

华为端口安全常用3种方法配置案例

安全动态mac地址学习功能 [Huawei]int g0/0/01 interface GigabitEthernet0/0/1 port-security enable //开启安全 port-security max-mac-num 2 //最多为2个mac地址学习 port-security protect-action restrict //丢包带警告 port-security aging-time 1 //mac地址的老化时间…

FFmpeg连载6-音频重采样

今天我们的实战内容是将音频解码成PCM,并将PCM重采样成特定的采样率,然后输出到本地文件进行播放。 什么是重采样? 所谓重采样,一句话总结就是改变音频的三元素,也就是通过重采样改变音频的采样率、采样格式或者声道数…

Github 2024-01-16 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-01-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10HTML项目1 精心策划的Python资源列表 创建周期:3490 天开发语言:Python…

在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常

前言 在 ASP.NET Core Web API 中,异常筛选器(Exception Filter)是一种用于处理发生在 Web API 控制器或管道中的异常的机制。 异常筛选器可以捕获和处理应用程序中发生的异常,当系统中出现未经处理的异常的时候,异常…

小程序基础学习(事件处理)

原理&#xff1a;组件内部设置点击事件&#xff0c;然后冒泡到页面捕获点击事件 在组件内部设置点击事件 处理点击事件&#xff0c;并告诉页面 页面捕获点击事件 页面处理点击事件 组件代码 <!--components/my-info/my-info.wxml--> <view class"title"…

基于Springboot的网上点餐系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的网上点餐系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&am…

docker-compose和docker compose的区别

在docker实际使用中&#xff0c;经常会搭配Compose&#xff0c;用来定义和运行多个 Docker 容器。使用时会发现&#xff0c;有时候的指令是docker-compose&#xff0c;有时候是docker compose&#xff0c;下面给出解释。 docker官方文档&#xff1a;https://docs.docker.com/c…

iphone 5s的充电时序原理图纸,iPAD充电讲解

上一篇写了iphone 5的时序。那是电池供电的开机时序。iphone 5s也是差不多的过程&#xff0c;不说了。现在看iphone5s手机充电时候的时序。iphone5s充电比iphone5充电简单了很多。 首先是usb接口接到手机上&#xff0c;usb线连接到J7接口上。J7接口不只是接usb&#xff0c;还能…

[NSSCTF Round#16 Basic]RCE但是没有完全RCE

RCE但是没有完全RCE wp 题目代码&#xff1a; 第一关 <?php error_reporting(0); highlight_file(__file__); include(level2.php); if (isset($_GET[md5_1]) && isset($_GET[md5_2])) {if ((string)$_GET[md5_1] ! (string)$_GET[md5_2] && md5($_GET[m…

IntelliJ IDEA使用学习

一、安装教程 网上自行下载&#xff0c;CSDN不然过审二、使用教程 2.1 快捷键操作与设置 设置 Setting——>按键映射——>选择顺手的系统快捷键 编写代码 CtrlShift Enter&#xff0c;语句完成。 “&#xff01;”&#xff0c;否定完成&#xff0c;输入表达式时按 …