Clang类结构模仿重构

本文分析了Clang类结构模仿重构,包括Decl和Stmt类的层级关系,以及LLVM IR的生成策略。在Decl类中,重点讨论了NamedDecl、ValueDecl和DeclaratorDecl。在Stmt类中,主要关注BinaryOperator、CallExpr、DeclRefExpr等。文中还对LLVM IR的Instructions、声明与控制流部分、表达式部分的耦合性进行了测试,提出简化后的类结构以适应AST构建和IR生成。
摘要由CSDN通过智能技术生成

通过上面的讨论,形成了以下类:

VarDecl
ParmVarDecl
FunctionDecl
​
BreakStmt
CompoundStmt
ContinueStmt
IfStmt
ReturnStmt
WhileStmt
DeclStmt
BinaryOperator
CallExpr
DeclRefExpr
ParenExpr
UnaryOperator
OpaqueValueExpr
​
IntegerLiteral
StringLiteral

接下来需要分别讨论之间的关系以及 llvm ir 的生成策略

一、类间关系

1、顶层类:Decl

Decl 类包含了所有表征定义的类,自顶向下顺序来说:

  • NamedDecl:表征声明是有名变量,有一些变量的声明可以不需要声明名字,这是 C++ 中的某些特性。在我们的实验中不需要考虑。

  • ValueDecl:Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it is a function designator) or an enum。简单来说,是含有实际内容的定义,包括变量、函数的定义,这也是本次实验的限定,所以不需要考虑。

  • DeclaratorDecl:待定,反正没啥用

我们所需要的声明(无论是之后的数组还是函数)DeclaratorDecl层已经够了,即保留一个顶层即可(直接就是Decl)。

 

2、顶层类:Stmt

Stmt 是最基本的结构,表征一个语句,一般带有分号。我们涉及的 Stmt 如下图所示:

 

在Expr上层其实还存在一个ValueStmt,但上述一样可以省略。上文讨论到的用于类型转换类的CastExpr,此处并没用到。其中DeclStmt的实质内容,是Decl。

下面综述一下 Expr 各部分的含义:

  • BinaryOperator:二元运算符,包含 =

  • CallExpr:函数调用,如printf,getint等

  • DeclRefExpr:变量的引用,如 b = a*2,则 a 就是DeclRefExpr类。

  • ParenExpr:带括号的表达式

  • UnaryOperator:一元运算符表达式

3、重构前后信息量

 

按照SysY文法,构建等价语法结构如上图所示,既然能够构建得出,说明此种分类方式的表现力足够,因此可以用这些类搭建AST。

二、LLVM生成策略

总的来说,对于上面重构的AST形式,我期望的生成方式是在各类内通过统一的方法进行 IR 生成。对此我们需分析上述各个类的 IR 耦合度是否支持我们这样做。当然,在此之前,必须对LLVM IR 的语法进行简单陈述。

1、LLVM IR

Instructions

  • opcode:add,sub

  • operands

  • one or zero result values

  • Explicitly typed

Instruction classes

  • Arithmetic instructions

    %sum = add i32 %a, 10
  • Compare Ins

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值