gpt4 book ai didi

c++ - 编写 LLVM int/string 输入

转载 作者:行者123 更新时间:2023-12-01 14:29:55 25 4
gpt4 key购买 nike

我正在尝试从 AST 生成 llvm-ir。

为了显示我添加的整数输出,

Constant *CalleeF = TheModule->getOrInsertFunction("printf",FunctionType::get(IntegerType::getInt32Ty(Context), PointerType::get(Type::getInt8Ty(Context), 0), true);`

在调用我写的打印函数时,
Value* PrintStmt::codegen(){
Value* V,*val,*to_print;
vector<Value *> ArgsV;
for (unsigned int i = 0, e = outs.size(); i != e; ++i){
to_print = outs[i]->codegen();
if(outs[i]->type=="int"){
val=Builder.CreateGlobalStringPtr("%d");
}
ArgsV.push_back(val);
ArgsV.push_back(to_print);
V = Builder.CreateCall(CalleeF, ArgsV, "printfCall");
}
return V;
}

我应该编写什么类似的代码来获取用户的输入,即 scanf 调用?

最佳答案

对于 scanf调用你可以先声明它的原型(prototype)

llvm::FunctionType *readFnType = llvm::FunctionType::get(builder.getInt32Ty(), true); 
llvm::Function* readfn = llvm::Function::Create(readFnType, llvm::GlobalValue::ExternalLinkage, "scanf", TheModule));

像这样称呼它
std::vector<Value*> ArgsV; // holds codegen IR for each argument
std::string StringFormat; // holds string formatting for all arguments
for(auto& arg : Args){
if(auto v = arg->codegen()){
if(v->getType()->isDoubleTy())
StringFormat += "%lf "; //
else if(v->getType()->isIntegerTy())
StringFormat += "%d ";
ArgsV.push_back(symbolTable[arg.name]);
}else return nullptr;
}
ArgsV.insert(ArgsV.begin(), builder.CreateGlobalStringPtr(StringFormat));
return builder.CreateCall(TheModule->getFunction("scanf"), ArgsV, "scanfCall");

在哪里 symbolTable是变量/参数名称到 Value* 的映射。保存变量的堆栈分配地址。回想一下 scanf获取要写入的变量的地址,这解释了符号表查找。

还值得一提的是,这使得 scanf本质上是不安全的。您应该考虑使用 fgetsgets代替功能。

关于c++ - 编写 LLVM int/string 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47272266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com