【linux环境】clang调试 更新

test.c

1
2
3
4
5
#include <stdio.h>
int main() {
  printf("hello llvm\n");
  return 0;
}

编译可执行文件

clang test.c -o test

生成LLVM 字节码文件

clang -O3 -emit-llvm test.c -c -o test.bc

生成LLVM  可视化字节码文件

clang -O3 -emit-llvm test.c -S -o test.ll

运行可执行文件

test

下列命令操作根据自己装的版本号操作

运行字节码文件

lli test.bc

 

反汇编字节码文件

llvm-dis < test.bc | less

llvm

编译字节码为汇编文件

llc test.bc -o test.s

llvm

【llvm】pass,部分自己总结

LLVM 的Pass框架是LLVM系统的一个很重要的部分。每个Pass都是做优化或者转变的工作,LLVM的优化和转换工作就是由很多个Pass来一起完成的。(每个节点做一些工作)

可选择已有的一些Pass,去构建出想要的优化和转化效果。或者自己重新写Pass去做自己想要的优化和转变,因为每个Pass都可以独 立存在,所以新建Pass并不用考虑LLVM之前的优化和转化是怎么做的,自己可以只运行自己新建的Pass,这样可以方便的实现自己想要的效果。

继续阅读“【llvm】pass,部分自己总结”

使用Clang实现C语言编程规范检查

Clang是LLVM编译器工具集的前端部分,也就是涵盖词法分析、语法语义分析的部分。而LLVM是Apple在Mac OS上用于替代GCC工具集的编译器软件集合。Clang支持类C语言的语言,例如C、C++、Objective C。Clang的与众不同在于其模块化的设计,使其不仅实现编译器前端部分,并且包装成库的形式提供给上层应用。使用Clang可以做诸如语法高亮、语法 检查、编程规范检查方面的工作,当然也可以作为你自己的编译器前端。

编程规范一般包含编码格式和语义规范两部分。编码格式用于约定代码的排版、符号命名等;而语义规范则用于约定诸如类型匹配、表达式复杂度等,例如不 允许对常数做逻辑运算、检查变量使用前是否被赋值等。本文描述的主要是基于语义方面的检查,其经验来自于最近做的一个检查工具,该工具实现了超过130条 的规范。这份规范部分规则来自于MISRA C