es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La clase `llvm::MCInstPrinter` no tiene un miembro llamado `setPrintBranchImmAsAddress`.

Cuando compilo un proyecto sobre riscv32 en wsl2 (Windows Subsystem for Linux) con la versión de Linux ubuntu-20.04LTS, ocurre un error de compilación:

chizm@LAPTOP-UV3G5VIL:~/Templates/ics2021/nemu$ make
+ CXX src/utils/disasm.cc
src/utils/disasm.cc: En la función ‘void init_disasm(const char*)’:
src/utils/disasm.cc:55:8: error: ‘class llvm::MCInstPrinter’ no tiene un miembro llamado ‘setPrintBranchImmAsAddress’
   55 |   gIP->setPrintBranchImmAsAddress(true);
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~
make: *** [/home/chizm/Templates/ics2021/nemu/scripts/build.mk:40: /home/chizm/Templates/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/disasm.o] Error 1

Pero verifiqué mi versión de LLVM a continuación:

chizm@LAPTOP-UV3G5VIL:~/Templates/ics2021/nemu$ sudo apt install llvm
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
llvm ya está en su versión más reciente (1:10.0-50~exp1).
0 actualizados, 0 nuevos se instalarán, 0 para eliminar y 0 no actualizados.

La versión de LLVM es la más reciente. ¿Qué debo hacer?

Aquí está el código:

#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCDisassembler/MCDisassembler.h"
#include "llvm/MC/MCInstPrinter.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"

using namespace llvm;

static llvm::MCDisassembler *gDisassembler = nullptr;
static llvm::MCSubtargetInfo *gSTI = nullptr;
static llvm::MCInstPrinter *gIP = nullptr;

extern "C" void init_disasm(const char *triple) {
  llvm::InitializeAllTargetInfos();
  llvm::InitializeAllTargetMCs();
  llvm::InitializeAllAsmParsers();
  llvm::InitializeAllDisassemblers();

  std::string errstr;
  std::string gTriple(triple);

  llvm::MCInstrInfo *gMII = nullptr;
  llvm::MCRegisterInfo *gMRI = nullptr;
  auto target = llvm::TargetRegistry::lookupTarget(gTriple, errstr);

  ....

  gDisassembler = target->createMCDisassembler(*gSTI, *Ctx);
  gIP = target->createMCInstPrinter(llvm::Triple(gTriple),
      AsmInfo->getAssemblerDialect(), *AsmInfo, *gMII, *gMRI);
  gIP->setPrintImmHex(true);
  gIP->setPrintBranchImmAsAddress(true);

  ....
}

Además, mi CPU de la computadora es AMD64.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basándonos en el mensaje de error proporcionado, parece que el problema está relacionado con una función miembro faltante en la clase LLVM MCInstPrinter, específicamente la función setPrintBranchImmAsAddress().

    Una posible solución podría ser actualizar la versión de LLVM a una versión más reciente, ya que la última versión disponible para Ubuntu 20.04 LTS puede que no sea la más actualizada que incluye la función faltante. Puedes intentar instalar una versión más reciente de LLVM directamente desde el sitio web oficial o a través de un gestor de paquetes que proporcione una actualización más reciente.

    Otra solución podría ser modificar el código para utilizar un método alternativo para imprimir las instrucciones de salto, como convertir manualmente el valor inmediato a una dirección o utilizar un método diferente proporcionado por LLVM. Esto requeriría modificar la función init_disasm() mostrada en el código proporcionado.

    También es posible que el problema esté relacionado con la configuración del sistema o la configuración, como versiones de bibliotecas en conflicto, dependencias faltantes o indicadores de compilación incorrectos. En ese caso, podría ser necesario investigar y solucionar problemas adicionales.

Comments are closed.