如何在LLVM传递期间修改然后解析函数?

时间:2017-07-27 11:50:42

标签: c++ llvm compiler-optimization

我有一个用于重命名函数的LLVM传递。给定一些源文件file.cc,我生成LLVM bitcode如下:

clang -c -o foo.bc -emit-llvm foo.cc

我希望运行LLVM传递foo.bc并重命名所有全局变量,函数和别名,以便我可以将变换后的bitcode输出到新文件file_renamed.bc,然后链接{ {1}}和file.bc放入一个文件file_renamed.bc

我遇到的一个问题是,只需执行file_linked.bc,就会在F.setName(F.getName() + "_renamed")返回的损坏的名称之后添加后缀。

另一个问题:我在F.getName()下面有一个功能成功解除demangle(const std::string &Name),但我在重新修改该名称时遇到了麻烦。

如果有更好的方法在LLVM bitcode中重命名标识符,或以其他方式链接同一个bitcode的两个实例,但仍然能够唯一地标识每个版本中的函数和全局变量,请随时在答案中提出建议。

这是我的LLVM传递。请注意,我使用LLVM 3.4(它是我正在处理的项目的依赖项。)

接头

Name

代码

#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cxxabi.h>
#include <memory>

#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/TypeFinder.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Target/Mangler.h"

1 个答案:

答案 0 :(得分:1)

您不能轻易地从字符串中破坏C ++标识符。你需要有适当的C ++ AST。事实上,我不明白你为什么需要那种破坏/消解的东西。由于您在LLVM IR级别工作,因此您不应该费心去处理语言详细信息(例如原始未编码的名称)。