La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Compiladores Generación de Código No Optimizado De la Representación Intermedia a Código de Máquina.

Presentaciones similares


Presentación del tema: "Compiladores Generación de Código No Optimizado De la Representación Intermedia a Código de Máquina."— Transcripción de la presentación:

1 Compiladores Generación de Código No Optimizado De la Representación Intermedia a Código de Máquina

2 Oscar Bonilla 2Universidad Galileo 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

3 Oscar Bonilla 3Universidad Galileo Anatomía de un Compilador Optimizador de Código Intermedio Generador de Código Representación Intermedia OptimizadaCódigo en Assembler Generador de Código Intermedio Representación Intermedia Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Programa (character stream)

4 Oscar Bonilla 4Universidad Galileo Anatomía de un Compilador Generador de Código Representación Intermedia Código en Assembler High-level IR Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Programa (character stream) Low-level IR Generador de Código Intermedio

5 Oscar Bonilla 5Universidad Galileo Representación en Formato Intermedio while (i < v.length && v[i] != 0) { i = i+1; } entry ldl ilen < cbr stl i exit ldf v lda 0 != cbr ldf vldl i 0 +

6 Oscar Bonilla 6Universidad 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

7 Oscar Bonilla 7Universidad 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

8 Oscar Bonilla 8Universidad Galileo Resumen de un Procesador Moderno ALU Control Memoria Registros Memory RegistersALU Control

9 Oscar Bonilla 9Universidad Galileo Arithmetic and Logic Unit Hace la mayoría de operaciones Con forma: OP R dest, R src1, R src2 Operaciones son: –Operaciones aritméticas (add, sub, mul) –Operaciones lógicas (and, sll) –Operaciones de comparación (seq, sge, slt) Memory Registers Control ALU

10 Oscar Bonilla 10Universidad Galileo Arithmetic and Logic Unit 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) Memory Registers Control ALU

11 Oscar Bonilla 11Universidad Galileo Control 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 Memory RegistersALU Control

12 Oscar Bonilla 12Universidad Galileo Control 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 r src –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 label jalr r src Memory RegistersALU Control

13 Oscar Bonilla 13Universidad Galileo Control 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 R src1, R src2, label –relop es de la forma: eq, ne, gt, ge, lt, le Memory RegistersALU Control

14 Oscar Bonilla 14Universidad Galileo Control 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 Memory RegistersALU Control

15 Oscar Bonilla 15Universidad Galileo Memory Espacio de Direcciones plano –Compuesto de words –Direccionable por bytes Necesitamos guardar –Programa –Variables locales –Stack –Heap Memory RegistersALU Control

16 Oscar Bonilla 16Universidad Galileo Memory RegistersALU Control Stack Código Generado Heap Objetos Arrays locales (parámetros)

17 Oscar Bonilla 17Universidad Galileo Registers 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 ALU Control Memory Registers

18 Oscar Bonilla 18Universidad Galileo Otras Interacciones 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 ALU Control Memory Registers

19 Oscar Bonilla 19Universidad 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

20 Oscar Bonilla 20Universidad 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

21 Oscar Bonilla 21Universidad Galileo Las máquinas entienden... location dataassembly instruction main: [test.c: 3] 0x4009b0:3c1c0fc0luigp,0xfc0 [test.c: 3] 0x4009b4:279c7640addiugp,gp,30272 [test.c: 3] 0x4009b8:0399e021addugp,gp,t9 [test.c: 3] 0x4009bc:8f998044lwt9,-32700(gp) [test.c: 3] 0x4009c0:27bdffe0addiusp,sp,-32 [test.c: 3] 0x4009c4:afbf001cswra,28(sp) [test.c: 3] 0x4009c8:afbc0018swgp,24(sp) [test.c: 3] 0x4009cc:0320f809jalrra,t9 [test.c: 3] 0x4009d0:2404000alia0,10 [test.c: 3] 0x4009d4:8fbf001clwra,28(sp) [test.c: 3] 0x4009d8:8fbc0018lwgp,24(sp) [test.c: 3] 0x4009dc:27bd0020addiusp,sp,32 [test.c: 3] 0x4009e0:03e00008jrra [test.c: 3] 0x4009e4:00001025movev0,zero

22 Oscar Bonilla 22Universidad Galileo Representación Intermedia Programa (character stream) Generador de Código Código en Assembler High-level IR Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Low-level IR Generador de Código Intermedio

23 Oscar Bonilla 23Universidad Galileo Representación Intermedia Programa (character stream) Generador de Código Código en Assembler High-level IR Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Low-level IR Generador de Código Intermedio Assembler & linker Binario Ejecutable Procesador

24 Oscar Bonilla 24Universidad 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

25 Oscar Bonilla 25Universidad 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

26 Oscar Bonilla 26Universidad Galileo Ejemplo de Assembler item:.word1.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 blab2 lab1: lw$15, 40($sp) bne$15, 1, $33 li$2, 1 blab1

27 Oscar Bonilla 27Universidad 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

28 Oscar Bonilla 28Universidad 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

29 Oscar Bonilla 29Universidad Galileo Layout de Memoria Inicio del Stack Manejo del Heap –free lists Posición de inicio en el segmento de texto Stack Text segment Heap Objects Arrays locals (parameters) 0x7fffffff 0x400000 Reserved

30 Oscar Bonilla 30Universidad 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

31 Oscar Bonilla 31Universidad Galileo Registros No es un registro, hard-wired a la constante 0 20

32 Oscar Bonilla 32Universidad Galileo Registros Return Address de una llamada (call) –Implicitamente copiada por jal y jalr

33 Oscar Bonilla 33Universidad Galileo Registros Frame pointer Stack pointer Pointer to global area

34 Oscar Bonilla 34Universidad Galileo Registros Reservado para uso del ensamblador –Se necesita almacenamiento para manejar instrucciones de assembler compuestas

35 Oscar Bonilla 35Universidad Galileo Registros Retornan los resultados –Copiar el resultado cuando estamos listos para retornar –Usados para evaluar expresiones (si quieren)

36 Oscar Bonilla 36Universidad 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

37 Oscar Bonilla 37Universidad Galileo Registros El resto son temporales

38 Oscar Bonilla 38Universidad Galileo Registros En una llamada a procedimiento los temporales: –Son guardados por el caller –Son guardados por el callee –Alguna combinación de ambos

39 Oscar Bonilla 39Universidad Galileo 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 21

40 Oscar Bonilla 40Universidad Galileo Registros En una llamada a procedimiento los temporales: –Son guardados por el caller –Son guardados por el callee –Alguna combinación de ambos

41 Oscar Bonilla 41Universidad Galileo 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 23

42 Oscar Bonilla 42Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area fp sp Dirección del n-ésimo argumento es -(n-4)*4*$fp Variables locales son constantes positivas de $fp

43 Oscar Bonilla 43Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area fp sp Al llamar un nuevo procedimiento 24

44 Oscar Bonilla 44Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area fp sp Al llamar un nuevo procedimiento, el caller:

45 Oscar Bonilla 45Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers fp sp Al llamar un nuevo procedimiento, el caller: –push de cualquier t0-t9 que tenga un valor importante al stack

46 Oscar Bonilla 46Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp 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

47 Oscar Bonilla 47Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp 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

48 Oscar Bonilla 48Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp En el procedimiento, el calliee al principio: 25

49 Oscar Bonilla 49Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp En el procedimiento, el calliee al principio : –copiar $sp a $fp sp

50 Oscar Bonilla 50Universidad Galileo old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack

51 Oscar Bonilla 51Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack

52 Oscar Bonilla 52Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Calliee saved registers Caller saved registers arguments fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack

53 Oscar Bonilla 53Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Local variables Calliee saved registers Caller saved registers arguments fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack

54 Oscar Bonilla 54Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Local variables Calliee saved registers Caller saved registers arguments Dynamic area fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack –ejecutar al calliee...

55 Oscar Bonilla 55Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Local variables Calliee saved registers Caller saved registers arguments Dynamic area En el procedimiento, el calliee al final : fp sp 26

56 Oscar Bonilla 56Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Local variables Calliee saved registers Caller saved registers arguments Dynamic area En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 fp sp

57 Oscar Bonilla 57Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Calliee saved registers Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... fp sp

58 Oscar Bonilla 58Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack fp sp Calliee saved registers

59 Oscar Bonilla 59Universidad Galileo return address old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack fp sp

60 Oscar Bonilla 60Universidad Galileo old frame pointer return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack –restaurar $fp del stack fp sp

61 Oscar Bonilla 61Universidad Galileo return address old frame pointer Stack Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack –restaurar $fp del stack –ejecutar jr ra para regresar al caller fp sp

62 Oscar Bonilla 62Universidad Galileo Stack Al regresar de la llamada al procedimiento, el caller: return address old frame pointer Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers arguments fp sp 27

63 Oscar Bonilla 63Universidad Galileo Stack Al regresar de la llamada al procedimiento, el caller: –actualizar $sp para ignorar argumentos return address old frame pointer Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers fp sp

64 Oscar Bonilla 64Universidad Galileo Stack Al regresar de la llamada al procedimiento, el caller: –actualizar $sp para ignorar argumentos –pop de los registros caller saved return address old frame pointer Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area Caller saved registers fp sp

65 Oscar Bonilla 65Universidad Galileo Stack Al regresar de la llamada al procedimiento, el caller: –actualizar $sp para ignorar argumentos –pop de los registros caller saved –continuar... return address old frame pointer Local variables Calliee saved registers Stack temporaries... argument 5 argument 4 Dynamic area fp sp

66 Oscar Bonilla 66Universidad Galileo Pregunta: ¿es necesario el $fp? ¿cuáles son las ventajas y desventajas de tener $fp? 30

67 Oscar Bonilla 67Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; }

68 Oscar Bonilla 68Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; } … int px, py, pz; … auxmath am; am.sum3d(px, py, pz, 0, 0, 0);

69 Oscar Bonilla 69Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; } … int px, py, pz; px = 10; py = 20; pz = 30; auxmath am; am.sum3d(px, py, pz, 0, 1, -1); Dynamic area Caller saved registers Argument 7: bz (-1) fp Argument 6: by (1) Argument 5: bx (0)

70 Oscar Bonilla 70Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; } … int px, py, pz; px = 10; py = 20; pz = 30; auxmath am; am.sum3d(px, py, pz, 0, 1, -1); return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0)

71 Oscar Bonilla 71Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; else dx = bx - ax; … retrun dx + dy + dz; } … int px, py, pz; px = 10; py = 20; pz = 30; auxmath am; am.sum3d(px, py, pz, 0, 1, -1); return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??)

72 Oscar Bonilla 72Universidad 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

73 Oscar Bonilla 73Universidad Galileo Creación de Expresiones Algoritmo ingenuo de generación de código x = y op z –Seleccionar un registro R src1 (digamos $t0) para cargar el valor y –Generar instrucción para copiar, si y está: En otro registro (digamos $t7) add $t0, $t7, zero Es constante (digamos 1024) li $t0, 1024 En memoria (digamos que $t7 apunta a y) lw $t0, $t7 En una dirección simbólica (digamos lab1) la $t0, lab1 –Seleccionar registro R src2 (digamos $t1) y cargar el valor z –Seleccionar registro R dest (digamos $t2) para guardar x –Hacer la operación (digamos and) and $t2, $t1, $t0

74 Oscar Bonilla 74Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; sp return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??)

75 Oscar Bonilla 75Universidad Galileo Programa Ejemplo class auxmath { int sum3d(int ax, int ay, int az, int bx, int by, int bz) { int dx, dy, dz; if(ax > ay) dx = ax - bx; sp return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) add $t0, $a1, zero lw$t1, 0($fp) sub$t2, $t0, $t1 sw$t2, -12($fp) address src1 src2 dest

76 Oscar Bonilla 76Universidad Galileo Cuidado Los temporales son limitados –Cuándo el árbol es grande, 18 registros temporales pueden ser insuficientes  asignar espacio en el stack No hay instrucción de máquina –Puede ser que haya que expandir la operación intermedia a múltiples operaciones de máquina Muy ineficiente –Muchas copias, sumas con cero, etc. –No se preocupen, vamos a arreglarlas en la optimización –Mantengan el generador de código muy muy simple

77 Oscar Bonilla 77Universidad 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

78 Oscar Bonilla 78Universidad Galileo Generación de control de flujo Aplanar la estructura del control –Usar un template Poner etiquetas únicas para puntos donde el control se une (join points) Ahora generamos el código apropiado

79 Oscar Bonilla 79Universidad Galileo Template para condicionales if (test) true_body else false_body boper …, lab_true jlab_end lab_true: lab_end: 38

80 Oscar Bonilla 80Universidad Galileo Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) address src1 src2 dest boper...,..., lab0 jlab1 lab0: lab1:

81 Oscar Bonilla 81Universidad Galileo Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) address src1 src2 dest add$t0, $a1, zero lw$t1, 0($fp) bgt$t0, $t1, lab0 jlab1 lab0: lab1:

82 Oscar Bonilla 82Universidad Galileo Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) address src1 src2 dest add$t0, $a1, zero lw$t1, 0($fp) bgt$t0, $t1, lab0 lw$t0, 0($fp) add$t1, $a1, zero sub$t2, $t0, $t1 sw$t2, -12($fp) jlab1 lab0: lab1:

83 Oscar Bonilla 83Universidad Galileo Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; return address old frame pointer Dynamic area Caller saved registers Argument 7: bz (-1) fp sp Argument 6: by (1) Argument 5: bx (0) Local variable dx (??) Local variable dy (??) Local variable dz (??) address src1 src2 dest add$t0, $a1, zero lw$t1, 0($fp) bgt$t0, $t1, lab0 lw$t0, 0($fp) add$t1, $a1, zero sub$t2, $t0, $t1 sw$t2, -12($fp) jlab1 lab0:add$t0, $a1, zero lw$t1, 0($fp) sub$t2, $t0, $t1 sw$t2, -12($fp) lab1:

84 Oscar Bonilla 84Universidad Galileo Template para ciclos while while (test) body

85 Oscar Bonilla 85Universidad Galileo Template para ciclos while while (test) body lab_cont: boper …, lab_body jlab_end lab_body: jlab_cont lab_end:

86 Oscar Bonilla 86Universidad Galileo Template para ciclos while while (test) body lab_cont: boper …, lab_body jlab_end lab_body: jlab_cont lab_end: Una template optimizada 43 lab_cont: boper …, lab_end jlab_cont lab_end:

87 Oscar Bonilla 87Universidad Galileo Pregunta: ¿Cuál es la template para? do body while (test)

88 Oscar Bonilla 88Universidad Galileo Question: ¿Cuál es la template para? do body while (test) lab_begin: boper …, lab_begin 44

89 Oscar Bonilla 89Universidad 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

90 Oscar Bonilla 90Universidad Galileo return address old frame pointer Procedure Call Dynamic area Local variables Calliee saved registers Caller saved registers arguments Dynamic area fp sp En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack –ejecutar al calliee...

91 Oscar Bonilla 91Universidad Galileo Procedure Call En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack –ejecutar al calliee... 46

92 Oscar Bonilla 92Universidad Galileo Procedure Call En el procedimiento, el calliee al principio : –copiar $sp a $fp –push $fp al stack –push $ra al stack –si cualquier s0-s7 es usado en el procedimiento, guardarlo en el stack –crear espacio para variables locales en el stack –ejecutar al calliee... proc_entry: add$t0, $fp, zero add $fp, $sp, zero addi $sp, $sp, -4 sw$t0, ($sp) addi $sp, $sp, -4 sw$ra, ($sp) 48

93 Oscar Bonilla 93Universidad Galileo Procedure Call Ejecutar el cuerpo del procedimiento callee –Acceso a variables locales y parámetros como offsets del $fp proc_entry: add$t0, $fp, zero add $fp, $sp, zero addi $sp, $sp, -4 sw$t0, ($sp) addi $sp, $sp, -4 sw$ra, ($sp)...

94 Oscar Bonilla 94Universidad Galileo Procedure Call proc_entry: add$t0, $fp, zero add $fp, $sp, zero addi $sp, $sp, -4 sw$t0, ($sp) addi $sp, $sp, -4 sw$ra, ($sp)... En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack –restaurar $fp del stack –ejecutar jr ra para regresar al caller

95 Oscar Bonilla 95Universidad Galileo Procedure Call proc_entry: add$t0, $fp, zero add $fp, $sp, zero addi $sp, $sp, -4 sw$t0, ($sp) addi $sp, $sp, -4 sw$ra, ($sp)... En el procedimiento, el calliee al final : –poner valores de retorno en v0,v1 –actualizar $sp usando $fp ($fp+4) +... –Pop los registros callee-saved del stack –restaurar $ra del stack –restaurar $fp del stack –ejecutar jr ra para regresar al caller add$v0, $t2 lw$sp, -8($fp) addi$sp, $sp, -8 lw$ra, ($sp) addi$sp, $sp, 4 lw$fp, ($sp) addi $sp, $sp, 4 jr$ra 51

96 Oscar Bonilla 96Universidad 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

97 Oscar Bonilla 97Universidad Galileo Símbolos Ejecutable es una colección –Compilaciones separadas –Librerías linkeadas estática y dinámicamente Por lo tanto, no podemos crear una imagen de memoria en tiempo de compilación Fase adicional del linker para juntarlo todo y crear la imagen final de memoria

98 Oscar Bonilla 98Universidad Galileo Salida del compilador Crear código objeto con direcciones simbólicas que pueden ser reposicionadas Direcciones simbólicas de todos los datos y principios de procedimientos que otros necesitan accesar son exportados Exportar los nombres de símbolos de referencias externas

99 Oscar Bonilla 99Universidad Galileo Símbolos exportados por el compilador Symbols from test.o: [Index] Value Class Type Section Name [0]| 0| File |ref=6 |Text | test.c [1]| 0| Proc |end=3 int |Text | main [2]| 56| Proc |end=5 int |Text | fib [3]| 0| Global | |Bss | internal_var [4]| 0| Proc |ref=1 |Text | main [5]| 56| Proc |ref=3 |Text | fib [6]| 0| Global | |Undefined| external_var [7]| 0| Proc | |Undefined| foo [8]| 0| Global | |Undefined| _gp_disp

100 Oscar Bonilla 100Universidad Galileo Linker Ver todos los object files para encontrar símbolos no resueltos Hacer match de los símbolos y encontrar las partes necesarias en las librerías Layout en una sola imagen de memoria Resolver todos los nombres simbólicos a las direcciones correctas de memoria y offsets adecuados

101 Oscar Bonilla 101Universidad Galileo Lecturas Ballena –Capítulo 7 Dragón (opcional) –Capítulo 9, 10.1, 10.2, 10.3, 10.4


Descargar ppt "Compiladores Generación de Código No Optimizado De la Representación Intermedia a Código de Máquina."

Presentaciones similares


Anuncios Google