Cómo crear una clase de valor que contenga tipos enteros en llvm
#include "llvm/Value.h"
La clase de valor es la clase más importante en el código fuente de llvm. Representa un valor escrito que puede ser un operando de otras instrucciones. En llvm, hay muchos tipos de valores diferentes, como constantes, parámetros, instrucciones y funciones, todos los cuales son valores.
Un valor específico se puede usar varias veces en la representación intermedia de llvm. Por ejemplo, el parámetro de introducción de una función (representado como una instancia de Argumento) se puede usar en cada instrucción de la función que usa el. Argumento. Para realizar un seguimiento de esta relación, la clase Valor mantiene una lista de todos los usuarios para realizar un seguimiento de cuál se utiliza (la clase Usuario es la clase base para los nodos de gráficos en llvm).
Debido a que llvm es una representación intermedia escrita, cada valor de llvm se escribe y el tipo está disponible a través del método getType(). Además, se pueden nombrar todos los valores de llvm. Sus nombres se pueden imprimir en el código llvm de la siguiente manera:
foo = add i32 1, 2
El nombre de esta instrucción es foo. Tenga en cuenta que el nombre de cualquier Valor puede ser una cadena vacía, por lo que el nombre solo se puede usar para depurar, no para rastrear el Valor o mapear. Por lo tanto, se debe utilizar un puntero a Valor.
Otro aspecto importante de llvm es que no hay distinción entre una variable SSA y la operación que la generó. Por tanto, cualquier referencia a Valor se representa mediante un puntero a la clase correspondiente a Valor.
Métodos públicos
Valor::use_iterator--Iterador de lista de usuarios
Valor: .use_iterator--Iterador de lista de usuarios: const_use_iterator - const ~ p>
use_size () sin firmar: el número de usuarios que devuelven el valor
bool use_empty(): demasiado obvio~
use_iterator use_begin()
use_iterator use_end()
Usuario *use_back()- Devuelve el último
Tipo * getType() const;
Tipo de valor de retorno
bool hasName() const;
string:: string getName() const;
void setName(const std: .string amp; Nombre)
void replaceAllUsesWith(Value *V);
Este método itera a través de la lista de usuarios correspondientes a un valor y reemplaza el valor utilizado con la variable especificada. Por ejemplo, si detecta que una determinada instrucción siempre produce un tipo constante, puede reemplazarla de la siguiente manera
Inst-gt;replaceAllUsesWith(ConstVal);
4. /p>
#include "llvm/ User.h"
Esta clase es la clase base para todos los nodos llvm, que, por supuesto, puede hacer referencia a Valor.
Todas las operaciones en la clase Usuario actúan directamente sobre el tipo Valor de llvm al que apunta.
Métodos públicos
Valor * getOperand(unsigned i)
unsigned getNumOperands()
Estos dos métodos exponen la operación del usuario.
Usuario:: op_iterator - iterador que define la operación
op_iterator op_begin()
op_iterator op_end()
Estos tres métodos Iteración se proporcionan métodos
5. Clase de instrucción
#include "llvm/Instruction.h"
La clase de instrucción es para todas las instrucciones en llvm Clase básica. Los datos rastreados por la clase Instrucción incluyen el código de operación (tipo de instrucción) y el BasicBlock principal.
Debido a que la clase Instrucción es una subclase de la clase Usuario, puedes manipular Instrucción de la misma manera que la clase Usuario.
La clase llvm/Instruction.def es muy importante para la clase Instrucción. Este archivo contiene metadatos para diferentes tipos de directivas. Las variables de enumeración descritas allí se utilizan en códigos de operación (por ejemplo, Instrucción::Add e Instrucción::ICmp).
Subclase
Operador binario
Esta subclase representa todas las instrucciones con solo dos operandos del mismo tipo.
CastInst
Esta subclase es la clase principal de 12 instrucciones de conversión y proporciona métodos de acceso público.
CmpInst
Esta subclase representa dos instrucciones distintas: ICmpInst (entero) y FCmpInst (punto flotante)
TerminatorInst
Esta subclase es la clase principal de todas las clases de terminador que pueden terminar bloques de código.
Métodos públicos
BasicBlock * getParent()
Devuelve el bloque de código básico en el que se encuentra.
bool mayWriteToMemory()
Si la instrucción necesita escribirse en la memoria, es decir, llamar, liberar, llamar y almacenar, entonces devuelve verdadero
unsigned getOpcode() p>
Devuelve el código de operación de la instrucción
Instrucción * clone() const
Devuelve otra instancia de la instrucción especificada que no tiene nombre y está no incrustado en el medio del bloque de código básico.