llvm llvm-c++-api llvm-ir

Adición de metadatos a instrucciones en LLVM IR



llvm-c++-api llvm-ir (1)

En mi opinión:

1. ¿Son los metadatos el mecanismo correcto para usar?

Si su "otra herramienta" no es un pase en sí mismo, entonces sí, creo que los metadatos son el mejor enfoque: mantiene todo en el IR, fácil de identificar a simple vista, fácil de agregar manualmente para las pruebas y, quizás lo más importante, lo hace no colisione con nada más, siempre y cuando no reutilice los tipos de metadatos existentes.

Sin embargo, si su "otra herramienta" es un pase en sí mismo, hay una alternativa: puede hacer que un pase sea dependiente del otro, y luego usar la información del anterior directamente en el pase posterior. La ventaja es que no tienes que modificar el IR.

2. ¿Cómo usar un nodo de metadatos personalizados?

Use la variante char* de setMetadata , así:

LLVMContext& C = Inst->getContext(); MDNode* N = MDNode::get(C, MDString::get(C, "my md string content")); Inst->setMetadata("my.md.name", N);

Y si es la primera vez que se usa la cadena en un setMetadata , automáticamente registrará my.md.name como un nuevo tipo en el módulo (en realidad es consistente en todo el contexto, creo). Más tarde puede recuperar la cadena usando:

cast<MDString>(Inst->getMetadata("my.md.name")->getOperand(0))->getString();

Sin embargo, si desea invocar getMetadata o setMetadata repetidamente desde el mismo ámbito, también puede usar Module::getMDKindID para obtener el tipo real utilizado y usar las variaciones de estos métodos que usan el valor kind.

Finalmente, tenga en cuenta que puede limitar el alcance del nodo de metadatos para que esté dentro de una función; use la MDNode::get(..., ..., true) para eso, aunque yo nunca lo usé.

En primer lugar, soy un novato en los pases de LLVM.

Estoy tratando de agregar metadatos a las instrucciones en LLVM después de un paso de transformación (con la API de C ++). Tengo la intención de almacenar esta información para que la use otra herramienta en una cadena de herramientas. Tengo dos preguntas con respecto a esto.

  1. Espero que la información que almaceno como metadatos se incorpore a otra herramienta que funciona en el LLVM IR. Entonces, ¿los metadatos son una buena idea? Tengo la intención de almacenar cadenas como metadatos con algunas instrucciones.

  2. Si los metadatos son la forma correcta de ir aquí, necesito ayuda para crear un nodo de metadatos. Planeo usar la función setMedata () para adjuntarla a una instrucción. La variante de setMetadata () es la correcta para usar. No estoy seguro de qué MDKind deberían tener mis datos. Quiero crear una MDString, adjuntarla a mi MDNode y luego llamar a setMetadata () con una instrucción. ¿Qué contexto debo usar en setMedata (), si quiero adjuntar los metadatos a una instrucción dentro de una función? ¿Cuál es la relevancia del contexto para los metadatos?

Intenté leer muchas discusiones en los foros y los documentos llvm doxygen pero no obtuve una respuesta clara y completa a todas mis preguntas. Aprecio su ayuda o algún material que pueda ayudarme a entender esto.