中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

生成BC文件

BC(BitCode)文件是使用LLVM(Low Level Virtual Machine)编译源代码生成中间文件(IR)的二进制表示,包含了程序编译的中间代码,比源代码文件更加紧凑和高效。DevKit基于LLVM框架,利用BC文件,提高程序的分析效率与分析准确度。

LLVM是一种开源编译器基础设施,它提供了一个通用的编译器框架和工具链,可以用于构建各种编程语言的编译器、解释器、调试器、代码优化器等。

  • 重构版本向量化检查中,使用工程构建工具生成BC文件时,不能指定CC、CXX、FC变量。
  • 为了保障功能完整,建议使用DevKit自带的clang作为编译工具,同时节省clang编译工具的编译安装时间。
  • 若BC文件生成失败,请参见编译器日志或工具日志中的报错信息对源码进行修改适配。部分报错修改请参见《毕昇编译器 用户指南》中的兼容性说明

前提条件

用于生成BC文件的项目需要确保可以在本地使用LLVM(C/C++编译器使用clang、clang++,Fortran编译器使用flang)编译通过并生成动态库(.so)文件或者可执行文件。

clang是一个C、C++、Objective-C和Objective-C++编程语言的开源编译器前端。

方法一(推荐)

在操作之前需要确保已安装亲和分析功能命令行工具,使用命令行BC文件生成功能生成BC文件可参见BC文件生成

方法二

使用工程构建工具生成BC文件,如make,cmake等。如果软件使用该方法,需修改相关的配置文件,如makefile。
  • 替换编译命令:若构建文件中有gcc、g++、gfortran或ld,需要替换成对应的clang、clang++、flang或llvm-link。
  • 调整编译选项:修改优化等级“-O0”,增加“-flto -g -fno-inline-functions”。

完成上述操作后,即可通过构建获得BC文件。

  • 在构建项目之前,需将gcc编译器替换成llvm相关的工具。
  • 构建时务必替换或增加指定的编译选项,防止部分指令信息缺失,从而影响分析结果准确性。
  • 将最终生成的目标文件修改为BC文件。
  1. 使用make工具完成项目构建。
    1
    2
    [root@localhost test]# ls
    main.c Makefile test.c
    
  2. 修改编译命令并替换编译选项。原始的makefile文件和修改后的makefile文件如下所示:

    原始的makefile文件:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    objects=main.o test.o
    exe=case
    
    CFLAGS = -O2 -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1
    
    all: $(objects)
    
    main.o: ./main.c
            gcc $(CFLAGS) -c $< -o main.o
    test.o: ./test.c
            gcc $(CFLAGS) -c $< -o test.o
    
    all: $(exe)
    case: main.o test.o
            gcc -lpthread main.o test.o -o case
    
    clean:
           rm -f *.o
    

    修改后的makefile文件:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    objects=main.o test.o
    exe=case.bc
    
    CFLAGS = -O0 -flto -g -fno-inline-functions -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1
    
    all: $(objects)
    
    main.o: ./main.c
            clang $(CFLAGS) -c $< -o main.o
    test.o: ./test.c
            clang $(CFLAGS) -c $< -o test.o
    
    all: $(exe)
    case.bc: main.o test.o
            llvm-link main.o test.o -o case.bc
    
    clean:
           rm -f *.o
    

    修改后的makefile文件,将编译工具修改为clang,链接生成目标文件的工具改为llvm-link。

  3. 完成项目构建。
    1
    2
    3
    4
    5
    6
    [root@localhost test]# make
    clang -O0 -flto -g fno-inline-functions -DAM_CPU_NUNBER=96 -DMAX_PARALLEL_NUMBER=1 -c main.c -o main.o
    clang -O0 -flto -g fno-inline-functions -DAM_CPU_NUNBER=96 -DMAX_PARALLEL_NUMBER=1 -c test.c -o test.o
    llvm-link main.o test.o -o case.bc
    [root@localhost test]# ls
    case.bc main.c main.o Makefile test.c test.o
    
  4. 打包BC文件。
    1. 创建目录。
      1
      mkdir bcfile
      
    2. 将bc文件拷贝到目录中。
      1
      cp case.bc bcfile/
      
    3. 将bc文件打包。
      1
      tar -czvf bcfile.tar.gz bcfile