联系我们:010-58426662

llvm之旅第二站 - 环境配置

2015-04-10 13:06:42

©娜迦 charme版权所有

版权声明:未经许可,请勿转载

工具链说明


编译好的工具链已经可以满足开发需求,下面对工具链中的部分常用工具做一个简单介绍:

基本工具

llvm-as - 汇编器,将可读的 .ll 文件汇编成字节代码

llvm-dis - 反汇编器,将字节代码文件反编成可读的 .ll 文件

opt - 优化器,在一个字节代码文件上运行一系列的 LLVM 到 LLVM 的优化

llc - 静态编译器,编译字节代码文件为本机器代码

lli - 解释运行字节码程序

llvm-link - 字节码链接器,将几个字节代码文件连接成一个

llvm-ar - 打包器,打包字节代码文件

llvm-nm - 输出LLVM 字节码或者object文件的符号表

llvm-config - 打印当前配置的 LLVM 编译选项

llvm-diff - 比较两个模块的结构

llvm-cov - 输出程序代码覆盖率信息

llvm-profdata - 输出profile数据

llvm-stress - 随机生成.ll文件,用于测试

llvm-symbolizer - 将地址对应到源码,方便定位

llvm-dwarfdump - 打印DWARF节


调试工具

bugpoint - 自动案例测试减速器

llvm-extract - 从 LLVM 字节代码文件中解压出一个函数

llvm-bcanalyzer - 字节代码分析器


开发工具

FileCheck - 灵活的文件验证器,广泛的被测试工具利用

tblgen - 目标描述阅读器和生成器

lit - LLVM 集成测试器,用于运行测试

llvm-build - LLVM工程辅助工具

llvm-readobj - LLVM object文件结构查看器


上述描述及工具分类均以官方最新版本工具集指导手册为主要参照,后续版本中可能会发生改动,详细的信息参考LLVM Command Guide。



在eclipse中使用Clang+LLVM


  1. 找到 NDK安装目录下的toolchians目录

$ cd NDK dir/toolchians/


  2.    创建子目录

$ mkdir naga-llvm-3.5
$ cd naga-llvm-3.5
$ mkdir prebuilt
$ cd prebuilt
$ mkdir linux-x86_64

  完整的路径为:ndk dir/toolchains/naga-llvm-3.5/prebuilt/linux-x86_64


3.  在ndk dir/toolchains/naga-llvm-3.5目录下创建config.mk文件,编辑其内容为:


TOOLCHAIN_ARCH := arm
TOOLCHAIN_ABIS := armeabi armeabi-v7a armeabi-v7a-hard


4.  在ndk dir/toolchains/naga-llvm-3.5目录下创建setup.mk文件,编辑其内容为:

LLVM_VERSION := 3.5
LLVM_NAME := naga-llvm-$(LLVM_VERSION)
LLVM_TOOLCHAIN_ROOT := $(NDK_HOME)/toolchains/$(LLVM_NAME)
LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call host-prebuilt-tag,$(LLVM_TOOLCHAIN_ROOT))
LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/


TOOLCHAIN_VERSION := 4.7
TOOLCHAIN_NAME := arm-linux-androideabi-$(TOOLCHAIN_VERSION)
TOOLCHAIN_ROOT := $(NDK_HOME)/toolchains/$(TOOLCHAIN_NAME)
TOOLCHAIN_PREBUILT_ROOT := $(call host-prebuilt-tag,$(TOOLCHAIN_ROOT))
TOOLCHAIN_PREFIX := $(TOOLCHAIN_PREBUILT_ROOT)/bin/arm-linux-androideabi-
TARGET_CC := $(LLVM_TOOLCHAIN_PREFIX)clang$(HOST_EXEEXT)
TARGET_CXX := $(LLVM_TOOLCHAIN_PREFIX)clang++$(HOST_EXEEXT)


#
# CFLAGS and LDFLAGS
#
TARGET_CFLAGS := \
    -gcc-toolchain $(call host-path,$(TOOLCHAIN_PREBUILT_ROOT)) \
    -fpic \
    -ffunction-sections \
    -funwind-tables \
    -fstack-protector \
    -no-canonical-prefixes
TARGET_LDFLAGS += \
    -gcc-toolchain $(call host-path,$(TOOLCHAIN_PREBUILT_ROOT)) \
    -no-canonical-prefixes
TARGET_C_INCLUDES := \
    $(SYSROOT_INC)/usr/include
ifneq ($(filter %armeabi-v7a,$(TARGET_ARCH_ABI)),)
    LLVM_TRIPLE := armv7-none-linux-androideabi
    TARGET_CFLAGS += -target $(LLVM_TRIPLE) \
                     -march=armv7-a \
                     -mfloat-abi=softfp \
                     -mfpu=vfpv3-d16
    TARGET_LDFLAGS += -target $(LLVM_TRIPLE) \
                      -Wl,--fix-cortex-a8
else
ifneq ($(filter %armeabi-v7a-hard,$(TARGET_ARCH_ABI)),)
    LLVM_TRIPLE := armv7-none-linux-androideabi
    TARGET_CFLAGS += -target $(LLVM_TRIPLE) \
                     -march=armv7-a \
                     -mfpu=vfpv3-d16 \
                     -mhard-float \
                     -D_NDK_MATH_NO_SOFTFP=1
    TARGET_LDFLAGS += -target $(LLVM_TRIPLE) \
                      -Wl,--fix-cortex-a8 \
                      -Wl,--no-warn-mismatch \
                      -lm_hard
else
    LLVM_TRIPLE := armv5te-none-linux-androideabi
    TARGET_CFLAGS += -target $(LLVM_TRIPLE) \
                     -march=armv5te \
                     -mtune=xscale \
                     -msoft-float
    TARGET_LDFLAGS += -target $(LLVM_TRIPLE)
endif
endif
TARGET_CFLAGS.neon := -mfpu=neon
TARGET_arm_release_CFLAGS :=  -O2 \
                              -g \
                              -DNDEBUG \
                              -fomit-frame-pointer \
                              -fstrict-aliasing
TARGET_thumb_release_CFLAGS := -mthumb \
                               -Os \
                               -g \
                               -DNDEBUG \
                               -fomit-frame-pointer \
                               -fno-strict-aliasing
# When building for debug, compile everything as arm.
TARGET_arm_debug_CFLAGS := $(TARGET_arm_release_CFLAGS) \
                           -O0 \
                           -UNDEBUG \
                           -fno-omit-frame-pointer \
                           -fno-strict-aliasing
TARGET_thumb_debug_CFLAGS := $(TARGET_thumb_release_CFLAGS) \
                             -O0 \
                             -UNDEBUG \
                             -marm \
                             -fno-omit-frame-pointer
# This function will be called to determine the target CFLAGS used to build
# a C or Assembler source file, based on its tags.
#
TARGET-process-src-files-tags = \
$(eval __arm_sources := $(call get-src-files-with-tag,arm)) \
$(eval __thumb_sources := $(call get-src-files-without-tag,arm)) \
$(eval __debug_sources := $(call get-src-files-with-tag,debug)) \
$(eval __release_sources := $(call get-src-files-without-tag,debug)) \
$(call set-src-files-target-cflags, \
    $(call set_intersection,$(__arm_sources),$(__debug_sources)), \
    $(TARGET_arm_debug_CFLAGS)) \
$(call set-src-files-target-cflags,\
    $(call set_intersection,$(__arm_sources),$(__release_sources)),\
    $(TARGET_arm_release_CFLAGS)) \
$(call set-src-files-target-cflags,\
    $(call set_intersection,$(__arm_sources),$(__debug_sources)),\
    $(TARGET_arm_debug_CFLAGS)) \
$(call set-src-files-target-cflags,\
    $(call set_intersection,$(__thumb_sources),$(__release_sources)),\
    $(TARGET_thumb_release_CFLAGS)) \
$(call set-src-files-target-cflags,\
    $(call set_intersection,$(__thumb_sources),$(__debug_sources)),\
    $(TARGET_thumb_debug_CFLAGS)) \
$(call add-src-files-target-cflags,\
    $(call get-src-files-with-tag,neon),\
    $(TARGET_CFLAGS.neon)) \
$(call set-src-files-text,$(__arm_sources),arm) \
$(call set-src-files-text,$(__thumb_sources),thumb)

    TOOLCHAIN_VERSION为当前环境中正在使用的NDK工具链版本,根据实际情况进行修改。


5.  打开eclipse中的工程,在application.mk文件中指定工具链版本

APP_MODULES :=libtest
APP_ABI := armeabi
NDK_TOOLCHAIN_VERSION := 3.5

    

     如果没有该mk文件,手动创建即可。

     配置中的3.5与setup.mk中的LLVM_VERSION保持一致。


6.  编译程序


     

我们改动Application.mk中的NDK_TOOLCHAIN_VERSION为错误配置,可以简单的验证当前工具链是否安装成功。

5.png

4.png



在xcode中使用Clang+LLVM


1.  将编译好的工具链包放置在任意目录。


2.  

$ cd /Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/
$ sudo cp -r Clang\ LLVM\ 1.0.xcplugin/ Naga\ LLVM\ 1.0.xcplugin
$ cd Naga\ LLVM\ 1.0.xcplugin/Contents/
$ sudo plutil -convert xml1 Info.plist


    打开Info.plist修改以下条目:

<string>com.apple.compilers.clang</string> -> <string>com.apple.compilers.naga</string>
<string>Clang LLVM 1.0 Compiler Xcode Plug-in</string> -> <string>Naga Clang LLVM 1.0 Compiler Xcode Plug-in</string>

    

3.  

$ sudo plutil -convert binary1 Info.plist
$ cd Resources/
$ sudo mv Clang\ LLVM\ 1.0.xcspec Naga\ LLVM\ 1.0.xcspec


    打开Naga LLVM 1.0.xcspec修改以下条目:

Identifier = "com.apple.compilers.llvm.clang.1_0"; -> Identifier = "com.apple.compilers.llvm.naga.1_0";
Name = "Apple LLVM 6.0"; -> Name = "Naga LLVM 1.0";
Description = "Apple LLVM 6.0 compiler"; -> Description = "Naga LLVM 1.0";
Vendor = Apple; -> Vendor = Naga;
Version = "6.0"; -> Version = "1.0";
ExecPath = "clang"; -> ExecPath = "/path/to/naga-llvm-1.0-mac/bin/clang";


4.  

$ cd English.lproj/
$ sudo mv Apple\ LLVM\ 6.0.strings Naga\ LLVM\ 1.0.strings


    打开Naga LLVM 1.0.strings修改以下条目:

"Name" = "Apple LLVM 6.0"; -> "Name" = "Naga LLVM 1.0";
"Description" = "Apple LLVM 5.0 Compiler"; -> "Description" = "Naga LLVM 1.0 Compiler";
"Version" = "6.0"; -> "Version" = "1.0";
"Vendor" = "Apple"; -> "Vendor" = "Naga";


5.  在工程的 [Build Settings] -> [Build Options] -> [Compiler for C/C++/Objective-C] 中选择使用Naga LLVM 1.0


6.  编译程序



配置好后的选项: 

1.png

2.png


具体的配置细节按照编译需求在此进行设置,所有设置都将隶属于新的naga llvm编译配置模版。

以上的配置以xcode6.2(llvm 6.0)为示例,其他版本路径上略微有所改动,自行调整。




参考文献:

LLVM Command Guide -http://llvm.org/docs/CommandGuide/


标签: llvm clang

热度  14229 回应  0 收藏  0

llvm之旅第二站 - 环境配置

作者信息

  • charme
  • 2015-03-30日入驻

收藏 0

文章 7

进入个人主页

娜迦,守护10亿移动用户安全! 免费体验