Red de conocimiento informático - Material del sitio web - Cómo crear una clase de valor que contenga tipos enteros en llvm

Cómo crear una clase de valor que contenga tipos enteros en llvm

3. Clase de valor

#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 ~

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()

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.