LLVM浅析

news/2024/7/20 21:33:58 标签: swift, 开发语言, ios

LLVM的探索

编译器的作用就是将源码编译成可以运行的程序。
终端按顺下敲入
vim hello.py
python hello.py

vim hello.c
clang hello.c
./a.out
vim main.m

#imclude<stdio.h>
int main(int argc, char *argv[]){
	printf("hello word!");
};

LLVM概述

请添加图片描述
请添加图片描述
从写代码->LLVM 的动态流程 ->APP运行:
源代码- 预编译 - 编译 - 链接.o - 可执行文件(静态连接和动态连接)- 可执行文件 - dyld - libsystem

Frontend 编译器前端

在这里插入图片描述

Optimizer 优化器

优化器负责进行各种优化。改善代码的运行时间,例如消除多余的计算等

backend 后端/ CodeGenerator代码生成器

将代码映射到目标的指令集。声称机器语言,并且进行机器相关的代码优化。

iOS的编译器架构

Objective C/C/C++使用的编译器前端是Clang,Swift是Swift,后端都是LLVM
在这里插入图片描述
请添加图片描述

编译流程

通过命令可以打印源码的编译阶段

clang -ccc-print-phases main.m

在这里插入图片描述
请添加图片描述
在这里插入图片描述
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
会把代码切成一段段的如下:
请添加图片描述
在这里插入图片描述

clang -s -fobjc-arc -emit-llvm main.m

生成的main.II如图 :
请添加图片描述
请添加图片描述

bitCode

xcode7 以后开启bitCode苹果会做进一步的优化。生成.bc的中间代码。
我们通过优化后的IR代码生成.bc代码

clang -emit-llvm -c main.ll -o main.bc 

生成汇编代码

我们通过最终的.bc或者.ll代码生成汇编代码

clang -S -fobjc-arc main.bc -o main.s 

clang -S -fobjc-arc main.ll -o main.s 

生成的汇编代码也可以进行优化

clang -Os -S -fobjc-arc main.m -o main.s

生成目标文件(汇编器)

目标文件的生成,是汇编器以汇编代码作为输入,将汇编代码转换为机器代码,最后输出目标文件。

clang -fmodules -main.s -o main.o

在这里插入图片描述
生成可执行文件(连接)
连接器把编译产生的.o文件和(.dylib.a)文件,生成一个mach-o文件。

clang main.o -o main

请添加图片描述


http://www.niftyadmin.cn/n/17824.html

相关文章

基于SINR最优的VoLTE异频切换优化

【摘 要】随着低频段重耕,城区LTE网络实现了1.8 G/2.1 G/800 MHz重叠覆盖,优化异频切换以利用不同频段覆盖的互补性提升VoLTE用户感知是网络优化的重要课题。通过分析路径损耗、SINR、切换对MOS的影响,SINR是其中决定性的因素,根据测试获取的RSRP和SINR之间的映射关系,提…

C++ 文件的读写操作

前言 最近在学习有关于卡尔曼滤波方面的知识&#xff0c;其中会涉及到一部分的测量数据和预测数据。这里记录一下C关于数据的读写操作 写数据到文件中 关于文件流的操作在网站菜鸟教程中有一些简介&#xff0c;这里我就不再重复记录一些基础操作了&#xff0c;下面就以一个实…

CAPL控制程控电源

文章目录 前言一、环境搭建二、程控电源调试助手三、CAPL控制程控电源脚本四、执行结果前言 汽车电子测试过程中,除了实车测试,还有台架测试,在进行台架测试时,都需要通过电源来模拟汽车电瓶给ECU供电,如果要进一步进行比较高效的压力测试或自动化测试,就需要用到程控电…

MATLB|电动车智能充电模式及电力高峰需求预测

目录 0 写在前面 1 电动车 1.1 电动车&#xff08;EV&#xff09; 1.2 电动汽车充电 1.3 智能充电和车联网&#xff08;V2G&#xff09; 1.4 V2G 应用 1.5 可再生能源可用性 1.6 基于价格的收费 2 电动车智能充电 2.1 智能充电 2.2 实时电价 2.3 智能充电模式——算…

HTML大学班级活动网页设计 、大学校园HTML实例网页代码 、本实例适合于初学HTML的同学

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

12 CPP引用

引用的基本概念 引用变量是C新增的符合类型。 引用是已定义的变量的别名。 引用的主要用途是用作函数的形参和返回值。 声明/创建引用的语法&#xff1a; 数据类型 &引用名原变量名; 注意&#xff1a; 1 引用的数据类型要与原变量的数据类型相同。 2 引用名和原变量…

Linux--进程控制

前言&#xff1a; 这篇文章主要是讲解Linux下的进程控制&#xff0c;我们会学习到进程等待&#xff0c;进程程序替换, 微型shell&#xff0c;重新认识shell运行原理 。最后也编写了一个属于我们自己的shell&#xff0c;尽管功能不够齐全&#xff0c;但是还是感觉挺有意思&#…

NC22 合并两个有序的数组 - java语言实现

文章目录1. 题目描述2. 题目解读3. 思路4. 代码实现总结✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来&#xff01; 编程真是一件很奇妙的东西。你只是浅尝辄止&#xff0c;那么只会觉得枯燥乏味&#xff0c;像对待任务似的应付它。但你如果深入探索&#xff0c;就会…