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);
}
}