使用十六进制的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中更改任何内容。您还没有提到您的最终目标,所以,如果它对您有效,那就干杯吧。