Tag: clang

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 […]

未定义的行为消毒剂

在最近的文章“有关Thread Sanitizer的一些知识”中,我们讨论了Thread Sanitizer工具及其工作方式。 如果您仍然没有阅读它,建议您在开始阅读本指南之前先阅读它,以了解一些概念和参考。 在今天的文章中,我们将讨论Undefined Behavior Sanitizer或UBSan。 所以……让我们从问题开始: 什么是UBSan? 摘自Apple未定义的行为消毒器文档 Undefined Behavior Sanitizer或UBSan是用于C语言的LLVM工具,可在运行时检测未定义的行为。 未定义行为描述了具有未指定语义的任何操作的结果,例如除以零,从未对齐的指针加载内存或取消引用空指针。 UBSan可以检测到许多其他未定义的行为,例如对数组的越界访问,整数溢出,对浮点类型与其他类型之间或从它们之间的强制类型转换。 未定义行为是最难调试的错误之一,因为您永远不知道它是否会导致崩溃,或者只是从丢失的指针数据中返回垃圾数据,或者如果您很幸运,它可能就好像没有什么问题一样起作用。 怎么运行的 让我们使用一个简单的C代码示例 如您所见,结果似乎有点不可思议吧? 由于32位MAX_INT的值为2147483647,为什么结果等于INT_MIN? 那是因为二进制加法的方式。 但更重要的是,这不是运行时错误,而只是显示“错误”的输出。 现在让我们看看启用USan的工作方式 要使用UBSan进行编译,我们只需传递-fsanitize = undefined标志 clang ubsan.c -o ubsan -fsanitize =未定义 OBS:您可以启用UBSan进行特定检查。 例如,仅检查整数溢出,将标志更改为-fsanitize = signed-integer-overflow。 有关更多信息:启用未定义的行为清理器 现在,UBSan检测整数溢出错误并显示为输出。 太酷了\ o / XCode上的UBSan 在Xcode上设置UBSan非常简单。 让我们建立一个Objective-C项目,看看它如何工作。 首先,我们必须启用UBSan: 在“产品”>“方案”>“编辑方案”上,在“运行”操作的“诊断”部分中,只需选中“未定义行为消毒剂”。 因此,建立一个项目,从前放置相同的代码,启用UBSan并在Xcode上运行该项目,将给我们带来运行时错误,如下所示: 重要 Apple Core Diagnostics文档中的一件重要事情 Undefined Behavior Sanitizer对性能的影响很小,在Debug配置中平均有20%的CPU开销。 与TSan不同,UBSan对性能的影响最小,并且可以在设备上运行。 […]

探索一些标准库排序功能

在今天的文章中,我们将探讨一些排序功能。 这些是我们作为开发人员在几乎所有日常任务中使用的非常常见的功能。 我们将探索clang libc ++的一些函数,例如std :: sort,std :: stable_sort和std :: partial_sort。 另外,我们将研究其中一些函数的算法,并尝试了解它们的工作原理。 另外,我们将讨论Swift Collection排序方法\ o /。 使用排序算法时,我们要了解的最重要的事情之一就是时间复杂度。 幸运的是,此信息始终是这些方法文档的一部分,因此在调用标准库排序方法时,我们具有此保证。 分类 std :: sort是使用Introsort算法的排序函数,其复杂度为O(N log(N)),其中N = std :: distance(first,last)自C ++ 11起,且元素顺序相等不能保证保留[3]。 gcc-libstdc ++也使用Introsort算法。 Introsort是一种混合算法,基本上使用两种(或在某些实现中为三种)算法来优化运行时复杂性。 它开始使用Quicksort,并且如果递归深度超出接近O(N log(N))[1]的阈值,它将切换到Heapsort算法,以避免Quicksort最坏情况下具有O(N²)的情况。时间复杂度。 在某些实现中,它使用InsertionSort在排序过程中对小区域进行排序,因为在这种情况下,它的处理效率更高。 我们没有详细介绍Introsort算法的实现细节,但是您可以在[7]上看到伪代码,该伪代码显示了其背后的逻辑。 在下面,我们可以看到一个非常简单的示例,说明如何使用std :: sort对int向量进行升序和降序排序。 这就是本文的全部,希望您喜欢🙂 如果我有问题或您有任何意见或疑问,请告诉我。 我很高兴收到您的反馈feedback 您可以在Twitter上@ LucianoPassos11找到我。 感谢您阅读🙂 参考文献 2017年LLVM开发人员会议:A.基于Kumar Introsort的libc ++排序功能。 https://www.youtube.com/watch?v=Lcz0ZHewkHs “ libc ++” C ++标准库。 […]

几乎裸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 […]

Xcode警告:…是一个GNU扩展

我为iOS应用程序使用C ++库。 随着苹果LLVM 3.1编译器configuration(默认),我得到了很多这个C + +代码的警告,其中大部分说: … is a GNU extension clang用户手册的介绍: Clang驱动程序和语言特性被有意devise为尽可能与GNU GCC编译器兼容,从GCC到Clang的迁移也变得容易。 在大多数情况下,代码“正常工作”。 所以,只是寻找一个开关来禁用这个警告(顺便说一句,如何?),或者我应该更好地得到这个lib摆脱所有的GNU扩展?

列表中的所有Objective-C预处理器指令

在Clang中是否有一些Objective-C预处理指令的列表? 我在说#pragma mark – Section I或#pragma unused (variableName)或#warning – message 。 我想知道更多的改进我的代码,但谷歌search“llvm预处理器指令”给了我这个链接: http : //clang.llvm.org/docs/UsersManual.html ,没有列出所有的指令。

如何解决“Xcode在使用libclang.dylib插件时意外退出”?

我在开始xCode( 5.1.1 )之后的每一段时间都有这个。 删除用户数据,closures源代码pipe理(如一些postbuild议),没有效果,仍然崩溃(显示索引…,永远不会完成)。 即使重新安装 xCode,没有任何影响,仍然是这样说的。 有没有人修复这样的xCode? 这是崩溃的线程: Thread 7 Crashed:: Dispatch queue: IDEIndex PCH Creation Lock 0 libclang.dylib 0x00000001080c60d9 void llvm::BitstreamWriter::EmitRecordWithAbbrevImpl<unsigned long long>(unsigned int, llvm::SmallVectorImpl<unsigned long long>&, llvm::StringRef) + 809 1 libclang.dylib 0x00000001080c5867 void llvm::BitstreamWriter::EmitRecord<unsigned long long>(unsigned int, llvm::SmallVectorImpl<unsigned long long>&, unsigned int) + 71 2 libclang.dylib 0x00000001081e9f25 clang::ASTWriter::WriteASTCore(clang::Sema&, llvm::StringRef, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > […]

iOS:阻止属性直接设置访问时崩溃

考虑下面的代码: @interface ClassA : NSObject @property (nonatomic, copy) void(^blockCopy)(); @end @implementation ClassA @synthesize blockCopy; – (void)giveBlock:(void(^)())inBlock { blockCopy = inBlock; } @end 然后在具有strongtypesClassA的类中使用它,称为someA : self.someA = [[ClassA alloc] init]; [self.someA giveBlock:^{ NSLog(@"self = %@", self); }]; dispatch_async(dispatch_get_main_queue(), ^{ self.someA.blockCopy(); self.someA = nil; }); 如果我在启用了ARC的情况下运行了内置的O3 ,则在iOS中它会在self.someA.blockCopy();期间崩溃self.someA.blockCopy(); 在objc_retain里面objc_retain 。 为什么? 现在我意识到人们可能会说我应该用self.blockCopy = inBlock来设置它,但我确实认为ARC应该在这里做正确的事情。 如果我看一下从giveBlock:方法生成的程序集(ARMv7),它看起来像这样: .align 2 .code […]

有没有人得到地址 – 消毒剂(称为asan或-fsanitize =地址)的iOS?

Address-Sanitizer https://code.google.com/p/address-sanitizer/wiki/AddressSanitizer 我已经编译了我自己的llvm(相当直接的编译),因为苹果的llvm不支持这个function。 我已经testing了mac命令行程序的铿锵声,它的工作原理(但没有显示源代码行)。 对于iOS,还是有一些问题: 编译模拟器版本:预编译头文件报告错误: 在/Users/fluke/Documents/projects/tmp/testAsanNoARC/testAsanNoARC/testAsanNoARC-Prefix.pch:12中包含的文件中:从/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/包含的文件中SDKs / iPhoneSimulator6.1.sdk / System / Library / Frameworks / UIKit.framework / Headers / UIKit.h:9:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1 (UIAccelerometer *)加速度计didAccelerate :() UIAcceleration *)加速NS_DEPRECATED_IOS(2_0,5_0); ^ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIAccelerometer.h:33:12:note:声明已明确标记为不可用@interface UIAccelerometer:NSObject {^ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/UIKit.framework /Headers/UIAccelerometer.h:53:71:error:'UIAcceleration'is unavailable:not available on OS X – (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration NS_DEPRECATED_IOS(2_0,5_0); … 编译为设备版本,它报告缺乏libarc(但实际上我不启用ARC) ld:找不到文件:/Users/fluke/Documents/tools/asan/Debug+Asserts/lib/arc/libarclite_iphoneos.a clang:error:linker命令失败,退出代码1(使用-v查看调用) 所以我尝试使用它作为一个单独的库 – 只是新的lib目标,并使用我自己的铛,而主要目标仍然使用苹果的llvm。 该程序编译(可能需要链接到build立llvm的asan dylib),但不工作,因为我需要在我们的程序入口之前加载。 谁有这样做的经验?

clang_complete:iOS的Vim自动完成

所以最近我一直在试图build立一个基于Vim的iOS工作stream程。 我发现了clang_complete,并在我的.vimrc中设置了clang用户选项 let g:clang_user_options='-fblocks -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -D__IPHONE_OS_VERSION_MIN_REQUIRED=40300' 如下所述: http : //www.zenskg.net/wordpress/?p=199#comment-229 并添加了一些框架/头/ libpath。 我不打算张贴整条线,因为它是巨大的。 所以我使用clang从命令行(使用相同的选项)testing了我的项目中的一个文件的编译,它编译得很好,但是只有在使用-arch armv6/7标志的时候。 如果我不尝试编译i386和抱怨缺less头文件。 到现在为止还挺好。 现在我只是使用与clang clang_complete的选项,在.vimrc clang_complete的用户选项。 不。 当我这样做,并尝试在Vim自动完成一个字,它说 unknown argument: '-arch' 在Vim的QuickFix列表中。 我需要这个标志,我应该怎么做? 任何想法有用。 我很想在Vim下使用iOS代码完成工作。