Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Basic Blocks refactoring #112

Open
wants to merge 2 commits into
base: enhance/52
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 15 additions & 14 deletions dncil/cil/body/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,16 +216,15 @@ def parse_basic_blocks(self):
# 3. Instructions that immediately follow unconditional or conditional jump/goto statements are considered leaders
# https://www.geeksforgeeks.org/basic-blocks-in-compiler-design/

leaders: Set[int] = set()
# add #1: first instruction is a leader
if not self.instructions:
return
leaders: Set[int] = set([self.instructions[0].offset])
for idx, insn in enumerate(self.instructions):
if idx == 0:
# add #1
leaders.add(insn.offset)

if any((insn.is_br(), insn.is_cond_br(), insn.is_leave())):
# add #2
# add #2: targets of branches are leaders
leaders.add(cast(int, insn.operand))
# add #3
# add #3: instructions immediately following unconditional or conditional branches are leaders
try:
leaders.add(self.instructions[idx + 1].offset)
except IndexError:
Expand All @@ -239,10 +238,9 @@ def parse_basic_blocks(self):
# new leader, new basic block
bb_curr = BasicBlock(instructions=[insn])
self.basic_blocks.append(bb_curr)
continue

assert bb_curr is not None
bb_curr.instructions.append(insn)
else:
assert bb_curr is not None
bb_curr.instructions.append(insn)
Comment on lines +241 to +243
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you provide context for this change? What is it addressing?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change was made in accordance to: mandiant/capa#1326 (comment)


# create mapping of first instruction to basic block
bb_map: Dict[int, BasicBlock] = {}
Expand All @@ -265,11 +263,14 @@ def parse_basic_blocks(self):
# no fallthrough
continue

# connect fallthrough
# connect fallthrough:
# if a basic block has a fallthrough successor, it will be the next basic block in our list
# since instructions, leaders, and basic blocks are processed sequentially
try:
bb_next: BasicBlock = self.basic_blocks[idx + 1]
bb.succs.append(bb_next)
bb_next.preds.append(bb)
except IndexError:
# end of method
continue
else:
bb.succs.append(bb_next)
bb_next.preds.append(bb)
Comment on lines +274 to +276
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you provide context for this change? What is it addressing?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change was made in accordance to:
mandiant/capa#1326 (comment)