---
title: 生成BC文件
description: "BC（BitCode）文件是使用LLVM（Low Level Virtual Machine）编译源代码生成中间文件（IR）的二进制表示，包含了程序编译的中间代码，比源代码文件更加紧凑和高效。DevKit基于LLVM框架，利用BC文件，提高程序的分析效率与分析准确度。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/devkit_24/usermanual/DevKit_Affinity_0018.html
sourcePath: /source/zh/kunpengdevkithistory/devkit_24/usermanual/DevKit_Affinity_0018.html
indexId: 20882275ad5e6e656e2ee427e9773ce56483e9b674ad4dc5dc1613df29d41b6e78
---
# 生成BC文件

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

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

- 重构版本向量化检查中，使用工程构建工具生成BC文件时，不能指定CC、CXX、FC变量。

- 为了保障功能完整，建议使用DevKit自带的clang作为编译工具，同时节省clang编译工具的编译安装时间。
- 若BC文件生成失败，请参见编译器日志或工具日志中的报错信息对源码进行修改适配。部分报错修改请参见《毕昇编译器 用户指南》中的  兼容性说明(https://www.hikunpeng.com/document/detail/zh/kunpengdevps/compilation/ug-bisheng/kunpengbisheng_06_0027.html)
。


#### 前提条件

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

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


#### 方法一（推荐）

在操作之前需要确保已安装亲和分析功能命令行工具，使用命令行BC文件生成功能生成BC文件可参见BC文件生成(https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/devkit_24/cliuserguide/KunpengDevKitCli_0043.html)。


#### 方法二

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


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

- 在构建项目之前，需将gcc编译器替换成llvm相关的工具。
- 构建时务必替换或增加指定的编译选项，防止部分指令信息缺失，从而影响分析结果准确性。
- 将最终生成的目标文件修改为BC文件。


以make构建项目为例：

1. 确认项目中存在Makefile文件。

```
[root@localhost test]# ls
main.c Makefile test.c
```


2. 修改编译命令并替换编译选项。
  原始的Makefile文件：

```
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文件：

```
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. 完成项目构建。

```
[root@localhost test]# make
clang -O0 -flto -g -fno-inline-functions -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1 -c main.c -o main.o
clang -O0 -flto -g -fno-inline-functions -DAM_CPU_NUMBER=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
```


  生成的BC文件为case.bc。

4. 打包BC文件。

  a. 创建目录。

```
mkdir bcfile
```


  b. 将BC文件拷贝到目录中。

```
cp case.bc bcfile/
```


  c. 将BC文件打包。

```
tar -czvf bcfile.tar.gz bcfile
```
