def handle_prologue(self, func_name, *operands): """Handles the prologue of the function definition in IR. """ self.memory_offset = 0 # Allocate memory for both the defined variables and the formal parameters. # Symbol table will have entry for all of them. for symtab_entry in self.ir.local_symbol_table.values(): if 'memory' in symtab_entry: symtab_entry['memory'].offset = self.memory_offset symtab_entry['memory'].size = MEMORY_WIDTH symtab_entry['memory'].base = 0 self.memory_offset += MEMORY_WIDTH elif symtab_entry.get('dimensions'): if 'memory' not in symtab_entry: symtab_entry['memory'] = Memory() symtab_entry['memory'].offset = self.memory_offset total_size = 1 for dimension in symtab_entry['dimensions']: total_size *= dimension symtab_entry['memory'].size = total_size * MEMORY_WIDTH symtab_entry['memory'].base = 0 self.memory_offset += total_size * MEMORY_WIDTH self.create_stack()
def allocate_global_memory(global_symbol_table): """Allocate memory for global datastructures. Args: global_symbol_table: Dictionary containing the global symbol table whose keys are symbol names and values are symbol table data like memory object for this symbol and type. """ memory_offset = 0 for symbol, symtab_entry in global_symbol_table.iteritems(): if symtab_entry.get('type') == 'function_name' or ( symbol in ['InputNum', 'OutputNum', 'OutputNewLine']): # These symbols are function names, don't do anything for them here. continue elif symtab_entry.get('dimensions', None) != None: # This entry is an array if 'memory' not in symtab_entry: symtab_entry['memory'] = Memory() symtab_entry['memory'].offset = memory_offset total_size = 1 for dimension in symtab_entry['dimensions']: total_size *= dimension symtab_entry['memory'].size = total_size * MEMORY_WIDTH symtab_entry['memory'].base = 'rip' memory_offset += total_size * MEMORY_WIDTH else: # This entry is a regular integer. if 'memory' not in symtab_entry: symtab_entry['memory'] = Memory() symtab_entry['memory'].offset = memory_offset symtab_entry['memory'].size = MEMORY_WIDTH symtab_entry['memory'].base = 'rip' memory_offset += MEMORY_WIDTH return memory_offset