快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

LLVMIR字符串类型拼接方法是怎样的

本篇文章为大家展示了LLVM IR字符串类型拼接方法是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

灵寿网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。成都创新互联自2013年创立以来到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联

IR语义为将字符串与整型进行拼接操作;方法虽然笨拙,但能够满足目前的业务需求,今分享出来供大家交流与参考。代码运行环境为LLVM6.0。 关键字:LLVM、字符串、char*、string、拼接 、concat、IR

#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/BasicBlock.h"

#include "llvm/ExecutionEngine/MCJIT.h"
#include "llvm/IR/TypeBuilder.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace llvm;
using namespace std;

//字符串拼接操作放在C++端进行
char* javaMethodAdd( int x, char * str) {
	
		cout << "arg x:"<< x << endl;
	string str1 = str;
	string xstr = to_string(x);
	str1+= xstr;
	char *st1 = const_cast(str1.c_str()) ;
	return st1;
}

int main() {
	llvm::LLVMContext *context = new llvm::LLVMContext();
	llvm::Module *module = new llvm::Module("test", *context);

	std::vector arg_types = {
		llvm::Type::getInt32Ty(*context),
		llvm::Type::getInt32Ty(*context)};
//函数参数,返回类型为char指针
	llvm::FunctionType *ftype = llvm::FunctionType::get(
		llvm::Type::getInt8PtrTy(*context), arg_types,false);


	llvm::Function *func = llvm::Function::Create(
		ftype, llvm::GlobalValue::LinkageTypes::ExternalLinkage, "my_func", module);
			func->setCallingConv(llvm::CallingConv::C);

	llvm::BasicBlock *bb = llvm::BasicBlock::(*context, "entry", func);

	llvm::IRBuilder<> builder(*context);
	builder.SetInsertPoint(bb);
//获取传入的参数
	llvm::Argument *arg0 = func->arg_begin() + 0;
	llvm::Argument *arg1 = func->arg_begin() + 1;
	
	
	//string begain------------------
	//LLVM字符串常量
Constant *const_array_str = ConstantDataArray::getString(*context, "beeeeegineeee", false);
	//申请内存空间
	AllocaInst* const_array_addr = builder.CreateAlloca(const_array_str->getType(), 
	                           ConstantExpr::getSizeOf(const_array_str->getType()),"temaddr");

const_array_addr->setAlignment (1);		   
	std::vector index_vector;
	index_vector.push_back(ConstantInt::get(Type::getInt32Ty(*context), 0));
	
	auto valueAsPtr = builder.CreateGEP(const_array_addr, index_vector, "tmp");
		// 存储字符串到内存空间
	StoreInst *sist = builder.CreateStore(const_array_str, valueAsPtr);
	sist->setAlignment (1);	
	
	index_vector.push_back(ConstantInt::get(Type::getInt64Ty(*context), 0));
	//创建指向字符串存储内存空间的指针
auto  retRes = builder.CreateInBoundsGEP( const_array_str->getType(), const_array_addr, index_vector, "tmpstr");
		//string end---------------------------
	

	//llvm::Value *result = builder.CreateAdd(arg0, arg1, "result");
	llvm::Value* result = builder.CreateBinOp(llvm::Instruction::Add,
                                   arg0, arg1, "result");
	//忽略函数名称(可改为任意的)
	FunctionType* double_add_double_type = TypeBuilder::get(*context);
	Function* fdouble_add_double = cast(module->getOrInsertFunction("double_add_double", double_add_double_type));
	std::vector args;
	args.push_back(result);
	args.push_back(retRes);
	Value* ret = builder.CreateCall(fdouble_add_double, args);
	
	builder.CreateRet(ret);
llvm::InitializeNativeTarget();
	llvm::InitializeNativeTargetAsmPrinter();
	llvm::InitializeNativeTargetAsmParser();
	//创建执行引擎
 llvm::ExecutionEngine *ee =
        llvm::EngineBuilder(std::unique_ptr(module)).setEngineKind(llvm::EngineKind::JIT).create();
 	printf("executed  .........segment........\n");
	//LLVM函数与C++函数映射
 ee->addGlobalMapping(fdouble_add_double, (char*)javaMethodAdd);

	ee->finalizeObject();

char* (*add)(int, int) = (char* (*)(int, int))ee->getFunctionAddress("my_func");
	printf("Result: %s\n", add(43, 10));
	return 0;
}

//编译和运行命令(Linux)。

// clang++ -O3 cppName.cpp -o test.bc `llvm-config --cflags --ldflags llvm-config --libs llvm-config --system-libs  `

// ./test.bc

上述内容就是LLVM IR字符串类型拼接方法是怎样的,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。


网页标题:LLVMIR字符串类型拼接方法是怎样的
本文网址:http://6mz.cn/article/jccsej.html

其他资讯