String LLVM IR字符串初始化

String LLVM IR字符串初始化,string,llvm,String,Llvm,我正在LLVM IR中编写一个程序,我试图初始化一个字符串,该字符串表示“Hello World!”,但我不知道如何初始化。代码的目标是计算字符串中的字符数。在需要初始化字符串之前以及在头之后,我有以下内容: int main(int argc,const char*argv[]{ //设置 //构建一个指向字符串的指针-LLVMValueRef*strptr=LLVMBuildGlobalStringPtr(builder,const char*string,const char*name);

我正在LLVM IR中编写一个程序,我试图初始化一个字符串,该字符串表示“Hello World!”,但我不知道如何初始化。代码的目标是计算字符串中的字符数。在需要初始化字符串之前以及在头之后,我有以下内容:

int main(int argc,const char*argv[]{
//设置
//构建一个指向字符串的指针-LLVMValueRef*strptr=LLVMBuildGlobalStringPtr(builder,const char*string,const char*name);
LLVMValueRef*strptr;
LLVMContextRef context=LLVMContextCreate();
LLVMBuilderRef builder=llvmcreatebuildercontext(上下文);
LLVMModuleRef module1=llvmmodulecreatewithnameintext(“mod”,context);
}

> > P> >使用C++后端查看这些事情的最简单方式——它生成为您构建模块的C++ API调用。你可以看到这一切都完成了

“编译”此代码:

const char*foo(){
const char*s=“你好世界”;
返回s;
}

这里有相关的C++ API调用:

GlobalVariable*gvar\u array\uu str=新的GlobalVariable(/*模块=*/*模块,
/*类型=*/ArrayTy\u 0,
/*isConstant=*/true,
/*链接=*/GlobalValue::PrivateLink,
/*初始值设定项=*/0,//具有以下指定的初始值设定项
/*名称=*/“.str”);
gvar_数组_uustr->setAlignment(1);
//恒定定义
常量*const\u array\u 4=ConstantDataArray::getString(mod->getContext(),“hello world”,true);
std::向量常数ptr_5_指数;
ConstantInt*const_int64_6=ConstantInt::get(mod->getContext(),APInt(64,StringRef(“0”),10));
常数ptr_5_索引。向后推(常数int64_6);
常数ptr_5_索引。向后推(常数int64_6);
常数*const_ptr_5=ConstantExpr::getGetElementPtr(gvar_数组__str,const_ptr_5_索引);
//全局变量定义
gvar_数组__str->setInitializer(常量数组_4);
//函数定义
//功能:foo(func_foo)
{
BasicBlock*label_entry=BasicBlock::Create(mod->getContext(),“entry”,func_foo,0);
//块条目(标签_条目)
ReturnInst::Create(mod->getContext(),const_ptr_5,label_条目);
}

什么是你想不出来的?我对此不太了解,但我想说第一个
char*
是内容(这里是
Hello World
),第二个类似于变量名,我试过了,但没用。我甚至不知道我是否应该建立一个指向字符串的指针,或者如果我需要使字符串成为全局变量,然后存储它。更新给任何看到这个的人——不要费心去尝试C++后端,@ TyySDG,你知道用其他方法来显示“如何使用C/C++ API生成IR”吗?我觉得没有足够的文档来支持这些API。我不用费心使用旧版本的llvm,也不用猜新版本的llvm是如何工作的。@worldterminator对不起,我已经一年多没有使用llvm了。祝你好运!!