Idilio Drago

103 papers A 5B 10C 1Journal 48Unranked 37
YearRankTypeTitle / Venue / Authors
2026 J jnl
Comput. Networks
Willen Borges Coelho, Giovanni V. Comarela, Rodolfo Vieira Valentim, Idilio Drago, Rodolfo da Silva Villaça
2026 J jnl
CoRR
Jianan Huang, Rodolfo V. Valentim, Luca Vassio, Matteo Boffa, Marco Mellia, Idilio Drago, Dario Rossi
2026 J jnl
CoRR
Federico Mirra, Matteo Boffa, Idilio Drago, Danilo Giordano, Marco Mellia
2025 J jnl
CoRR
Michele Lorenzo, Idilio Drago, Dario Salvadori, Fabio Romolo Vayr
2025 conf
EMNLP (Industry Track)
Luca Gioacchini, Alexander Delsanto, Idilio Drago, Marco Mellia, Giuseppe Siracusano, Roberto Bifulco
2025 J jnl
CoRR
Zhihao Wang, Alessandro Cornacchia, Andrea Bianco, Idilio Drago, Paolo Giaccone, Dingde Jiang, Marco Mellia
2025 B conf
FPL
Qaisar Farooq, Idilio Drago
2025 J jnl
CoRR
Andrea Sordello, Marco Mellia, Idilio Drago, Rodolfo V. Valentim, Francesco Musumeci, Massimo Tornatore, Federico Cerutti, Martino Trevisan, Alessio Botta, Willen Borges Coelho
2025 conf
TMA
Rustam Talibzade, Francesco Bergadano, Idilio Drago
2025 conf
LAMPS@CCS
Rustam Talibzade, Idilio Drago, Francesco Bergadano
2025 J jnl
CoRR
Luca Cotti, Idilio Drago, Anisa Rula, Devis Bianchini, Federico Cerutti
2025 conf
CoNEXT (Short Papers)
Damiano Ravalico, Martino Trevisan, Idilio Drago
2025 conf
ITASEC/SERICS
Alessandro Gaudenzi, Lorenzo Nodari, Rodolfo V. Valentim, Danilo Giordano, Idilio Drago, Alessandra Russo, Federico Cerutti
2024 J jnl
CoRR
Luca Gioacchini, Marco Mellia, Idilio Drago, Alexander Delsanto, Giuseppe Siracusano, Roberto Bifulco
2024 conf
TMA
Damiano Ravalico, Rodolfo V. Valentim, Martino Trevisan, Idilio Drago
2024 J jnl
IEEE Trans. Netw. Serv. Manag.
Luca Gioacchini, Marco Mellia, Luca Vassio, Idilio Drago, Giulia Milan, Zied Ben-Houidi, Dario Rossi
2024 conf
EuroS&P Workshops
Luca Gioacchini, Welton Santos, Barbara Lopes, Idilio Drago, Marco Mellia, Jussara M. Almeida, Marcos André Gonçalves
2024 J jnl
CoRR
Luca Gioacchini, Idilio Drago, Marco Mellia, Zied Ben-Houidi, Dario Rossi
2024 J jnl
Comput. Secur.
Matteo Boffa, Idilio Drago, Marco Mellia, Luca Vassio, Danilo Giordano, Rodolfo V. Valentim, Zied Ben-Houidi
2024 J jnl
ACM Trans. Priv. Secur.
Rodolfo Vieira Valentim, Idilio Drago, Marco Mellia, Federico Cerutti
2023 J jnl
ACM Trans. Internet Techn.
Martino Trevisan, Francesca Soro, Marco Mellia, Idilio Drago, Ricardo Morla
2023 J jnl
IEEE Trans. Netw. Serv. Manag.
Francesca Soro, Thomas Favale, Danilo Giordano, Idilio Drago, Tommaso Rescio, Marco Mellia, Zied Ben-Houidi, Dario Rossi
2023 J jnl
CoRR
Matteo Boffa, Rodolfo Vieira Valentim, Luca Vassio, Danilo Giordano, Idilio Drago, Marco Mellia, Zied Ben-Houidi
2023 conf
EuroS&P Workshops
Rodolfo V. Valentim, Idilio Drago, Marco Mellia, Federico Cerutti
2023 B conf
PAM
Martino Trevisan, Idilio Drago, Paul Schmitt, Francesco Bronzino
2023 J jnl
CoRR
Rodolfo V. Valentim, Idilio Drago, Marco Mellia, Federico Cerutti
2023 J jnl
IEEE Trans. Netw. Serv. Manag.
Rodolfo Vieira Valentim, Idilio Drago, Martino Trevisan, Marco Mellia
2023 J jnl
ACM Trans. Internet Techn.
Luca Gioacchini, Luca Vassio, Marco Mellia, Idilio Drago, Zied Ben-Houidi, Dario Rossi
2022 J jnl
Comput. Commun.
Gianluca Perna, Martino Trevisan, Danilo Giordano, Idilio Drago
2022 conf
EuroS&P Workshops
Rodolfo V. Valentim, Idilio Drago, Federico Cerutti, Marco Mellia
2022 conf
ITSC
Elvio G. Amparore, Marco Botta, Idilio Drago, Susanna Donatelli, Giuseppe Mazzone
2022 conf
NativeNI@CoNEXT
Matteo Boffa, Luca Vassio, Marco Mellia, Idilio Drago, Giulia Milan, Zied Ben-Houidi, Dario Rossi
2022 conf
EuroS&P Workshops
Matteo Boffa, Giulia Milan, Luca Vassio, Idilio Drago, Marco Mellia, Zied Ben-Houidi
2022 conf
EuroS&P Workshops
Thomas Favale, Danilo Giordano, Idilio Drago, Marco Mellia
2021 J jnl
J. Netw. Syst. Manag.
Glauber Dias Gonçalves, Idilio Drago, Alex Borges Vieira, Ana Paula Couto da Silva, Jussara Marques de Almeida
2021 conf
StudentWorkshop@CoNEXT
Rodolfo V. Valentim, Idilio Drago, Martino Trevisan, Federico Cerutti, Marco Mellia
2021 conf
SP (Workshops)
Tommaso Rescio, Thomas Favale, Francesca Soro, Marco Mellia, Idilio Drago
2021 A conf
CoNEXT
Luca Gioacchini, Luca Vassio, Marco Mellia, Idilio Drago, Zied Ben-Houidi, Dario Rossi
2021 conf
MedComNet
Martino Trevisan, Danilo Giordano, Idilio Drago, Ali Safari Khatouni
2021 J jnl
CoRR
Martino Trevisan, Danilo Giordano, Idilio Drago, Ali Safari Khatouni
2021 J jnl
Multim. Syst.
Thiago A. Guarnieri, Idilio Drago, Ítalo Cunha, Breno Almeida, Jussara M. Almeida, Alex Borges Vieira
2021 J jnl
CoRR
Carlos H. G. Ferreira, Fabricio Murai, Ana P. C. Silva, Jussara M. Almeida, Martino Trevisan, Luca Vassio, Marco Mellia, Idilio Drago
2021 J jnl
Online Soc. Networks Media
Carlos H. G. Ferreira, Fabricio Murai, Ana P. C. Silva, Jussara M. Almeida, Martino Trevisan, Luca Vassio, Marco Mellia, Idilio Drago
2021 conf
COINS
Giulia Milan, Luca Vassio, Idilio Drago, Marco Mellia
2021 J jnl
CoRR
Giulia Milan, Luca Vassio, Idilio Drago, Marco Mellia
2021 J jnl
IEEE Trans. Netw. Serv. Manag.
Thomas Favale, Martino Trevisan, Idilio Drago, Marco Mellia
2020 J jnl
CoRR
Alessandro D'Alconzo, Idilio Drago, Andrea Morichetta, Marco Mellia, Pedro Casas
2020 J jnl
CoRR
Thomas Favale, Francesca Soro, Martino Trevisan, Idilio Drago, Marco Mellia
2020 J jnl
Comput. Networks
Thomas Favale, Francesca Soro, Martino Trevisan, Idilio Drago, Marco Mellia
2020 J jnl
Comput. Commun. Rev.
Martino Trevisan, Francesca Soro, Marco Mellia, Idilio Drago, Ricardo Morla
2020 J jnl
IEEE/ACM Trans. Netw.
Martino Trevisan, Danilo Giordano, Idilio Drago, Maurizio M. Munafò, Marco Mellia
2020 J jnl
J. Netw. Syst. Manag.
Jawad Manzoor, Llorenç Cerdà-Alabern, Ramin Sadre, Idilio Drago
2020 conf
MedComNet
Francesca Soro, Mauro Allegretta, Marco Mellia, Idilio Drago, Leandro M. Bertholdo
2020 conf
WebSci
Carlos Henrique Gomes Ferreira, Fabricio Murai, Ana Paula Couto da Silva, Jussara Marques de Almeida, Martino Trevisan, Luca Vassio, Idilio Drago, Marco Mellia
2020 A conf
ITC
Thomas Favale, Martino Trevisan, Idilio Drago, Marco Mellia
2019 J jnl
IEEE Trans. Netw. Serv. Manag.
Alessandro D'Alconzo, Idilio Drago, Andrea Morichetta, Marco Mellia, Pedro Casas
2019 C conf
LANMAN
Francesca Soro, Idilio Drago, Martino Trevisan, Marco Mellia, João M. Ceron, José Jair Santanna
2019 ch.
Encyclopedia of Big Data Technologies
Idilio Drago, Marco Mellia, Alessandro D'Alconzo
2019 B conf
WCNC
Jawad Manzoor, Llorenç Cerdà-Alabern, Ramin Sadre, Idilio Drago
2019 J jnl
Comput. Networks
Martino Trevisan, Idilio Drago, Marco Mellia
2019 conf
HT
Martino Trevisan, Luca Vassio, Idilio Drago, Marco Mellia, Fabricio Murai, Flavio Figueiredo, Ana Paula Couto da Silva, Jussara M. Almeida
2019 J jnl
CoRR
Martino Trevisan, Luca Vassio, Idilio Drago, Marco Mellia, Fabricio Murai, Flavio Figueiredo, Ana Paula Couto da Silva, Jussara M. Almeida
2018 J jnl
IEEE Trans. Netw. Serv. Manag.
Martino Trevisan, Idilio Drago, Marco Mellia, Han Hee Song, Mario Baldi
2018 conf
BiDU@VLDB
Felipe Rooke, Victor Aquiles Alencar, Alex Borges Vieira, Jussara M. Almeida, Idilio Drago
2018 A conf
CoNEXT
Martino Trevisan, Danilo Giordano, Idilio Drago, Marco Mellia, Maurizio M. Munafò
2018 conf
CF
Marco Aldinucci, Sergio Rabellino, Marco Pironti, Filippo Spiga, Paolo Viviani, Maurizio Drocco, Marco Guerzoni, Guido Boella, Marco Mellia, Paolo Margara, Idilio Drago, Roberto Marturano, Guido Marchetto, Elio Piccolo, Stefano Bagnasco, Stefano Lusso, Sara Vallero, Giuseppe Attardi, Alex Barchiesi, Alberto Colla, Fulvio Galeazzi
2018 B conf
Networking
Jawad Manzoor, Ramin Sadre, Idilio Drago, Llorenç Cerdà-Alabern
2018 conf
ANRW
Martino Trevisan, Idilio Drago, Marco Mellia
2018 J jnl
SIGMETRICS Perform. Evaluation Rev.
Martino Trevisan, Idilio Drago
2018 J jnl
CoRR
Luca Vassio, Idilio Drago, Marco Mellia, Zied Ben-Houidi, Mohamed Lamine Lamali
2018 J jnl
ACM Trans. Web
Luca Vassio, Idilio Drago, Marco Mellia, Zied Ben-Houidi, Mohamed Lamine Lamali
2017 conf
IEEE BigData
Martino Trevisan, Idilio Drago, Marco Mellia, Maurizio M. Munafò
2017 B conf
GLOBECOM
Thiago A. Guarnieri, Idilio Drago, Alex Borges Vieira, Ítalo Cunha, Jussara M. Almeida
2017 B conf
MASCOTS
Glauber D. Gonçalves, Alex Borges Vieira, Idilio Drago, Ana Paula Couto da Silva, Jussara M. Almeida
2017 conf
TMA
Jawad Manzoor, Idilio Drago, Ramin Sadre
2017 conf
Internet-QoE@SIGCOMM
Martino Trevisan, Idilio Drago, Marco Mellia
2017 J jnl
IEEE Trans. Cloud Comput.
Enrico Bocchi, Idilio Drago, Marco Mellia
2016 conf
LANCOMM@SIGCOMM
Glauber Dias Gonçalves, Idilio Drago, Alex Borges Vieira, Ana Paula Couto da Silva, Jussara Marques de Almeida
2016 B conf
IWCMC
Luca Vassio, Idilio Drago, Marco Mellia
2016 conf
Internet-QoE@SIGCOMM
Martino Trevisan, Idilio Drago, Marco Mellia
2016 J jnl
Comput. Commun. Rev.
Idilio Drago, Fabio Ricciato, Ramin Sadre
2016 J jnl
IEEE Internet Comput.
Glauber D. Gonçalves, Idilio Drago, Ana Paula Couto da Silva, Alex Borges Vieira, Jussara M. Almeida
2016 B conf
CNSM
Jawad Manzoor, Idilio Drago, Ramin Sadre
2016 B conf
IWCMC
Martino Trevisan, Idilio Drago, Marco Mellia, Maurizio M. Munafò
2016 conf
IEEE BigData
Martino Trevisan, Idilio Drago, Marco Mellia, Han Hee Song, Mario Baldi
2016 J jnl
Comput. Networks
Glauber D. Gonçalves, Idilio Drago, Alex Borges Vieira, Ana Paula Couto da Silva, Jussara M. Almeida, Marco Mellia
2015 conf
SBRC
Glauber D. Gonçalves, Idilio Drago, Ana Paula Couto da Silva, Alex Borges Vieira, Jussara Marques de Almeida
2015 J jnl
J. Netw. Syst. Manag.
Idilio Drago, Rick Hofstede, Ramin Sadre, Anna Sperotto, Aiko Pras
2015 conf
CloudNet
Enrico Bocchi, Idilio Drago, Marco Mellia
2014 conf
SBRC
Glauber D. Gonçalves, Idilio Drago, Ana Paula Couto da Silva, Jussara M. Almeida, Alex Borges Vieira
2014 J jnl
IEEE Commun. Surv. Tutorials
Rick Hofstede, Pavel Celeda, Brian Trammell, Idilio Drago, Ramin Sadre, Anna Sperotto, Aiko Pras
2014 conf
ICC
Glauber D. Gonçalves, Idilio Drago, Ana Paula Couto da Silva, Alex Borges Vieira, Jussara M. Almeida
2013 A conf
Internet Measurement Conference
Idilio Drago, Enrico Bocchi, Marco Mellia, Herman Slatman, Aiko Pras
2013 B conf
PAM
Rick Hofstede, Idilio Drago, Anna Sperotto, Ramin Sadre, Aiko Pras
2013 J jnl
Prax. Inf.verarb. Kommun.
Idilio Drago, Ricardo de Oliveira Schmidt, Rick Hofstede, Anna Sperotto, Morteza Karimzadeh, Boudewijn R. Haverkort, Aiko Pras
2013
Idilio Drago
2012 A conf
Internet Measurement Conference
Idilio Drago, Marco Mellia, Maurizio M. Munafò, Anna Sperotto, Ramin Sadre, Aiko Pras
2011 conf
AIMS
Rick Hofstede, Idilio Drago, Giovane Cesar Moreira Moura, Aiko Pras
2011 conf
EUNICE
Rick Hofstede, Idilio Drago, Anna Sperotto, Aiko Pras
2011 J jnl
J. Netw. Syst. Manag.
Idilio Drago, Rafael Ramos Regis Barbosa, Ramin Sadre, Aiko Pras, Jürgen Schönwälder
2011 J jnl
J. Netw. Syst. Manag.
Idilio Drago, Ramin Sadre, Aiko Pras
2010 conf
AIMS
Idilio Drago, Aiko Pras
2008 conf
IBERAMIA
Fábio Fabris, Idilio Drago, Flávio Miguel Varejão
redb/extractors/decompiler/bninja/analysis/cfg-old.py
← Index redb/extractors/decompiler/bninja/analysis/cfg-old.py python
from collections import deque
from enum import Enum

from binaryninja.enums import (
    BranchType,
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from ..utils.hashes import calculate_md5, calculate_sha256
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_md5, calculate_sha256


class CFGAnalysis:
    def __init__(self, function):
        self.function = function

    def determine_block_type(self, block) -> str:
        """Determine the type of a basic block."""
        # Check if it's a thunk function (usually just a jump or call)
        if len(block.disassembly_text) <= 2 and any(
            "jmp" in line.tokens[0].text.lower() for line in block.disassembly_text
        ):
            return "THUNK"

        # Check if it contains only data (no valid instructions)
        if all(not line.tokens for line in block.disassembly_text):
            return "DATA"

        # Default to code
        return "CODE"

    def extract_cyclomatic_complexity(self):
        """
        Cyclomatic complexity (McCabe’s metric) measures the number of linearly independent paths
        through a function’s control flow graph (CFG).
        The standard formula is:

            M = E - N + 2

        where:
            - E = number of edges in the CFG
            - N = number of nodes (basic blocks)
            - 2 accounts for the entry and exit nodes of a single connected graph
        """
        if self.function is None:
            return 0

        # number of basic blocks
        num_blocks = len(self.function.basic_blocks)
        # number of edges in the graph
        num_edges = sum(
            len(basic_block.outgoing_edges)
            for basic_block in self.function.basic_blocks
        )
        return num_edges - num_blocks + 2

    def extract_function_cfg(self):
        """Extract information about a function CFG and return it as a dictionary."""

        function = self.function
        function_data = {
            "function_address": self.function.start,
            "blocks": [],
            "measures": {
                "cyclomatic_complexity": self.extract_cyclomatic_complexity(),
            },
        }

        if self.function is None:
            return function_data

        # Get the map of the depth associated to every block
        depths = self.get_map_depth()

        # Get the map of the positions associated to every block
        id_maps = self.get_block_id_map()

        # Extract block data with graph structure information
        for block in function.basic_blocks:
            # dominators per every block translated
            dominators = sorted(self.extract_dominators(block, id_maps))

            # post dominators
            post_dominators = sorted(self.extract_post_dominators(block, id_maps))

            # Build block instructions string
            block_instructions = "\n".join(str(line) for line in block.disassembly_text)

            # Determine block type
            block_type = self.determine_block_type(block)

            # Extract successors directly from basic block
            successor_blocks = [edge.target.start for edge in block.outgoing_edges]
            # We ensure a canonical order and we sort the edges
            successor_blocks.sort()

            # Extract predecessors directly from basic block
            predecessor_blocks = [edge.source.start for edge in block.incoming_edges]
            # We ensure a canonical order and we sort the edges
            predecessor_blocks.sort()

            # Determine branch type from outgoing edges
            branch_type = self.determine_branch_type(block)

            instructions_count = len(block.disassembly_text)

            # Create block record
            block_json = {
                "function_address": self.function.start,
                "block_start_address": block.start,
                "block_end_address": block.end,
                "block_size": block.end - block.start,
                "instructions_count": instructions_count,
                "block_instructions_hash": calculate_sha256(block_instructions),
                "predecessor_blocks": predecessor_blocks,
                "successor_blocks": successor_blocks,
                "depth": depths[block.start],
                "position": id_maps[block.start],
                "branch_type": branch_type,
                "block_type": block_type,
                "flags": self.extract_block_flags(block),
                "dominators": dominators,
                "post_dominators": post_dominators,
            }
            function_data["blocks"].append(block_json)

        return function_data

    def extract_dominators(self, bb, id_maps):
        """Extract the dominators normalized"""
        dom_idx = [id_maps[d.start] for d in bb.dominators]
        return dom_idx

    def extract_post_dominators(self, bb, id_maps):
        """Extract the post-dominators normalized"""
        post_dom_idx = [id_maps[d.start] for d in bb.post_dominators]
        return post_dom_idx

    def determine_branch_type(self, block):
        """
        Determine the type of branch at the end of a basic block.
        This combines edge type information with instruction analysis.
        """
        # If no outgoing edges, it might be a return or terminal block
        if not block.outgoing_edges:
            # Check if the last instruction is a return
            for line in reversed(list(block.disassembly_text)):
                if line.tokens and any(
                    token.text.lower() in ["ret", "retn"] for token in line.tokens
                ):
                    return "RETURN"
            return "UNKNOWN"

        # Collect branch types from all outgoing edges
        branch_types = []
        for edge in block.outgoing_edges:
            edge_type = edge.type
            # Map edge type to our branch type enum
            if isinstance(edge_type, str):
                if edge_type == "IndirectCall":
                    branch_types.append("CALL")
                else:
                    branch_types.append("UNKNOWN")
            else:
                # Use our mapping for integer/enum values
                type_mapping = {
                    BranchType.UnconditionalBranch: "DIRECT",
                    BranchType.FalseBranch: "CONDITIONAL",
                    BranchType.TrueBranch: "CONDITIONAL",
                    BranchType.CallDestination: "CALL",
                    BranchType.FunctionReturn: "RETURN",
                    BranchType.SystemCall: "CALL",
                    BranchType.IndirectBranch: "INDIRECT",
                    BranchType.ExceptionBranch: "UNKNOWN",
                    BranchType.UnresolvedBranch: "UNKNOWN",
                    BranchType.UserDefinedBranch: "UNKNOWN",
                }
                branch_types.append(type_mapping.get(edge_type, "UNKNOWN"))

        # Determine overall branch type (prioritize CALL > RETURN > CONDITIONAL > DIRECT)
        if "CALL" in branch_types:
            return "CALL"
        elif "RETURN" in branch_types:
            return "RETURN"
        elif "CONDITIONAL" in branch_types:
            return "CONDITIONAL"
        elif "DIRECT" in branch_types:
            return "DIRECT"
        elif len(block.outgoing_edges) == 1:
            return "FALLTHROUGH"

        # If edge analysis was inconclusive, fall back to instruction analysis
        last_instr = None
        for line in reversed(list(block.disassembly_text)):
            if line.tokens:
                last_instr = line
                break

        if last_instr:
            mnemonic = None
            for token in last_instr.tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.lower()
                    break

            if mnemonic:
                if mnemonic == "call":
                    return "CALL"
                elif mnemonic == "jmp":
                    return "DIRECT"
                elif mnemonic.startswith("j") and mnemonic != "jmp":
                    return "CONDITIONAL"
                elif mnemonic in ["ret", "retn"]:
                    return "RETURN"

        return "UNKNOWN"

    def get_map_depth(self):
        """
        Run a BFS on the basic blocks of the function to assign a depth to every block
        """

        depths = {}
        entry = self.function.get_basic_block_at(self.function.start)

        ### Simple BFS
        q = deque()
        q.append(entry)
        depths[entry.start] = 0

        while q:
            b = q.popleft()
            b_depth = depths[b.start]
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in depths:
                    depths[tgt.start] = b_depth + 1
                    q.append(tgt)

        return depths

    def get_block_id_map(self):
        """
        Assign a unique, sequential ID to each basic block of the function using a BFS starting from the entry block.
        """

        id_map = {}
        entry = self.function.get_basic_block_at(self.function.start)

        q = deque()
        q.append(entry)

        current_id = 0
        id_map[entry.start] = current_id

        while q:
            b = q.popleft()
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in id_map:
                    current_id += 1
                    id_map[tgt.start] = current_id
                    q.append(tgt)

        return id_map

    def extract_block_flags(self, block):
        """
        Get the flags for every basic block. Currently, we implemented these heuristics:
            - if a basic block is the entry node for a function
            - if a basic block is the exit block for a function
            - if a basic block is part of a natural loop
        """
        flags = []

        if block.start == self.function.start:
            flags.append(BlockFlags.EntryBlock.value)

        if any(edge.type == BranchType.FunctionReturn for edge in block.outgoing_edges):
            flags.append(BlockFlags.ExitBlock.value)

        # if this block is in its dominance frontier, then it's part of a natural loop
        if block in block.dominance_frontier:
            flags.append(BlockFlags.LoopBlock.value)

        return flags


class BlockFlags(Enum):
    # generally, the basic block identifying the entry point of the function
    EntryBlock = "EntryBlock"
    # any basic blocks that makes the control flow exiting from the current function
    ExitBlock = "ExitBlock"
    # any block is in a natural loop if it is in its own dominance frontier
    LoopBlock = "LoopBlock"


class BlockType(Enum):
    THUNK = "THUNK"
    DATA = "DATA"
    PADDING = "PADDING"
    CODE = "CODE"