llvm基础了解叙述

1、what is llvm(Low Level Virtual Machine):是模块化、可重用的编译器及其工具链技术的集合。

2、编译器架构:源码 ~ Frontend ~ Optimizer ~ Backend ~ 可执行文件
前端(clang):词法分析(token)、语法分析(语法树AST)、语义分析、生成中间代码(IR)
优化器:中间代码优化(pass)
后端:生成机器码

3、待续

小细节:
(1)判断数据类型:
常用的为三个模版方法:

isa<类>(变量指针) 返回布尔类型,用于做运行时类型审查
cast<类>(变量指针)用于将基类转换成派生类,如果不是正确的类型的话会触发一个assert。这个模版方法可以作用于指针和引用上
dyn_cast<类>(变量指针) 一个包含了类型检查的类型转换模版方法。如果是正确的类型的话返回新类型的指针,否则返回null。这个模版方法只对指针生效,使用上非常类似C++的dynamic_cast<>

(2)遍历全局变量的声明-使用链来找到所有引用了这个变量的指令并对LoadInst和StoreInst做正确的处理
声明-使用链 即Def-Use Chain,给定一个变量,找到所有引用处
使用-声明链 即Use-Def Chain,给定一个引用,找到所有可能的变量。

for(User *U : GVPtr->users()){
     if(LoadInst *LI=dyn_cast<LoadInst>(U)){
                   Instruction* XORInst=BinaryOperator::CreateXor(XORKey,XORKey);
                      XORInst->insertAfter(LI);
                      LI->replaceAllUsesWith(XORInst);
                      XORInst->setOperand(0,LI);

                    }else if(StoreInst *SI=dyn_cast<StoreInst>(U)){
                      Instruction* XORInst=BinaryOperator::CreateXor(SI->getValueOperand(),XORKey);
                      XORInst->insertBefore(SI);
                      SI->replaceUsesOfWith(SI->getValueOperand(),XORInst);
                    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值