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.

Cómo llamar a una función en línea en LLVM

Escribí una función en línea e implementé la llamada a cada bloque básico en la función en línea en el pase de LLVM. Sin embargo, el error de compilación es el siguiente:

La llamada a una función en línea en una función con información de depuración debe tener una ubicación !dbg.

Me pregunto ¿por qué? ¿Es posible que me falte algún paso o parámetro?

[+] La instrucción de llamada es así:
“`cpp
std::vector<type *=""> Vct;
Vct.push_back(Int32Ty);
Vct.push_back(Int32Ty);
ArrayRef<type *=""> Args(Vct);
FunctionType *Ty = FunctionType::get(Type::getVoidTy(Ctx), Args, false);
FunctionCallee callee_ = M.getOrInsertFunction("HH", Ty);
Value *Args_[] = { IRB.getInt32(a), IRB.getInt32(b) };
const Twine Name = "";

IRB.CreateCall(callee_, Args_, Name);
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error que encontraste sugiere que cuando creaste la instrucción Call, no incluiste la información de ubicación de depuración. La información de ubicación de depuración permite al compilador asociar números de línea del código fuente con el código LLVM IR generado, facilitando la depuración del código.

    Para solucionar el error, debes agregar una ubicación de depuración a tu instrucción Call. Puedes hacer esto creando un nuevo objeto DebugLoc y pasándolo al método CreateCall, de la siguiente manera:

    DILocation *Loc = IRB.getCurrentDebugLocation()->get();
    IRBuilder<> Builder(Inst.getParent(), Inst.getIterator());
    DebugLoc debugLoc(Loc->getLine(), Loc->getCol(), Loc->getScope());
    Builder.SetCurrentDebugLocation(debugLoc);
    Builder.CreateCall(callee_, Args_);
    

    En este ejemplo, obtenemos la ubicación de depuración actual del Instruction Builder (IRB) y creamos un nuevo objeto DebugLoc a partir de ella. Luego, utilizamos una instancia de IRBuilder para insertar la instrucción Call con la ubicación de depuración. Debes reemplazar Inst, que es la instrucción para la cual estás generando información de depuración, con tu propia instrucción.

    Al agregar información de ubicación de depuración, deberías poder resolver el error de compilación.

Comments are closed.