1.03k likes | 1.27k Views
Generación de Código No Optimizado. De la Representación Intermedia a Código de Máquina. Resumen. Introducción Overview de un procesador moderno Lenguaje de Máquina Convenciones de Llamado Generación de Expresiones Generación de Control de Flujo Generación de Procedimientos Linking.
E N D
Generación de Código No Optimizado De la Representación Intermedia a Código de Máquina
Resumen • Introducción • Overview de un procesador moderno • Lenguaje de Máquina • Convenciones de Llamado • Generación de Expresiones • Generación de Control de Flujo • Generación de Procedimientos • Linking Oscar Bonilla2Universidad Galileo
Programa (character stream) Token Stream Representación Intermedia Representación Intermedia Optimizada Código en Assembler Anatomía de un Compilador Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Arbol de Parseo Generador de Código Intermedio Optimizador de Código Intermedio Generador de Código Oscar Bonilla3Universidad Galileo
Programa (character stream) Token Stream Código en Assembler Anatomía de un Compilador Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Arbol de Parseo Generador de Código Intermedio High-level IR Low-level IR Representación Intermedia Generador de Código Oscar Bonilla4Universidad Galileo
Representación en Formato Intermedio while (i < v.length && v[i] != 0) { i = i+1; } entry cbr < ldl i len cbr ldf v != stl i 0 lda exit + ldf v ldl i ldl i 0 Oscar Bonilla5Universidad Galileo
El Generador de Código debe... • Traducir todas las instrucciones en la representación intermedia a lenguaje ensamblador • Asignar espacio para variables, arreglos, etc. • Adherirse a las convenciones de llamado • Crear la información simbólica necesaria Oscar Bonilla6Universidad Galileo
Resumen • Introducción • Resumen de un procesador moderno • Lenguaje de Máquina • Convenciones de Llamado • Generación de Expresiones • Generación de Control de Flujo • Generación de Procedimientos • Linking Oscar Bonilla7Universidad Galileo
Resumen de un Procesador Moderno Memory • ALU • Control • Memoria • Registros Registers ALU Control Oscar Bonilla8Universidad Galileo
Arithmetic and Logic Unit Memory • Hace la mayoría de operaciones • Con forma:OP Rdest, Rsrc1, Rsrc2 • Operaciones son: • Operaciones aritméticas (add, sub, mul) • Operaciones lógicas (and, sll) • Operaciones de comparación (seq, sge, slt) Registers ALU Control Oscar Bonilla9Universidad Galileo
Arithmetic and Logic Unit Memory • Muchas operaciones aritméticas pueden causar una excepción • overflow y underflow • Puede operar en distintos tipos de datos • 8, 16, 32 bits • Aritmética con y sin signo • Operaciones de punto flotante (ALU separada) • Instrucciones para convertir entre formatos (cvt.s.d) Registers ALU Control Oscar Bonilla10Universidad Galileo
Control Memory • Maneja la secuencia de Instrucciones • Ejecución de Instrucciones • Todas las instrucciones están en memoria • Fetch de la instrucción a la que apunta el PC y ejecutarla • Para instrucciones generales, incrementar el PC para que apunte a la siguiente posición de memoria Registers ALU Control Oscar Bonilla11Universidad Galileo
Control Memory • Saltos no condicionales • Fetch de la siguiente instrucción de una localidad diferente • Salto incondicional a una dirección dada j label • Salto incondicional a una dirección en un registro jr rsrc • Para manejar llamadas a procedimientos, se hace un salto incondicional, pero se guarda la siguiente dirección en la secuencia actual en un registro jal labeljalr rsrc Registers ALU Control Oscar Bonilla12Universidad Galileo
Control Memory • Saltos Condicionales • Ejectuamos un test,si es éxitoso, fetch de instrucciones de una nueva dirección,de otra forma fetch de la siguiente instrucción • Las instrucciones son de la forma: brelop Rsrc1, Rsrc2, label • relop es de la forma:eq, ne, gt, ge, lt, le Registers ALU Control Oscar Bonilla13Universidad Galileo
Control Memory • Transferencia de control en casos especiales (raros) • traps y excepciones • Mecanismo • Guardar la posición de la siguiente instrucción (o la actual) • Encontrar la dirección a la que hay que saltar (de un vector de excepciones) • Saltar a esa posición Registers ALU Control Oscar Bonilla14Universidad Galileo
Memory Memory • Espacio de Direcciones plano • Compuesto de words • Direccionable por bytes • Necesitamos guardar • Programa • Variables locales • Stack • Heap Registers ALU Control Oscar Bonilla15Universidad Galileo
Memory Memory Stack locales (parámetros) Registers ALU Objetos Control Heap Arrays Código Generado Oscar Bonilla16Universidad Galileo
Registers Memory • Arquitectura load/store • Todas las operaciones se ejecutan en registros • Necesitamos mover datos de/a memoria a/de registros • Importante para rendimiento • Limitados en número Registers ALU Control Oscar Bonilla17Universidad Galileo
Otras Interacciones Memory • Otras operaciones • Input/Output • Operaciones Privilegiadas / seguras • Manejo de hardware especial • TLBs, Caches etc. • La mayoría via system calls • Codificadas a mano en assembler • El compilador las puede tratar como una llamada normal a una función Registers ALU Control Oscar Bonilla18Universidad Galileo
Resumen • Introducción • Resumen de un procesador moderno • Lenguaje de Máquina • Convenciones de Llamado • Generación de Expresiones • Generación de Control de Flujo • Generación de Procedimientos • Linking Oscar Bonilla19Universidad Galileo
Las máquinas entienden... location data 0x4009b0: 3c1c0fc0 0x4009b4: 279c7640 0x4009b8: 0399e021 0x4009bc: 8f998044 0x4009c0: 27bdffe0 0x4009c4: afbf001c 0x4009c8: afbc0018 0x4009cc: 0320f809 0x4009d0: 2404000a 0x4009d4: 8fbf001c 0x4009d8: 8fbc0018 0x4009dc: 27bd0020 0x4009e0: 03e00008 0x4009e4: 00001025 Oscar Bonilla20Universidad Galileo
Las máquinas entienden... location data assembly instruction main: [test.c: 3] 0x4009b0: 3c1c0fc0 lui gp,0xfc0 [test.c: 3] 0x4009b4: 279c7640 addiu gp,gp,30272 [test.c: 3] 0x4009b8: 0399e021 addu gp,gp,t9 [test.c: 3] 0x4009bc: 8f998044 lw t9,-32700(gp) [test.c: 3] 0x4009c0: 27bdffe0 addiu sp,sp,-32 [test.c: 3] 0x4009c4: afbf001c sw ra,28(sp) [test.c: 3] 0x4009c8: afbc0018 sw gp,24(sp) [test.c: 3] 0x4009cc: 0320f809 jalr ra,t9 [test.c: 3] 0x4009d0: 2404000a li a0,10 [test.c: 3] 0x4009d4: 8fbf001c lw ra,28(sp) [test.c: 3] 0x4009d8: 8fbc0018 lw gp,24(sp) [test.c: 3] 0x4009dc: 27bd0020 addiu sp,sp,32 [test.c: 3] 0x4009e0: 03e00008 jr ra [test.c: 3] 0x4009e4: 00001025 move v0,zero Oscar Bonilla21Universidad Galileo
Programa (character stream) Token Stream Código en Assembler Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Arbol de Parseo Generador de Código Intermedio High-level IR Low-level IR Representación Intermedia Generador de Código Oscar Bonilla22Universidad Galileo
Programa (character stream) Token Stream Código en Assembler Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Arbol de Parseo Generador de Código Intermedio High-level IR Low-level IR Representación Intermedia Generador de Código Assembler & linker Binario Ejecutable Procesador Oscar Bonilla23Universidad Galileo
Lenguaje Ensamblador • Ventajas • Simplifica la generación de código debido al uso de instrucciones simbólicas y nombres simbólicos • Capa de abstracción lógica • Las arquitecturas pueden ser descritas por un lenguaje ensamblador podemos modificar la implementación • Instrucciones de macro assembler • Desventajas • Proceso adicional de ensamblaje y linking Oscar Bonilla24Universidad Galileo
Lenguaje Ensamblador • Lenguaje de Máquina Reposicionable (object modules) • Todas las posiciones (direcciones) representadas por símbolos • Mapeadas a direcciones de memoria en tiempo de linking y loading • Flexibilidad de compilación separada • Lenguaje de Máquina Absoluto • Direcciones hard-coded • Implementación simple y directa • Inflexible – difícil de recargar el código generado Oscar Bonilla25Universidad Galileo
Ejemplo de Assembler item: .word 1 .text fib: subu $sp, 40 sw $31, 28($sp) sw $4, 40($sp) sw $16, 20($sp) .frame $sp, 40, $31 # 7 if(n == 0) return 0; lw $14, 40($sp) bne $14, 0, $32 move $2, $0 b lab2 lab1: lw $15, 40($sp) bne $15, 1, $33 li $2, 1 b lab1 Oscar Bonilla26Universidad Galileo
Resumen • Introducción • Resumen de un procesador moderno • Lenguaje de Máquina • Convenciones de Llamado • Generación de Expresiones • Generación de Control de Flujo • Generación de Procedimientos • Linking Oscar Bonilla27Universidad Galileo
Compatibilidad • Necesitamos Manejar • Procedimientos múltiples • Llamadas a librerías • Código compilado por otros compiladores, escrito en lenguajes distintos, assembler escrito a mano • Convenciones de llamado • Layout de memoria • Registros • Stack Oscar Bonilla28Universidad Galileo
Layout de Memoria 0x7fffffff Stack • Inicio del Stack • Manejo del Heap • free lists • Posición de inicio en el segmento de texto locals (parameters) Objects Heap Arrays Text segment 0x400000 Reserved Oscar Bonilla29Universidad Galileo
Disciplinas de paso de parámetros • Muchos métodos distintos • Llamada por referencia • Llamada por valor • Llamada por valor-resultado • ¿Cómo pasamos los parámetros? • Por el stack • Por los registros • O una combinación Oscar Bonilla30Universidad Galileo
20 Registros • No es un registro, hard-wired a la constante 0 Oscar Bonilla31Universidad Galileo
Registros • Return Address de una llamada (call) • Implicitamente copiada por jal y jalr Oscar Bonilla32Universidad Galileo
Registros • Frame pointer • Stack pointer • Pointer to global area Oscar Bonilla33Universidad Galileo
Registros • Reservado para uso del ensamblador • Se necesita almacenamiento para manejar instrucciones de assembler compuestas Oscar Bonilla34Universidad Galileo
Registros • Retornan los resultados • Copiar el resultado cuando estamos listos para retornar • Usados para evaluar expresiones (si quieren) Oscar Bonilla35Universidad Galileo
Registros • Primeros cuatro argumentos de una llamada • Se pueden usar para otra cosa si los argumentos no importan • Si hay más argumentos se pasan por el stack Oscar Bonilla36Universidad Galileo
Registros • El resto son temporales Oscar Bonilla37Universidad Galileo
Registros • En una llamada a procedimiento los temporales: • Son guardados por el caller • Son guardados por el callee • Alguna combinación de ambos Oscar Bonilla38Universidad Galileo
21 Pregunta: • ¿Cuáles son las ventajas/desventajas de que: • El callee guarde los registros? • El caller guarde los registros? • ¿Qué registros deben ser usados por el caller y callee si la mitad es guardada por el caller y la otra mitad es guardada por el callee? • Caller-saved t0 - t9 • Calliee-saved s0-s7 Oscar Bonilla39Universidad Galileo
Registros • En una llamada a procedimiento los temporales: • Son guardados por el caller • Son guardados por el callee • Alguna combinación de ambos Oscar Bonilla40Universidad Galileo
23 Stack • Guarda los parámetros y las variables locales • Cada invocación obtiene una nueva copia • Caller tiene que guardar • Cualquier registro caller-saved que tiene un valor • Cualesquiera parámetros pasados • Return address (de cuando se hizo el branch) • Callee tiene que guardar • Dirección anterior del stack pointer • Cualquier registro callee-saved que use Oscar Bonilla41Universidad Galileo
Stack ... argument 5 argument 4 fp old frame pointer return address • Dirección del n-ésimo argumento es -(n-4)*4*$fp • Variables locales son constantes positivas de $fp Calliee saved registers Local variables Stack temporaries Dynamic area sp Oscar Bonilla42Universidad Galileo
24 Stack ... argument 5 argument 4 fp old frame pointer return address • Al llamar un nuevo procedimiento Calliee saved registers Local variables Stack temporaries Dynamic area sp Oscar Bonilla43Universidad Galileo
Stack ... argument 5 argument 4 fp old frame pointer return address • Al llamar un nuevo procedimiento, el caller: Calliee saved registers Local variables Stack temporaries Dynamic area sp Oscar Bonilla44Universidad Galileo
Stack ... argument 5 argument 4 fp old frame pointer return address • Al llamar un nuevo procedimiento, el caller: • push de cualquier t0-t9 que tenga un valor importante al stack Calliee saved registers Local variables Stack temporaries Dynamic area Caller saved registers sp Oscar Bonilla45Universidad Galileo
Stack ... argument 5 argument 4 fp old frame pointer return address • Al llamar un nuevo procedimiento, el caller: • push de cualquier t0-t9 que tenga un valor importante al stack • poner argumentos 1-4 en registros a0-a3 • push del resto de los argumentos al stack Calliee saved registers Local variables Stack temporaries Dynamic area Caller saved registers arguments sp Oscar Bonilla46Universidad Galileo
Stack ... argument 5 argument 4 fp old frame pointer return address • Al llamar un nuevo procedimiento, el caller: • push de cualquier t0-t9 que tenga un valor importante al stack • poner argumentos 1-4 en registros a0-a3 • push del resto de los argumentos al stack • hacer un jal o jalr Calliee saved registers Local variables Stack temporaries Dynamic area Caller saved registers arguments sp Oscar Bonilla47Universidad Galileo
sp 25 Stack ... argument 5 argument 4 fp old frame pointer return address • En el procedimiento, el calliee al principio: Calliee saved registers Local variables Stack temporaries Dynamic area Caller saved registers arguments Oscar Bonilla48Universidad Galileo
sp Stack ... argument 5 argument 4 old frame pointer return address • En el procedimiento, el calliee al principio : • copiar $sp a $fp Calliee saved registers Local variables Stack temporaries Dynamic area Caller saved registers fp arguments Oscar Bonilla49Universidad Galileo
sp Stack ... argument 5 argument 4 old frame pointer return address • En el procedimiento, el calliee al principio : • copiar $sp a $fp • push $fp al stack Calliee saved registers Local variables Stack temporaries Dynamic area Caller saved registers arguments fp old frame pointer Oscar Bonilla50Universidad Galileo