Clang学习历程 概述

keil出现fatal error: error in backend: ran out of registers during register allocation的解决方案 最近用GD32E230单片机开发一款产品在配置GPIO时出现了以下错误: Build started: Project: **** *** Using Compiler 'V6.12', folder: 'D:\Keil_v5\ARM\ARMCLANG\Bin' Build target 'Target 1' fatal error: error in backend: ran out of r... 阅读详情

介绍

Clang

Clang是LLVM(Low Level Virtual Machine)项目提供的工具链中的编译器的前端部分

LLVM项目是模块化和可重用的编译器和工具链技术的集合,LLVM的一大特色就是,有着独立的、完善的、严格约束的中间代码表示。这种中间代码,就是LLVM的字节码,是LLVM抽象的精髓,前端生成这种中间代码,后端自动进行各类优化分析,让用LLVM开发的编译器,都能用上最先见的后端优化技术。

编译器编译流程如下

编译流程

来自《编译原理》

编译器分成前端与后端两部分

前端负责处理源代码,后端负责生成目标代码


来自参考链接3

环境

macOS Hign Sierra 10.13.6
Xcode10.1

编译

获取llvm源代码

% git clone https://git.llvm.org/git/llvm.git/

获取Clang源代码

% cd llvm/tools
% git clone https://git.llvm.org/git/clang.git/

获取compiler-rt源代码

## 定位到llvm工程目录下
% cd llvm
% git clone https://git.llvm.org/git/compiler-rt.git/

获取libomp源代码

% cd llvm
% git clone https://git.llvm.org/git/openmp.git/

获取libcxx和libcxxabi源代码

% cd llvm
% git clone https://git.llvm.org/git/libcxx.git/
% git clone https://git.llvm.org/git/libcxxabi.git/

获取测试用例

% cd llvm
% git clone https://git.llvm.org/git/test-suite.git/

Clang 使用CMake(一个用于构建,测试和打包软件的开源跨平台工具系列)进行构建

# LLVM 禁止源码内编译(in-tree build is not supported),创建一个与llvm工程同级的build目录
% cd src/
% mkdir build
% cd build 

## 安装cmake
% brew install cmake

## -G <generator-name>
##             Specify a build system generator.
## cmake [{-D <var>=<value>}...] -P <cmake-script-file>
## Create or update a cmake cache entry.

##              When cmake is first run in an empty build tree, it ## creates a CMakeCache.txt file and populates it with customizable settings for
##              the project.  This option may be used to specify a setting that takes priority over the projectas default value.  The option may
##              be repeated for as many cache entries as desired.
## 会被存在build目录下的CMakeCache.txt中
## -Wno-dev 忽略开发警告
% cmake -G Ninja ../llvm/ \
  	-DCMAKE_INSTALL_PREFIX=/opt/llvm  \
    -DCMAKE_BUILD_TYPE=Release \
    -DLLVM_ENABLE_FFI=ON \
    -DLLVM_BUILD_LLVM_DYLIB=ON \
    -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
    -DLLVM_TARGETS_TO_BUILD="host;AMDGPU" \
    -Wno-dev

## 安装 ninja
## Ninja is a small build system with a focus on speed. 
## It differs from other build systems in two major respects: it is designed to have its input files generated by a higher-level build system, and it is designed to run builds as fast as possible.
% brew install ninja

## -j N     run N jobs in parallel [default=6, derived from CPUs available]
## CMake Error at cmake_install.cmake:36 (file):
##  file INSTALL cannot set permissions on "/opt/llvm/include/llvm"
## 加上sudo
% sudo ninja -j4 install

替换Clang

## 查看系统的Clang的位置
~% which clang
/usr/bin/clang

~% clang -v 
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

根据参考链接7

新建Xcode工程

创建用户自定义配置CC,并设置DEBUG时的值为编译完成后Clang二进制的位置。

⌘ B 编译,查看编译输出的日志,证明已经使用了编译的Clang

错误原因:

Unknown argument: '-index-store-path'

根据参考链接10,在Build Setting 中搜索index并将Enable Index-While-Building Functionality选项设置为NO

⌘ B

错误原因:

fatal error: error in backend: No available targets are compatible with triple "arm64-apple-ios9.0.0"
clang-8: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 8.0.0 (https://git.llvm.org/git/clang.git/ a6eb16ed631365f3bbadd0450ab52746c151794d) (https://git.llvm.org/git/llvm.git/ 1c98a2b870d058132698ae4d67ef954b13dc41b4)
Target: aarch64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /opt/llvm/bin

分析: 因为该手机架构是arm64而cmake编译时指定的是 -DLLVM_TARGETS_TO_BUILD="host;AMDGPU",并没有对应的架构

HowToBuildOnARM

cmake $LLVM_SRC_DIR -DCMAKE_BUILD_TYPE=Release
-DLLVM_TARGETS_TO_BUILD=“ARM;X86;AArch64”

操作

## 重新编译
% cmake -G Ninja ../llvm/ \
  	-DCMAKE_INSTALL_PREFIX=/opt/llvm  \
    -DCMAKE_BUILD_TYPE=Release \
    -DLLVM_ENABLE_FFI=ON \
    -DLLVM_BUILD_LLVM_DYLIB=ON \
    -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
    -DLLVM_TARGETS_TO_BUILD="host;ARM;X86;AArch64" \
    -Wno-dev

## 确认
% grep -r "LLVM_TARGETS_TO_BUILD" CMakeCache.txt
CMakeCache.txt:LLVM_TARGETS_TO_BUILD:STRING=host;ARM;X86;AArch64

## 安装 只会处理有变更的部分
% sudo ninja -j4 install

⌘ B 成功

代码

TryLLVM

参考

  1. llvm.org
  2. 结构化编译器前端 Clang 介绍
  3. 编译器架构的王者LLVM
  4. cmake.org
  5. wiki-XcodeVersionInfo
  6. 下载标准库libcxx出现svn: E000104: Error running context: Connection reset by peer的解决方案
  7. 安装 LLVM + Clang
  8. 如何让Xcode使用clang的替代版本
  9. Why can’t I create a directory under /opt without sudo
  10. compilation-error-when-using-xcode-9-0-with-clang-cannot-specify-o-when-genera
LLVM 学习(三) -样例学习 LLVM 学习(三) -样例学习 @2022-04-17 09:28:38 @sizaif LLVM IR 样例学习 1. 基本语法 编写c代码 # hello.c #include <stdio.h> int add(int a,int b){ return a + b; } int main() { int a = 10; int b = 22; printf("%d\n",add(a,b)); return 0; } 将c源码转换为LLVM IR-ll 阅读详情

相关推荐

关于llvm-clang用ASTMatcher查找全局变量的一点心得

    这学期在软件体系结构课上,被要求基于llvm-clang进行二次开发,查找项目中的全局变量,以及全局变量被调用的相关函数。本来传统思路是写一个checker来完成这个任务,但机缘巧合下了解到ASTMatcher可以作为一个很好的替代方案。由于与ASTMatcher相关的中文资料甚少,所以写下此博客,以记录本蒻的艰辛历程。由于是对学习过程加以记录,如果出现错误和纰漏还请见谅。    llvm...

z_zys的博客 3092

androidstudio2.3.1 ndk 编译错误error: clang frontend command failed with exit code 70 (use -v to

问题描述android ndk编译公司旧代码时出现如下错误: clang.exe: error: clang frontend command failed with exit code 70 (use -v to see invocation)原因分析&查找复制出Gradle Console中的所有记录,在sublime中查看FAILED: D:\Android\sdk\ndk-bundle\to

gdyshi的博客 7928

spake2-wasm

建筑 由改编并发布到npm 确保您有rust和cargo ,以及现代的clang 。 安装wasm-pack : cargo install wasm-pack 然后构建: wasm-pack build No available targets are compatible with triple "wasm32-unknown-unknown" 此错误表示您的clang已过期:例如,您使用的是内置版本的MacOS。 在Mac上,您可以通过以下方式解决此问题: brew install llvm 然后为wasm-pack命令添加前缀,如下所示: PATH=/usr/local/opt/llvm/bin: $PATH wasm-pack build --target=nodejs 在Linux上,确保您拥有最新的llvm(10+)和clang(12+)。 llvm-

LLVM-Clang交叉编译详细教程

最近自己写了个C++的小项目,想在Windows编译出其他平台的二进制文件的话,只能交叉编译了,于是就选了LLVM的Clang编译器来使用。

NueXini的博客 1万+

Rust-wasm-nodejs.pdf Rust ➡ WebAssembly Node.js

Rust ➡ WebAssembly Node.js Introduction to SSVM is a high performance, extensible, and hardware optimized WebAssembly Virtual Machine for cloud, AI, and blockchain applications.

spake2-ee:libsodium 1.0.16+ 的 SPAKE2+ Elligator 版实现

SPAKE2+EE libsodium 1.0.17+ 的 SPAKE2+EE(SPAKE2+ Elligator 版)实现 模糊 SPAKE2 是一种密码验证密钥协商协议,允许共享密码的两方安全地相互验证并派生临时会话密钥。 它安全且计算效率高。 这是变体的实现。 它比原来的 SPAKE2 略快,并且具有更好的安全假设。 它也得到了增强,这意味着即使存储在服务器上的凭据被泄露,这也不足以登录。 用法 SPAKE2 协议只需要一次往返来派生共享密钥,另一次往返来进行相互认证。 /* A client identifier (username, email address, public key...) */ # define CLIENT_ID " client " /* A server identifier (IP address, host name,

Clang学习历程 编译过程-词法分析

前言 《编译原理》中提到 编译器的第一个步骤是词法分析(Lexical Analysis)或扫描。词法分析器读入组成源程序的字符流,并且将它们组织成为有意义的词素(lexeme)的序列。对于每个词素,词法分析产生如下形式的词法单元(token)作为输出: &amp;lt;token-name,attribute-value&amp;gt; token-name 是一个语法分析步骤要使用的抽象符号 att...

ioSugar 4980

【AI深究】合成数据(Synthetic Data)深度解析:原理、算法与工程实践——全网最详细流程|核心原理、主流方法、数学表达、工程实践与细节、未来趋势|GAN、VAE、语言模型LLM合成如GPT

大家好,我是爱酱。本篇延续将会系统梳理合成数据(Synthetic Data)的核心原理、主流方法、数学表达、工程实践与未来趋势,结合数学公式,帮助你全面理解这一AI建模的关键技术。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 4907

LLVM 与 Clang 介绍

晚上听国软徐纪元学弟给我说起了他刚装上的 Mac Lion 操作系统,也说到了最近 Apple 推出的新版本的 Xcode 4.2 在 iOS 4、iOS 5 程序开发中,加入了 automatic reference counting 功能,也即是开发者不再需要手动的做内存管理

wangwang4whu 1万+

玩转Isaac Sim动态控制:从随机舞动到精准操控Franka的5种控制模式实测

本文深入实测了在NVIDIA Isaac Sim仿真平台中,利用Dynamic Control模块对Franka机械臂进行精准操控的五种核心模式:位置控制、单关节位置控制、速度控制、单关节速度控制和力矩控制。通过详细的代码示例和对比分析,阐述了每种模式的适用场景、参数调优技巧及从随机运动到闭环控制的实现路径,为机器人算法验证提供了实用指南。

night的博客 807

Joern实战:从代码导入到Python分析的全流程避坑指南(附常见错误解决方案)

本文详细介绍了Joern静态分析工具从代码导入到Python分析的全流程实践指南,包括环境配置、代码导入技巧、数据库服务优化、Python交互分析及性能调优等关键步骤。特别针对常见错误提供了实用解决方案,帮助开发者高效进行代码安全分析和漏洞挖掘。

weixin_28309571的博客 138

LLVM与Clang介绍

LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/O

萱的house 1628

数据库崩溃恢复机制:REDO日志与UNDO日志详解

在数据库管理系统中,事务的持久性和一致性是至关重要的。为了保证在系统崩溃或发生故障时数据不会丢失,数据库引入了恢复机制。其中,REDO日志和UNDO日志是两种关键的恢复技术。本文将详细描述这两种日志的作用、工作原理以及它们在数据库崩溃恢复中的应用。

My_wife_QBL的博客 1408

1131_使用clang-format进行代码格式排版

使用clang-format进行代码格式排版 Grey 全部学习汇总: GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 使用clang-format进行代码格式排版 前言 我自己写代码其实也经历了很多过程,前期的确是没有关注过什么代码风格或者排版。但是随着接触到的代码越来越多,发现没有一个统一良好的编码排版风格理解管理一个工程都是很有挑战的。于是,不仅仅从编码的定义风格上,从排版的布局

小灰笔记 1975

北斗导航 | SPP、RTK、RTD、PPP-RTK、PPP算法原理,公式及完整matlab代码

开发参考:SPP适合入门学习GNSS定位原理和最小二乘。RTK是工程高精度定位主流方案,但依赖基站。PPP适合无基站区域的广域高精度应用。PPP-RTK是融合两者优点的新一代技术,但系统复杂度最高。· 代码资源:raPPPid(VieVS PPP)是功能完整的MATLAB开源PPP工具箱,支持多系统PPP-AR。MATLAB GPS Toolbox 提供从SPP到PPP的完整功能实现。· 实际应用:农业自动驾驶、无人机航测通常使用网络RTK;大地测量、地壳形变监测常采用PPP事后处理;

尘世冰封的专栏 821

Winform从入门到精通(38)——StatusStrip(史上最全)

本文介绍StatusStrip控件的详细用法,包含所有属性和事件,绝对史上最全!

qq_34059233的博客 2757

LLVM 和Clang简介

转载:http://blog.youkuaiyun.com/wwang196988/article/details/6628543  Apple 在Xcode 4.2 在 iOS 4、iOS 5 程序开发中,加入了 automatic reference counting 功能,也即是开发者不再需要手动的做内存管理了,不用纠结内存管理了,不再需要 retain release 了。 同时 Apple 现

滴水可以穿石 百炼才能成钢,谋全局而通一域 致广大而尽精微 456

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

clang编译内核_Android源码、内核编译

Android源码和内核的编译就是一场马拉松,每一个节点都耗时漫长,下载源码、编译源码、下载内核、编译内核,下载中途会断掉,编译中间会失败,求解再重来,又是一轮马拉松,于是每一步都要做好备份和记录,可是30G的源码(编译后已经达到70G)备份一次都需要好久。好在春节伊始我放弃了其他的学习,全力搞这个过程,终于算是拿下了。不过,漫漫长路,这只是一个开头。我编译的是Android最新稳定版本andro...

weixin_39776787的博客 2246

网格质量评价

CFD中评价网格质量的方法

B_etter_Man的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: ObjC Runtime 中 Weak 属性的实现 (中)
下一篇: Clang学习历程 编译过程-词法分析
忘川三
博客等级 码龄12年 208粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值