| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- # TODO: Get all jump commands
- JUMP_COMMANDS = ['j', 'jal']
- def is_jump(statement):
- '''Check if a statement is a jump command.'''
- return statement[0] == 'command' and statement[1] in JUMP_COMMANDS
- def find_leaders(statements):
- '''Determine the leaders, which are:
- 1. The first statement.
- 2. Any statement that is the target of a jump.
- 3. Any statement that follows directly follows a jump.'''
- leaders = [0]
- jump_target_labels = []
- # Append statements following jumps and save jump target labels
- for i, statement in enumerate(statements[1:]):
- if is_jump(statement):
- leaders.append(i + 2)
- jump_target_labels.append(statement[2]['args'][0])
- #print 'found jump:', i, statement
- #print 'target labels:', jump_target_labels
- # Append jump targets
- for i, statement in enumerate(statements[1:]):
- if i + 1 not in leaders \
- and statement[0] == 'label' \
- and statement[1] in jump_target_labels:
- leaders.append(i + 1)
- #print 'target:', i + 1, statements[i + 1]
- return leaders
- def find_basic_blocks(statements):
- '''Divide a statement list into basic blocks. Returns a list of basic
- blocks, which are also statement lists.'''
- leaders = find_leaders(statements)
- blocks = []
- for i in range(len(leaders) - 1):
- blocks.append(statements[leaders[i]:leaders[i + 1]])
- return blocks
|