llvm

LLVM and visual studio .obj binary incompatibility

大兔子大兔子 提交于 2019-12-05 08:34:40
Does anyone know if LLVM binary compatibility is planned for visual studio combiled .obj and static .lib files? Right now I can only link LLVM made .obj files with dynamic libs that loads a DLL at runtime (compiled from visual studio). While there probably is very small chances that binary compatibility will happen between the two compilers, does anybody know why it is so difficult achieving this between compilers for one platform? As Neil already said, the compatibility includes stuff like calling convention, name mangling, etc. Though these two are the smallest possible problems. LLVM

Since when does Xcode no longer require forward method declarations and why?

£可爱£侵袭症+ 提交于 2019-12-05 07:27:47
I noticed that Xcode (or more precisely the Apple LLVM compiler?) does not longer require forward method declarations. In other words, the following code builds without warnings: @implementation Foo -(void) foo { [self bar]; } -(void) bar {} @end This used to throw a warning in -foo saying that Foo might not respond to -bar , right? Is the compiler smarter now or is this something else? I’m using Xcode 4.3.1 plus Apple LLVM compiler 3.1. Clay Bridges This has definitely changed, and it looks like such forward declarations are not required in Xcode 4.3 & later. Cf. Private Methods in Objective

Force Clang to “perform math early” on constant values

只愿长相守 提交于 2019-12-05 07:17:03
This is related to How to force const propagation through an inline function? Clang has an integrated assembler; and it does not use the system's assembler (which is often GNU AS (GAS)). Non-Clang performed the math early, and everything "just worked". I say "early" because @n.m. objected to describing it as "math performed by the preprocessor." But the idea is the value is known at compile time, and it should be evaluated early, like when the preprocessor evaluates a #if (X % 32 == 0) . Below, Clang 3.6 is complaining about violating a constraint. It appears the constant is not being

llvm编译系统结构分析

核能气质少年 提交于 2019-12-05 06:17:41
LLVM 编译系统分析 中间代码 工具集 编译流程 整个 LLVM 编译系统的组成可分成三部分:LLVM 中间代码,用于分析、 优化、代码生成等工作的集成库,以及建立在以上集成库基础之上的工具,包括汇 编器、链接器、调试器等等。本章将先依次分析这三个组成部分,然后再对 LLVM 的编译流程作详细的说明。 中间代码 LLVM 中间代码是一种采用 SSA 形式的 IR(Immediate Representation,中间 表达),使用的指令集为 LLVM 虚拟指令集。该指令集是一个类似 RISC(Reduced Instruction Set Computer,精简指令集计算机)的三地址指令集,含有简单的控制 指令和使用带类型指针的访存指令,拥有独立于高级语言和目标处理器的语法,易 于进行代码分析和优化。使用 LLVM 虚拟指令集的 LLVM 中间代码可以三种方式 存在:存在于内存中的编译器 IR、存在磁盘上的字节码(bytecode)、以及可供人 阅读的汇编代码。这三种存在方式是同一中间代码的不同表达形式,可分别用于: 在编译器执行编译遍时提供方便高效的中间代码转换或者中间代码分析、作为 JIT 编译器(Just-In-Time Compiler)在本地执行客户处理器代码的格式、以及方便开 发人员进行代码调试的汇编代码。LLVM 中间代码由虚拟指令集、中间代码高层结构

LLVM 编译器基础架构

前提是你 提交于 2019-12-05 06:16:47
LLVM 编译器基础架构 1. LLVM 概述 2. LLVM特性 3. LLVM系统的优势 4. LLVM 用处 5. 最新 LLVM 发行版 6. 了解更多 本文为译文,点击 此处 查看原文。 1. LLVM 概述 LLVM 项目是模块化、可重用的编译器和工具链技术的集合。尽管名为 LLVM,但它与传统虚拟机几乎没有什么关系。名称 “LLVM” 本身并不是缩写;它是项目的全称。 LLVM 最初是 伊利诺伊大学 的一个 研究项目 ,其目标是提供一种现代的、基于 SSA 的编译策略,能够支持任意编程语言的静态和动态编译。从那时起,LLVM 已经成长为一个由许多子项目组成的伞形项目,其中许多子项目被各种各样的 商业和开源项目 用于生产,并被广泛用于 学术研究 。LLVM 项目中的代码是在 “Apache 2.0许可下使用 LLVM 例外” 许可的。 LLVM的主要子项目有: LLVM Core 库提供了一个现代的独立于源和目标的 优化器 ,以及对许多流行 CPU(以及一些不太常见的CPU)的 代码生成支持 !这些库是围绕一个 良好指定 的代码表示构建的,该代码表示称为 LLVM 中间表示( “LLVM IR” )。LLVM Core 库有很好的文档说明,而且特别容易发明自己的语言(或移植现有编译器)来使用 LLVM 作为优化器和代码生成器 。 Clang 是一个“LLVM 原生” C

LLVM编译原理和使用

你说的曾经没有我的故事 提交于 2019-12-05 06:16:34
LLVM 简介: LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。 LLVM最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。 在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM。广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。 LLVM 优势: 传统编译器分三个阶段: 前端(Frontend)-- 优化器(Optimizer)-- 后端(Backend) 前端负责分析源代码,可以检查语法级错误,并构建针对语言的抽象语法树(AST);抽象语法树可以进一步转换为优化,最终转为新的表示方式,然后再交给让优化器和后端处理; 最终由后端生成可执行的机器码。 llvm 也分三个阶段,但是设计上略微的有些区别, LLVM不同的就是对于不同的语言它都提供了同一种中间表示:

GCC,LLVM,Clang编译器对比

倾然丶 夕夏残阳落幕 提交于 2019-12-05 06:16:16
在XCode中,我们经常会看到这些编译选项(如下图),有些人可能会有些茫然,本文将对GCC4.2、LLVM GCC 4.2、LLVM compliler 2.0三个编译选项进行一个详细的介绍。 GCC GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。 GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言。 LLVM LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。 LLVM历史 Apple

简述 LLVM 与 Clang 及其关系

此生再无相见时 提交于 2019-12-05 06:15:39
随着 Android P 的逐步应用,越来越多的客户要求编译库时用 libc++ 来代替 libstdc++。libc++ 和 libstdc++ 这两个库有关系呢?它们两个都是 C++ 标准库,libc++ 是针对 Clang 编译器特别重写的 C++ 标准库,而 libstdc++ 则是 GCC 的对应 C++ 标准库了。从 Android 市场来说,Android NDK 已在具体应用中放弃了 GCC,全面转向 Clang,正如很早前 Android NDK 在 Changelog 中提到的那样: Everyone should be switching to Clang. GCC in the NDK is now deprecated. 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++

iOS混淆--OLLVM在iOS中的实践(Xcode9.2)

↘锁芯ラ 提交于 2019-12-05 06:15:16
OLLVM简介 OLLVM(Obfuscator-LLVM) 是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加对逆向工程的难度。后期转向商业项目 strong.protect 。目前,OLLVM已经支持LLVM-4.0版本。 LLVM是一个优秀的编译器框架,它也采用经典的三段式设计。前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操作,通过一系列的Pass对IR做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。 LLVM IR 是LLVM的中间表示,优化器就是对IR进行操作的,具体的优化操作由一些列的Pass来完成,当前端生成初级IR后,Pass会依次对IR进行处理,最终生成后端可用的IR。下图可以说明这个过程: OLLVM的混淆操作就是在中间表示IR层,通过编写Pass来混淆IR,然后后端依据IR来生成的目标代码也就被混淆了。得益于LLVM的设计,OLLVM适用LLVM支持的所有语言(C,C++,Objective-C,Ada,Fortran)和目标平台

Debug build of Clang built with MinGW on Windows 10 cannot be run

不想你离开。 提交于 2019-12-05 06:15:12
I have built Clang with MinGW on Windows with the target triple x86_64-w64-windows-gnu. The executables clang.exe and clang++.exe work as expected if I build them in release mode (they compile programs without error), however when building in debug mode I cannot run them and get this error - "This app can't run on your PC". Other executables from the same build such as clang-check.exe do not display this error and run correctly. It seems as though this could be an issue with the file size as both clang.exe and clang++.exe are > 2GB in size whereas the other executables are smaller but I was