在 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】:

您的代码看起来不错,除了 a4a5 行应该是

auto a4 = dyn_cast<GlobalVariable>(a);
if (a4)
  auto a5 = dyn_cast<ConstantDataArray>(a4->getInitializer());
  if (a5)
    auto a6 = a5->getAsCString();

【讨论】:

以上是关于在 LLVM 中获取全局字符串值的主要内容,如果未能解决你的问题,请参考以下文章

获取指向 LLVM-IR 中数组第一个元素的指针

LLVM 中间代码归纳

如何在 LLVM IR 的 switch 指令中使用 char*?

使用 LLVM 创建本地字符串

SpringBoot中配置文件详解(ymlproperties全局配置和自定义配置),获取配置方式

LLVM 中的抽象解释