LLVM代码内容

1. LLVM简介

LLVM库包含所有LLVM顶层项目,可以分为以下几类:

• LLVM核心库和附加内容

• 编译器和工具

• 运行时库

        LLVM是一个编译器框架。LLVM作为编译器框架,是需要各种功能模块支撑起来的。可以将clang和lld都看做是LLVM的组成部分。框架的意思是,你可以基于LLVM提供的功能开发自己的模块,并集成在LLVM系统上,增加它的功能,或者就单纯自己开发软件工具,而利用LLVM来支撑底层实现。LLVM由一些库和工具组成,正因为它的这种设计思想,使它可以很容易和IDE集成(因为IDE软件可以直接调用库来实现一些如静态检查这些功能),也很容易构建生成各种功能的工具(因为新的工具只需要调用需要的库就行)。

2. LLVM核心库和附加内容

      LLVM核心库位于llvm目录中。为主流的CPU提供了一组带有优化器和代码生成的库,还提供基于这些库的工具。LLVM静态编译器llc将LLVM中间表示(IR)编写的文件作为输入,并将其编译为位码、汇编器输出或二进制对象文件。像llvm-objdump和llvm-dwarfdump这样的工具允许检查目标文件,而像llvm-ar这样的工具允许从一组目标文件创建静态库,还包括帮助开发LLVM本身的工具,例如:bugpoint工具可以帮助找到LLVM中崩溃的最小测试用例。llvm-mc可以对机器代码进行操作:该工具可以对机器指令进行汇编和反汇编,这对添加新的指令很有帮助。

      LLVM核心库由C++编写的。此外,还提供了C接口和Go、Ocaml和Pyhton接口。

      Polly项目位于polly目录中,向LLVM添加了另一组优化。它基于一种叫做多面体模型的数学表示,使用这种方法,可以进行复杂的优化,如使用缓存局部优化的循环。MLIR项目旨在为LLVM提供多级中间表示。

      MLIR旨在为LLVM提供多级的间表示。LLVM IR已经属于底层,并包括源语言的某些信息(这些信息在编译器生成IR时丢失了)。MLIR使LLVM IR具有可扩展性,并在特定领域可以捕获该信息,可以在mlir目录中找到相应的源码。

3. 编译器和工具

      名为Clang(http://clang.llvm.org/)的C/C++/Objective-C/Object-C++编译器是LLVM项目的一部分,源码位于clang目录中。它提供了一组库,用于从C, C++,Objective-C和Objective-C++源码进行词法分析、解析、语义分析和生成LLVM IR。Clang是基于这些库的编译器驱动程序。另一个工具是clang-format,可以根据用户提供的规则格式化C/C++源码。

      Clang的目标是兼容GCC(GNU C/C++编译器)和CL(Microsoft C/C++编译器)。

      C/C++的其他工具由同名目录下的clang-tools-extra项目提供。值得注意的是clang-tidy,它是C/C++的Lint样式检器。clang-tidy使用clang库来解析源代码,并使用静态分析检查源代码。与编译器相比,工具可以捕获更多的潜在错误,但会增加运行时间。

      llgo是一个用于Go编程语言的编译器,位于llgo目录下。用Go编写的,并使用LLVM核心库的Go绑定LLVM接口。llgo的目标是与参考编译器(https://golang.org/)兼容,但目前支持的架构是64-bit x86 Linux。该项目似乎没有继续进行维护,并可能在未来删除。

      编译器创建的对象文件必须与运行时库链接在一起,以形成可执行文件。这是lld(http://lld.llvm.org/)的任务,LLVM链接器位于lld目录中。连接器支持ELF、COFF、Mach-O和WebAssembly格式。

      没有调试器的编译器工具集是不完整的!LLVM调试器名为lldb(http://lldb.llvm.org/),位于同名的目录中。该接口类似于GDB、GNU调试器,并且该工具支持C、C++和Objective-C。调试器可以扩展,因此可以添加对其他编程语言的支持。

4. 运行时库(runtime)

      除了编译器,运行时库还需要编程语言支持。所有项目都位于同一个目录中:

• compiler-rt项目提供了独立于编程语言的支持库。它包括泛型函数,例如:可在32位(i386)机上使用的64位除法、各种sanitizers、模糊库和分析库。

• libunwind库提供了基于DWARF标准的堆栈展开帮助函数。这通常用于C++等语言的异常处理。该库用C编写,函数没有绑定到特定的异常处理模型上。

• libcxxabi库在libunwind上实现了C++的异常处理,并为其提供了标准的C++函数。

• libcxx是C++标准库的实现,包括iostreams和STL。另外,pstl项目提供了并行版本的STL算法。

• libclc是OpenCL的运行时库。OpenCL是异构并行计算的标准,有助于将计算任务转移到GP上。

• libc旨在提供一个完整的C库。这个项目仍处于早期阶段。

• OpenMP项目提供对OpenMP API的支持。OpenMP可以帮助多线程编程,例如:可以基于源代码中的注释并行化循环。

      尽管这是一个很长的项目列表,但所有项目的结构都是相似的。我们将在下一个文章中查看统一的目录结构。

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

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

相关文章

老卫带你学---leetcode刷题(50. Pow(x, n))

50. Pow(x, n) 问题 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000 示例 2: 输入:x 2.10000, n 3 输出…

RandLA-Net导出onnx模型并使用onnxruntime推理

首先下载RandLA-Net工程:https://github.com/tsunghan-wu/RandLA-Net-pytorch 导出onnx模型 import torch from utils.config import ConfigSemanticKITTI as cfg from network.RandLANet import Networkmodel Network(cfg) checkpoint torch.load("./pret…

Pandas实战100例 | 案例 13: 数据分类 - 使用 `cut` 对数值进行分箱

案例 13: 数据分类 - 使用 cut 对数值进行分箱 知识点讲解 在数据分析中,将连续的数值数据分类成不同的区间(或“分箱”)是一种常见的做法。Pandas 提供了 cut 函数,它可以根据你指定的分箱边界将数值数据分配到不同的类别中。 …

力扣(leetcode)第709题转成小写字母(Python)

709.转成小写字母 题目链接:709.转成小写字母 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 示例 1: 输入:s “Hello” 输出:“hello” 示例 2: 输入&am…

浏览器进程模型和JS的事件循环

一、浏览器的进程模型 1、什么是进程? 程序运行所需要的专属内存空间 2、什么是线程? ​​​​​运行​代码的称为线程(同一个进程中的线程共享进程的资源) ⼀个进程⾄少有⼀个线程,所以在进程开启后会⾃动创建⼀个线…

ubuntu在使用su - root时提示认证失败

原因: 在ubuntu中,默认情况下,是没有开启root账户的,因此在输入密码的时候会显示认证失败。 解决方法: 输入sudo passwd root设置密码来激活root权限 参考链接:ubuntu出现su:Authentication failure解决方…

《剑指 Offer》专项突破版 - 面试题 7 : 数组中和为 0 的 3 个数字(C++ 实现)

题目链接:15. 三数之和 - 力扣(LeetCode) 题目: 输入一个数组,如何找出数组中所有和为 0 的 3 个数字的三元组?需要注意的是,返回值中不得包含重复的三元组。例如,在数组 [-1, 0, …

【数值分析】数值微分

1. 基于Taylor公式的数值微分公式 f ′ ( x ) ≈ f ( x h ) − f ( x ) h , 截断误差 − f ′ ′ ( ξ ) 2 h f(x)\approx \frac{f(xh)-f(x)}{h}\,\,,\,\, 截断误差 \,\,\, - \frac{f(\xi)}{2}h f′(x)≈hf(xh)−f(x)​,截断误差−2f′′(ξ)​h f ′ ( x ) ≈ f ( x ) − f …

【JUC进阶】14. TransmittableThreadLocal

目录 1、前言 2、TransmittableThreadLocal 2.1、使用场景 2.2、基本使用 3、实现原理 4、小结 1、前言 书接上回《【JUC进阶】13. InheritableThreadLocal》,提到了InheritableThreadLocal虽然能进行父子线程的值传递,但是如果在线程池中&#x…

spring-mvc(1):Hello World

虽然目前大多数都是使用springboot来开发java程序,或者使用其来为其他端提供接口,而为其他端提供接口,这些功能都是依靠springmvc实现的,所以有必要学习一下spring-mvc,这样才能更好的学习springboot。 一&#xff0c…

c语言题目之九九乘法表的打印

文章目录 题目一、题目分析二,代码编写三,拓展 题目 用c语言打印九九乘法表 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目分析 在上面图我们假设一个乘法为一个单位,在这里我们可以看到第一行有一行一列&…

Python 3 字符串的基本使用

介绍 字符串是一个或多个字符(字母、数字、符号)的序列,可以是常量,也可以是变量。字符串由 Unicode 组成,是不可变的序列,这意味着它们是不变的。 由于文本是我们在日常生活中使用的一种常见数据形式&am…

掌握WPF控件:熟练常用属性(二)

WPF布局常用控件(二) Calendar 用于日期选择的控件。它提供了一个可视化的界面,可以通过它来选择特定的日期。 常用属性描述DisplayMode用来设置Calendar的显示模式,有三种可选值:默认Month(月&#xff…

自编C++题目——输入程序

预估难度 简单 题目描述 小明编了一个输入程序&#xff0c;当用户的输入之中有<时&#xff0c;光标移动到最右边&#xff1b;当输入有>时&#xff0c;光标移动到最左边&#xff0c;当输入有^时&#xff0c;光标移动到前一个字符&#xff0c;当输入为#时&#xff0c;清…

华纳云:在Conda中环境迁移有哪些步骤

在Conda中&#xff0c;环境的迁移通常涉及两个方面&#xff1a;导出环境配置和导出环境中的包。这可以通过以下步骤来完成&#xff1a; 导出环境配置&#xff1a; 在源环境中运行以下命令&#xff0c;导出环境配置到一个 environment.yml 文件中&#xff1a; conda env expo…

SLAM第十四讲

基础知识 四元数 先将三维空间的点p(x,y,z) 变成四元数的表示q(0,x,y,z) 其中0为四元数的实部&#xff0c;x,y,z为四元数的虚部。 实部为0的四元数也叫纯虚四元数。 通过 左乘四元数&#xff…

YOLOv8 Ultralytics:使用Ultralytics框架进行SAM图像分割

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行SAM图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行SAM图像分割参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xf…

Rust的第一个程序

从C系出发感觉长相怪异程度只比Erlang柔和那么一点点。 教材里的猜数字字符界面游戏&#xff1a; use rand::Rng; use std::cmp::Ordering; use std::io;fn main() {println!("Guess the number!");let secret_number rand::thread_rng().gen_range(1..100);//pri…

TypeScript进阶(四)声明文件

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

P1643 完美数 题解

完美数 首先&#xff0c;介绍一下这篇题解的特邀嘉宾&#xff1a;ChatGPT4.0 传送门 题目描述 考古队员小星在一次考察中意外跌入深渊&#xff0c;穿越到了一个神秘的荒漠。这里有许多超越他认识的事物存在&#xff0c;例如许多漂浮在空中的建筑&#xff0c;例如各种奇怪的…