LLVM - 如何从std :: string构造llvm :: Value

时间:2018-02-13 21:07:50

标签: llvm llvm-ir

std::string myIR = "%3 = alloca i32, align 4";

如何将C ++ std::string(例如上面的那个)转换为llvm::Value?我可以将llvm::Instruction放入std:string this SO答案节目,但我不确定如何从std::string转到llvm::Instruction或者llvm::Value

2 个答案:

答案 0 :(得分:0)

我不确定你要完成什么(看起来有点可疑),因为打印或转换为字符串的典型用法是出于调试目的(你链接的SO Q&A)。

话虽如此,也许您可​​以查看Parser.h头文件的llvm::parseAssemblyString()函数(还要注意其他变体中也有llvm::parseAssemblyString()函数)。这需要将IR至少包装到一个函数中(您可以创建一个类似的虚拟void foo(void))。

最小(不完整)示例(至少是LLVM 3.9.0):

#include <memory>
// using std::unique_ptr

#include "llvm/IR/LLVMContext.h"
// using llvm::LLVMContext

#include "llvm/IR/Module.h"
// using llvm::Module

#include "llvm/IR/Verifier.h"
// using llvm::verifyModule

#include "llvm/AsmParser/Parser.h"
// using llvm::parseAssemblyString

#include "llvm/Support/SourceMgr.h"
// using llvm::SMDiagnostic

#include "llvm/Support/raw_ostream.h"
// using llvm::raw_string_ostream

#include "llvm/Support/ErrorHandling.h"
// using llvm::report_fatal_error

std::string myAsmIR = "...";
llvm::LLVMContext theContext;
llvm::SMDiagnostic theDiagnostic;

std::unique_ptr<llvm::Module> myModule = llvm::parseAssemblyFile(myAsmIR, theDiagnostic, theContext);

// for verifying and printing diagnostics from the parsed file/string
std::string msg;
llvm::raw_string_ostream os(msg);
theDiagnostic.print("", os);

if(llvm::verifyModule(*myModule, &(llvm::errs()))
   llvm::report_fatal_error(os.str().c_str());

这会为您提供llvm::Module,您可以按常规方式处理(例如*myModule->begin()以获取第一个功能)。

最后,您已将问题标记为“llvm-3.0”,但这是一个相当旧的版本,所以不确定这个API有多少,但您可以挖掘。

如果您找到其他方式,请告诉我们。

答案 1 :(得分:0)

您可以使用 IRBuilder <>。CreateGlobalStringPtr IRBuilder <>。CreateGlobalString 函数从stl字符串创建全局字符串:

LLVMContext context;
IRBuilder<> builder(context);

std::string str = "hello world"
Value * v = builder.CreateGlobalString(StringRef(str),"varName");
...