首页 > 其他分享 >Clang参数中的-Xclang/-mllvm意义与Clang的Driver架构

Clang参数中的-Xclang/-mllvm意义与Clang的Driver架构

时间:2023-08-17 16:36:05浏览次数:40  
标签:LLVM CC1 Driver Clang 参数 Xclang mllvm

title: Clang参数中的-Xclang/-mllvm意义与Clang的Driver架构
date: 2023-08-17 00:00:00
updated: 2023-08-17 00:00:00
lang: zh-CN
categories:
- [LLVM]
tags:
- LLVM
- 编译
toc: true

文章首发于 https://wwh1004.com/the-meaning-of-xclang-mllvm-in-clang-arguments-and-the-driver-architecture-of-clang/

本文介绍了为什么Clang的有些参数需要通过-Xclang传递,有些又需要通过-mllvm传递,这其中与Clang的Driver架构密切相关。

Xclang参数

-Xclang参数是将参数传递给Clang的CC1前端。

比如想要禁用所有LLVM Pass的运行,也就是生成无任何优化的IR,那么你就要使用-disable-llvm-passes参数传递给CC1。但是这个参数并没有Clang Driver的表示形式(也就是不使用-Xclang传递给CC1),那么你就需要写-Xclang -disable-llvm-passes把参数透过Clang Driver把参数传递给CC1。

mllvm参数

-mllvm参数的作用是将参数传递给作为中后端的LLVM。

如果参数是在LLVM中后端定义的,那么直接把参数给Clang的Driver或者CC1都是不行的,需要使用-mllvm将参数跳过Clang的Driver和CC1传递到LLVM。比如想要在Pass运行完成后输出IR,那么就需要使用-mllvm --print-after-all把参数传给LLVM。

Clang的Driver架构

为什么要加-Xclang和-mllvm参数?直接丢给Clang不行么?那么这就要说到Clang的Driver架构和LLVM整体设计了。

我们平常使用的可执行文件clang.exe其实只是一个Driver,用于接收gcc兼容的参数(clang++.exe/clang-cl.exe同理,接受g++/msvc兼容的参数),然后传递给真正的clang编译器前端,也就是CC1。CC1作为前端,负责解析C++源码为语法树,转换到LLVM IR。比如选项A在gcc中默认开启,但是clang规则中是默认不开启的,那么为了兼容gcc,clang.exe的Driver就要手动开启选项A,也就是添加命令行参数,将它传递给CC1。

在CC1工作完成后,所有C++源码都转换到了LLVM IR,前端Action也就结束了。接下来就是LLVM中端和后端的工作了。LLVM中端负责执行通用优化,也就是语言无关架构无关的优化。在中端优化完成后,LLVM IR会交给后端进行目标代码生成,最后生成目标特定的机器码。关于LLVM中端的详细流程,可以看这篇文章 LLVM: The middle-end optimization pipeline

从这里我们可以知道,Clang和LLVM不是设计为一个整体的,而是松耦合的。Clang的Driver可以接收兼容各种编译器的参数,然后将它们转换为Clang规则的前中后端参数。Clang的前中后端不存在关联,开关特定的选项需要将参数分别传递给所属的前中后端。

标签:LLVM,CC1,Driver,Clang,参数,Xclang,mllvm
From: https://www.cnblogs.com/wwh1004/p/17638013.html

相关文章

  • 软件测试|Chrome 115之后的版本,如何更新driver?
    2023年8月,chrome自动更新到115版本了,而从https://registry.npmmirror.com/binary.html?path=chromedriver/处只能下载114版本的driver,无法工作。参考:https://blog.csdn.net/Tester_muller/article/details/132086996  找到https://googlechromelabs.github.io/chrome-for......
  • webdriver 的三种等待方式(强制等待、隐式等待、显示等待)
    在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行。我们可以通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三......
  • 38 pinctrl(四)pinctrl driver
    前言一些使用技巧查看设备支持的pinctrlls/sys/kernel/debug/pinctrl/查看pinctrl中支持的引脚、组、functioncat/sys/kernel/debug/pinctrl/20e0000.iomuxc/pinscat/sys/kernel/debug/pinctrl/20e0000.iomuxc/pingroupscat/sys/kernel/debug/pinctrl/20e0000.io......
  • 当打开百度,定位输入报错怎么解决driver.find_element_by_id('kw').send_keys("seleniu
    报错如下: 解决方案,改变编写方式,引入fromselenium.webdriver.common.byimportBy  源码:例子说明: 打开百度,输入selenium进行搜索。fromseleniumimportwebdriverfromtimeimportsleepfromselenium.webdriver.common.byimportBydriver=webdriver.Chrome()d......
  • Golang - 原生go-sql-driver:出现invalid connection报错
    在使用go-sql-driver/msqyl驱动过程中,偶现invalidconnection错误,字面上看就是无效连接的意思。开始以为是数据库压力问题或是网络不好,后来发现服务器和数据库是走内网的,网络出现问题几率非常小;只是在测试服务器上跑,没多少连接,不存在压力问题。golang数据库驱动维护一个连接池,如......
  • 如何在 Cent OS 7 操作系统安装 Clang
    一、介绍Clang是一种基于LLVM的C、C++、Objective-C和Objective-C++编译器,它提供了一个高效的编译流程,并且能够生成高质量的代码。在本文中,我们将介绍如何在CentOS7上安装Clang。二、安装步骤更新系统在安装Clang之前,我们需要确保系统处于最新状态。可以使用以......
  • Bazel 如何生成 clangd/clang-tidy 所需的 compile_commands.json
    VSCode中如何使用clang-tidy安装clangd插件禁用ms-cpp插件(VSCode会自动提示有冲突)生成clangd所需的compile_commands.json文件如何生成compile_commands.json文件修改WORKSPACE,添加以下内容load("@bazel_tools//tools/build_defs/repo:http.bzl","http_a......
  • clang 静态编译 ffmpeg
    文档说明:只记录关键的地方;发文时间:2023-08-06意义:静态编译ffmpeg,可自由裁剪,使用libc构建;支持macos、linux构建;生成库依赖库图环境:alpine:3.17dockerclang备注:大部分软件源代码来源于github.com,下载过程断断续续的。请自备代理借助swoole-cli已经编写好......
  • ios自动化-Xcode、WebDriverAgent环境部署
    环境准备:Mac电脑一台(更新到最新的macOS,此文档使用的为macOS12.3.1,Intel芯片)Xcode最新稳定版(此文档使用的为13.4.1)IOS设备(此文档使用了10.3.3-15.1均有,且都安装WebDriverAgent成功)保证自己电脑有大于25G的可用内存空间,Xcode很大!Xcode下载https://developer.apple.com/xcode/r......
  • 记录一下Linux下远程访问Mysql连接不上,报错The driver has not received any packets
    问题所在远程服务器已经提前安装好了MySQL,版本也是对应的。在ssh上可以正常进入MySQL数据库。但是其他地方无法连接上,例如navicat和IDE内部都发生报错。排查1.首先排查了一下远程服务器上mysql服务状态是否处于正常运行状态sudoservicemysqldstatus没有发生问题。2.检......