clang 如何引导 C/C++ 代码优化?

2024-01-20

有人告诉我 clang 是一个像 gcc 一样工作的驱动程序,可以进行预处理、编译和链接工作。在编译和链接过程中,据我所知,实际上是llvm进行了优化("-O1", "-O2", "-O3", "-Os", "-flto").

但我就是无法理解howllvm参与其中.

看来编译源代码甚至不需要静态库,例如libLLVMCore.a,相反,对于 debian clang 软件包依赖于另一个名为libllvm-3.4(clang版本是3.4),其中包含libLLVM-3.4.so(.1),clang是否使用这个共享库进行优化?

我检查了一段时间 clang 源代码,发现include/clang/Driver/Options.td包含相关选项,但不幸的是我未能找到该源文件include该文件,所以我仍然不知道该机制。

我希望有人能给我一些提示。


(TL;DontWannaRead - skip to the end of this answer)

要正确回答您的问题,您首先需要了解编译器之间的区别前端 http://en.wikipedia.org/wiki/Compiler#Front_end and back-end http://en.wikipedia.org/wiki/Compiler#Back_end(尤其是第一个)。

Clang 是一个编译器前端 (http://en.wikipedia.org/wiki/Clang http://en.wikipedia.org/wiki/Clang) 适用于 C、C++、Objective C 和 Objective C++ 语言。

Clang 的职责如下:

即从 C++ 源代码(或 C、Objective C 等)翻译为LLVM IR http://llvm.org/docs/LangRef.html,该代码应该做什么的文本低级表示。为了做到这一点,Clang 使用了许多子模块,您可以在任何像样的编译器构建书籍中找到这些子模块的描述:词法分析器、解析器 + 语义分析器 (Sema) 等。

LLVM http://en.wikipedia.org/wiki/LLVM是一组库,其主要任务如下:假设我们有以下 C++ 函数的 LLVM IR 表示

int double_this_number(int num) {
    int result = 0;
    result = num;
    result = result * 2;
    return result;
}

LLVM 传递的核心应该optimizeLLVM 红外代码:

如何处理优化的 LLVM IR 代码完全取决于您:您可以将其转换为 x86_64 可执行代码或对其进行修改,然后将其吐出为 ARM 可执行代码或 GPU 可执行代码。这取决于您的项目的目标。

“后端”一词经常令人困惑,因为有许多论文将 LLVM 库定义为编译器链中的“中间端”,并将“后端”定义为执行代码生成的最终模块(LLVM IR 到可执行代码或其他不再需要编译器处理的代码)。其他来源将 LLVM 称为 Clang 的后端。无论哪种方式,它们的角色都很明确,并且提供了强大的机制:无论您的目标语言是什么(C++、C、Objective C、Python 等),如果您有一个将其转换为 LLVM IR 的前端,您就可以将其转换为 LLVM IR。可以使用同一组 LLVM 库来对其进行优化,并且只要您有适合您的目标架构的后端,就可以生成优化的可执行代码。

回想一下 LLVM 是一组库(不仅是优化过程,还包括数据结构 http://llvm.org/docs/ProgrammersManual.html#picking-the-right-data-structure-for-a-task、实用模块、诊断模块等),Clang 还利用manyLLVM 库在其前端过程。你真的无法撕裂everyLLVM 模块远离 Clang,因为后者是建立在前一组之上的。

至于为什么 Clang 被称为“编译驱动程序”:Clang 管理解释命令行参数(描述和许多声明是TableGen http://llvm.org/docs/TableGen/d 并且他们可能需要的不仅仅是一个简单的 grep 来浏览源代码),决定哪个Jobs和要执行的阶段,设置CodeGenOptions根据所需/可能的优化和转换级别并调用适当的模块(clangCodeGen in BackendUtil.cpp是用要应用的优化填充模块传递管理器的工具)和工具(例如 Windowsld链接器)。它从头到尾引导编译过程。

最后,我建议阅读 Clang 和 LLVM 文档,它们非常具有解释性,您的大多数问题应该首先在那里寻找答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

clang 如何引导 C/C++ 代码优化? 的相关文章

  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 冒号在c中起什么作用?

    我在课堂上得到了这个例子 但我不确定它的作用 我知道冒号添加了一个位字段 但我仍然不确定这个问题 a b gt 0 3 1 运算符称为条件运算符 If b值为 gt 0 价值3被分配给a否则值1被分配给a 以 Kernighan Ritch
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有

随机推荐