我试图在运行时使用对 LLVM 中的 printf 的调用打印出 128 位结果。
我可以使用 printf 中的格式字符串 "%d" 打印 32 到 64 位整数。
请参阅下面的代码,因为我在尝试打印运行时计算的 128 位值时遇到了一些困难。包含动态转换为 ConstantInt 的代码部分永远不会执行,因为该值永远不会转换为 ConstantInt。
(我在 SO 上看到了这种方法 - LLVM 从 Value* 中获取常量整数)
下面只显示相关的代码部分
Value* val = e->codegen() ;
if(!val)
{
return logError("Error evaluating argument to function call");
}
if(val->getType()->isIntegerTy() )
{
if(val->getType()->getIntegerBitWidth() <= 64)
{
tempString = tempString + "%+d,";
}
// Is this correct ? Doesnt seem to be executing ...
else
{
if(ConstantInt* CI = dyn_cast<ConstantInt>(val))
{
// base 10 and signed
std::string res = CI->getValue().toString(10,true);
val=Builder.CreateGlobalStringPtr(res,"str");
tempString = tempString + "%+s,";
}
}
}
argsValueVector.push_back(val);
++i;
}
formatString = formatString + tempString + "\n" ;
// every string is declared as a "global constant" at the top of the module.
Value* val=Builder.CreateGlobalStringPtr(formatString,"str");
std::vector<Value*>::iterator it = argsValueVector.begin();
argsValueVector.insert(it,val);
}
return Builder.CreateCall(F,argsValueVector,"calltmp") ;
}