有没有办法在Xcode 4中编译ARM而不是Thumb?

时间:2011-12-05 19:18:07

标签: ios xcode compiler-construction xcode4 arm

如果有许多浮点运算正在进行,Apple建议为ARM而不是拇指进行编译。我的整个应用程序几乎是一个大的浮点操作。

以下是他们在iOS应用开发工作流程指南中所说的内容:

  

iOS设备支持两个指令集,ARM和Thumb。 Xcode使用   默认情况下Thumb指令因为使用Thumb通常会减少   相对于ARM,代码大小约为35%。有的应用程序   如果使用ARM,广泛的浮点代码可能会表现得更好   说明而不是拇指。您可以关闭Thumb   应用程序,因此它通过设置Compile for Thumb为ARM编译   将设置设置为编号

但是,我在构建设置中找不到任何“Compile for Thumb”设置。他们重命名了吗?或者Xcode 4现在不可用?

3 个答案:

答案 0 :(得分:49)

首先,为了提高浮点性能而不为Thumb指令集编译的建议仅适用于旧的ARMv6设备。

ARMv7硬件(iPhone 3G S及更新版本,包括所有iPad)使用更高效的Thumb-2指令集,它不会遭受相同类型的浮点减速。对于ARMv7版本,几乎在所有情况下都建议您为Thumb构建。我在答案here中提供了更多有关此内容的详细信息。

这可能就是为什么这个编译器设置不再作为常见选项公开的原因,因为ARMv7设备是绝大多数的iOS设备。

如果您只想为ARMv6版本执行此操作,则可以转到构建设置并将鼠标悬停在“其他C标志”选项上。单击此选项右侧显示的小加号按钮,为ARMv6体系结构添加条件。再次执行此操作以为ARMv7体系结构创建一个。在ARMv6体系结构下,添加-mno-thumb的额外编译器标志(正如Kevin建议的那样)。

您应该得到如下所示的内容:

Build settings for ARMv6

我在我的一个应用程序中执行此操作,因为我确实看到旧版ARMv6设备的性能提升。但是,在ARMv6上没有为Thumb构建时,我的另一个应用程序速度较慢,因此您需要先对其进行分析。

此外,还有currently a bug in the LLVM Compiler 3.0 that ships with Xcode 4.2(从我听到的内容已经在4.2.1中修复),其中浮点计算在Thumb for ARMv6下编译错误。如果您使用的是特定版本的Xcode,则需要在旧设备上正确执行此操作。

答案 1 :(得分:8)

我不知道Xcode 4中是否存在“Compile for Thumb”,但您始终可以将-mno-thumb添加到其他C标志构建设置。< / p>

答案 2 :(得分:3)

关于您的原始问题:我注意到Xcode 4.2.1中的“Compile for Thumb”(在“项目构建设置”的“代码生成”部分下)仅在您使用LLVM GCC 4.2时可用(如果在“Compiler for C / C ++ / Objective-C”中设置!

如果使用Apple LLVM 3.0进行编译,则会发现没有“Compile for Thumb”选项。但是 - 正如Brad已经说过的那样 - 您仍然可以更改“其他C标志”选项以关闭Thumb模式。

另一个有趣的观点:我在我的项目中使用sqlite合并源(我需要fts - 全文搜索),并且自从使用LLVM 3.0进行编译后,无论何时访问数据库,我都会在armv6设备上发生奇怪且相当随机的崩溃:那是因为在编译armv6设备时没有禁用Thumb模式。