使用十六进制的llvm::Module::dump打印整数
当我调用使用十六进制的llvm::Module::dump打印整数,llvm,llvm-ir,Llvm,Llvm Ir,当我调用llvm::Module::dump时,它以十进制打印整数常量。例如: %1 = load float, float* inttoptr (i64 4404658304 to float*) 有没有办法让它用十六进制格式化?大概IR语法允许十六进制整数常量。Per,十六进制保留用于浮点文本。因此答案是否定的。如果不修补llvm,这是不可能的 如果您对修补程序llvm开放,那么您可以修改lib/IR/AsmWriter.cpp:1084 static void WriteConstan
llvm::Module::dump
时,它以十进制打印整数常量。例如:
%1 = load float, float* inttoptr (i64 4404658304 to float*)
有没有办法让它用十六进制格式化?大概IR语法允许十六进制整数常量。Per,十六进制保留用于浮点文本。因此答案是否定的。如果不修补llvm,这是不可能的 如果您对修补程序llvm开放,那么您可以修改lib/IR/AsmWriter.cpp:1084
static void WriteConstantInternal(raw_ostream &Out, const Constant *CV,
TypePrinting &TypePrinter,
SlotTracker *Machine,
const Module *Context) {
if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
if (CI->getType()->isIntegerTy(1)) {
Out << (CI->getZExtValue() ? "true" : "false");
return;
}
Out << CI->getValue();
return;
}
static void WriteConstantInternal(原始数据和输出,常量*CV,
打字机和打字机,
SlotTracker*机器,
常量模块*上下文){
if(常数常数常数*CI=动态铸造(CV)){
如果(CI->getType()->isIntegerTy(1)){
Out getZExtValue()?“true”:“false”);
返回;
}
Out getValue();
返回;
}
在这里,您可以将代码修补到下面,以将整数转储到十六进制
- Out << CI->getValue();
+ Out << format_hex(CI->getZExtValue(), 0, /*Upper=*/true);
-Out getValue();
+Out getZExtValue(),0,/*上限=*/true);
我正在考虑将其转储到一个字符串,然后搜索“i64[integer]”,这样我就不必在LLVM中更改任何内容。您还没有提到您的最终目标,所以,如果它对您有效,那就干杯吧。