From 5eeca119d7731179e5bdb9fc309dd19506adacc6 Mon Sep 17 00:00:00 2001 From: Rog3rSm1th Date: Tue, 30 Apr 2024 16:29:00 +0200 Subject: [PATCH 1/8] move types & libfuncs declarations to the verbose output --- lib/src/decompiler/decompiler.rs | 10 +++++++++- lib/tests/test_decompiler.rs | 18 +----------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/lib/src/decompiler/decompiler.rs b/lib/src/decompiler/decompiler.rs index 37ac50a..34c4e16 100644 --- a/lib/src/decompiler/decompiler.rs +++ b/lib/src/decompiler/decompiler.rs @@ -61,7 +61,15 @@ impl<'a> Decompiler<'a> { let functions = self.decompile_functions(); // Format the output string - format!("{}\n\n{}\n\n{}", types, libfuncs, functions) + let mut output = String::new(); + if self.verbose { + output.push_str(&types); + output.push_str("\n\n"); + output.push_str(&libfuncs); + output.push_str("\n\n"); + } + output.push_str(&functions); + output } /// Decompiles the type declarations diff --git a/lib/tests/test_decompiler.rs b/lib/tests/test_decompiler.rs index d24c176..1fd9ff6 100644 --- a/lib/tests/test_decompiler.rs +++ b/lib/tests/test_decompiler.rs @@ -18,23 +18,7 @@ fn test_decompiler_output() { let use_color = false; let decompiler_output = decompiler.decompile(use_color); - let expected_output = r#"type felt252 -type Const -type NonZero - -libfunc disable_ap_tracking -libfunc dup -libfunc felt252_is_zero -libfunc branch_align -libfunc drop -libfunc store_temp -libfunc drop> -libfunc felt252_add -libfunc const_as_immediate> -libfunc felt252_sub -libfunc function_call - -// Function 1 + let expected_output = r#"// Function 1 func examples::fib::fib (v0: felt252, v1: felt252, v2: felt252) -> (felt252) { v2, v3 = dup(v2) if (felt252_is_zero(v3) == 0) { From 703a98c3ffc52f1338cc464ad92864e786abd91b Mon Sep 17 00:00:00 2001 From: Rog3rSm1th Date: Fri, 3 May 2024 00:41:43 +0200 Subject: [PATCH 2/8] Format dup statements as variables assignments --- lib/src/decompiler/function.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/src/decompiler/function.rs b/lib/src/decompiler/function.rs index 3c656b8..e182f9a 100644 --- a/lib/src/decompiler/function.rs +++ b/lib/src/decompiler/function.rs @@ -22,6 +22,8 @@ lazy_static! { static ref DROP_REGEX: Regex = Regex::new(r"drop(<.*>)?").unwrap(); // Store temporary variable static ref STORE_TEMP_REGEX: Regex = Regex::new(r"store_temp(<.*>)?").unwrap(); + // Variable duplication + static ref DUP_REGEX: Regex = Regex::new(r"dup(<.*>)?").unwrap(); /// These are libfuncs id patterns whose representation in the decompiler output can be improved @@ -168,6 +170,15 @@ impl SierraStatement { } } + // Handling variables duplications + // In the Sierra IR it it represented like : v1, v2 = dup(v1) + // But we can represent it as a variable assignment such as : v2 = v1 + if DUP_REGEX.is_match(libfunc_id_str) { + if let Some((first_var, second_var)) = assigned_variables_str.split_once(", ") { + return format!("{} = {}", second_var, first_var); + } + } + // Handling arithmetic operations let operator = if ADDITION_REGEX.is_match(libfunc_id_str) { "+" From 95e9b8b435c1e6ae977602e4f51e731cdb7282cc Mon Sep 17 00:00:00 2001 From: Rog3rSm1th Date: Fri, 3 May 2024 02:12:13 +0200 Subject: [PATCH 3/8] Extract consts from libfuncs names --- lib/src/decompiler/function.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/src/decompiler/function.rs b/lib/src/decompiler/function.rs index e182f9a..fb92bda 100644 --- a/lib/src/decompiler/function.rs +++ b/lib/src/decompiler/function.rs @@ -20,19 +20,29 @@ lazy_static! { // Variable drop static ref DROP_REGEX: Regex = Regex::new(r"drop(<.*>)?").unwrap(); + // Store temporary variable static ref STORE_TEMP_REGEX: Regex = Regex::new(r"store_temp(<.*>)?").unwrap(); - // Variable duplication - static ref DUP_REGEX: Regex = Regex::new(r"dup(<.*>)?").unwrap(); /// These are libfuncs id patterns whose representation in the decompiler output can be improved // User defined function call static ref FUNCTION_CALL_REGEX: Regex = Regex::new(r"function_call<(.*)>").unwrap(); + // Arithmetic operations static ref ADDITION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_add").unwrap(); static ref SUBSTRACTION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_sub").unwrap(); static ref MULTIPLICATION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_mul").unwrap(); + + // Variable duplication + static ref DUP_REGEX: Regex = Regex::new(r"dup(<.*>)?").unwrap(); + + // Consts declarations + static ref CONST_REGEXES: Vec = vec![ + Regex::new(r"const_as_immediate[0-9]+)>>").unwrap(), + Regex::new(r"storage_base_address_const<(?P[0-9]+)>").unwrap(), + Regex::new(r"(felt|u)_?(8|16|32|64|128|252)_const<(?P[0-9]+)>").unwrap(), + ]; } /// A struct representing a statement @@ -179,6 +189,16 @@ impl SierraStatement { } } + // Handling const declarations + for regex in CONST_REGEXES.iter() { + if let Some(captures) = regex.captures(libfunc_id_str) { + if let Some(const_value) = captures.name("const") { + let const_value_str = const_value.as_str(); + return format!("{} = {}", assigned_variables_str, const_value_str); + } + } + } + // Handling arithmetic operations let operator = if ADDITION_REGEX.is_match(libfunc_id_str) { "+" From 6681c85daae9df81a13475b9622f564ce4e9d0b2 Mon Sep 17 00:00:00 2001 From: Rog3rSm1th Date: Fri, 3 May 2024 02:31:15 +0200 Subject: [PATCH 4/8] Implement integer to string decoder for consts --- lib/Cargo.toml | 2 ++ lib/src/decompiler/function.rs | 19 ++++++++++++++++++- lib/src/decompiler/mod.rs | 1 + lib/src/decompiler/utils.rs | 17 +++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 lib/src/decompiler/utils.rs diff --git a/lib/Cargo.toml b/lib/Cargo.toml index b7a9d34..95d653f 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -9,7 +9,9 @@ edition = "2021" cairo-lang-sierra = "~2.6.3" colored = "2.1.0" graphviz-rust = "0.9.0" +hex = "0.4.3" lazy_static = "1.4.0" +num-bigint = "0.4.4" regex = "1.10.4" [dev-dependencies] diff --git a/lib/src/decompiler/function.rs b/lib/src/decompiler/function.rs index fb92bda..1696e65 100644 --- a/lib/src/decompiler/function.rs +++ b/lib/src/decompiler/function.rs @@ -1,5 +1,6 @@ use colored::*; use lazy_static::lazy_static; +use num_bigint::BigInt; use regex::Regex; use cairo_lang_sierra::program::BranchTarget; @@ -9,6 +10,7 @@ use cairo_lang_sierra::program::StatementIdx; use crate::decompiler::cfg::ControlFlowGraph; use crate::decompiler::cfg::SierraConditionalBranch; +use crate::decompiler::utils::decode_hex_bigint; use crate::extract_parameters; use crate::parse_element_name; @@ -193,8 +195,23 @@ impl SierraStatement { for regex in CONST_REGEXES.iter() { if let Some(captures) = regex.captures(libfunc_id_str) { if let Some(const_value) = captures.name("const") { + // Convert string to a BigInt in order to decode it let const_value_str = const_value.as_str(); - return format!("{} = {}", assigned_variables_str, const_value_str); + let const_value_bigint = + BigInt::parse_bytes(const_value_str.as_bytes(), 10).unwrap(); + + // If the const integer can be decoded to a valid string, use the string as a comment + if let Some(decoded_string) = decode_hex_bigint(&const_value_bigint) { + let string_comment = format!(r#"// "{}""#, decoded_string).green(); + return format!( + "{} = {} {}", + assigned_variables_str, const_value_str, string_comment + ); + } + // If the string can not be decoded as a valid string + else { + return format!("{} = {}", assigned_variables_str, const_value_str); + } } } } diff --git a/lib/src/decompiler/mod.rs b/lib/src/decompiler/mod.rs index 5caa18d..432edf5 100644 --- a/lib/src/decompiler/mod.rs +++ b/lib/src/decompiler/mod.rs @@ -2,3 +2,4 @@ pub mod cfg; pub mod decompiler; pub mod function; pub mod macros; +pub mod utils; diff --git a/lib/src/decompiler/utils.rs b/lib/src/decompiler/utils.rs new file mode 100644 index 0000000..a728b1f --- /dev/null +++ b/lib/src/decompiler/utils.rs @@ -0,0 +1,17 @@ +use num_bigint::BigInt; +use std::str; + +/// Convert an integer to it's string value +/// Used to decode consts +pub fn decode_hex_bigint(bigint: &BigInt) -> Option { + // Convert the BigInt to a hexadecimal string + let hex_string = format!("{:x}", bigint); + + // Decode the hexadecimal string to a byte vector + let bytes = hex::decode(hex_string).ok()?; + + // Convert the byte vector to a string + let string = str::from_utf8(&bytes).ok()?.to_string(); + + Some(string) +} From 133698aacaf3681ce3c5c7427490ade67273f932 Mon Sep 17 00:00:00 2001 From: Rog3rSm1th Date: Fri, 3 May 2024 16:00:14 +0200 Subject: [PATCH 5/8] Format rename & store_temp libfuncs as variables assignments --- lib/src/decompiler/function.rs | 17 +++++++++++++++++ lib/src/decompiler/utils.rs | 13 ++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/src/decompiler/function.rs b/lib/src/decompiler/function.rs index 1696e65..079caf6 100644 --- a/lib/src/decompiler/function.rs +++ b/lib/src/decompiler/function.rs @@ -39,6 +39,12 @@ lazy_static! { // Variable duplication static ref DUP_REGEX: Regex = Regex::new(r"dup(<.*>)?").unwrap(); + // Variable renaming + static ref VARIABLE_ASSIGNMENT_REGEX: Vec = vec![ + Regex::new(r"rename<.+>").unwrap(), + Regex::new(r"store_temp<.+>").unwrap() + ]; + // Consts declarations static ref CONST_REGEXES: Vec = vec![ Regex::new(r"const_as_immediate[0-9]+)>>").unwrap(), @@ -191,6 +197,17 @@ impl SierraStatement { } } + // Handling variables assignments + if VARIABLE_ASSIGNMENT_REGEX + .iter() + .any(|regex| regex.is_match(libfunc_id_str)) + { + if let Some(old_var) = parameters.first().cloned() { + let assigned_variable = assigned_variables_str.to_string(); + return format!("{} = {}", assigned_variable, old_var); + } + } + // Handling const declarations for regex in CONST_REGEXES.iter() { if let Some(captures) = regex.captures(libfunc_id_str) { diff --git a/lib/src/decompiler/utils.rs b/lib/src/decompiler/utils.rs index a728b1f..b73b7f6 100644 --- a/lib/src/decompiler/utils.rs +++ b/lib/src/decompiler/utils.rs @@ -1,17 +1,20 @@ use num_bigint::BigInt; use std::str; -/// Convert an integer to it's string value +/// Convert an integer to it's string value or hex value /// Used to decode consts pub fn decode_hex_bigint(bigint: &BigInt) -> Option { // Convert the BigInt to a hexadecimal string let hex_string = format!("{:x}", bigint); // Decode the hexadecimal string to a byte vector - let bytes = hex::decode(hex_string).ok()?; + let bytes = hex::decode(hex_string.clone()).ok()?; - // Convert the byte vector to a string - let string = str::from_utf8(&bytes).ok()?.to_string(); + // Convert the byte vector to a string or hex value + let string = match str::from_utf8(&bytes) { + Ok(s) => Some(s.to_string()), + Err(_) => Some(format!("0x{hex_string}")), + }; - Some(string) + string } From 3ddcd3a3091982e99569510bf1142d8cda29ca1f Mon Sep 17 00:00:00 2001 From: Rog3rSm1th Date: Fri, 3 May 2024 17:12:52 +0200 Subject: [PATCH 6/8] Improve if conditions formatting --- lib/src/decompiler/decompiler.rs | 41 +++++++++++++++---- lib/src/decompiler/function.rs | 52 ++++++------------------- lib/src/decompiler/libfuncs_patterns.rs | 44 +++++++++++++++++++++ lib/src/decompiler/mod.rs | 1 + 4 files changed, 89 insertions(+), 49 deletions(-) create mode 100644 lib/src/decompiler/libfuncs_patterns.rs diff --git a/lib/src/decompiler/decompiler.rs b/lib/src/decompiler/decompiler.rs index 34c4e16..a6deb23 100644 --- a/lib/src/decompiler/decompiler.rs +++ b/lib/src/decompiler/decompiler.rs @@ -11,6 +11,7 @@ use crate::decompiler::cfg::BasicBlock; use crate::decompiler::cfg::EdgeType; use crate::decompiler::function::Function; use crate::decompiler::function::SierraStatement; +use crate::decompiler::libfuncs_patterns::IS_ZERO_REGEX; use crate::sierra_program::SierraProgram; /// A struct that represents a decompiler for a Sierra program @@ -476,9 +477,6 @@ impl<'a> Decompiler<'a> { let mut decompiled_basic_block = String::new(); let indentation = "\t".repeat(self.indentation as usize); - // Define the bold brace - let bold_brace_open = "{".blue().bold(); - // Append each statement to the string block for statement in &block.statements { // If condition @@ -486,13 +484,10 @@ impl<'a> Decompiler<'a> { if block.edges.len() == 2 { let function_name = &conditional_branch.function; let function_arguments = conditional_branch.parameters.join(", "); - decompiled_basic_block += &format!( - "{}if ({}({}) == 0) {}{}\n", - indentation, + decompiled_basic_block += &Self::format_if_statement( function_name, function_arguments, - bold_brace_open, - "\t".repeat(self.indentation as usize + 1) // Adjust for nested content indentation + self.indentation as usize, ); } } @@ -514,6 +509,36 @@ impl<'a> Decompiler<'a> { decompiled_basic_block } + /// Formats an `if` statement with the given function name, function arguments, and indentation level. + fn format_if_statement( + function_name: &str, + function_arguments: String, + indentation: usize, + ) -> String { + let bold_brace_open = "{".blue().bold(); + let indentation_str = "\t".repeat(indentation); + + // Check if the function name matches the IS_ZERO_REGEX + if IS_ZERO_REGEX.is_match(function_name) { + let argument = function_arguments.trim(); + return format!( + "{}if ({argument} == 0) {}{}\n", + indentation_str, + bold_brace_open, + "\t".repeat(indentation + 1) + ); + } + + format!( + "{}if ({}({}) == 0) {}{}\n", + indentation_str, + function_name, + function_arguments, + bold_brace_open, + "\t".repeat(indentation + 1) // Adjust for nested content indentation + ) + } + /// Generates a control flow graph representation (CFG) in DOT format pub fn generate_cfg(&mut self) -> String { let mut dot = String::from("digraph {\n"); diff --git a/lib/src/decompiler/function.rs b/lib/src/decompiler/function.rs index 079caf6..cf34b58 100644 --- a/lib/src/decompiler/function.rs +++ b/lib/src/decompiler/function.rs @@ -1,7 +1,5 @@ use colored::*; -use lazy_static::lazy_static; use num_bigint::BigInt; -use regex::Regex; use cairo_lang_sierra::program::BranchTarget; use cairo_lang_sierra::program::GenFunction; @@ -10,49 +8,14 @@ use cairo_lang_sierra::program::StatementIdx; use crate::decompiler::cfg::ControlFlowGraph; use crate::decompiler::cfg::SierraConditionalBranch; +use crate::decompiler::libfuncs_patterns::{ + ADDITION_REGEX, CONST_REGEXES, DROP_REGEX, DUP_REGEX, FUNCTION_CALL_REGEX, + MULTIPLICATION_REGEX, STORE_TEMP_REGEX, SUBSTRACTION_REGEX, VARIABLE_ASSIGNMENT_REGEX, +}; use crate::decompiler::utils::decode_hex_bigint; use crate::extract_parameters; use crate::parse_element_name; -lazy_static! { - /// Those libfuncs id patterns are blacklisted from the regular decompiler output (not the verbose) - /// to make it more readable - /// - /// We use lazy_static for performances issues - - // Variable drop - static ref DROP_REGEX: Regex = Regex::new(r"drop(<.*>)?").unwrap(); - - // Store temporary variable - static ref STORE_TEMP_REGEX: Regex = Regex::new(r"store_temp(<.*>)?").unwrap(); - - /// These are libfuncs id patterns whose representation in the decompiler output can be improved - - // User defined function call - static ref FUNCTION_CALL_REGEX: Regex = Regex::new(r"function_call<(.*)>").unwrap(); - - // Arithmetic operations - static ref ADDITION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_add").unwrap(); - static ref SUBSTRACTION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_sub").unwrap(); - static ref MULTIPLICATION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_mul").unwrap(); - - // Variable duplication - static ref DUP_REGEX: Regex = Regex::new(r"dup(<.*>)?").unwrap(); - - // Variable renaming - static ref VARIABLE_ASSIGNMENT_REGEX: Vec = vec![ - Regex::new(r"rename<.+>").unwrap(), - Regex::new(r"store_temp<.+>").unwrap() - ]; - - // Consts declarations - static ref CONST_REGEXES: Vec = vec![ - Regex::new(r"const_as_immediate[0-9]+)>>").unwrap(), - Regex::new(r"storage_base_address_const<(?P[0-9]+)>").unwrap(), - Regex::new(r"(felt|u)_?(8|16|32|64|128|252)_const<(?P[0-9]+)>").unwrap(), - ]; -} - /// A struct representing a statement #[derive(Debug, Clone)] pub struct SierraStatement { @@ -133,6 +96,7 @@ impl SierraStatement { &assigned_variables_str, &libfunc_id_str, ¶meters, + &verbose, )) } } @@ -167,10 +131,16 @@ impl SierraStatement { assigned_variables_str: &str, libfunc_id_str: &str, parameters: &[String], + verbose: &bool, ) -> String { // Join parameters for general use let parameters_str = parameters.join(", "); + if *verbose { + // If verbose is true, return the invocation as is + return format!("{}({})", libfunc_id_str.blue(), parameters_str); + } + // Handling user-defined function calls if let Some(caps) = FUNCTION_CALL_REGEX.captures(libfunc_id_str) { if let Some(inner_func) = caps.get(1) { diff --git a/lib/src/decompiler/libfuncs_patterns.rs b/lib/src/decompiler/libfuncs_patterns.rs new file mode 100644 index 0000000..e3ef2cd --- /dev/null +++ b/lib/src/decompiler/libfuncs_patterns.rs @@ -0,0 +1,44 @@ +use lazy_static::lazy_static; +use regex::Regex; + +lazy_static! { + /// Those libfuncs id patterns are blacklisted from the regular decompiler output (not the verbose) + /// to make it more readable + /// + /// We use lazy_static for performances issues + + // Variable drop + pub static ref DROP_REGEX: Regex = Regex::new(r"drop(<.*>)?").unwrap(); + + // Store temporary variable + pub static ref STORE_TEMP_REGEX: Regex = Regex::new(r"store_temp(<.*>)?").unwrap(); + + /// These are libfuncs id patterns whose representation in the decompiler output can be improved + + // User defined function call + pub static ref FUNCTION_CALL_REGEX: Regex = Regex::new(r"function_call<(.*)>").unwrap(); + + // Arithmetic operations + pub static ref ADDITION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_add").unwrap(); + pub static ref SUBSTRACTION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_sub").unwrap(); + pub static ref MULTIPLICATION_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)(_overflowing)?_mul").unwrap(); + + // Variable duplication + pub static ref DUP_REGEX: Regex = Regex::new(r"dup(<.*>)?").unwrap(); + + // Variable renaming + pub static ref VARIABLE_ASSIGNMENT_REGEX: Vec = vec![ + Regex::new(r"rename<.+>").unwrap(), + Regex::new(r"store_temp<.+>").unwrap() + ]; + + // Check if an integer is 0 + pub static ref IS_ZERO_REGEX: Regex = Regex::new(r"(felt|u)_?(8|16|32|64|128|252)_is_zero").unwrap(); + + // Consts declarations + pub static ref CONST_REGEXES: Vec = vec![ + Regex::new(r"const_as_immediate[0-9]+)>>").unwrap(), + Regex::new(r"storage_base_address_const<(?P[0-9]+)>").unwrap(), + Regex::new(r"(felt|u)_?(8|16|32|64|128|252)_const<(?P[0-9]+)>").unwrap(), + ]; +} diff --git a/lib/src/decompiler/mod.rs b/lib/src/decompiler/mod.rs index 432edf5..81440aa 100644 --- a/lib/src/decompiler/mod.rs +++ b/lib/src/decompiler/mod.rs @@ -1,5 +1,6 @@ pub mod cfg; pub mod decompiler; pub mod function; +pub mod libfuncs_patterns; pub mod macros; pub mod utils; From b345ed8ff467e67338b0efcb9287302fc03c5394 Mon Sep 17 00:00:00 2001 From: Rog3rSm1th Date: Fri, 3 May 2024 17:27:11 +0200 Subject: [PATCH 7/8] Fix unit tests --- lib/src/decompiler/decompiler.rs | 7 ++++--- lib/src/decompiler/function.rs | 19 ++++++++++++++----- lib/tests/test_decompiler.rs | 12 ++++++------ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/src/decompiler/decompiler.rs b/lib/src/decompiler/decompiler.rs index a6deb23..6093957 100644 --- a/lib/src/decompiler/decompiler.rs +++ b/lib/src/decompiler/decompiler.rs @@ -484,7 +484,7 @@ impl<'a> Decompiler<'a> { if block.edges.len() == 2 { let function_name = &conditional_branch.function; let function_arguments = conditional_branch.parameters.join(", "); - decompiled_basic_block += &Self::format_if_statement( + decompiled_basic_block += &self.format_if_statement( function_name, function_arguments, self.indentation as usize, @@ -509,8 +509,9 @@ impl<'a> Decompiler<'a> { decompiled_basic_block } - /// Formats an `if` statement with the given function name, function arguments, and indentation level. + /// Formats an `if` statement fn format_if_statement( + &self, function_name: &str, function_arguments: String, indentation: usize, @@ -519,7 +520,7 @@ impl<'a> Decompiler<'a> { let indentation_str = "\t".repeat(indentation); // Check if the function name matches the IS_ZERO_REGEX - if IS_ZERO_REGEX.is_match(function_name) { + if IS_ZERO_REGEX.is_match(function_name) && !self.verbose { let argument = function_arguments.trim(); return format!( "{}if ({argument} == 0) {}{}\n", diff --git a/lib/src/decompiler/function.rs b/lib/src/decompiler/function.rs index cf34b58..2f81ce4 100644 --- a/lib/src/decompiler/function.rs +++ b/lib/src/decompiler/function.rs @@ -136,11 +136,6 @@ impl SierraStatement { // Join parameters for general use let parameters_str = parameters.join(", "); - if *verbose { - // If verbose is true, return the invocation as is - return format!("{}({})", libfunc_id_str.blue(), parameters_str); - } - // Handling user-defined function calls if let Some(caps) = FUNCTION_CALL_REGEX.captures(libfunc_id_str) { if let Some(inner_func) = caps.get(1) { @@ -158,6 +153,20 @@ impl SierraStatement { } } + if *verbose { + // If verbose is true, return the invocation as is + if assigned_variables_str.is_empty() { + return format!("{}({})", libfunc_id_str.blue(), parameters_str); + } else { + return format!( + "{} = {}({})", + assigned_variables_str, + libfunc_id_str.blue(), + parameters_str + ); + } + } + // Handling variables duplications // In the Sierra IR it it represented like : v1, v2 = dup(v1) // But we can represent it as a variable assignment such as : v2 = v1 diff --git a/lib/tests/test_decompiler.rs b/lib/tests/test_decompiler.rs index 1fd9ff6..8ebddae 100644 --- a/lib/tests/test_decompiler.rs +++ b/lib/tests/test_decompiler.rs @@ -20,11 +20,11 @@ fn test_decompiler_output() { let expected_output = r#"// Function 1 func examples::fib::fib (v0: felt252, v1: felt252, v2: felt252) -> (felt252) { - v2, v3 = dup(v2) - if (felt252_is_zero(v3) == 0) { - v1, v5 = dup(v1) + v3 = v2 + if (v3 == 0) { + v5 = v1 v6 = v0 + v5 - v7 = const_as_immediate>() + v7 = 1 v8 = v2 - v7 v9 = user@examples::fib::fib(v1, v6, v8) return (v9) @@ -77,9 +77,9 @@ func examples::fib::fib (v0: felt252, v1: felt252, v2: felt252) -> (felt252) { branch_align() drop>(v4) v1, v5 = dup(v1) - v6 = v0 + v5 + v6 = felt252_add(v0, v5) v7 = const_as_immediate>() - v8 = v2 - v7 + v8 = felt252_sub(v2, v7) v1 = store_temp(v1) v6 = store_temp(v6) v8 = store_temp(v8) From 76b78717c8d2c4e5891164556c3b5b44c0c5a02f Mon Sep 17 00:00:00 2001 From: Rog3rSm1th Date: Fri, 3 May 2024 17:29:06 +0200 Subject: [PATCH 8/8] Update documentation --- doc/images/decompiler-output.png | Bin 60860 -> 34162 bytes lib/src/decompiler/libfuncs_patterns.rs | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/images/decompiler-output.png b/doc/images/decompiler-output.png index aff60ddf71422e8f626638b0278798e69c35b59f..dd1c78ab93846f8ebcfdb9a121bc182b4042b846 100644 GIT binary patch literal 34162 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

vdwd$CqDi+ob-CO?v957aHq(ZA~EO$fi1yec^a z|6($%JyG_tLN+BNl=jql@vtpaMa#`Uq=PpW=83H8`RK?qz?}B2z6rUbJJMO;rQo~n z2-Pe#6-H;%g3IHE!lxWoG;#08NziMgpzdrckbhL*D1)ina&h(oQPFT^>{%8GBV2Px zA5U0V3{c^IErx0|SN`>eqvf5^^ias=C{{u&c-Ip~X)C(CgGhc^3(7YbG3**M`sCBF znN@D?+y^XmuSq|(S4|&?VAm_1E`jR0=SJzmACIZeV7 zSZ2Vq9}0L_aZFbERALy0W8YcQN|^Iw>ED_M7hkY#KehgnYX ze8Hmo;_pkL)F`Z&Z36z~;8OV@G_t3TQ>mOSXPMd^R#qmdPM%Tl+Ug}zLueRsH=Md+Nib7px%z`u#4o%omU!A{II8PeG2eYtBFi8TB)r~SX%u4kX`{wn9l$=X^7)WAo=L0*&q*D0350G!-+2#xK zh*Bf79`UG6)EW8mP;KD$8T;rn2Bufqw4aCSG4Z)(`Ki?833*PSoaGledL?{Kpb%jA zw4+=Z8{lM}f5gDexfDKZ)is$?xycMs_lAH5Fw+Dl+RYXvdExnW!EttHyfw5p%UzF- zG2j+4BwQktuNE6;($FSn&ZE`H1>*26%RPhW?TQsH8;SWk zVy6w~vD0D^CRQ0B8f-LT6_ahsAnv*?yZ!26u@QN5qGtS*VtLC{81FB)nSl1~HvMo+ z&!s5scF{usikEs+i$jr8G0tl^SYcS_i6&zpJJ8W~3|@ak3&^QArjqx78xic&7cDsZ zD_%96Ze$#3w(!Jo?ZZzyGwj;h(LLYpy<@{+ETw05J0+s}5Y_V^oFSHa9ig;DW}gc8 zH_AD3_|Lg_TpZOwOr0Qcpjf-s6QP1Lx=aO$4`(M;Sx-TK`ZoMj(Vbb|L`t?F-uy2e z-;V7MsgiO|Dp&sRS0E%G!y8YBReX4e{>{behBEB0Wn(c!0;`&u&Whzb zkbNnED&~N3%}H9H(tRi<1$siB&79_E!({>l%*1Eh-a813tH~y+ah4!;+K`i?C!YLm zJFTP=tEmu`B1V;Gx=t$&U-4=&9Je{Fj!%2WA1pd-b1S|R%eTM+70l6aixKI?dFzh~ zQ3-y_QS?^L~&E*b9oz^53Fiy7QyHgSiP^RA);9&%Ns=?DBnNC3{FAh?bHm z=R7rt&-;8b=G~t)i-FvLLtAtC2vPktN!Wg5k(CO6gw>Ql$}&xikAvO3X0g$*=mT3b zkN*Nx-}^NnGTo=ii-(XiXp?yc{5Jj;?!;4afoV=l~ zHJHb^&b^ro*T>2FYbASL*#0B&+?cYLoyB+@`W3wcr^#ONkx7CVo8#V@gBjoHQ9N*5 zdcwU0_+y32pH&@C$FyPv-=~_t0UJfe2wC(qVxXW0>M`q!3k&tGxYWwcm$30;RMrVPU9re zKu+}eu^*W#OO@z_q-id&G>baL@il*z^dr7Mb_Mg}d@Db&wH2(c{{xf&` z&zQu&&687!8S_n~N2G4OJvH2C9&c~L>1%J8+cX!vK5hNlb4&@n1*WgDc(r|Q^C2<4TJ*B7I{A3 z+_IiNP93Uh04FcSnM~tnTV-vL8Q+e>sh=dGn*^1TEC_WdS~o z!Hg`oZL{NC9}=mrI+sw=OeWkH@WSeq8z1e8YIhURXcfA6_Lkp~l4R{ErNT5ZZ_NqW zK28K?SB92NRuAb-jEw6M?drY`MZ^oo`11=odK;~;SacZx*5X%Aa6Vsuap{peaO$J7 zw#IpO)=cn2K8RKrRWB}9SquljqA)W@FIV()+Zf1?3+VxT;@1GM#<>1>zG9n1mw(yh z;lvtT_l?4OYr0hR@Bepr`Vbip~@rFyd16 z7S}u_f4_ErHJc4+SLu`=HN%o&z+E*C11>uPr~9$!jJuPpIIgH9WP-{|XLvY5)8ER%M!V;eJMKm7~ese#A; z54TdN>7k`8zAJEHuKrPQ?lh=RD?nqi%R8qyz`F&xnZsa`c|Ga1WIYh~>eI+R4RnCQ zGD(y6w{%V*;>Wuwc|M7*dJWEM=({q!Rq|{+JLWGni5uA-+r5%H`J&Mf==F=;`tYmq z^DA_i7ZZc#b6OD@Iu`|RhDaLA;LPuqbSbWP`-}U0p47dEn*5{=Yq%V>lcmy5_H1KX z>}InV8)uP=6-aT#R}2Ub#yh8S2hC5~*1KsxtA0$8PGBhRr3k<*t{^4s3jAv91gdDP z73B=M(+?SKT@c8&txw4DO7JNV*d9!S2yeo3JsMgd(9{FmAKD((3Z;`HpQnSdCH6gA zUkYb?O%i=`Hd&vVDk(|w9{u|Axke0TnSS4UXxltx#+Tn?an(tUZhFgn(pDZbH|oiv zjuvbWIxXuxP77BZmV11rdFkdrqn!JWVdWf-O~?Y2Oo1VG>us%5&ceSpYPoppIqx~X zw3wPS>|4&|T&Fzg4q9H)@t7X5Ya!yDtQq#_0IfqY7DuJk6Dcic2GD&LPtF&o)mW?t zHPBCH*f?AeQ^%7yah)io#S3nI-H=cQHiEJ-FMB-(i>FYp?@ZN8!#*mm3_80%rZQ_t3?ykT-g_>Qe&mPB8H*__`xt!+ z-0%?*b?`y8lNq8X$w7R4yJeSvi>pMD_N5I%L??fV@LEI}b@92#Qs$Kj24S~kYY9qT zJoHU%K0RO54s>B7>&3X$bzTp$1^Z)k-(c`h?IqhQF>af&a7?nG-hylmML`nkTR9Ii zew44bE}i|zr6fsdrU<0)+k`jsBa&CWY&S%j-3KVEvIIlJ0-mY#3Yvn{2S$wt7CO71 zyIB=0>7>3mos$)xa0y~G_Y&1b@CqJKn2s$z1tJ&wfSd-;tJ?W2MgkP3Mw2wcm%;eg8oZ( zO^~dbFTHrvNX`{mUd@iT;{^mhX&b(oS&(M=lEaZgsf$c;iVe<7n_l@L=9EBLRPIZ? zHwvhub8e^fS5E}?iGRV4`&f@J7GYMhv5m?giYx288K^yUFRpQU@k^64qk!SE0mO5> z&56hZF{+4V=UxvdjHHvm*7-7U(fwtqrMu?Cd44!Vta4~0>0wD&h%#n7!^@#AZw^-( zQZDE?*Xsf38X1*ekZkc@V1!=U9@_|`BfL!~B)2Jf)DQD`k2CVld8@v%fp>J+pb$ZFFyyDFTzPYS<+L!?&`_$!xkRF!c6ZBJ ziqXy@aOagiIo|f^Zn$l}X6SGndZrVI%h3Q6)bQXigpok`+D(@CLy#NQ7G0>wnARoK zo=|S*q0O5FIWu8YEEn6IID3}2(WTDpqbAD zG+2hSfS&n0#A+{Rln9c{?(J^=#UJeDu@NI`JT)ZY8xe4MQ@8bFo#XQR%Muz7WNX6t zo&(L9>9GAlX55St+hrmq(K}lQ8yQaj4aMoPP{E(s9~f+DCQQlP)BqRxip_oI zyrVknoz>Ibx9Lv_&pwkV}s z0k=3A)QlAO>ZS!iw3a!e?3Dsz8*vxMm?aL}7Nse+o2Lv_Zzu?1*7vZtMD9Dwi*CK&cN&$eRlDkzZS`$AYH zz&MygIc-eiADY>-@ny*;OUay4g^Za9kU!-2)lF*UCkR<5Ik)0>xS!G`sWNp{l+ znh7H0tO5Jp2C^k34!kr}L_^?jCebc_ONMuyyi`|#LB(IlI@_P#fgJJQzr3C}Y15kx zqgKd7XNJRH(>HRj{Iu@+{Cf-Q54%d@LC-7JK$_eK9$vf2mz}G>wA>oMdqw)-@fB~4 zzE)4~&(3|@yMl_fokW1Mh}rxkL0$bqdZ7P%e3T-ARf&ysED#EpL-M^93z9vY#);9D z5F&ayEb+zt;07M(Yg-0=lRoRg5P1X=FMDEUGSF5};7*xCA%&|}I$rho(|6%ru2^+k zT&e6B6TGKh51R_$SJ_I+qiDtbqJCw5n9`I6AL4(N269Z%to$slQCyAm?xo^$!#P5h zU`af#m%hG+8<77=2S_R&@U-PL)hph!kZ_B^AYDX8+ffC^n`C`cVX2};;wE$Nnkk>i z?+q2L09=`qm&@-39#kv1SRRyNc;95WZy=4Ov*Jz46Bq6xBb%lZhKAq1zD{LgS6}}^ ztoBOCrE;D(eCs<4wO{n>D*JLwBBG6B<>e0^Twk-pN6!=>9&gTD5p;$M7Xk+UTzE+l z9~QpMk{sP|Wnk@}T^7}lh|vZIGxx&#Xjjc19DgxP<|sINh+XaYdPGrJnP))2a`X)q zXe;_7@3@L?dXiB#v5p$E#rWz)<|90{*zZ=`iaICw(s|PdoWyIv(e0-y4(}e06(yec zUo}r!cJ-UbU=cxY`?;032a2-m^9Hn3bGFi6lztBw_(V#TtHCn^PR#b>_Z`cW(+P-t zy=QP4Ly}*m!1;!eHESqUA#H%5t9GEw4$Q_P8V}7%-iz&%l^XY{QGbFR@ZMbxd{r&& z6ZOG6BjKlWMELWUq(&5yZQBn4yeaz~C)tSe)vu26ZRI`z_1EE=KAwsmJY3veF56X3 zCKb9jm4aAyh@syeBs}qyuBaTeY{8mWO2iZveLTNjd$*ZQlQDI|a94asl}6<^*K|GZ z(tlklE*po4X>Xjpjb7|Bu7>b@8aI8;;1K+c7{N>4y`S=+MPlvT+NVO_U#op&GpOU` z%vgm?!~PKE>W;R;ox{yS(-rgWvfscX%hYlE?*)_HTG6 zRL5IrdGc-N4zODY*p8m~Foieuz4Suz`!Ly8u@19Oo+O999R z(aDLK9Obj$lKDKqBDPD<@?lOW~%^URj;jr>U1AUdDO`KLwRM}~pW4;F${ z-8Q$EM_`T?hv%f|zj-DLvJ4kDF_1=##DuUA#SZD&oFjdGO@@-T-YUz57RVgbK2PH; zQd5`u$pCqAIwQ-^Kz%m+Hu0=JZ&01@HvLEf(}?F+;cn$32aJ)Z%-A3!H>r4aqy3vG9r~P-o+ixw$ zBmpUx1bF|&}vxyHBBo!;ra`CVw_$%g&b$i6(>@~afFv1f}9xJyqPK1|; z3**DOo`=G>f>z*iFUAn3fv|6QS3>L7@}H!e{N@L6`cIj z;Mj{e#WlX`mGqIAR-O$SU7MF?h-^)>1=lF7x7j7xzshB1w4*f>9`fcN)IK!&FT5(k z2qZt_62AYNO_KHYeX^%@pX`YVw+1k|G@$RPar*y*#gD$nAmIQ|$gdmUa6YrkjI=jp zF9b=uEl#C?_clJguU7_&hvZ9o-5m{(xE!bM5JnDDQPt%?D49!+)Adv)S=<{5pGb_o z9^-RRbcOn{8W^%{9d-~R!FMu!6=ei0#pJ8+yNG$G^g@G`6K;xv_=)wWM@J*5{V@MP zTR+;qlwp5cs1z^Gq#K>mJvEb*m`3HP<`~zQX2Fm)vvn_EVhSWvO`K}nH4FJ&IOLsf zwh5mK*ByqN_iKe`&nlgPQfA?z$uD;KDiwrLmtHj|i9Hi`RkN#>{KQaVAOi?86}x_X z>KuJ^kI>2}U}z;{2FvW19R2(y8qq}TF%DbYEWzc8o0_p|_ajkC&g|Rn?IndfrA(=E zV1NNgfA*on?l=fm`!3%zmrh#Z6NpXo*t&4Ujlwi}j^U$eraR*8OBTNb6Qo8xS%c$w z5Dk%@6Lappti514i3%?BTl56G`_$e$%Z*_vl3Mm)3Qze>qzsW7;~cKBVhm36-F19> z0zv_z7V~GALMzO=3%tP?K!xX*FY?^JvM3ti2wbe2OUJ!`m;nuy;Zsn|tSBRA!;8+` zxI6YIR^c5vfVYzes~qi+|Eqo|$Dz(Ha>y#p&6)w^C)rTMlYoz{e&FaOu1BwkLmQO| zG=d7Mtx~s937NyD5@)x{R>J||%uDLEIJpIRY4^{(-kcrvdmqOv_AZ`2KJnzOfvIqB zzZ}@nd|UYS744gWk>R~MO4Wb$^jDRp0U1xJ%Dr7q3NGdi?!YnUC(TTM$zm=4(4z^X z0*E&zLTk^hX03C*%lPp`cUqcf%H}qvuF^Od zxsO)-=Bz6Fojm6Bs%yhmMb@<6U&N!?mLuC7#tjq&aW|lY5|(dtRWsg?;^&&cgh%;G ze4y+tqRzKzCoMVi`=zAo6GMh-qM=lJ;pUkoIhheF#?JNi?Uj`tG)ObO{g$MmNz-E` z6*r(hG0HEdOfR93p#kPhOG}UX*MtScGzOX{#AB=NP{PbnnOa}1Kx7xpcHcOY+T9Kz zm7mK@(v(b~1P?pU=4&=i!6q*+JJ~dAD+}2n68+snakLDC$?u%JULxhVbVxP0$wHn*(4k}U2(Hq49+ z%o$&u@;G{*t%MS849!EWMlHJFi^)mbiemYb=(p#yK8zqy(_?yT>Wz2JMFzmt9^hvD zsb}E;aoW5^MCxOoGAmrO9>IQrWzd9nh6PNUyiVXEg%SL{${dbXz!B*X)9Fsy@@}pl zxm9aGJpz(uPP!1x%=%lh>vHS;wXb>2g+|2p9Z@RSC!S4PiOV_Bsjx>yTj+r2=9PK! zBAFY3H?JTAx7jQJb`k^+SCHMS4-PI{;{l-~plJQiOG-G(+?7)ey_-;GYh(Dk`ye~| z-l=t#);Q0po4uNB}!(_a9Rl`K(l0I4OI&6l%Ou3U;3V0JY1D)$e51R^hA z`aN$wQCqVc=Ax}nJpmH!?xAk28*kyP-=E@ann0wb5T`UsU~5`7ml|T1j?@ZEHJfgq z6oaU06=b3j6E3^PGn~^%`O2s>d5>iL55P++{y+)0J^(1;C$7IFHXm@80f_gUgEd;n5B1|aBYzXC**tLomeMNPw8U&cUD z0PUKWq0Lz>G*$>9Z?#aHM}B(K$K^3M;80=1C!QF$nu}g*Z=vLVDCg$cAj74pCx5hJ zUZEh2UtW%P>be|$1-Z*H(wGWMRKv2TU5OyxDedf_>+@Fo4?>=|Gdbe|W5OvCRUl)zaQ0U0H;@<+%LqG3LCReqpFlXx zBY%yCV=9O^xm-~LT60)3O52nFTgiIk|23iI{VWM!}0GoAeGMo8*)hIUPG z+S7ph011Ey#)g;%ZRmhFAeiNfD~F;2lc3nGMioKy<*nS_E7rG)O^)zZJmJ2|D@L8D zVtP3hzm>wl&MFnXOi5L~O40uS`>6e?YuK}P{&a*X53dq)FdOlwQ7GkNyHpC!6#Rk%tS&)RAaQrkQd))3zDYKt zsLli)9TdO3EbbH8SuvQH5L|>%`(--PwdbqkH)iKyiC{|`TW@73YvGMdNd%iEL^uyo z<^Mr8>pF;^NMoQSH~_0;Tlk~4l(A(|DyQS7fR(|qOkN32VyWCLHz%{CXI%LGsun~Q ziYjg*aV0#e*P}7{Jf_G=@nP|6*wWH&anZYML@8>R_;xqCK zJ0All)YFK&WN6#htYnoOO=phGyK%SCo}I1Rnj&#$d;M~;I{x}62S-^y3mTFT|OmRKtDN9q+?pEJ^E19bcXZCq24lgQ+6ThFby z^t<=1ZV75O9h)D2l@7BE8&V6D6H!+e1ym)UYY4@&7pS$5ZmZh{aw9BN$4Qa-LP@nl z_}^|eV79>frcgfH|4oSh9T)sz%>J8{N)tD`Lw7sR|DjjaRG(xYJwW84*pM;xQ54*v zcXlape$A_L{8^C^3v%3x|Rowm>X7i-d^2+h%8fC$F1}~dd%Y#DG+Y32(?okj>@*McOalC4ugie@N_+9%- z@_mN(meuOHl7T~^+Sv=ma{O?>=6nvwH4>8EIUFdXv#JALV;^WKGI`(Fg7crfo$>ge zzCh-6Jw5Q#!Nh1q%D_cY1Dyt%&QstE6ycx=of+WvQCz+Lvv!;wXtnfoRM?kabH~W< z(|rT)!A5mbr;8a=AK=CZaS7;>f2hpIm2gvPR}a3eB&x=#6iIMc`rn_ws?%Xbfe-YM z``$sNyVLvPKvQ%?r>D*wIXK76TA$soOVj6FQymp2dY+f_o)$weif&Fky;|I)b}q|% zvKmF#-! literal 60860 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:oSEW7mRSO^q3> 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 diff --git a/lib/src/decompiler/libfuncs_patterns.rs b/lib/src/decompiler/libfuncs_patterns.rs index e3ef2cd..9732944 100644 --- a/lib/src/decompiler/libfuncs_patterns.rs +++ b/lib/src/decompiler/libfuncs_patterns.rs @@ -37,8 +37,8 @@ lazy_static! { // Consts declarations pub static ref CONST_REGEXES: Vec = vec![ - Regex::new(r"const_as_immediate[0-9]+)>>").unwrap(), - Regex::new(r"storage_base_address_const<(?P[0-9]+)>").unwrap(), - Regex::new(r"(felt|u)_?(8|16|32|64|128|252)_const<(?P[0-9]+)>").unwrap(), + Regex::new(r"const_as_immediate-?[0-9]+)>>").unwrap(), + Regex::new(r"storage_base_address_const<(?P-?[0-9]+)>").unwrap(), + Regex::new(r"(felt|u)_?(8|16|32|64|128|252)_const<(?P-?[0-9]+)>").unwrap(), ]; }