
/* std::string::rbegin() */

void std::string::rbegin(void)

{
  long lVar1;
  string *in_RSI;
  long *in_RDI;
  
  lVar1 = *(long *)in_RSI;
  if (-1 < *(int *)(lVar1 + -8)) {
    _M_leak_hard(in_RSI);
    lVar1 = *(long *)in_RSI;
  }
  *in_RDI = lVar1 + *(long *)(lVar1 + -0x18);
  return;
}



long * FUN_0030def0(long *param_1,long *param_2)

{
  long lVar1;
  
  lVar1 = *param_2;
  if (-1 < *(int *)(lVar1 + -8)) {
    FUN_0030ddd0(param_2);
    lVar1 = *param_2;
  }
  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);
  return param_1;
}


PUSH RBP
PUSH RBX
MOV RBX,RDI
SUB RSP,0x8
MOV RDX,qword ptr [RSI]
MOV EAX,dword ptr [RDX + -0x8]
TEST EAX,EAX
JS 0x0030df12
MOV RBP,RSI
MOV RDI,RSI
CALL 0x0030ddd0
MOV RDX,qword ptr [RBP]
ADD RDX,qword ptr [RDX + -0x18]
MOV RAX,RBX
MOV qword ptr [RBX],RDX
ADD RSP,0x8
POP RBX
POP RBP
RET
(translation_unit "long * FUN_0030def0(long *param_1,long *param_2)\n\n{\n  long lVar1;\n  \n  lVar1 = *param_2;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }\n  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);\n  return param_1;\n}\n\n" (function_definition "long * FUN_0030def0(long *param_1,long *param_2)\n\n{\n  long lVar1;\n  \n  lVar1 = *param_2;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }\n  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);\n  return param_1;\n}" (sized_type_specifier "long" long) (pointer_declarator "* FUN_0030def0(long *param_1,long *param_2)" * (function_declarator "FUN_0030def0(long *param_1,long *param_2)" identifier (parameter_list "(long *param_1,long *param_2)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "long *param_2" (sized_type_specifier "long" long) (pointer_declarator "*param_2" * identifier)) )))) (compound_statement "{\n  long lVar1;\n  \n  lVar1 = *param_2;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }\n  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);\n  return param_1;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (expression_statement "lVar1 = *param_2;" (assignment_expression "lVar1 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (if_statement "if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }" if (parenthesized_expression "(-1 < *(int *)(lVar1 + -8))" ( (binary_expression "-1 < *(int *)(lVar1 + -8)" number_literal < (pointer_expression "*(int *)(lVar1 + -8)" * (cast_expression "(int *)(lVar1 + -8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -8)" ( (binary_expression "lVar1 + -8" identifier + number_literal) ))))) )) (compound_statement "{\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }" { (expression_statement "FUN_0030ddd0(param_2);" (call_expression "FUN_0030ddd0(param_2)" identifier (argument_list "(param_2)" ( identifier ))) ;) (expression_statement "lVar1 = *param_2;" (assignment_expression "lVar1 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) })) (expression_statement "*param_1 = lVar1 + *(long *)(lVar1 + -0x18);" (assignment_expression "*param_1 = lVar1 + *(long *)(lVar1 + -0x18)" (pointer_expression "*param_1" * identifier) = (binary_expression "lVar1 + *(long *)(lVar1 + -0x18)" identifier + (pointer_expression "*(long *)(lVar1 + -0x18)" * (cast_expression "(long *)(lVar1 + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -0x18)" ( (binary_expression "lVar1 + -0x18" identifier + number_literal) )))))) ;) (return_statement "return param_1;" return identifier ;) })))
(translation_unit "/* std::string::rbegin() */\n\nvoid std::string::rbegin(void)\n\n{\n  long lVar1;\n  string *in_RSI;\n  long *in_RDI;\n  \n  lVar1 = *(long *)in_RSI;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    _M_leak_hard(in_RSI);\n    lVar1 = *(long *)in_RSI;\n  }\n  *in_RDI = lVar1 + *(long *)(lVar1 + -0x18);\n  return;\n}\n\n" comment (function_definition "void std::string::rbegin(void)\n\n{\n  long lVar1;\n  string *in_RSI;\n  long *in_RDI;\n  \n  lVar1 = *(long *)in_RSI;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    _M_leak_hard(in_RSI);\n    lVar1 = *(long *)in_RSI;\n  }\n  *in_RDI = lVar1 + *(long *)(lVar1 + -0x18);\n  return;\n}" primitive_type (ERROR "std::string::" identifier : : identifier : :) (function_declarator "rbegin(void)" identifier (parameter_list "(void)" ( (parameter_declaration "void" primitive_type) ))) (compound_statement "{\n  long lVar1;\n  string *in_RSI;\n  long *in_RDI;\n  \n  lVar1 = *(long *)in_RSI;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    _M_leak_hard(in_RSI);\n    lVar1 = *(long *)in_RSI;\n  }\n  *in_RDI = lVar1 + *(long *)(lVar1 + -0x18);\n  return;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "string *in_RSI;" type_identifier (pointer_declarator "*in_RSI" * identifier) ;) (declaration "long *in_RDI;" (sized_type_specifier "long" long) (pointer_declarator "*in_RDI" * identifier) ;) (expression_statement "lVar1 = *(long *)in_RSI;" (assignment_expression "lVar1 = *(long *)in_RSI" identifier = (pointer_expression "*(long *)in_RSI" * (cast_expression "(long *)in_RSI" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier))) ;) (if_statement "if (-1 < *(int *)(lVar1 + -8)) {\n    _M_leak_hard(in_RSI);\n    lVar1 = *(long *)in_RSI;\n  }" if (parenthesized_expression "(-1 < *(int *)(lVar1 + -8))" ( (binary_expression "-1 < *(int *)(lVar1 + -8)" number_literal < (pointer_expression "*(int *)(lVar1 + -8)" * (cast_expression "(int *)(lVar1 + -8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -8)" ( (binary_expression "lVar1 + -8" identifier + number_literal) ))))) )) (compound_statement "{\n    _M_leak_hard(in_RSI);\n    lVar1 = *(long *)in_RSI;\n  }" { (expression_statement "_M_leak_hard(in_RSI);" (call_expression "_M_leak_hard(in_RSI)" identifier (argument_list "(in_RSI)" ( identifier ))) ;) (expression_statement "lVar1 = *(long *)in_RSI;" (assignment_expression "lVar1 = *(long *)in_RSI" identifier = (pointer_expression "*(long *)in_RSI" * (cast_expression "(long *)in_RSI" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) identifier))) ;) })) (expression_statement "*in_RDI = lVar1 + *(long *)(lVar1 + -0x18);" (assignment_expression "*in_RDI = lVar1 + *(long *)(lVar1 + -0x18)" (pointer_expression "*in_RDI" * identifier) = (binary_expression "lVar1 + *(long *)(lVar1 + -0x18)" identifier + (pointer_expression "*(long *)(lVar1 + -0x18)" * (cast_expression "(long *)(lVar1 + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -0x18)" ( (binary_expression "lVar1 + -0x18" identifier + number_literal) )))))) ;) (return_statement "return;" return ;) })))
(translation_unit "long * FUN_0030def0(long *param_1,long *param_2)\n\n{\n  long lVar1;\n  \n  lVar1 = *param_2;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }\n  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);\n  return param_1;\n}\n\n" (function_definition "long * FUN_0030def0(long *param_1,long *param_2)\n\n{\n  long lVar1;\n  \n  lVar1 = *param_2;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }\n  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);\n  return param_1;\n}" (sized_type_specifier "long" long) (pointer_declarator "* FUN_0030def0(long *param_1,long *param_2)" * (function_declarator "FUN_0030def0(long *param_1,long *param_2)" identifier (parameter_list "(long *param_1,long *param_2)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "long *param_2" (sized_type_specifier "long" long) (pointer_declarator "*param_2" * identifier)) )))) (compound_statement "{\n  long lVar1;\n  \n  lVar1 = *param_2;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }\n  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);\n  return param_1;\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (expression_statement "lVar1 = *param_2;" (assignment_expression "lVar1 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (if_statement "if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }" if (parenthesized_expression "(-1 < *(int *)(lVar1 + -8))" ( (binary_expression "-1 < *(int *)(lVar1 + -8)" number_literal < (pointer_expression "*(int *)(lVar1 + -8)" * (cast_expression "(int *)(lVar1 + -8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -8)" ( (binary_expression "lVar1 + -8" identifier + number_literal) ))))) )) (compound_statement "{\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }" { (expression_statement "FUN_0030ddd0(param_2);" (call_expression "FUN_0030ddd0(param_2)" identifier (argument_list "(param_2)" ( identifier ))) ;) (expression_statement "lVar1 = *param_2;" (assignment_expression "lVar1 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) })) (expression_statement "*param_1 = lVar1 + *(long *)(lVar1 + -0x18);" (assignment_expression "*param_1 = lVar1 + *(long *)(lVar1 + -0x18)" (pointer_expression "*param_1" * identifier) = (binary_expression "lVar1 + *(long *)(lVar1 + -0x18)" identifier + (pointer_expression "*(long *)(lVar1 + -0x18)" * (cast_expression "(long *)(lVar1 + -0x18)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + -0x18)" ( (binary_expression "lVar1 + -0x18" identifier + number_literal) )))))) ;) (return_statement "return param_1;" return identifier ;) })))
(translation_unit (function_definition (sized_type_specifier long) (pointer_declarator * (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) )))) (compound_statement { (declaration (sized_type_specifier long) IDENT ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) )) (compound_statement { (expression_statement (call_expression IDENT (argument_list ( IDENT ))) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) })) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression IDENT + (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))))) ;) (return_statement return IDENT ;) })))
(function_definition "long * FUN_0030def0(long *param_1,long *param_2)\n\n{\n  long lVar1;\n  \n  lVar1 = *param_2;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }\n  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);\n  return param_1;\n}" (sized_type_specifier "long" (long "long")) (pointer_declarator "* FUN_0030def0(long *param_1,long *param_2)" (* "*") (function_declarator "FUN_0030def0(long *param_1,long *param_2)" (identifier "FUN_0030def0") (parameter_list "(long *param_1,long *param_2)" (( "(") (parameter_declaration "long *param_1" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "long *param_2" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) () ")")))) (compound_statement "{\n  long lVar1;\n  \n  lVar1 = *param_2;\n  if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }\n  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);\n  return param_1;\n}" ({ "{") (declaration "long lVar1;" (sized_type_specifier "long" (long "long")) (identifier "lVar1") (; ";")) (expression_statement "lVar1 = *param_2;" (assignment_expression "lVar1 = *param_2" (identifier "lVar1") (= "=") (pointer_expression "*param_2" (* "*") (identifier "param_2"))) (; ";")) (if_statement "if (-1 < *(int *)(lVar1 + -8)) {\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }" (if "if") (parenthesized_expression "(-1 < *(int *)(lVar1 + -8))" (( "(") (binary_expression "-1 < *(int *)(lVar1 + -8)" (number_literal "-1") (< "<") (pointer_expression "*(int *)(lVar1 + -8)" (* "*") (cast_expression "(int *)(lVar1 + -8)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar1 + -8)" (( "(") (binary_expression "lVar1 + -8" (identifier "lVar1") (+ "+") (number_literal "-8")) () ")"))))) () ")")) (compound_statement "{\n    FUN_0030ddd0(param_2);\n    lVar1 = *param_2;\n  }" ({ "{") (expression_statement "FUN_0030ddd0(param_2);" (call_expression "FUN_0030ddd0(param_2)" (identifier "FUN_0030ddd0") (argument_list "(param_2)" (( "(") (identifier "param_2") () ")"))) (; ";")) (expression_statement "lVar1 = *param_2;" (assignment_expression "lVar1 = *param_2" (identifier "lVar1") (= "=") (pointer_expression "*param_2" (* "*") (identifier "param_2"))) (; ";")) (} "}"))) (expression_statement "*param_1 = lVar1 + *(long *)(lVar1 + -0x18);" (assignment_expression "*param_1 = lVar1 + *(long *)(lVar1 + -0x18)" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (= "=") (binary_expression "lVar1 + *(long *)(lVar1 + -0x18)" (identifier "lVar1") (+ "+") (pointer_expression "*(long *)(lVar1 + -0x18)" (* "*") (cast_expression "(long *)(lVar1 + -0x18)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar1 + -0x18)" (( "(") (binary_expression "lVar1 + -0x18" (identifier "lVar1") (+ "+") (number_literal "-0x18")) () ")")))))) (; ";")) (return_statement "return param_1;" (return "return") (identifier "param_1") (; ";")) (} "}")))

/* std::string::rbegin() */

void std::type_1::function_1(void)

{
  long var_1;
  type_1 *in_RSI;
  long *in_RDI;
  
  var_1 = *(long *)in_RSI;
  if (-1 < *(int *)(var_1 + -8)) {
    var_2(in_RSI);
    var_1 = *(long *)in_RSI;
  }
  *in_RDI = var_1 + *(long *)(var_1 + -0x18);
  return;
}


(translation_unit (function_definition type: (sized_type_specifier) declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier)))))) body: (compound_statement (declaration type: (sized_type_specifier) declarator: (identifier)) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) consequence: (compound_statement (expression_statement (call_expression function: (identifier) arguments: (argument_list (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))))) (return_statement (identifier)))))

long * MASKED(long *param_1,long *param_2)

{
  long lVar1;
  
  lVar1 = *param_2;
  if (-1 < *(int *)(lVar1 + -8)) {
    FUN_0030ddd0(param_2);
    lVar1 = *param_2;
  }
  *param_1 = lVar1 + *(long *)(lVar1 + -0x18);
  return param_1;
}

