llvm

学习 LLVM(10) ilist.h

北慕城南 提交于 2020-02-29 13:20:05
位于 llvm/include/llvm/[[ADT]]/ilist.h == 简介 == 主要实现侵入式链接列表模板(Intrusive Linked List Template),实际是双向的列表。 主要类是 iplist, ilist 用于实现 列表模板。 其它是主要类的辅助的 iterator, traits 的实现。 这个文件定义类用于实现一个侵入式(intrusive)双向链接列表,也即列表中每个元素节点必须包含一个 next 和 previous 字段来作为链表指针。 This file defines classes to implement an intrusive doubly linked list class(i.e. each node of the list must contain a next and previous field for the list. == 实现的类 == * ilist_nextprev_traits -- 提供 T 类型缺省 get|set Prev|Next 访问策略。 * ilist_sentinel_traits -- 哨兵(sentinel)节点新建、删除、访问策略。 * ilist_node_traits -- 节点缺省操作策略实现。 * ilist_default_traits -- 缺省的 next,prev

关于llvm后由lldb和gdb

不问归期 提交于 2020-02-29 08:42:44
只是知道 XCode4.0以后,编译器换成了 LLVM 编译器 2.0 肯定是因为 LLVM 更完美,因为人都是喜欢追求更完美的东西。不然也不会轻易更换,search了一篇才了解到: 与以前相比,更加强大: 1.LLVM 编译器是 下一带开源的编译技术 . 完全支持C, Objective-C, 和 C++. 2.LLVM 速度比 GCC快两倍 ,建立的程序也会运行的更快. 因为它更好的利用现代的芯片的结构. 3.LLVM 和Xcode 4完全的整合 在一起.包括关键字高亮,代码完整性等全都是由LLVM语法分析器来分析的. 这样可以在编辑的时候就可以很好的了解你的代码. 编译器进化之后,控制台调试命令前缀,也由原来的gdb更改成了lldb。当然以前的gdb命令如今还是可以完美的使用的。 关于调试的技巧和命令,其实我个人觉得在xcode里面用的很好。 用的比较多的命令就po 一个object,比较多的调试技巧就是添加一个exception断点。这个真的很好用,除了你的nib文件由野指针。一般都能准确定位你的异常在哪儿。 但是nib文件的也指针也是很好定位的。比如你nib文件中一个button指向的那个method找不到,lldb将给你 -[LoginViewController onClickLogin:]: unrecognized selector sent to

llvm每日谈之二 LLVM IR

北城以北 提交于 2020-02-29 07:47:18
作者: snsn1984 在介绍LLVM IR之前,我们需要先了解下LLVM的结构。传统的静态编译器分为三个阶段:前端、优化和后端。 LLVM的三阶段设计是这样的: 这样做的优点是如果需要支持一种新的编程语言,那么我们只需要实现一种新的前端。如果我们需要支持一种新的硬件设备,那我们只需要实现一个新的后端。而优化阶段因为是针对了统一的LLVM IR,所以它是一个通用的阶段,不论是支持新的编程语言,还是支持新的硬件设备,这里都不需要对优化阶段做修改。所以从这里可以看出LLVM IR的作用。 LLVM IR主要有三种格式:一种是在内存中的编译中间语言;一种是硬盘上存储的二进制中间语言(以.bc结尾),最后一种是可读的中间格式(以.ll结尾)。这三种中间格式是完全相等的。 LLVM IR是LLVM优化和进行代码生成的关键。根据可读的IR,我们可以知道再最终生成目标代码之前,我们已经生成了什么样的代码。而且根据IR,我们可以选择使用不同的后端而生成不同的可执行代码。同时,因为使用了统一的IR,所以我们可以重用LLVM的优化功能,即使我们使用的是自己设计的编程语言。 如果想直观的看下llvm的IR到底是什么样的,可以先写一个helloworld的程序,文件名字叫做hello.c。根据下列文档的步骤配置llvm: http://clang.llvm.org/get_started.html

开发和调试第一个 LLVM Pass

孤人 提交于 2020-02-28 22:37:59
1. 下载和编译 LLVM LLVM 下载地址 http://releases.llvm.org/download.html , 目前最新版是 6.0.0,下载完成之后,执行 tar 解压 llvm 包: tar -xzvf llvm-6.0.0.src.tar.xz 再下载 Clang 解压: tar -xzvf cfe-6.0.0.src.tar.xz 将 cfe-6.0.0.src 目录复制到 llvm-6.0.0.src/tools,重命名为 clang。通过 brew 安装 cmake: brew install cmake 然后在命令行下切换到 llvm-6.0.0.src 目录,新建 build 目录,切换到 build 目录执行 cmake 生成配置文件,命令如下: mkdir build cd build cmake -G Xcode CMAKE_BUILD_TYPE="Debug" .. 执行完成之后,可以看到 Xcode 的工程文件 LLVM.xcodeproj,打开工程文件,会提示是否自动创建 Schemes,如图所示: 点击 Manually Manage Schemes 手动创建,添加 ALL_BUILD,如图所示: 然后在 Xcode 上进行编译,编译过程比如慢,可能得二十分钟到半小时左右,全部编译完文件会在 11G 左右。 2. 编写 Pass 代码

llvm教程

空扰寡人 提交于 2020-02-28 22:30:45
study_obscure 混淆反混淆视频教程 第一章 llvm项目简单使用 第一课 llvm项目 编译(windows xcode) 链接: https://pan.baidu.com/s/1ILvoVripdAcHF9NLKJYZ2A https://github.com/haidragon/study_obscure/blob/master/llvm_note/class1/note.md 第二课 clang编译与调试(xcode) 链接: https://pan.baidu.com/s/1MHvB4IysZ0v_0vMz1NJOhA https://github.com/haidragon/study_obscure/blob/master/llvm_note/class2/note.md 第三课 clang插件编写 链接: https://pan.baidu.com/s/1iwi0AIcis8M8ZBIBg27Nwg https://github.com/haidragon/study_obscure/blob/master/llvm_note/class3/note.md 第四课 实现一个自定义检查规范的 Clang 插件 链接: https://pan.baidu.com/s/1rWOowwOMAm2SrOh-nxPT6w https://github.com

LLVM到底是什么?

北城以北 提交于 2020-02-26 23:07:58
我一直都在听有关LLVM的信息。 在Perl中,然后在Haskell中,然后有人以其他某种语言使用它? 它是什么? #1楼 LLVM编译器基础结构对于在代码上执行优化和转换特别有用。 它还由许多服务于不同用途的工具组成。 llvm-prof是一种性能分析工具,可让您执行执行性能分析以识别程序热点。 Opt是一种优化工具,可提供各种优化途径(例如,消除死代码)。 重要的是,LLVM为您提供了编写自己的通行证的库。 例如,如果您需要对传递给程序某些功能的某些参数进行范围检查,则编写一个简单的LLVM Pass就足够了。 有关编写自己的通行证的更多信息,请查看此 http://llvm.org/docs/WritingAnLLVMPass.html #2楼 LLVM基本上是一个用于构建编译器和/或面向语言的软件的库。 基本要点是,尽管您拥有可能是最常见的编译器套件的gcc,但它并不是可重用的。 从gcc提取组件并使用它来构建您自己的应用程序很难。 LLVM通过构建一套“模块化和可重用的编译器和工具链技术”很好地解决了这个问题,任何人都可以使用它来构建编译器和面向语言的软件。 #3楼 LLVM是用于构建,优化和产生中间和/或二进制机器代码的库。 LLVM可用作编译器框架,您可以在其中提供“前端”(解析器和词法分析器)和“后端”(将LLVM的表示形式转换为实际机器代码的代码)。

Cmake和NdkBuild方式链接交叉编译的动态库-->杂记

断了今生、忘了曾经 提交于 2020-02-26 03:24:48
前提介绍: a.加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译 b.https://developer.android.google.cn/ndk/guides/android_mk:官方Android.mk介绍指南 c.看动态库的依赖库有哪些: $ndk64Readelf -d libplay.so d.看动态库定义的方法:$ndkNm64 -D libplay.soo e.compile 4 steps :(gcc xxx.c -o xxx) gcc -E xxx.c -o xxx.i 预处理 gcc -S xxx.i -o xxx.s 汇编 gcc -c xxx.s -o xxx.o 机器代码编译 gcc -C xxx.o -o xxx.a 链接(为了可执行) run it : ./xxx.a or ./xxx EScC export zzm="zengzeming" export ndkClang="/zengzeming/ndk/android-ndk-r21-beta2/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang" export ndkLink="--sysroot=/zengzeming/ndk/android-ndk

Java代码的汇编细节

一世执手 提交于 2020-02-25 17:06:18
尽管在Java语言中,存在一个“Java虚拟机规范”,规范了Java中每一条指令所能执行的动作以及堆栈的分布做了规范,但是随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述产生越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”——即实现只能保证规范描述等效。 基于上面的原因,我们分析程序的执行语义问题(虚拟机做了什么)时,在字节码层面上分析完全可行,但分析程序的执行行为问题(虚拟机是怎样做的、性能如何)时,在字节码层面上分析就没有什么意义了,需要通过其他方式解决。 分析程序如何执行,通过软件调试工具(GDB、Windbg等)来断点调试是最常见的手段,但是这样的调试方式在JVM中会遇到很大困难,因为大量执行代码是通过JIT编译器动态生成到CodeBuffer中的,没有很简单的手段来处理这种混合模式的调试(不过相信虚拟机开发团队内部肯定是有内部工具的)。因此我们要通过一些曲线手段来解决问题,基于这种背景下,本文的主角——HSDIS插件就正式登场了。 1.准备工作   HSDIS是一份Sun官方推荐的HotSpot VM JIT编译代码的反汇编插件,它包含在HotSpot VM的源码之中,在Project Kenai( http://kenai.com/projects/base-hsdis )也可以下载到单独的源码。它的作用是让HotSpot的

LLVM与Clang

╄→尐↘猪︶ㄣ 提交于 2020-02-21 10:31:40
随着 Android P 的逐步应用,越来越多的客户要求编译库时用 libc++ 来代替 libstdc++。libc++ 和 libstdc++ 这两个库有关系呢?它们两个都是 C++ 标准库,libc++ 是针对 Clang 编译器特别重写的 C++ 标准库,而 libstdc++ 则是 GCC 的对应 C++ 标准库了。从 Android 市场来说,Android NDK 已在具体应用中放弃了 GCC,全面转向 Clang。 Android NDK 从 r11 开始建议大家切换到 Clang,并且把 GCC 标记为 deprecated,将 GCC 版本锁定在 GCC 4.9 不再更新; Android NDK 从 r13 起,默认使用 Clang 进行编译,但是暂时也没有把 GCC 删掉,Google 会一直等到 libc++ 足够稳定后再删掉 GCC; Android NDK 在 r17 中宣称不再支持 GCC 并在后续的 r18 中删掉 GCC,具体可见 NDK 的版本历史。 接下来,简要的介绍一下 Clang。Clang 是一个 C、C++、Objective-C 和 Objective-C++ 编程语言的编译器前端,采用底层虚拟机(LLVM)作为后端。至于为什么有了 GCC 还要开发 Clang?Clang 相比 GCC 又有什么优势呢?网上有很多信息可以参考

编译安装 LLVM

好久不见. 提交于 2020-02-17 14:01:01
本文记录 LLVM 的安装过程,比较繁琐,使用 LLVM 3.4 操作系统:CentOS 6.6 64 位 1. 下载需要的软件 相关软件下载地址: http://llvm.org/releases/download.html#3.4 我们需要下载代码如下: Clang source code LLVM source code Compiler RT source code 下载之后,分别解压各个压缩包,然后把 clang 放到 llvm 源码的 tools 目录中,并重命名为 clang,把 compiler-rt 放到 llvm 源码中的 projects 目录中,重命名为 compiler-rt: tar -zxf clang-3.4.src.tar.gz tar -zxf compiler-rt-3.4.src.tar.gz tar -zxf llvm-3.4.src.tar.gz mv clang-3.4 llvm-3.4/tools/clang mv compiler-rt-3.4 llvm-3.4/projects/compiler-rt 2. 解决软件依赖 LLVM 3.4 所依赖的各个软件及其版本号如下: Package Version Notes Download Links GNU Make 3.79, 3.79.1 Makefile/build