我有一个用于重命名函数的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"
答案 0 :(得分:1)
您不能轻易地从字符串中破坏C ++标识符。你需要有适当的C ++ AST。事实上,我不明白你为什么需要那种破坏/消解的东西。由于您在LLVM IR级别工作,因此您不应该费心去处理语言详细信息(例如原始未编码的名称)。