
/* WARNING: Type propagation algorithm not settling */
/* DWARF original prototype: int script_compare(Sort_output_sections * this, Output_section * os1,
   Output_section * os2) */

int __thiscall
gold::Sort_output_sections::script_compare
          (Sort_output_sections *this,Output_section *os1,Output_section *os2)

{
  Sections_elements *pSVar1;
  bool bVar2;
  bool bVar3;
  Output_section *pOVar4;
  _List_node_base *p_Var5;
  
  pSVar1 = this->elements_;
  if ((pSVar1 != (Sections_elements *)0x0) &&
     (p_Var5 = (pSVar1->
               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).
               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1))
  {
    bVar3 = false;
    bVar2 = false;
    do {
      while (pOVar4 = (Output_section *)
                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),
            pOVar4 == os2) {
        if (bVar2) {
          return -1;
        }
        bVar3 = true;
        p_Var5 = p_Var5->_M_next;
        if ((_List_node_base *)this->elements_ == p_Var5) {
          return 0;
        }
      }
      pOVar4 = (Output_section *)
               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);
      if (pOVar4 == os1) {
        if (bVar3) {
          return 1;
        }
        bVar2 = true;
      }
      p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)
                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;
    } while ((_List_node_base *)this->elements_ != p_Var5);
  }
  return 0;
}



undefined4 FUN_0015ca80(int *param_1,int param_2,int param_3)

{
  int *piVar1;
  bool bVar2;
  bool bVar3;
  int iVar4;
  int *piVar5;
  
  piVar1 = (int *)*param_1;
  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {
    bVar3 = false;
    bVar2 = false;
    do {
      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {
        if (bVar2) {
          return 0xffffffff;
        }
        bVar3 = true;
        piVar5 = (int *)*piVar5;
        if ((int *)*param_1 == piVar5) {
          return 0;
        }
      }
      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);
      if (iVar4 == param_2) {
        if (bVar3) {
          return 1;
        }
        bVar2 = true;
      }
      piVar5 = (int *)*piVar5;
    } while ((int *)*param_1 != piVar5);
  }
  return 0;
}


PUSH EBP
PUSH EDI
PUSH ESI
PUSH EBX
SUB ESP,0x1c
MOV EBX,dword ptr [ESP + 0x30]
MOV EBP,dword ptr [ESP + 0x34]
MOV ESI,dword ptr [ESP + 0x38]
MOV EAX,dword ptr [EBX]
TEST EAX,EAX
JZ 0x0015caee
MOV EDI,dword ptr [EAX]
CMP EDI,EAX
JZ 0x0015caee
MOV byte ptr [ESP + 0xf],0x0
MOV byte ptr [ESP + 0xe],0x0
JMP 0x0015cac9
MOV EAX,dword ptr [EDI + 0x8]
SUB ESP,0xc
MOV ECX,dword ptr [EAX]
PUSH EAX
CALL dword ptr [ECX + 0x38]
ADD ESP,0x10
CMP EAX,EBP
JZ 0x0015cb00
MOV EDI,dword ptr [EDI]
CMP dword ptr [EBX],EDI
JZ 0x0015caee
MOV EAX,dword ptr [EDI + 0x8]
SUB ESP,0xc
MOV ECX,dword ptr [EAX]
PUSH EAX
CALL dword ptr [ECX + 0x38]
ADD ESP,0x10
CMP EAX,ESI
JNZ 0x0015cab0
CMP byte ptr [ESP + 0xe],0x0
JNZ 0x0015cb10
MOV byte ptr [ESP + 0xf],0x1
MOV EDI,dword ptr [EDI]
CMP dword ptr [EBX],EDI
JNZ 0x0015cac9
ADD ESP,0x1c
XOR EAX,EAX
POP EBX
POP ESI
POP EDI
POP EBP
RET
CMP byte ptr [ESP + 0xf],0x0
JNZ 0x0015cb1d
MOV byte ptr [ESP + 0xe],0x1
JMP 0x0015cac3
ADD ESP,0x1c
MOV EAX,0xffffffff
POP EBX
POP ESI
POP EDI
POP EBP
RET
ADD ESP,0x1c
MOV EAX,0x1
POP EBX
POP ESI
POP EDI
POP EBP
RET
(translation_unit "undefined4 FUN_0015ca80(int *param_1,int param_2,int param_3)\n\n{\n  int *piVar1;\n  bool bVar2;\n  bool bVar3;\n  int iVar4;\n  int *piVar5;\n  \n  piVar1 = (int *)*param_1;\n  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }\n  return 0;\n}\n\n" (function_definition "undefined4 FUN_0015ca80(int *param_1,int param_2,int param_3)\n\n{\n  int *piVar1;\n  bool bVar2;\n  bool bVar3;\n  int iVar4;\n  int *piVar5;\n  \n  piVar1 = (int *)*param_1;\n  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }\n  return 0;\n}" type_identifier (function_declarator "FUN_0015ca80(int *param_1,int param_2,int param_3)" identifier (parameter_list "(int *param_1,int param_2,int param_3)" ( (parameter_declaration "int *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "int param_2" primitive_type identifier) , (parameter_declaration "int param_3" primitive_type identifier) ))) (compound_statement "{\n  int *piVar1;\n  bool bVar2;\n  bool bVar3;\n  int iVar4;\n  int *piVar5;\n  \n  piVar1 = (int *)*param_1;\n  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }\n  return 0;\n}" { (declaration "int *piVar1;" primitive_type (pointer_declarator "*piVar1" * identifier) ;) (declaration "bool bVar2;" primitive_type identifier ;) (declaration "bool bVar3;" primitive_type identifier ;) (declaration "int iVar4;" primitive_type identifier ;) (declaration "int *piVar5;" primitive_type (pointer_declarator "*piVar5" * identifier) ;) (expression_statement "piVar1 = (int *)*param_1;" (assignment_expression "piVar1 = (int *)*param_1" identifier = (cast_expression "(int *)*param_1" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier))) ;) (if_statement "if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }" if (parenthesized_expression "((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1))" ( (binary_expression "(piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)" (parenthesized_expression "(piVar1 != (int *)0x0)" ( (binary_expression "piVar1 != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) && (parenthesized_expression "(piVar5 = (int *)*piVar1, piVar5 != piVar1)" ( (comma_expression "piVar5 = (int *)*piVar1, piVar5 != piVar1" (assignment_expression "piVar5 = (int *)*piVar1" identifier = (cast_expression "(int *)*piVar1" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*piVar1" * identifier))) , (binary_expression "piVar5 != piVar1" identifier != identifier)) ))) )) (compound_statement "{\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }" { (expression_statement "bVar3 = false;" (assignment_expression "bVar3 = false" identifier = false) ;) (expression_statement "bVar2 = false;" (assignment_expression "bVar2 = false" identifier = false) ;) (do_statement "do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);" do (compound_statement "{\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    }" { (while_statement "while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }" while (parenthesized_expression "(iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3)" ( (comma_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3" (assignment_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" identifier = (call_expression "(**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" (parenthesized_expression "(**(code **)(*(int *)piVar5[2] + 0x38))" ( (pointer_expression "**(code **)(*(int *)piVar5[2] + 0x38)" * (pointer_expression "*(code **)(*(int *)piVar5[2] + 0x38)" * (cast_expression "(code **)(*(int *)piVar5[2] + 0x38)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*(int *)piVar5[2] + 0x38)" ( (binary_expression "*(int *)piVar5[2] + 0x38" (pointer_expression "*(int *)piVar5[2]" * (cast_expression "(int *)piVar5[2]" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (subscript_expression "piVar5[2]" identifier [ number_literal ]))) + number_literal) ))))) )) (argument_list "((int *)piVar5[2])" ( (cast_expression "(int *)piVar5[2]" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (subscript_expression "piVar5[2]" identifier [ number_literal ])) )))) , (binary_expression "iVar4 == param_3" identifier == identifier)) )) (compound_statement "{\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }" { (if_statement "if (bVar2) {\n          return 0xffffffff;\n        }" if (parenthesized_expression "(bVar2)" ( identifier )) (compound_statement "{\n          return 0xffffffff;\n        }" { (return_statement "return 0xffffffff;" return number_literal ;) })) (expression_statement "bVar3 = true;" (assignment_expression "bVar3 = true" identifier = true) ;) (expression_statement "piVar5 = (int *)*piVar5;" (assignment_expression "piVar5 = (int *)*piVar5" identifier = (cast_expression "(int *)*piVar5" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*piVar5" * identifier))) ;) (if_statement "if ((int *)*param_1 == piVar5) {\n          return 0;\n        }" if (parenthesized_expression "((int *)*param_1 == piVar5)" ( (binary_expression "(int *)*param_1 == piVar5" (cast_expression "(int *)*param_1" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier)) == identifier) )) (compound_statement "{\n          return 0;\n        }" { (return_statement "return 0;" return number_literal ;) })) })) (expression_statement "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);" (assignment_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" identifier = (call_expression "(**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" (parenthesized_expression "(**(code **)(*(int *)piVar5[2] + 0x38))" ( (pointer_expression "**(code **)(*(int *)piVar5[2] + 0x38)" * (pointer_expression "*(code **)(*(int *)piVar5[2] + 0x38)" * (cast_expression "(code **)(*(int *)piVar5[2] + 0x38)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*(int *)piVar5[2] + 0x38)" ( (binary_expression "*(int *)piVar5[2] + 0x38" (pointer_expression "*(int *)piVar5[2]" * (cast_expression "(int *)piVar5[2]" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (subscript_expression "piVar5[2]" identifier [ number_literal ]))) + number_literal) ))))) )) (argument_list "((int *)piVar5[2])" ( (cast_expression "(int *)piVar5[2]" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (subscript_expression "piVar5[2]" identifier [ number_literal ])) )))) ;) (if_statement "if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }" if (parenthesized_expression "(iVar4 == param_2)" ( (binary_expression "iVar4 == param_2" identifier == identifier) )) (compound_statement "{\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }" { (if_statement "if (bVar3) {\n          return 1;\n        }" if (parenthesized_expression "(bVar3)" ( identifier )) (compound_statement "{\n          return 1;\n        }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "bVar2 = true;" (assignment_expression "bVar2 = true" identifier = true) ;) })) (expression_statement "piVar5 = (int *)*piVar5;" (assignment_expression "piVar5 = (int *)*piVar5" identifier = (cast_expression "(int *)*piVar5" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*piVar5" * identifier))) ;) }) while (parenthesized_expression "((int *)*param_1 != piVar5)" ( (binary_expression "(int *)*param_1 != piVar5" (cast_expression "(int *)*param_1" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier)) != identifier) )) ;) })) (return_statement "return 0;" return number_literal ;) })))
(translation_unit "/* WARNING: Type propagation algorithm not settling */\n/* DWARF original prototype: int script_compare(Sort_output_sections * this, Output_section * os1,\n   Output_section * os2) */\n\nint __thiscall\ngold::Sort_output_sections::script_compare\n          (Sort_output_sections *this,Output_section *os1,Output_section *os2)\n\n{\n  Sections_elements *pSVar1;\n  bool bVar2;\n  bool bVar3;\n  Output_section *pOVar4;\n  _List_node_base *p_Var5;\n  \n  pSVar1 = this->elements_;\n  if ((pSVar1 != (Sections_elements *)0x0) &&\n     (p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1))\n  {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2) {\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }\n      pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);\n      if (pOVar4 == os1) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;\n    } while ((_List_node_base *)this->elements_ != p_Var5);\n  }\n  return 0;\n}\n\n" comment comment (function_definition "int __thiscall\ngold::Sort_output_sections::script_compare\n          (Sort_output_sections *this,Output_section *os1,Output_section *os2)\n\n{\n  Sections_elements *pSVar1;\n  bool bVar2;\n  bool bVar3;\n  Output_section *pOVar4;\n  _List_node_base *p_Var5;\n  \n  pSVar1 = this->elements_;\n  if ((pSVar1 != (Sections_elements *)0x0) &&\n     (p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1))\n  {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2) {\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }\n      pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);\n      if (pOVar4 == os1) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;\n    } while ((_List_node_base *)this->elements_ != p_Var5);\n  }\n  return 0;\n}" primitive_type (ms_call_modifier "__thiscall" __thiscall) (ERROR "gold::Sort_output_sections::" identifier : : identifier : :) (function_declarator "script_compare\n          (Sort_output_sections *this,Output_section *os1,Output_section *os2)" identifier (parameter_list "(Sort_output_sections *this,Output_section *os1,Output_section *os2)" ( (parameter_declaration "Sort_output_sections *this" type_identifier (pointer_declarator "*this" * identifier)) , (parameter_declaration "Output_section *os1" type_identifier (pointer_declarator "*os1" * identifier)) , (parameter_declaration "Output_section *os2" type_identifier (pointer_declarator "*os2" * identifier)) ))) (compound_statement "{\n  Sections_elements *pSVar1;\n  bool bVar2;\n  bool bVar3;\n  Output_section *pOVar4;\n  _List_node_base *p_Var5;\n  \n  pSVar1 = this->elements_;\n  if ((pSVar1 != (Sections_elements *)0x0) &&\n     (p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1))\n  {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2) {\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }\n      pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);\n      if (pOVar4 == os1) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;\n    } while ((_List_node_base *)this->elements_ != p_Var5);\n  }\n  return 0;\n}" { (declaration "Sections_elements *pSVar1;" type_identifier (pointer_declarator "*pSVar1" * identifier) ;) (declaration "bool bVar2;" primitive_type identifier ;) (declaration "bool bVar3;" primitive_type identifier ;) (declaration "Output_section *pOVar4;" type_identifier (pointer_declarator "*pOVar4" * identifier) ;) (declaration "_List_node_base *p_Var5;" type_identifier (pointer_declarator "*p_Var5" * identifier) ;) (expression_statement "pSVar1 = this->elements_;" (assignment_expression "pSVar1 = this->elements_" identifier = (field_expression "this->elements_" identifier -> field_identifier)) ;) (if_statement "if ((pSVar1 != (Sections_elements *)0x0) &&\n     (p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1))\n  {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2) {\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }\n      pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);\n      if (pOVar4 == os1) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;\n    } while ((_List_node_base *)this->elements_ != p_Var5);\n  }" if (parenthesized_expression "((pSVar1 != (Sections_elements *)0x0) &&\n     (p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1))" ( (binary_expression "(pSVar1 != (Sections_elements *)0x0) &&\n     (p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1)" (parenthesized_expression "(pSVar1 != (Sections_elements *)0x0)" ( (binary_expression "pSVar1 != (Sections_elements *)0x0" identifier != (cast_expression "(Sections_elements *)0x0" ( (type_descriptor "Sections_elements *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) && (parenthesized_expression "(p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1)" ( (comma_expression "p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next, p_Var5 != (_List_node_base *)pSVar1" (assignment_expression "p_Var5 = (pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next" identifier = (field_expression "(pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base._M_next" (field_expression "(pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node.super__List_node_base" (field_expression "(pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl._M_node" (field_expression "(pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>).\n               _M_impl" (parenthesized_expression "(pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>)" ( (binary_expression "pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_>" (binary_expression "pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_" (binary_expression "pSVar1->\n               super__List_base<gold::Sections_element*,_std::allocator<gold" (binary_expression "pSVar1->\n               super__List_base<gold::Sections_element*,_std" (binary_expression "pSVar1->\n               super__List_base<gold" (field_expression "pSVar1->\n               super__List_base" identifier -> field_identifier) < identifier) (ERROR "::Sections_element" : : identifier) * (ERROR "," ,) identifier) (ERROR "::allocator" : : identifier) < identifier) (ERROR "::Sections_element" : : identifier) * (ERROR ">" >) identifier) > identifier) )) . field_identifier) . field_identifier) . field_identifier) . field_identifier)) , (binary_expression "p_Var5 != (_List_node_base *)pSVar1" identifier != (cast_expression "(_List_node_base *)pSVar1" ( (type_descriptor "_List_node_base *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier))) ))) )) (compound_statement "{\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2) {\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }\n      pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);\n      if (pOVar4 == os1) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;\n    } while ((_List_node_base *)this->elements_ != p_Var5);\n  }" { (expression_statement "bVar3 = false;" (assignment_expression "bVar3 = false" identifier = false) ;) (expression_statement "bVar2 = false;" (assignment_expression "bVar2 = false" identifier = false) ;) (do_statement "do {\n      while (pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2) {\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }\n      pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);\n      if (pOVar4 == os1) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;\n    } while ((_List_node_base *)this->elements_ != p_Var5);" do (compound_statement "{\n      while (pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2) {\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }\n      pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);\n      if (pOVar4 == os1) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;\n    }" { (while_statement "while (pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2) {\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }" while (parenthesized_expression "(pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2)" ( (comma_expression "pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next),\n            pOVar4 == os2" (assignment_expression "pOVar4 = (Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next)" identifier = (cast_expression "(Output_section *)\n                      (**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next)" ( (type_descriptor "Output_section *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(**(code **)(*(int *)p_Var5[1]._M_next + 0x38))(p_Var5[1]._M_next)" (parenthesized_expression "(**(code **)(*(int *)p_Var5[1]._M_next + 0x38))" ( (pointer_expression "**(code **)(*(int *)p_Var5[1]._M_next + 0x38)" * (pointer_expression "*(code **)(*(int *)p_Var5[1]._M_next + 0x38)" * (cast_expression "(code **)(*(int *)p_Var5[1]._M_next + 0x38)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*(int *)p_Var5[1]._M_next + 0x38)" ( (binary_expression "*(int *)p_Var5[1]._M_next + 0x38" (pointer_expression "*(int *)p_Var5[1]._M_next" * (cast_expression "(int *)p_Var5[1]._M_next" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (field_expression "p_Var5[1]._M_next" (subscript_expression "p_Var5[1]" identifier [ number_literal ]) . field_identifier))) + number_literal) ))))) )) (argument_list "(p_Var5[1]._M_next)" ( (field_expression "p_Var5[1]._M_next" (subscript_expression "p_Var5[1]" identifier [ number_literal ]) . field_identifier) ))))) , (binary_expression "pOVar4 == os2" identifier == identifier)) )) (compound_statement "{\n        if (bVar2) {\n          return -1;\n        }\n        bVar3 = true;\n        p_Var5 = p_Var5->_M_next;\n        if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }\n      }" { (if_statement "if (bVar2) {\n          return -1;\n        }" if (parenthesized_expression "(bVar2)" ( identifier )) (compound_statement "{\n          return -1;\n        }" { (return_statement "return -1;" return number_literal ;) })) (expression_statement "bVar3 = true;" (assignment_expression "bVar3 = true" identifier = true) ;) (expression_statement "p_Var5 = p_Var5->_M_next;" (assignment_expression "p_Var5 = p_Var5->_M_next" identifier = (field_expression "p_Var5->_M_next" identifier -> field_identifier)) ;) (if_statement "if ((_List_node_base *)this->elements_ == p_Var5) {\n          return 0;\n        }" if (parenthesized_expression "((_List_node_base *)this->elements_ == p_Var5)" ( (binary_expression "(_List_node_base *)this->elements_ == p_Var5" (cast_expression "(_List_node_base *)this->elements_" ( (type_descriptor "_List_node_base *" type_identifier (abstract_pointer_declarator "*" *)) ) (field_expression "this->elements_" identifier -> field_identifier)) == identifier) )) (compound_statement "{\n          return 0;\n        }" { (return_statement "return 0;" return number_literal ;) })) })) (expression_statement "pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next);" (assignment_expression "pOVar4 = (Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next)" identifier = (cast_expression "(Output_section *)\n               (**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next)" ( (type_descriptor "Output_section *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))(p_Var5[1]._M_next)" (parenthesized_expression "(**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38))" ( (pointer_expression "**(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38)" * (pointer_expression "*(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38)" * (cast_expression "(code **)((int)(p_Var5[1]._M_next)->_M_next + 0x38)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "((int)(p_Var5[1]._M_next)->_M_next + 0x38)" ( (binary_expression "(int)(p_Var5[1]._M_next)->_M_next + 0x38" (cast_expression "(int)(p_Var5[1]._M_next)->_M_next" ( (type_descriptor "int" primitive_type) ) (field_expression "(p_Var5[1]._M_next)->_M_next" (parenthesized_expression "(p_Var5[1]._M_next)" ( (field_expression "p_Var5[1]._M_next" (subscript_expression "p_Var5[1]" identifier [ number_literal ]) . field_identifier) )) -> field_identifier)) + number_literal) ))))) )) (argument_list "(p_Var5[1]._M_next)" ( (field_expression "p_Var5[1]._M_next" (subscript_expression "p_Var5[1]" identifier [ number_literal ]) . field_identifier) ))))) ;) (if_statement "if (pOVar4 == os1) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }" if (parenthesized_expression "(pOVar4 == os1)" ( (binary_expression "pOVar4 == os1" identifier == identifier) )) (compound_statement "{\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }" { (if_statement "if (bVar3) {\n          return 1;\n        }" if (parenthesized_expression "(bVar3)" ( identifier )) (compound_statement "{\n          return 1;\n        }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "bVar2 = true;" (assignment_expression "bVar2 = true" identifier = true) ;) })) (expression_statement "p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;" (assignment_expression "p_Var5 = (((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next" identifier = (field_expression "(((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base._M_next" (field_expression "(((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node.super__List_node_base" (field_expression "(((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)._M_node" (parenthesized_expression "(((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl)" ( (field_expression "((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)->_M_impl" (parenthesized_expression "((_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next)" ( (binary_expression "(_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)\n                &p_Var5->_M_next" (parenthesized_expression "(_List_base<gold::Sections_element*,_std::allocator<gold::Sections_element*>_> *)" ( (ERROR "_List_base<gold::Sections_element*,_std::allocator<gold::" (binary_expression "_List_base<gold" identifier < identifier) : : (type_descriptor "Sections_element*" type_identifier (abstract_pointer_declarator "*" *)) , identifier : : (binary_expression "allocator<gold" identifier < identifier) : :) (binary_expression "Sections_element*>_> *" (binary_expression "Sections_element*>_" identifier * (ERROR ">" >) identifier) > (pointer_expression "*" * identifier)) )) & (field_expression "p_Var5->_M_next" identifier -> field_identifier)) )) -> field_identifier) )) . field_identifier) . field_identifier) . field_identifier)) ;) }) while (parenthesized_expression "((_List_node_base *)this->elements_ != p_Var5)" ( (binary_expression "(_List_node_base *)this->elements_ != p_Var5" (cast_expression "(_List_node_base *)this->elements_" ( (type_descriptor "_List_node_base *" type_identifier (abstract_pointer_declarator "*" *)) ) (field_expression "this->elements_" identifier -> field_identifier)) != identifier) )) ;) })) (return_statement "return 0;" return number_literal ;) })))
(translation_unit "undefined4 FUN_0015ca80(int *param_1,int param_2,int param_3)\n\n{\n  int *piVar1;\n  bool bVar2;\n  bool bVar3;\n  int iVar4;\n  int *piVar5;\n  \n  piVar1 = (int *)*param_1;\n  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }\n  return 0;\n}\n\n" (function_definition "undefined4 FUN_0015ca80(int *param_1,int param_2,int param_3)\n\n{\n  int *piVar1;\n  bool bVar2;\n  bool bVar3;\n  int iVar4;\n  int *piVar5;\n  \n  piVar1 = (int *)*param_1;\n  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }\n  return 0;\n}" type_identifier (function_declarator "FUN_0015ca80(int *param_1,int param_2,int param_3)" identifier (parameter_list "(int *param_1,int param_2,int param_3)" ( (parameter_declaration "int *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "int param_2" primitive_type identifier) , (parameter_declaration "int param_3" primitive_type identifier) ))) (compound_statement "{\n  int *piVar1;\n  bool bVar2;\n  bool bVar3;\n  int iVar4;\n  int *piVar5;\n  \n  piVar1 = (int *)*param_1;\n  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }\n  return 0;\n}" { (declaration "int *piVar1;" primitive_type (pointer_declarator "*piVar1" * identifier) ;) (declaration "bool bVar2;" primitive_type identifier ;) (declaration "bool bVar3;" primitive_type identifier ;) (declaration "int iVar4;" primitive_type identifier ;) (declaration "int *piVar5;" primitive_type (pointer_declarator "*piVar5" * identifier) ;) (expression_statement "piVar1 = (int *)*param_1;" (assignment_expression "piVar1 = (int *)*param_1" identifier = (cast_expression "(int *)*param_1" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier))) ;) (if_statement "if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }" if (parenthesized_expression "((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1))" ( (binary_expression "(piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)" (parenthesized_expression "(piVar1 != (int *)0x0)" ( (binary_expression "piVar1 != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) && (parenthesized_expression "(piVar5 = (int *)*piVar1, piVar5 != piVar1)" ( (comma_expression "piVar5 = (int *)*piVar1, piVar5 != piVar1" (assignment_expression "piVar5 = (int *)*piVar1" identifier = (cast_expression "(int *)*piVar1" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*piVar1" * identifier))) , (binary_expression "piVar5 != piVar1" identifier != identifier)) ))) )) (compound_statement "{\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }" { (expression_statement "bVar3 = false;" (assignment_expression "bVar3 = false" identifier = false) ;) (expression_statement "bVar2 = false;" (assignment_expression "bVar2 = false" identifier = false) ;) (do_statement "do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);" do (compound_statement "{\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    }" { (while_statement "while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }" while (parenthesized_expression "(iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3)" ( (comma_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3" (assignment_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" identifier = (call_expression "(**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" (parenthesized_expression "(**(code **)(*(int *)piVar5[2] + 0x38))" ( (pointer_expression "**(code **)(*(int *)piVar5[2] + 0x38)" * (pointer_expression "*(code **)(*(int *)piVar5[2] + 0x38)" * (cast_expression "(code **)(*(int *)piVar5[2] + 0x38)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*(int *)piVar5[2] + 0x38)" ( (binary_expression "*(int *)piVar5[2] + 0x38" (pointer_expression "*(int *)piVar5[2]" * (cast_expression "(int *)piVar5[2]" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (subscript_expression "piVar5[2]" identifier [ number_literal ]))) + number_literal) ))))) )) (argument_list "((int *)piVar5[2])" ( (cast_expression "(int *)piVar5[2]" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (subscript_expression "piVar5[2]" identifier [ number_literal ])) )))) , (binary_expression "iVar4 == param_3" identifier == identifier)) )) (compound_statement "{\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }" { (if_statement "if (bVar2) {\n          return 0xffffffff;\n        }" if (parenthesized_expression "(bVar2)" ( identifier )) (compound_statement "{\n          return 0xffffffff;\n        }" { (return_statement "return 0xffffffff;" return number_literal ;) })) (expression_statement "bVar3 = true;" (assignment_expression "bVar3 = true" identifier = true) ;) (expression_statement "piVar5 = (int *)*piVar5;" (assignment_expression "piVar5 = (int *)*piVar5" identifier = (cast_expression "(int *)*piVar5" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*piVar5" * identifier))) ;) (if_statement "if ((int *)*param_1 == piVar5) {\n          return 0;\n        }" if (parenthesized_expression "((int *)*param_1 == piVar5)" ( (binary_expression "(int *)*param_1 == piVar5" (cast_expression "(int *)*param_1" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier)) == identifier) )) (compound_statement "{\n          return 0;\n        }" { (return_statement "return 0;" return number_literal ;) })) })) (expression_statement "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);" (assignment_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" identifier = (call_expression "(**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" (parenthesized_expression "(**(code **)(*(int *)piVar5[2] + 0x38))" ( (pointer_expression "**(code **)(*(int *)piVar5[2] + 0x38)" * (pointer_expression "*(code **)(*(int *)piVar5[2] + 0x38)" * (cast_expression "(code **)(*(int *)piVar5[2] + 0x38)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*(int *)piVar5[2] + 0x38)" ( (binary_expression "*(int *)piVar5[2] + 0x38" (pointer_expression "*(int *)piVar5[2]" * (cast_expression "(int *)piVar5[2]" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (subscript_expression "piVar5[2]" identifier [ number_literal ]))) + number_literal) ))))) )) (argument_list "((int *)piVar5[2])" ( (cast_expression "(int *)piVar5[2]" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (subscript_expression "piVar5[2]" identifier [ number_literal ])) )))) ;) (if_statement "if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }" if (parenthesized_expression "(iVar4 == param_2)" ( (binary_expression "iVar4 == param_2" identifier == identifier) )) (compound_statement "{\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }" { (if_statement "if (bVar3) {\n          return 1;\n        }" if (parenthesized_expression "(bVar3)" ( identifier )) (compound_statement "{\n          return 1;\n        }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "bVar2 = true;" (assignment_expression "bVar2 = true" identifier = true) ;) })) (expression_statement "piVar5 = (int *)*piVar5;" (assignment_expression "piVar5 = (int *)*piVar5" identifier = (cast_expression "(int *)*piVar5" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*piVar5" * identifier))) ;) }) while (parenthesized_expression "((int *)*param_1 != piVar5)" ( (binary_expression "(int *)*param_1 != piVar5" (cast_expression "(int *)*param_1" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_1" * identifier)) != identifier) )) ;) })) (return_statement "return 0;" return number_literal ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) , (binary_expression IDENT != IDENT)) ))) )) (compound_statement { (expression_statement (assignment_expression IDENT = BOOL) ;) (expression_statement (assignment_expression IDENT = BOOL) ;) (do_statement do (compound_statement { (while_statement while (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ]))) + LIT) ))))) )) (argument_list ( (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ])) )))) , (binary_expression IDENT == IDENT)) )) (compound_statement { (if_statement if (parenthesized_expression ( IDENT )) (compound_statement { (return_statement return LIT ;) })) (expression_statement (assignment_expression IDENT = BOOL) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (if_statement if (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT)) == IDENT) )) (compound_statement { (return_statement return LIT ;) })) })) (expression_statement (assignment_expression IDENT = (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ]))) + LIT) ))))) )) (argument_list ( (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (subscript_expression IDENT [ LIT ])) )))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == IDENT) )) (compound_statement { (if_statement if (parenthesized_expression ( IDENT )) (compound_statement { (return_statement return LIT ;) })) (expression_statement (assignment_expression IDENT = BOOL) ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) }) while (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT)) != IDENT) )) ;) })) (return_statement return LIT ;) })))
(function_definition "undefined4 FUN_0015ca80(int *param_1,int param_2,int param_3)\n\n{\n  int *piVar1;\n  bool bVar2;\n  bool bVar3;\n  int iVar4;\n  int *piVar5;\n  \n  piVar1 = (int *)*param_1;\n  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }\n  return 0;\n}" (type_identifier "undefined4") (function_declarator "FUN_0015ca80(int *param_1,int param_2,int param_3)" (identifier "FUN_0015ca80") (parameter_list "(int *param_1,int param_2,int param_3)" (( "(") (parameter_declaration "int *param_1" (primitive_type "int") (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "int param_2" (primitive_type "int") (identifier "param_2")) (, ",") (parameter_declaration "int param_3" (primitive_type "int") (identifier "param_3")) () ")"))) (compound_statement "{\n  int *piVar1;\n  bool bVar2;\n  bool bVar3;\n  int iVar4;\n  int *piVar5;\n  \n  piVar1 = (int *)*param_1;\n  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }\n  return 0;\n}" ({ "{") (declaration "int *piVar1;" (primitive_type "int") (pointer_declarator "*piVar1" (* "*") (identifier "piVar1")) (; ";")) (declaration "bool bVar2;" (primitive_type "bool") (identifier "bVar2") (; ";")) (declaration "bool bVar3;" (primitive_type "bool") (identifier "bVar3") (; ";")) (declaration "int iVar4;" (primitive_type "int") (identifier "iVar4") (; ";")) (declaration "int *piVar5;" (primitive_type "int") (pointer_declarator "*piVar5" (* "*") (identifier "piVar5")) (; ";")) (expression_statement "piVar1 = (int *)*param_1;" (assignment_expression "piVar1 = (int *)*param_1" (identifier "piVar1") (= "=") (cast_expression "(int *)*param_1" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_1" (* "*") (identifier "param_1")))) (; ";")) (if_statement "if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }" (if "if") (parenthesized_expression "((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1))" (( "(") (binary_expression "(piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)" (parenthesized_expression "(piVar1 != (int *)0x0)" (( "(") (binary_expression "piVar1 != (int *)0x0" (identifier "piVar1") (!= "!=") (cast_expression "(int *)0x0" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (&& "&&") (parenthesized_expression "(piVar5 = (int *)*piVar1, piVar5 != piVar1)" (( "(") (comma_expression "piVar5 = (int *)*piVar1, piVar5 != piVar1" (assignment_expression "piVar5 = (int *)*piVar1" (identifier "piVar5") (= "=") (cast_expression "(int *)*piVar1" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*piVar1" (* "*") (identifier "piVar1")))) (, ",") (binary_expression "piVar5 != piVar1" (identifier "piVar5") (!= "!=") (identifier "piVar1"))) () ")"))) () ")")) (compound_statement "{\n    bVar3 = false;\n    bVar2 = false;\n    do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);\n  }" ({ "{") (expression_statement "bVar3 = false;" (assignment_expression "bVar3 = false" (identifier "bVar3") (= "=") (false "false")) (; ";")) (expression_statement "bVar2 = false;" (assignment_expression "bVar2 = false" (identifier "bVar2") (= "=") (false "false")) (; ";")) (do_statement "do {\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    } while ((int *)*param_1 != piVar5);" (do "do") (compound_statement "{\n      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }\n      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);\n      if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }\n      piVar5 = (int *)*piVar5;\n    }" ({ "{") (while_statement "while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }" (while "while") (parenthesized_expression "(iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3)" (( "(") (comma_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3" (assignment_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" (identifier "iVar4") (= "=") (call_expression "(**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" (parenthesized_expression "(**(code **)(*(int *)piVar5[2] + 0x38))" (( "(") (pointer_expression "**(code **)(*(int *)piVar5[2] + 0x38)" (* "*") (pointer_expression "*(code **)(*(int *)piVar5[2] + 0x38)" (* "*") (cast_expression "(code **)(*(int *)piVar5[2] + 0x38)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(*(int *)piVar5[2] + 0x38)" (( "(") (binary_expression "*(int *)piVar5[2] + 0x38" (pointer_expression "*(int *)piVar5[2]" (* "*") (cast_expression "(int *)piVar5[2]" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "piVar5[2]" (identifier "piVar5") ([ "[") (number_literal "2") (] "]")))) (+ "+") (number_literal "0x38")) () ")"))))) () ")")) (argument_list "((int *)piVar5[2])" (( "(") (cast_expression "(int *)piVar5[2]" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "piVar5[2]" (identifier "piVar5") ([ "[") (number_literal "2") (] "]"))) () ")")))) (, ",") (binary_expression "iVar4 == param_3" (identifier "iVar4") (== "==") (identifier "param_3"))) () ")")) (compound_statement "{\n        if (bVar2) {\n          return 0xffffffff;\n        }\n        bVar3 = true;\n        piVar5 = (int *)*piVar5;\n        if ((int *)*param_1 == piVar5) {\n          return 0;\n        }\n      }" ({ "{") (if_statement "if (bVar2) {\n          return 0xffffffff;\n        }" (if "if") (parenthesized_expression "(bVar2)" (( "(") (identifier "bVar2") () ")")) (compound_statement "{\n          return 0xffffffff;\n        }" ({ "{") (return_statement "return 0xffffffff;" (return "return") (number_literal "0xffffffff") (; ";")) (} "}"))) (expression_statement "bVar3 = true;" (assignment_expression "bVar3 = true" (identifier "bVar3") (= "=") (true "true")) (; ";")) (expression_statement "piVar5 = (int *)*piVar5;" (assignment_expression "piVar5 = (int *)*piVar5" (identifier "piVar5") (= "=") (cast_expression "(int *)*piVar5" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*piVar5" (* "*") (identifier "piVar5")))) (; ";")) (if_statement "if ((int *)*param_1 == piVar5) {\n          return 0;\n        }" (if "if") (parenthesized_expression "((int *)*param_1 == piVar5)" (( "(") (binary_expression "(int *)*param_1 == piVar5" (cast_expression "(int *)*param_1" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) (== "==") (identifier "piVar5")) () ")")) (compound_statement "{\n          return 0;\n        }" ({ "{") (return_statement "return 0;" (return "return") (number_literal "0") (; ";")) (} "}"))) (} "}"))) (expression_statement "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);" (assignment_expression "iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" (identifier "iVar4") (= "=") (call_expression "(**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2])" (parenthesized_expression "(**(code **)(*(int *)piVar5[2] + 0x38))" (( "(") (pointer_expression "**(code **)(*(int *)piVar5[2] + 0x38)" (* "*") (pointer_expression "*(code **)(*(int *)piVar5[2] + 0x38)" (* "*") (cast_expression "(code **)(*(int *)piVar5[2] + 0x38)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(*(int *)piVar5[2] + 0x38)" (( "(") (binary_expression "*(int *)piVar5[2] + 0x38" (pointer_expression "*(int *)piVar5[2]" (* "*") (cast_expression "(int *)piVar5[2]" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "piVar5[2]" (identifier "piVar5") ([ "[") (number_literal "2") (] "]")))) (+ "+") (number_literal "0x38")) () ")"))))) () ")")) (argument_list "((int *)piVar5[2])" (( "(") (cast_expression "(int *)piVar5[2]" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (subscript_expression "piVar5[2]" (identifier "piVar5") ([ "[") (number_literal "2") (] "]"))) () ")")))) (; ";")) (if_statement "if (iVar4 == param_2) {\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }" (if "if") (parenthesized_expression "(iVar4 == param_2)" (( "(") (binary_expression "iVar4 == param_2" (identifier "iVar4") (== "==") (identifier "param_2")) () ")")) (compound_statement "{\n        if (bVar3) {\n          return 1;\n        }\n        bVar2 = true;\n      }" ({ "{") (if_statement "if (bVar3) {\n          return 1;\n        }" (if "if") (parenthesized_expression "(bVar3)" (( "(") (identifier "bVar3") () ")")) (compound_statement "{\n          return 1;\n        }" ({ "{") (return_statement "return 1;" (return "return") (number_literal "1") (; ";")) (} "}"))) (expression_statement "bVar2 = true;" (assignment_expression "bVar2 = true" (identifier "bVar2") (= "=") (true "true")) (; ";")) (} "}"))) (expression_statement "piVar5 = (int *)*piVar5;" (assignment_expression "piVar5 = (int *)*piVar5" (identifier "piVar5") (= "=") (cast_expression "(int *)*piVar5" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*piVar5" (* "*") (identifier "piVar5")))) (; ";")) (} "}")) (while "while") (parenthesized_expression "((int *)*param_1 != piVar5)" (( "(") (binary_expression "(int *)*param_1 != piVar5" (cast_expression "(int *)*param_1" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) (!= "!=") (identifier "piVar5")) () ")")) (; ";")) (} "}"))) (return_statement "return 0;" (return "return") (number_literal "0") (; ";")) (} "}")))

/* WARNING: Type propagation algorithm not settling */
/* DWARF original prototype: int script_compare(Sort_output_sections * this, Output_section * os1,
   Output_section * os2) */

int __thiscall
var_2::type_1::function_1
          (type_1 *this,type_2 *var_9,type_2 *var_8)

{
  type_3 *var_1;
  bool bVar2;
  bool bVar3;
  type_2 *var_7;
  type_4 *var_6;
  
  var_1 = this->elements_;
  if ((var_1 != (type_3 *)0x0) &&
     (var_6 = (var_1->
               super__List_base<var_2::var_10*,var_3::allocator<var_2::var_10*>var_4>var_5).
               _M_impl._M_node.super__List_node_base._M_next, var_6 != (type_4 *)var_1))
  {
    bVar3 = false;
    bVar2 = false;
    do {
      while (var_7 = (type_2 *)
                      (**(type_5 **)(*(int *)var_6[1]._M_next + 0x38))(var_6[1]._M_next),
            var_7 == var_8) {
        if (bVar2) {
          return -1;
        }
        bVar3 = true;
        var_6 = var_6->_M_next;
        if ((type_4 *)this->elements_ == var_6) {
          return 0;
        }
      }
      var_7 = (type_2 *)
               (**(type_5 **)((int)(var_6[1]._M_next)->_M_next + 0x38))(var_6[1]._M_next);
      if (var_7 == var_9) {
        if (bVar3) {
          return 1;
        }
        bVar2 = true;
      }
      var_6 = (((_List_base<var_2::var_10*,var_3::allocator<var_2::var_10*>var_4> *var_5)
                &var_6->_M_next)->_M_impl)._M_node.super__List_node_base._M_next;
    } while ((type_4 *)this->elements_ != var_6);
  }
  return 0;
}


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

undefined4 MASKED(int *param_1,int param_2,int param_3)

{
  int *piVar1;
  bool bVar2;
  bool bVar3;
  int iVar4;
  int *piVar5;
  
  piVar1 = (int *)*param_1;
  if ((piVar1 != (int *)0x0) && (piVar5 = (int *)*piVar1, piVar5 != piVar1)) {
    bVar3 = false;
    bVar2 = false;
    do {
      while (iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]), iVar4 == param_3) {
        if (bVar2) {
          return 0xffffffff;
        }
        bVar3 = true;
        piVar5 = (int *)*piVar5;
        if ((int *)*param_1 == piVar5) {
          return 0;
        }
      }
      iVar4 = (**(code **)(*(int *)piVar5[2] + 0x38))((int *)piVar5[2]);
      if (iVar4 == param_2) {
        if (bVar3) {
          return 1;
        }
        bVar2 = true;
      }
      piVar5 = (int *)*piVar5;
    } while ((int *)*param_1 != piVar5);
  }
  return 0;
}

