Tag: llvm

学习Swift背后的编译器基础架构

关于2016年LLVM开发者会议的说明 2016年美国LLVM开发人员会议于11月3日至4日在圣何塞举行。 没有惊喜。 许多演讲者和与会者都来自Apple。 我很幸运有机会参加这次会议。 讲座涵盖了LLVM,Clang,JIT,编译器工具链和构建系统。 LLVM(以前称为低级虚拟机)是模块化和可重用的编译器以及工具链技术的集合,用于开发编译器字体的前端和后端。 它也是由Swift的创建者Chris Lattner在2003年创建的。当然,Swift使用的是LLVM。 因此,如果您对Swift感兴趣,那么您肯定想了解有关LLVM的更多信息。 构建软件的新架构 演讲者:Apple Inc.的Daniel Dunbar 由于某些原因,没有人喜欢CMake。 演讲中介绍了llbuild-一个新的构建系统。 它是围绕可重用​​,灵活和可扩展的通用构建引擎设计的,该引擎能够解决许多类似于“构建系统”的问题。 它支持C,C ++和Swift。 它是Swift开源项目的一部分。 当前,Xcode,Swift操场和Swift包管理器正在使用llbuild。 对于速度,忍者仍然比llbuild快。 但是,丹尼尔(Daniel)提到llbuild在将来可能与忍者一样快。 用CMake开发和发行Clang 演讲者:苹果公司的克里斯·比尼曼 LLVM用于使用autoconf构建系统。 演讲者分享了有关他们如何在LLVM 3.9中迁移到CMake系统的故事。 他给出了CMake的几个原因: 跨平台构建配置工具 简单而强大的脚本语言 在许多平台上支持本机开发和IDE 活跃的替代开源社区。 他还指出,一个好的构建系统是没人想考虑的。 有人确实向Chris Bieneman问了一个问题:“ llbuild vs. CMake,哪个更好?” Chris Bieneman没有给出答案。 我的理解是llbuild支持Swift,而CMake不支持。 处理寄存器层次结构 演讲者:苹果公司的Matthias Braun 演讲者谈到了编译器代码生成阶段的寄存器分配器。 这是非常有趣的话题。 LLVM的一大特色是LLVM IR使用了无限的单辅助寄存器机器指令集。 在代码生成阶段,寄存器分配器确定从LLVM寄存器到物理寄存器的映射。 这简化并改善了许多编译器优化的结果。 演讲者还展示了寄存器分配器中的最新算法,可将GPU着色器程序的平均寄存器计数减少20%。 也有一些关于Clang静态分析器,调试工具和编译器优化的讨论。 其中大多数处于研究阶段,不适用于大型软件项目。 您可以在https://llvmdevelopersmeetingbay2016.sched.org上查看完整的时间表。 […]

Swift,C,LLVM编译器优化

用很少和基本的词来说,LLVM是一个编译器框架,在“前端”-“后端”多层体系结构中支持许多不同的编程语言,其中,第一层非常容易地对源代码进行解析和分类,以生成中间语言表示形式,第二层层将中间表示形式转换为针对不同处理器体系结构优化的实际组装机器代码。 当然,LLVM比这个简单的描述要多得多,但是我并不十分在意这篇文章中的LLVM。 我在这里真正关心的是专注于基于LLVM架构的Swift和Clang现代编译器如何进行编译,尤其是优化我们开发人员每天生成的源代码,尤其是这些编译器如何对某些旧式技巧,窍门做出反应和优化,我们尝试在源代码中花费一些时间。 在这篇文章中,我将测试一个在Swift和C中使用不同编程技术实现的超简单但繁琐的函数,以试图迫使编译器遵循一些经典的优化模式。 我将提供编译后代码的运行时执行性能结果,并分享生成的汇编代码中的一些优化细节。 假设您已经分配了一个很大的缓冲区,不管是在堆还是在堆栈上,我们都不在乎,我们可以很容易地说一个整数数组,我们的基本函数只需要为该数组的每个位置分配一个特定的值。 而已! 因此,在C语言中,我们的功能可能是这样的超级基本的东西: void testLoop(int64_t * buffer,int64_t tot){ for(int64_t i = 0; i <tot; i ++){ *缓冲区++ = 1; } } 在Swift中,类似的东西非常类似: func testLoop(_ a:inout [Int],_ tot:Int){ 对于i in 0 .. <tot { a [i] = 1 } } 注意,我在这里使用64位整数,因为这是64位体系结构上Swift Int的默认值,我希望能够支持很大的缓冲区以及巨大的循环。 一个好的开发人员通常可以在这种超级简单的场景中应用的基本技巧之一就是试图减少循环指令占用空间的影响。 举例来说,除了让循环具有n个交互并在每个循环交互上没有一条赋值指令,我们还可以将总的循环交互减少一个数量级,并在循环周期内放入10个这样的嵌套指令, 在C中: void testLoop(int64_t * buffer,int64_t tot){ int64_t […]

迅捷— LLVM的孩子

LLVM进步与迅捷 Swift的主要动机肯定是背负并继续利用LLVM工具链的进步。 值得注意的是,还有其他重要原因来引入一种更易于访问的新语言。 新的开发人员如虎添翼。 Obj-C不是最容易掌握的第一语言。 Swift开发的大概目标: SIL 借助Swift,编译团队决定引入一种新的中间语言,以同时启用语言功能和改进的编译。 LLVM的灵活性使他们能够做到这一点,并将其放入现有的编译流程中 关于此的大量信息来源是2015年LLVM开发人员会议上的一次演讲-Swift的高级IR:案例研究…。 看一下这个。 令人着迷。 好处 如以上链接中所述,SIL在编译期间在源(Swift)语义和IR语义之间实现了更大的差距。 这有一些明显的好处: 语言演变 -SIL使Swift语言编写者可以使用该语言编写更多的语言 安全性 -SIL允许在未初始化var和无法访问的代码等方面出现编译器错误 泛型 -影响语言功能的编译策略的一个非常有趣的示例 SIL允许使用支持动态调度和单独编译的泛型模型。 这不是依赖于模板实例化(例如Obj-C和C ++),后者使用的运行时策略会降低执行速度。 用更简单的语言来说,动态调度和单独编译是一种在编译时使用内联具体类型函数定义的策略。 这使得泛型在运行时的影响基本上不存在。 请查看(本页)[https://swift.org/blog/whole-module-optimizations/],了解其操作方法。 仅供参考,这称为功能专门化 。 总结一下 作为一名使用Swift语言的工程师,了解它的设计与苹果在拥护该工具链期间对LLVM的改进有多么巨大的联系是极为重要的。 它不仅为到目前为止我们已经看到的语言功能提供了很好的背景信息,而且还为这种仍然很年轻的语言提供了可能的指示!

快速中级语言

Надняхна可可头-Санкт-ПетербургерассказалпроустройствокомпилятораLLVM和Swift中级语言。 Подкатомтекстовыйвариантдоклада。 Историческийликбез ПроектLLVM是2003年12月。 ДоэтогоонвтечениитрёхлетразрабатывалсявстенахИллинойскогоуниверситетакакнаучныйпрое。 苹果公司,2005年LLVM推出的Позднее,какмызнаем。 级别低的虚拟机。ИзначальнопроектLLVM。 Итаккакданноеназваниесбивалостолку,намекаянато,чтоврукахнаходитсявиртуальнаямашина,вбудущемLLVMпересталсчитатьсяакронимом – сейчасэтополноеназваниекомпилятора。 Унасестьобобщеннаясистемакоманд,прослойкаабстракцииотконечнойархитектуры,норевер Этонеболее,чемсистемакоманд,котораяможетиспользоватьсядлядостижениясвоихцелей。 АрхитектураLLVM LLVM中的应用程序—图库视频影像#132848108 LLVM。LLVM —Проскомпиляторсмодульнойархитектурой。 Онсостоитизтрехмодулей,您在каждогоизкоторыхестьсвоячеткаязонаответственности: 前端; 中端(优化程序); 后端。 中间代表(IR)。 задачей 前端’ аявляетсяпреобразованиеязыкавысокогоуровня(Swift’а),是IR; 中端 ответственензаоптимизациюэтогопромежуточногопредставления; 后端 преобразуетэтопредставлениевмашинныйкодподконкретнуюархитектуру。 Дляпреобразованиякодавнекотороепромежуточноепредставление,такжевыполняетсяцепочканекоторыхпреобразований,входекоторыхкодпредставляетсявтрехразныхпредставлениях。 Навходкомпиляторупоступаеткод,написанныйнаязыкевысокогоуровня。 迅速添加Swift。 Первыйэтапназывается 解析 。 Парсерответственензагенерациюабстрактногосинтаксическогодерева— AST( 抽象语法树 )безкакой-либосем Затемнаступаеточередьсемантическогоанализа( 语义分析 )。 Врезультатечегоформируетсяужесемантическикорректноетипизированноесинтаксическоедерево。 Наэтомэтапеопределяетсяналичиесемантическихошибок。 Наследующемшагепроисходитимпорткода,Objective-CиC,例如Swift’овоепредставление。 备注ClangImporter 。 Swift中级语言Swift中级语言вегопервойформепредставления。 ПерваяформаSILпоступаетнавходоптимизатору。 Которыйвыполняетанализ,оптимизациюитрансформациюэтойформывканоническую。 Сначаланашагетрансформациивыполняетсядиагностикапотокаданныхигарантированныепреобразования,повышающиепроизводительностьпрограммы(определяетсяиспользованиенеинициализированныхпеременных,проверяетсядостижимостьвсехузловграфапотокаданных)。 ДальшеSILOptimizerвыполняетвысокоуровневыедоменно-специфичныеоптимизациидлябазовыхтиповконтейнеров。 Такжеонответственензадевиртуализациюфункций,ARC ARCиспецификациюдженериков。 ПослеэтогоужегенерируетсяпромежуточноепредставлениеLLVM,котороепоступаетнавход后端。 Почему-томногие,когдаговорято后端LLVM,имеютввидусамLLVM。 […]

iOS项目编译

我正在研究访问Web服务的项目。 我find了一个项目 http://d1xzuxjlafny7l.cloudfront.net/downloads/PromoTest.zip 上面的代码包括JSON库[项目设置编译器= LLVM 4.2]我试图在我的项目中使用该项目的部分代码。 所以我复制JSON库到我的项目[我的项目使用苹果LLVM 3.1],然后出现一些错误 例如。 SBJsonStreamWriterState **states; //error:Pointer to non-const type "SBJsonStreamWriterState *" with no explicit ownership 我已经尝试使用编译器标志-fno-objc-arc,不行。 我不知道它是一个ARC问题? 如果是这样,那么为什么上面的编译器标志不会工作。

几乎裸iOS8.4 – >如何获得一个链接器?

编辑2015-29-10。 II。 事实上-arch armv7代替-arch arm64而不降低优化,完美运行。 编辑2015-29-10。 我试图补充 export CFLAGS="-O1" export CXXFLAGS="-O1" 在configure之前,并且具有相同的错误,这次有一个不同的文件丢失: "/usr/local/cctools-arm64-port/bin/ld" -demangle -dynamic -arch arm64 -iphoneos_version_min 5.0.0 -syslibroot /usr/local/iPhoneOS8.4.sdk -o testcpp /var/tmp/testcpp-4f79ac.o -lstdc++ -lSystem ld: file not found: N?L 我也试过用-O0优化代替-01 ,结果相同。 编辑2015年2月10日。 II。 我做到了这一点: ./autogen.sh export CC="clang -arch arm64 -mios-version-min=8.4 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk" export CXX="clang++ -arch arm64 -mios-version-min=8.4 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk" ./configure -v –host=arm-apple-darwin11 –prefix=/usr/local/lvm-cross/cctools-arm64-port […]

Xcode5上的libcurl链接器错误,但在Xcode 4.6上正常工作

我有一个使用libcurl.all.a的项目。 它在Xcode 4.6.3上构build,链接和完美运行。 但是在Xcode5中,它会在未定义的符号上引发链接器错误。 错误日志如下。 Undefined symbols for architecture i386: "_SSLCopyPeerCertificates", referenced from: _darwinssl_connect_common in libcurl.all.a(libcurl_la-curl_darwinssl.o) "_SSLDisposeContext", referenced from: _Curl_darwinssl_close in libcurl.all.a(libcurl_la-curl_darwinssl.o) _Curl_darwinssl_shutdown in libcurl.all.a(libcurl_la-curl_darwinssl.o) _darwinssl_connect_common in libcurl.all.a(libcurl_la-curl_darwinssl.o) "_SSLNewContext", referenced from: _darwinssl_connect_common in libcurl.all.a(libcurl_la-curl_darwinssl.o) "_SSLSetEnableCertVerify", referenced from: _darwinssl_connect_common in libcurl.all.a(libcurl_la-curl_darwinssl.o) "_SSLSetProtocolVersionEnabled", referenced from: _darwinssl_connect_common in libcurl.all.a(libcurl_la-curl_darwinssl.o) ld: symbol(s) not found for architecture i386 clang: error: […]

在Xcode 4.5“显示实时问题”不再有效

我发现Xcode在编写代码时会显示编译器警告是非常有用的。 例如:如果我写了“ldksjfksdj”,我希望立即看到一个红色的感叹号图标和警告, use of undeclared identifier 。 但是现在用Xcode 4.5编译项目后我只看到这个警告。 然后,在编译完成之后,查看错误,并删除“ldksjfksdj”,警告不会像以前那样立即消失。 它只会在我重新编译之后消失。 这是非常烦人的,没有帮助。 有没有人有办法解决吗?

ld:警告:section __DATA / __ objc_imageinfo__DATA意外的大尺寸

有人知道这个警告是什么意思吗? 之后是错误: Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 failed with exit code 1 这是一个iPad的Xcode项目。 我只在编译模拟器时看到这个,而不是设备。 我有一个静态库(* .a)链接到这个项目,这是我认为这是失败的。 此外,它曾经在模拟器上运行没有问题,我不知道是什么改变。 所有的编译器输出: Ld /Users/cduckering/Library/Developer/Xcode/DerivedData/IQ-bldfqilntfqfrccozykbqulagovx/Build/Products/Debug-iphonesimulator/IQ.app/IQ normal i386 cd /Users/cduckering/Desktop/LitePoint/Apps/App/IQ setenv MACOSX_DEPLOYMENT_TARGET 10.6 setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/cduckering/Library/Developer/Xcode/DerivedData/IQ-bldfqilntfqfrccozykbqulagovx/Build/Products/Debug-iphonesimulator -F/Users/cduckering/Library/Developer/Xcode/DerivedData/IQ-bldfqilntfqfrccozykbqulagovx/Build/Products/Debug-iphonesimulator -filelist /Users/cduckering/Library/Developer/Xcode/DerivedData/IQ-bldfqilntfqfrccozykbqulagovx/Build/Intermediates/IQ.build/Debug-iphonesimulator/IQ.build/Objects-normal/i386/IQ.LinkFileList -mmacosx-version-min=10.6 -dead_strip -ObjC -all_load -fprofile-use -Xlinker -objc_abi_version -Xlinker 2 -lCorePlot-CocoaTouch -weak_framework QuickLook -weak_framework MessageUI -framework QuartzCore -framework UIKit -framework […]

你如何处理“要求(…,保释)”与ARC的声明?

我正在通过苹果示例代码中的方形凸轮的一些示例代码 。 我想用ARC来复制现代项目中的一些function。 但是,有大量的要求陈述,例如: BOOL success = (destination != NULL); require(success, bail); 其中生成编译器错误: 转到受保护的范围。 我的问题是 – 在使用ARC的项目中处理这种语句的适当方式是什么?