论文部分内容阅读
摘要:在嵌入式系统调试环境下,需将大量的结构体变量输出到诊断软件,进行解析与呈现,而结构体数量庞大,且容易变化。在软件快速迭代开发阶段,迫切需要使结构体解析过程自动化。最关键的一步,是实现结构体定义数据库的提取。此文主要研究基于Clang编译器,实现从前端编译结构体定义文件生成的抽象语法树中提取结构体定义信息。实验结果表明,该方法能准确的实现从结构体定义文件提取结构体定义XML数据库。
关键词: Clang编译器;抽象语法树;信息提取;结构体定义
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2017)06-0019-03
Abstract: In the debugging environment of the embedded system, the structure variables which are very large in quantity and mutable, should be output to the diagnostic software to be parsed and presented. In the rapidly iteration development phase, it is an urgent need to make the structure parsing process automation. It is the most crucial step to realize the extraction of structure definition database. This paper mainly studies how to extract structure definition information from the abstract syntax tree generated by the fronted compiler Clang. The experimental results show that this method can realize the structure XML database form the definition files accurately.
Key words:Clang compiler; abstract syntax tree (AST); information extraction; structure definition
1 概述
在嵌入式软件开发过程中,为了快速分析软件运行过程,定位问题,将系统运行中的各类诊断信息输出到诊断软件解析,而大量的诊断信息是基于结构体类型,在嵌入式系统开发前期,采用手工编写解析结构体的函数来实现。但结构体定义在开发调试过程中会经常发生变更,结构体解析库就需要同步更新维护,随着系统工程模块化程度提高,规模也越来越大,涉及的人员越来越多,结构体定义与解析库之间更新不同步的问题越来越频繁,维护成本越来越高,严重影响了软件开发迭代进度。
本文在开源编译框架LLVM的前端编译器Clang的基础上,通过开发一个Clang前端插件,实现从抽象语法树AST(Abstract Syntax Tree)中进行结构体数据库提取。相比于手工编写解析函数,将繁重的开发和维护工作量降到0,大大提高了工作效率。
本文第二节介绍Clang 前端插件的编写、编译与执行方法;给出结构体数据库提取插件的实现方法;第三节对本文進行总结。
2 相关工作
2.1 Clang 前端插件开发介绍
Clang作为LLVM开源编译框架的一种前端编译器,实现编译过程中的词法分析,语法分析,类型检查,中间代码生成。Clang对用户进行前端插件的开发提供了很好的支持,前端操作的切入点是抽象类FrontendAction,此接口支持在前端编译过程中执行插件定制的操作。AST消费者的切入点是抽象类ASTConsumer,此接口支持对抽象语法树的访问。
本文是研究在编译过程中从抽象语法树提取结构体定义相关的信息,面向AST消费者前端操作的抽象接口类为FrontendAction的子类ASTFrontendAction,插件中前端操作基类选择ASTFrontendAction的子类PluginASTAction。自定义的AST消费者基类选择ASTConsumer。
2.1.1 编写Clang插件
1) 定义继承自PluginASTAction的自定义类StructFrontendAction。重载三个成员函数:
①用于创建抽象语法树的Consumer类。
ASTConsumer *CreateASTConsumer(CompilerInstance
关键词: Clang编译器;抽象语法树;信息提取;结构体定义
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2017)06-0019-03
Abstract: In the debugging environment of the embedded system, the structure variables which are very large in quantity and mutable, should be output to the diagnostic software to be parsed and presented. In the rapidly iteration development phase, it is an urgent need to make the structure parsing process automation. It is the most crucial step to realize the extraction of structure definition database. This paper mainly studies how to extract structure definition information from the abstract syntax tree generated by the fronted compiler Clang. The experimental results show that this method can realize the structure XML database form the definition files accurately.
Key words:Clang compiler; abstract syntax tree (AST); information extraction; structure definition
1 概述
在嵌入式软件开发过程中,为了快速分析软件运行过程,定位问题,将系统运行中的各类诊断信息输出到诊断软件解析,而大量的诊断信息是基于结构体类型,在嵌入式系统开发前期,采用手工编写解析结构体的函数来实现。但结构体定义在开发调试过程中会经常发生变更,结构体解析库就需要同步更新维护,随着系统工程模块化程度提高,规模也越来越大,涉及的人员越来越多,结构体定义与解析库之间更新不同步的问题越来越频繁,维护成本越来越高,严重影响了软件开发迭代进度。
本文在开源编译框架LLVM的前端编译器Clang的基础上,通过开发一个Clang前端插件,实现从抽象语法树AST(Abstract Syntax Tree)中进行结构体数据库提取。相比于手工编写解析函数,将繁重的开发和维护工作量降到0,大大提高了工作效率。
本文第二节介绍Clang 前端插件的编写、编译与执行方法;给出结构体数据库提取插件的实现方法;第三节对本文進行总结。
2 相关工作
2.1 Clang 前端插件开发介绍
Clang作为LLVM开源编译框架的一种前端编译器,实现编译过程中的词法分析,语法分析,类型检查,中间代码生成。Clang对用户进行前端插件的开发提供了很好的支持,前端操作的切入点是抽象类FrontendAction,此接口支持在前端编译过程中执行插件定制的操作。AST消费者的切入点是抽象类ASTConsumer,此接口支持对抽象语法树的访问。
本文是研究在编译过程中从抽象语法树提取结构体定义相关的信息,面向AST消费者前端操作的抽象接口类为FrontendAction的子类ASTFrontendAction,插件中前端操作基类选择ASTFrontendAction的子类PluginASTAction。自定义的AST消费者基类选择ASTConsumer。
2.1.1 编写Clang插件
1) 定义继承自PluginASTAction的自定义类StructFrontendAction。重载三个成员函数:
①用于创建抽象语法树的Consumer类。
ASTConsumer *CreateASTConsumer(CompilerInstance