在 LLVM 中获取全局字符串值
Posted
技术标签:
【中文标题】在 LLVM 中获取全局字符串值【英文标题】:Get global string value in LLVM 【发布时间】:2018-06-12 13:22:53 【问题描述】:我的情况是,我在源代码中有一个带有常量字符串参数的函数调用,并且我想在 C++ 中的 LLVM Pass 中访问该字符串(作为 CString 或 char* 等)。 来源示例:
void some_function()
give_txt("abcd 1234");
功能
give_text
是一个虚拟函数,在 .hpp -file 中定义如下:
const char* give_txt(char*)
return ".";
那么:如何在通行证中访问这个“abcd 1234”? 我已经走到这一步了:
bool runOnModule(Module &M) override
for(auto &F : M)
std::string name = F.getName();
if(name.find("some_function") != std::string::npos)
auto &B = *(F.begin());
for(auto &I : B)
if (auto* op = dyn_cast<CallInst>(&I))
std::string mangled_name = op->getCalledFunction()->getName();
std::string name = demangle(mangled_name);
if(name.find("give_text") != std::string::npos)
Value* a = op->getArgOperand(0);
auto a2 = op->arg_begin()->get();
auto a3 = a->getType();
auto a4 = dyn_cast<ConstantDataArray>(a);
auto a5 = a4->getAsCString();
但这显然行不通,编译在最后一条指令处崩溃(分配a5)。
【问题讨论】:
为什么不遍历Module.globals()
来查找字符串常量?
究竟如何?我可以遍历它们,但我如何辨别哪个是正确的以及如何从中取出字符串?
@Elmore 看到这仍然没有被接受的答案,你知道如何从llvm::Constant
对象中提取字符串吗?我目前也在努力实现这一目标。
【参考方案1】:
您的代码看起来不错,除了 a4
和 a5
行应该是
auto a4 = dyn_cast<GlobalVariable>(a);
if (a4)
auto a5 = dyn_cast<ConstantDataArray>(a4->getInitializer());
if (a5)
auto a6 = a5->getAsCString();
【讨论】:
以上是关于在 LLVM 中获取全局字符串值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 LLVM IR 的 switch 指令中使用 char*?