
/* WARNING: Type propagation algorithm not settling */
/* WARNING: Enum "DT": Some values do not have unique names */
/* DWARF original prototype: int gp_offset(Mips_output_data_got<64,_false> * this, uint got_offset,
   Mips_relobj<64,_false> * object) */

int __thiscall
anon_unknown.dwarf_ead2ad::Mips_output_data_got<64,_false>::gp_offset
          (Mips_output_data_got<64,_false> *this,uint got_offset,Mips_relobj<64,_false> *object)

{
  Sized_symbol<64> *pSVar1;
  Mips_output_data_got<64,_false> *pMVar2;
  int iVar3;
  int iVar4;
  undefined4 in_register_00000034;
  
  if (((this->super_Output_data_got<64,_false>).super_Output_data_got_base.
       super_Output_section_data_build.super_Output_section_data.super_Output_data.field_0x20 & 1)
      != 0) {
    iVar3 = (int)(this->super_Output_data_got<64,_false>).super_Output_data_got_base.
                 super_Output_section_data_build.super_Output_section_data.super_Output_data.
                 address_ + got_offset;
    pSVar1 = this->target_->gp_;
    if (pSVar1 != (Sized_symbol<64> *)0x0) {
      pMVar2 = this->target_->got_;
      iVar4 = (int)pSVar1->value_;
      if (((pMVar2 != (Mips_output_data_got<64,_false> *)0x0) &&
          (pMVar2->primary_got_ != (Mips_got_info<64,_false> *)0x0)) &&
         (object->got_info_ != (Mips_got_info<64,_false> *)0x0)) {
        iVar4 = iVar4 + object->got_info_->offset_;
      }
      iVar3 = iVar3 - iVar4;
    }
    return iVar3;
  }
                    /* WARNING: Subroutine does not return */
  Mips_output_data_plt<64,_false>::mips_entry_address
            ((Mips_output_data_plt<64,_false> *)this,
             (Mips_symbol<64> *)CONCAT44(in_register_00000034,got_offset));
}



int FUN_00292570(long param_1,int param_2,long param_3)

{
  long lVar1;
  long lVar2;
  int iVar3;
  
  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {
    param_2 = *(int *)(param_1 + 8) + param_2;
    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);
    if (lVar1 != 0) {
      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);
      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);
      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {
        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);
      }
      param_2 = param_2 - iVar3;
    }
    return param_2;
  }
                    /* WARNING: Subroutine does not return */
  FUN_00291e90();
}


TEST byte ptr [RDI + 0x20],0x1
JZ 0x002925ba
MOV EAX,dword ptr [RDI + 0x8]
ADD EAX,ESI
MOV RSI,qword ptr [RDI + 0x88]
MOV RCX,qword ptr [RSI + 0x28]
TEST RCX,RCX
JZ 0x002925b9
MOV RSI,qword ptr [RSI + 0x20]
MOV RCX,qword ptr [RCX + 0x40]
TEST RSI,RSI
JZ 0x002925b7
CMP qword ptr [RSI + 0xd0],0x0
JZ 0x002925b7
MOV RDX,qword ptr [RDX + 0x378]
TEST RDX,RDX
JZ 0x002925b7
MOV EDX,dword ptr [RDX + 0x10c]
ADD RCX,RDX
SUB EAX,ECX
RET
PUSH RAX
CALL 0x00291e90
(translation_unit "int FUN_00292570(long param_1,int param_2,long param_3)\n\n{\n  long lVar1;\n  long lVar2;\n  int iVar3;\n  \n  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }\n                    /* WARNING: Subroutine does not return */\n  FUN_00291e90();\n}\n\n" (function_definition "int FUN_00292570(long param_1,int param_2,long param_3)\n\n{\n  long lVar1;\n  long lVar2;\n  int iVar3;\n  \n  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }\n                    /* WARNING: Subroutine does not return */\n  FUN_00291e90();\n}" primitive_type (function_declarator "FUN_00292570(long param_1,int param_2,long param_3)" identifier (parameter_list "(long param_1,int param_2,long param_3)" ( (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "int param_2" primitive_type identifier) , (parameter_declaration "long param_3" (sized_type_specifier "long" long) identifier) ))) (compound_statement "{\n  long lVar1;\n  long lVar2;\n  int iVar3;\n  \n  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }\n                    /* WARNING: Subroutine does not return */\n  FUN_00291e90();\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "long lVar2;" (sized_type_specifier "long" long) identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (if_statement "if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }" if (parenthesized_expression "((*(byte *)(param_1 + 0x20) & 1) != 0)" ( (binary_expression "(*(byte *)(param_1 + 0x20) & 1) != 0" (parenthesized_expression "(*(byte *)(param_1 + 0x20) & 1)" ( (binary_expression "*(byte *)(param_1 + 0x20) & 1" (pointer_expression "*(byte *)(param_1 + 0x20)" * (cast_expression "(byte *)(param_1 + 0x20)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x20)" ( (binary_expression "param_1 + 0x20" identifier + number_literal) )))) & number_literal) )) != number_literal) )) (compound_statement "{\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }" { (expression_statement "param_2 = *(int *)(param_1 + 8) + param_2;" (assignment_expression "param_2 = *(int *)(param_1 + 8) + param_2" identifier = (binary_expression "*(int *)(param_1 + 8) + param_2" (pointer_expression "*(int *)(param_1 + 8)" * (cast_expression "(int *)(param_1 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) + identifier)) ;) (expression_statement "lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);" (assignment_expression "lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28)" identifier = (pointer_expression "*(long *)(*(long *)(param_1 + 0x88) + 0x28)" * (cast_expression "(long *)(*(long *)(param_1 + 0x88) + 0x28)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)(param_1 + 0x88) + 0x28)" ( (binary_expression "*(long *)(param_1 + 0x88) + 0x28" (pointer_expression "*(long *)(param_1 + 0x88)" * (cast_expression "(long *)(param_1 + 0x88)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x88)" ( (binary_expression "param_1 + 0x88" identifier + number_literal) )))) + number_literal) ))))) ;) (if_statement "if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }" if (parenthesized_expression "(lVar1 != 0)" ( (binary_expression "lVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }" { (expression_statement "lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);" (assignment_expression "lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20)" identifier = (pointer_expression "*(long *)(*(long *)(param_1 + 0x88) + 0x20)" * (cast_expression "(long *)(*(long *)(param_1 + 0x88) + 0x20)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)(param_1 + 0x88) + 0x20)" ( (binary_expression "*(long *)(param_1 + 0x88) + 0x20" (pointer_expression "*(long *)(param_1 + 0x88)" * (cast_expression "(long *)(param_1 + 0x88)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x88)" ( (binary_expression "param_1 + 0x88" identifier + number_literal) )))) + number_literal) ))))) ;) (expression_statement "iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);" (assignment_expression "iVar3 = (int)*(undefined8 *)(lVar1 + 0x40)" identifier = (cast_expression "(int)*(undefined8 *)(lVar1 + 0x40)" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*(undefined8 *)(lVar1 + 0x40)" * (cast_expression "(undefined8 *)(lVar1 + 0x40)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + 0x40)" ( (binary_expression "lVar1 + 0x40" identifier + number_literal) )))))) ;) (if_statement "if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }" if (parenthesized_expression "(((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0))" ( (binary_expression "((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)" (parenthesized_expression "((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0))" ( (binary_expression "(lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)" (parenthesized_expression "(lVar2 != 0)" ( (binary_expression "lVar2 != 0" identifier != number_literal) )) && (parenthesized_expression "(*(long *)(lVar2 + 0xd0) != 0)" ( (binary_expression "*(long *)(lVar2 + 0xd0) != 0" (pointer_expression "*(long *)(lVar2 + 0xd0)" * (cast_expression "(long *)(lVar2 + 0xd0)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar2 + 0xd0)" ( (binary_expression "lVar2 + 0xd0" identifier + number_literal) )))) != number_literal) ))) )) && (parenthesized_expression "(*(long *)(param_3 + 0x378) != 0)" ( (binary_expression "*(long *)(param_3 + 0x378) != 0" (pointer_expression "*(long *)(param_3 + 0x378)" * (cast_expression "(long *)(param_3 + 0x378)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_3 + 0x378)" ( (binary_expression "param_3 + 0x378" identifier + number_literal) )))) != number_literal) ))) )) (compound_statement "{\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }" { (expression_statement "iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);" (assignment_expression "iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c)" identifier = (binary_expression "iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c)" identifier + (pointer_expression "*(int *)(*(long *)(param_3 + 0x378) + 0x10c)" * (cast_expression "(int *)(*(long *)(param_3 + 0x378) + 0x10c)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)(param_3 + 0x378) + 0x10c)" ( (binary_expression "*(long *)(param_3 + 0x378) + 0x10c" (pointer_expression "*(long *)(param_3 + 0x378)" * (cast_expression "(long *)(param_3 + 0x378)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_3 + 0x378)" ( (binary_expression "param_3 + 0x378" identifier + number_literal) )))) + number_literal) )))))) ;) })) (expression_statement "param_2 = param_2 - iVar3;" (assignment_expression "param_2 = param_2 - iVar3" identifier = (binary_expression "param_2 - iVar3" identifier - identifier)) ;) })) (return_statement "return param_2;" return identifier ;) })) comment (expression_statement "FUN_00291e90();" (call_expression "FUN_00291e90()" identifier (argument_list "()" ( ))) ;) })))
(ERROR "/* WARNING: Type propagation algorithm not settling */\n/* WARNING: Enum "DT": Some values do not have unique names */\n/* DWARF original prototype: int gp_offset(Mips_output_data_got<64,_false> * this, uint got_offset,\n   Mips_relobj<64,_false> * object) */\n\nint __thiscall\nanon_unknown.dwarf_ead2ad::Mips_output_data_got<64,_false>::gp_offset\n          (Mips_output_data_got<64,_false> *this,uint got_offset,Mips_relobj<64,_false> *object)\n\n{\n  Sized_symbol<64> *pSVar1;\n  Mips_output_data_got<64,_false> *pMVar2;\n  int iVar3;\n  int iVar4;\n  undefined4 in_register_00000034;\n  \n  if (((this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build.super_Output_section_data.super_Output_data.field_0x20 & 1)\n      != 0) {\n    iVar3 = (int)(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build.super_Output_section_data.super_Output_data.\n                 address_ + got_offset;\n    pSVar1 = this->target_->gp_;\n    if (pSVar1 != (Sized_symbol<64> *)0x0) {\n      pMVar2 = this->target_->got_;\n      iVar4 = (int)pSVar1->value_;\n      if (((pMVar2 != (Mips_output_data_got<64,_false> *)0x0) &&\n          (pMVar2->primary_got_ != (Mips_got_info<64,_false> *)0x0)) &&\n         (object->got_info_ != (Mips_got_info<64,_false> *)0x0)) {\n        iVar4 = iVar4 + object->got_info_->offset_;\n      }\n      iVar3 = iVar3 - iVar4;\n    }\n    return iVar3;\n  }\n                    /* WARNING: Subroutine does not return */\n  Mips_output_data_plt<64,_false>::mips_entry_address\n            ((Mips_output_data_plt<64,_false> *)this,\n             (Mips_symbol<64> *)CONCAT44(in_register_00000034,got_offset));\n}\n\n" comment comment comment (declaration "int __thiscall\nanon_unknown.dwarf_ead2ad::Mips_output_data_got<64,_false>::gp_offset\n          (Mips_output_data_got<64,_false> *this,uint got_offset,Mips_relobj<64,_false> *object)\n\n{\n  Sized_symbol<64> *pSVar1;" primitive_type (ms_call_modifier "__thiscall" __thiscall) (ERROR "anon_unknown.dwarf_ead2ad::" identifier . identifier : :) identifier (ERROR "<64" < number_literal) , (ERROR "_false>::gp_offset\n          (Mips_output_data_got<64,_false> *this,uint got_offset,Mips_relobj<64,_false> *object)\n\n{\n  Sized_symbol<64>" identifier > : : (function_declarator "gp_offset\n          (Mips_output_data_got<64,_false> *this,uint got_offset,Mips_relobj<64,_false> *object)" identifier (parameter_list "(Mips_output_data_got<64,_false> *this,uint got_offset,Mips_relobj<64,_false> *object)" ( (parameter_declaration "Mips_output_data_got" type_identifier) (ERROR "<64" < number_literal) , (parameter_declaration "_false> *this" type_identifier (ERROR ">" >) (pointer_declarator "*this" * identifier)) , (parameter_declaration "uint got_offset" type_identifier identifier) , (parameter_declaration "Mips_relobj" type_identifier) (ERROR "<64" < number_literal) , (parameter_declaration "_false> *object" type_identifier (ERROR ">" >) (pointer_declarator "*object" * identifier)) ))) { identifier < number_literal >) (pointer_declarator "*pSVar1" * identifier) ;) (expression_statement "Mips_output_data_got<64,_false> *pMVar2;" (update_expression "Mips_output_data_got<64,_false> *pMVar2" (binary_expression "Mips_output_data_got<64,_false> *pMVar2" (binary_expression "Mips_output_data_got<64" identifier < number_literal) (ERROR ",_false" , identifier) > (pointer_expression "*pMVar2" * identifier)) --) ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "int iVar4;" primitive_type identifier ;) (declaration "undefined4 in_register_00000034;" type_identifier identifier ;) if (parenthesized_expression "(((this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build.super_Output_section_data.super_Output_data.field_0x20 & 1)\n      != 0)" ( (binary_expression "((this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build.super_Output_section_data.super_Output_data.field_0x20 & 1)\n      != 0" (parenthesized_expression "((this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build.super_Output_section_data.super_Output_data.field_0x20 & 1)" ( (binary_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build.super_Output_section_data.super_Output_data.field_0x20 & 1" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build.super_Output_section_data.super_Output_data.field_0x20" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build.super_Output_section_data.super_Output_data" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build.super_Output_section_data" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n       super_Output_section_data_build" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base" (parenthesized_expression "(this->super_Output_data_got<64,_false>)" ( (comma_expression "this->super_Output_data_got<64,_false" (binary_expression "this->super_Output_data_got<64" (field_expression "this->super_Output_data_got" identifier -> field_identifier) < number_literal) , identifier) (ERROR ">" >) )) . field_identifier) . field_identifier) . field_identifier) . field_identifier) . field_identifier) & number_literal) )) != number_literal) )) { (expression_statement "iVar3 = (int)(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build.super_Output_section_data.super_Output_data.\n                 address_ + got_offset;" (assignment_expression "iVar3 = (int)(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build.super_Output_section_data.super_Output_data.\n                 address_ + got_offset" identifier = (binary_expression "(int)(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build.super_Output_section_data.super_Output_data.\n                 address_ + got_offset" (cast_expression "(int)(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build.super_Output_section_data.super_Output_data.\n                 address_" ( (type_descriptor "int" primitive_type) ) (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build.super_Output_section_data.super_Output_data.\n                 address_" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build.super_Output_section_data.super_Output_data" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build.super_Output_section_data" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base.\n                 super_Output_section_data_build" (field_expression "(this->super_Output_data_got<64,_false>).super_Output_data_got_base" (parenthesized_expression "(this->super_Output_data_got<64,_false>)" ( (comma_expression "this->super_Output_data_got<64,_false" (binary_expression "this->super_Output_data_got<64" (field_expression "this->super_Output_data_got" identifier -> field_identifier) < number_literal) , identifier) (ERROR ">" >) )) . field_identifier) . field_identifier) . field_identifier) . field_identifier) . field_identifier)) + identifier)) ;) (expression_statement "pSVar1 = this->target_->gp_;" (assignment_expression "pSVar1 = this->target_->gp_" identifier = (field_expression "this->target_->gp_" (field_expression "this->target_" identifier -> field_identifier) -> field_identifier)) ;) if (parenthesized_expression "(pSVar1 != (Sized_symbol<64> *)0x0)" ( (binary_expression "pSVar1 != (Sized_symbol<64> *)0x0)" identifier != (parenthesized_expression "(Sized_symbol<64> *)0x0)" ( (binary_expression "Sized_symbol<64> *)0x0" (binary_expression "Sized_symbol<64" identifier < number_literal) > (pointer_expression "*)0x0" * (ERROR ")" )) number_literal)) ))) )) { (expression_statement "pMVar2 = this->target_->got_;" (assignment_expression "pMVar2 = this->target_->got_" identifier = (field_expression "this->target_->got_" (field_expression "this->target_" identifier -> field_identifier) -> field_identifier)) ;) (expression_statement "iVar4 = (int)pSVar1->value_;" (assignment_expression "iVar4 = (int)pSVar1->value_" identifier = (cast_expression "(int)pSVar1->value_" ( (type_descriptor "int" primitive_type) ) (field_expression "pSVar1->value_" identifier -> field_identifier))) ;) if ( ( ( (ERROR "pMVar2 != (Mips_output_data_got<64,_false> *)0x0) &&\n          (pMVar2->primary_got_ != (Mips_got_info<64,_false> *)0x0)) &&\n         (object->got_info_ != (Mips_got_info<64,_false> *)0x0)) {\n        iVar4 = iVar4 + object->got_info_->offset_;\n      }\n      iVar3 = iVar3 - iVar4;\n    }\n    return iVar3;\n  }" (binary_expression "pMVar2 != (Mips_output_data_got<64,_false> *)0x0) &&\n          (pMVar2->primary_got_ != (Mips_got_info<64,_false> *)0x0)) &&\n         (object->got_info_ != (Mips_got_info<64,_false> *)0x0))" (binary_expression "pMVar2 != (Mips_output_data_got<64,_false> *)0x0) &&\n          (pMVar2->primary_got_ != (Mips_got_info<64,_false> *)0x0))" (binary_expression "pMVar2 != (Mips_output_data_got<64,_false> *)0x0)" identifier != (parenthesized_expression "(Mips_output_data_got<64,_false> *)0x0)" ( (comma_expression "Mips_output_data_got<64,_false> *)0x0" (binary_expression "Mips_output_data_got<64" identifier < number_literal) , (binary_expression "_false> *)0x0" identifier > (pointer_expression "*)0x0" * (ERROR ")" )) number_literal))) ))) && (parenthesized_expression "(pMVar2->primary_got_ != (Mips_got_info<64,_false> *)0x0))" ( (binary_expression "pMVar2->primary_got_ != (Mips_got_info<64,_false> *)0x0)" (field_expression "pMVar2->primary_got_" identifier -> field_identifier) != (parenthesized_expression "(Mips_got_info<64,_false> *)0x0)" ( (comma_expression "Mips_got_info<64,_false> *)0x0" (binary_expression "Mips_got_info<64" identifier < number_literal) , (binary_expression "_false> *)0x0" identifier > (pointer_expression "*)0x0" * (ERROR ")" )) number_literal))) ))) ))) && (parenthesized_expression "(object->got_info_ != (Mips_got_info<64,_false> *)0x0))" ( (binary_expression "object->got_info_ != (Mips_got_info<64,_false> *)0x0)" (field_expression "object->got_info_" identifier -> field_identifier) != (parenthesized_expression "(Mips_got_info<64,_false> *)0x0)" ( (comma_expression "Mips_got_info<64,_false> *)0x0" (binary_expression "Mips_got_info<64" identifier < number_literal) , (binary_expression "_false> *)0x0" identifier > (pointer_expression "*)0x0" * (ERROR ")" )) number_literal))) ))) ))) (compound_statement "{\n        iVar4 = iVar4 + object->got_info_->offset_;\n      }" { (expression_statement "iVar4 = iVar4 + object->got_info_->offset_;" (assignment_expression "iVar4 = iVar4 + object->got_info_->offset_" identifier = (binary_expression "iVar4 + object->got_info_->offset_" identifier + (field_expression "object->got_info_->offset_" (field_expression "object->got_info_" identifier -> field_identifier) -> field_identifier))) ;) }) (assignment_expression "iVar3 = iVar3 - iVar4" identifier = (binary_expression "iVar3 - iVar4" identifier - identifier)) ; } return identifier ; }) comment (binary_expression "Mips_output_data_plt<64" identifier < number_literal) , identifier > (ERROR "::" : :) identifier ( ( (comma_expression "Mips_output_data_plt<64,_false> *)this,\n             (Mips_symbol<64> *)CONCAT44(in_register_00000034,got_offset))" (binary_expression "Mips_output_data_plt<64" identifier < number_literal) , (comma_expression "_false> *)this,\n             (Mips_symbol<64> *)CONCAT44(in_register_00000034,got_offset))" (binary_expression "_false> *)this" identifier > (pointer_expression "*)this" * (ERROR ")" )) identifier)) , (parenthesized_expression "(Mips_symbol<64> *)CONCAT44(in_register_00000034,got_offset))" ( (binary_expression "Mips_symbol<64> *)CONCAT44(in_register_00000034,got_offset)" (binary_expression "Mips_symbol<64" identifier < number_literal) > (pointer_expression "*)CONCAT44(in_register_00000034,got_offset)" * (ERROR ")" )) (call_expression "CONCAT44(in_register_00000034,got_offset)" identifier (argument_list "(in_register_00000034,got_offset)" ( identifier , identifier ))))) )))) ; })
(translation_unit "int FUN_00292570(long param_1,int param_2,long param_3)\n\n{\n  long lVar1;\n  long lVar2;\n  int iVar3;\n  \n  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }\n                    \n  FUN_00291e90();\n}\n\n" (function_definition "int FUN_00292570(long param_1,int param_2,long param_3)\n\n{\n  long lVar1;\n  long lVar2;\n  int iVar3;\n  \n  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }\n                    \n  FUN_00291e90();\n}" primitive_type (function_declarator "FUN_00292570(long param_1,int param_2,long param_3)" identifier (parameter_list "(long param_1,int param_2,long param_3)" ( (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "int param_2" primitive_type identifier) , (parameter_declaration "long param_3" (sized_type_specifier "long" long) identifier) ))) (compound_statement "{\n  long lVar1;\n  long lVar2;\n  int iVar3;\n  \n  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }\n                    \n  FUN_00291e90();\n}" { (declaration "long lVar1;" (sized_type_specifier "long" long) identifier ;) (declaration "long lVar2;" (sized_type_specifier "long" long) identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (if_statement "if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }" if (parenthesized_expression "((*(byte *)(param_1 + 0x20) & 1) != 0)" ( (binary_expression "(*(byte *)(param_1 + 0x20) & 1) != 0" (parenthesized_expression "(*(byte *)(param_1 + 0x20) & 1)" ( (binary_expression "*(byte *)(param_1 + 0x20) & 1" (pointer_expression "*(byte *)(param_1 + 0x20)" * (cast_expression "(byte *)(param_1 + 0x20)" ( (type_descriptor "byte *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x20)" ( (binary_expression "param_1 + 0x20" identifier + number_literal) )))) & number_literal) )) != number_literal) )) (compound_statement "{\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }" { (expression_statement "param_2 = *(int *)(param_1 + 8) + param_2;" (assignment_expression "param_2 = *(int *)(param_1 + 8) + param_2" identifier = (binary_expression "*(int *)(param_1 + 8) + param_2" (pointer_expression "*(int *)(param_1 + 8)" * (cast_expression "(int *)(param_1 + 8)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) + identifier)) ;) (expression_statement "lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);" (assignment_expression "lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28)" identifier = (pointer_expression "*(long *)(*(long *)(param_1 + 0x88) + 0x28)" * (cast_expression "(long *)(*(long *)(param_1 + 0x88) + 0x28)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)(param_1 + 0x88) + 0x28)" ( (binary_expression "*(long *)(param_1 + 0x88) + 0x28" (pointer_expression "*(long *)(param_1 + 0x88)" * (cast_expression "(long *)(param_1 + 0x88)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x88)" ( (binary_expression "param_1 + 0x88" identifier + number_literal) )))) + number_literal) ))))) ;) (if_statement "if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }" if (parenthesized_expression "(lVar1 != 0)" ( (binary_expression "lVar1 != 0" identifier != number_literal) )) (compound_statement "{\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }" { (expression_statement "lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);" (assignment_expression "lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20)" identifier = (pointer_expression "*(long *)(*(long *)(param_1 + 0x88) + 0x20)" * (cast_expression "(long *)(*(long *)(param_1 + 0x88) + 0x20)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)(param_1 + 0x88) + 0x20)" ( (binary_expression "*(long *)(param_1 + 0x88) + 0x20" (pointer_expression "*(long *)(param_1 + 0x88)" * (cast_expression "(long *)(param_1 + 0x88)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x88)" ( (binary_expression "param_1 + 0x88" identifier + number_literal) )))) + number_literal) ))))) ;) (expression_statement "iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);" (assignment_expression "iVar3 = (int)*(undefined8 *)(lVar1 + 0x40)" identifier = (cast_expression "(int)*(undefined8 *)(lVar1 + 0x40)" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*(undefined8 *)(lVar1 + 0x40)" * (cast_expression "(undefined8 *)(lVar1 + 0x40)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar1 + 0x40)" ( (binary_expression "lVar1 + 0x40" identifier + number_literal) )))))) ;) (if_statement "if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }" if (parenthesized_expression "(((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0))" ( (binary_expression "((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)" (parenthesized_expression "((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0))" ( (binary_expression "(lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)" (parenthesized_expression "(lVar2 != 0)" ( (binary_expression "lVar2 != 0" identifier != number_literal) )) && (parenthesized_expression "(*(long *)(lVar2 + 0xd0) != 0)" ( (binary_expression "*(long *)(lVar2 + 0xd0) != 0" (pointer_expression "*(long *)(lVar2 + 0xd0)" * (cast_expression "(long *)(lVar2 + 0xd0)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(lVar2 + 0xd0)" ( (binary_expression "lVar2 + 0xd0" identifier + number_literal) )))) != number_literal) ))) )) && (parenthesized_expression "(*(long *)(param_3 + 0x378) != 0)" ( (binary_expression "*(long *)(param_3 + 0x378) != 0" (pointer_expression "*(long *)(param_3 + 0x378)" * (cast_expression "(long *)(param_3 + 0x378)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_3 + 0x378)" ( (binary_expression "param_3 + 0x378" identifier + number_literal) )))) != number_literal) ))) )) (compound_statement "{\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }" { (expression_statement "iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);" (assignment_expression "iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c)" identifier = (binary_expression "iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c)" identifier + (pointer_expression "*(int *)(*(long *)(param_3 + 0x378) + 0x10c)" * (cast_expression "(int *)(*(long *)(param_3 + 0x378) + 0x10c)" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*(long *)(param_3 + 0x378) + 0x10c)" ( (binary_expression "*(long *)(param_3 + 0x378) + 0x10c" (pointer_expression "*(long *)(param_3 + 0x378)" * (cast_expression "(long *)(param_3 + 0x378)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_3 + 0x378)" ( (binary_expression "param_3 + 0x378" identifier + number_literal) )))) + number_literal) )))))) ;) })) (expression_statement "param_2 = param_2 - iVar3;" (assignment_expression "param_2 = param_2 - iVar3" identifier = (binary_expression "param_2 - iVar3" identifier - identifier)) ;) })) (return_statement "return param_2;" return identifier ;) })) (expression_statement "FUN_00291e90();" (call_expression "FUN_00291e90()" identifier (argument_list "()" ( ))) ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) IDENT) , (parameter_declaration TYPE IDENT) , (parameter_declaration (sized_type_specifier long) IDENT) ))) (compound_statement { (declaration (sized_type_specifier long) IDENT ;) (declaration (sized_type_specifier long) IDENT ;) (declaration TYPE IDENT ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) & LIT) )) != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) + IDENT)) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) + LIT) ))))) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE) ) (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))))) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT != LIT) )) && (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) != LIT) ))) )) && (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) != LIT) ))) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) + LIT) )))))) ;) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT - IDENT)) ;) })) (return_statement return IDENT ;) })) (expression_statement (call_expression IDENT (argument_list ( ))) ;) })))
(function_definition "int FUN_00292570(long param_1,int param_2,long param_3)\n\n{\n  long lVar1;\n  long lVar2;\n  int iVar3;\n  \n  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }\n                    \n  FUN_00291e90();\n}" (primitive_type "int") (function_declarator "FUN_00292570(long param_1,int param_2,long param_3)" (identifier "FUN_00292570") (parameter_list "(long param_1,int param_2,long param_3)" (( "(") (parameter_declaration "long param_1" (sized_type_specifier "long" (long "long")) (identifier "param_1")) (, ",") (parameter_declaration "int param_2" (primitive_type "int") (identifier "param_2")) (, ",") (parameter_declaration "long param_3" (sized_type_specifier "long" (long "long")) (identifier "param_3")) () ")"))) (compound_statement "{\n  long lVar1;\n  long lVar2;\n  int iVar3;\n  \n  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }\n                    \n  FUN_00291e90();\n}" ({ "{") (declaration "long lVar1;" (sized_type_specifier "long" (long "long")) (identifier "lVar1") (; ";")) (declaration "long lVar2;" (sized_type_specifier "long" (long "long")) (identifier "lVar2") (; ";")) (declaration "int iVar3;" (primitive_type "int") (identifier "iVar3") (; ";")) (if_statement "if ((*(byte *)(param_1 + 0x20) & 1) != 0) {\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }" (if "if") (parenthesized_expression "((*(byte *)(param_1 + 0x20) & 1) != 0)" (( "(") (binary_expression "(*(byte *)(param_1 + 0x20) & 1) != 0" (parenthesized_expression "(*(byte *)(param_1 + 0x20) & 1)" (( "(") (binary_expression "*(byte *)(param_1 + 0x20) & 1" (pointer_expression "*(byte *)(param_1 + 0x20)" (* "*") (cast_expression "(byte *)(param_1 + 0x20)" (( "(") (type_descriptor "byte *" (type_identifier "byte") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x20)" (( "(") (binary_expression "param_1 + 0x20" (identifier "param_1") (+ "+") (number_literal "0x20")) () ")")))) (& "&") (number_literal "1")) () ")")) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    param_2 = *(int *)(param_1 + 8) + param_2;\n    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);\n    if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }\n    return param_2;\n  }" ({ "{") (expression_statement "param_2 = *(int *)(param_1 + 8) + param_2;" (assignment_expression "param_2 = *(int *)(param_1 + 8) + param_2" (identifier "param_2") (= "=") (binary_expression "*(int *)(param_1 + 8) + param_2" (pointer_expression "*(int *)(param_1 + 8)" (* "*") (cast_expression "(int *)(param_1 + 8)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 8)" (( "(") (binary_expression "param_1 + 8" (identifier "param_1") (+ "+") (number_literal "8")) () ")")))) (+ "+") (identifier "param_2"))) (; ";")) (expression_statement "lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);" (assignment_expression "lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28)" (identifier "lVar1") (= "=") (pointer_expression "*(long *)(*(long *)(param_1 + 0x88) + 0x28)" (* "*") (cast_expression "(long *)(*(long *)(param_1 + 0x88) + 0x28)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*(long *)(param_1 + 0x88) + 0x28)" (( "(") (binary_expression "*(long *)(param_1 + 0x88) + 0x28" (pointer_expression "*(long *)(param_1 + 0x88)" (* "*") (cast_expression "(long *)(param_1 + 0x88)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x88)" (( "(") (binary_expression "param_1 + 0x88" (identifier "param_1") (+ "+") (number_literal "0x88")) () ")")))) (+ "+") (number_literal "0x28")) () ")"))))) (; ";")) (if_statement "if (lVar1 != 0) {\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }" (if "if") (parenthesized_expression "(lVar1 != 0)" (( "(") (binary_expression "lVar1 != 0" (identifier "lVar1") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);\n      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);\n      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }\n      param_2 = param_2 - iVar3;\n    }" ({ "{") (expression_statement "lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);" (assignment_expression "lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20)" (identifier "lVar2") (= "=") (pointer_expression "*(long *)(*(long *)(param_1 + 0x88) + 0x20)" (* "*") (cast_expression "(long *)(*(long *)(param_1 + 0x88) + 0x20)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*(long *)(param_1 + 0x88) + 0x20)" (( "(") (binary_expression "*(long *)(param_1 + 0x88) + 0x20" (pointer_expression "*(long *)(param_1 + 0x88)" (* "*") (cast_expression "(long *)(param_1 + 0x88)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x88)" (( "(") (binary_expression "param_1 + 0x88" (identifier "param_1") (+ "+") (number_literal "0x88")) () ")")))) (+ "+") (number_literal "0x20")) () ")"))))) (; ";")) (expression_statement "iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);" (assignment_expression "iVar3 = (int)*(undefined8 *)(lVar1 + 0x40)" (identifier "iVar3") (= "=") (cast_expression "(int)*(undefined8 *)(lVar1 + 0x40)" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (pointer_expression "*(undefined8 *)(lVar1 + 0x40)" (* "*") (cast_expression "(undefined8 *)(lVar1 + 0x40)" (( "(") (type_descriptor "undefined8 *" (type_identifier "undefined8") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar1 + 0x40)" (( "(") (binary_expression "lVar1 + 0x40" (identifier "lVar1") (+ "+") (number_literal "0x40")) () ")")))))) (; ";")) (if_statement "if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }" (if "if") (parenthesized_expression "(((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0))" (( "(") (binary_expression "((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)" (parenthesized_expression "((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0))" (( "(") (binary_expression "(lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)" (parenthesized_expression "(lVar2 != 0)" (( "(") (binary_expression "lVar2 != 0" (identifier "lVar2") (!= "!=") (number_literal "0")) () ")")) (&& "&&") (parenthesized_expression "(*(long *)(lVar2 + 0xd0) != 0)" (( "(") (binary_expression "*(long *)(lVar2 + 0xd0) != 0" (pointer_expression "*(long *)(lVar2 + 0xd0)" (* "*") (cast_expression "(long *)(lVar2 + 0xd0)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(lVar2 + 0xd0)" (( "(") (binary_expression "lVar2 + 0xd0" (identifier "lVar2") (+ "+") (number_literal "0xd0")) () ")")))) (!= "!=") (number_literal "0")) () ")"))) () ")")) (&& "&&") (parenthesized_expression "(*(long *)(param_3 + 0x378) != 0)" (( "(") (binary_expression "*(long *)(param_3 + 0x378) != 0" (pointer_expression "*(long *)(param_3 + 0x378)" (* "*") (cast_expression "(long *)(param_3 + 0x378)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_3 + 0x378)" (( "(") (binary_expression "param_3 + 0x378" (identifier "param_3") (+ "+") (number_literal "0x378")) () ")")))) (!= "!=") (number_literal "0")) () ")"))) () ")")) (compound_statement "{\n        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);\n      }" ({ "{") (expression_statement "iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);" (assignment_expression "iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c)" (identifier "iVar3") (= "=") (binary_expression "iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c)" (identifier "iVar3") (+ "+") (pointer_expression "*(int *)(*(long *)(param_3 + 0x378) + 0x10c)" (* "*") (cast_expression "(int *)(*(long *)(param_3 + 0x378) + 0x10c)" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*(long *)(param_3 + 0x378) + 0x10c)" (( "(") (binary_expression "*(long *)(param_3 + 0x378) + 0x10c" (pointer_expression "*(long *)(param_3 + 0x378)" (* "*") (cast_expression "(long *)(param_3 + 0x378)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_3 + 0x378)" (( "(") (binary_expression "param_3 + 0x378" (identifier "param_3") (+ "+") (number_literal "0x378")) () ")")))) (+ "+") (number_literal "0x10c")) () ")")))))) (; ";")) (} "}"))) (expression_statement "param_2 = param_2 - iVar3;" (assignment_expression "param_2 = param_2 - iVar3" (identifier "param_2") (= "=") (binary_expression "param_2 - iVar3" (identifier "param_2") (- "-") (identifier "iVar3"))) (; ";")) (} "}"))) (return_statement "return param_2;" (return "return") (identifier "param_2") (; ";")) (} "}"))) (expression_statement "FUN_00291e90();" (call_expression "FUN_00291e90()" (identifier "FUN_00291e90") (argument_list "()" (( "(") () ")"))) (; ";")) (} "}")))

/* WARNING: Type propagation algorithm not settling */
/* WARNING: Enum "DT": Some values do not have unique names */
/* DWARF original prototype: int gp_offset(Mips_output_data_got<64,_false> * this, uint got_offset,
   Mips_relobj<64,_false> * object) */

int __thiscall
anon_unknown.dwarf_ead2ad::Mips_output_data_got<64,_false>::gp_offset
          (Mips_output_data_got<64,_false> *this,uint got_offset,Mips_relobj<64,_false> *object)

{
  Sized_symbol<64> *pSVar1;
  Mips_output_data_got<64,_false> *pMVar2;
  int iVar3;
  int iVar4;
  undefined4 in_register_00000034;
  
  if (((this->super_Output_data_got<64,_false>).super_Output_data_got_base.
       super_Output_section_data_build.super_Output_section_data.super_Output_data.field_0x20 & 1)
      != 0) {
    iVar3 = (int)(this->super_Output_data_got<64,_false>).super_Output_data_got_base.
                 super_Output_section_data_build.super_Output_section_data.super_Output_data.
                 address_ + got_offset;
    pSVar1 = this->target_->gp_;
    if (pSVar1 != (Sized_symbol<64> *)0x0) {
      pMVar2 = this->target_->got_;
      iVar4 = (int)pSVar1->value_;
      if (((pMVar2 != (Mips_output_data_got<64,_false> *)0x0) &&
          (pMVar2->primary_got_ != (Mips_got_info<64,_false> *)0x0)) &&
         (object->got_info_ != (Mips_got_info<64,_false> *)0x0)) {
        iVar4 = iVar4 + object->got_info_->offset_;
      }
      iVar3 = iVar3 - iVar4;
    }
    return iVar3;
  }
                    /* WARNING: Subroutine does not return */
  Mips_output_data_plt<64,_false>::mips_entry_address
            ((Mips_output_data_plt<64,_false> *)this,
             (Mips_symbol<64> *)CONCAT44(in_register_00000034,got_offset));
}


(translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (sized_type_specifier) declarator: (identifier)) (parameter_declaration type: (primitive_type) declarator: (identifier)) (parameter_declaration type: (sized_type_specifier) declarator: (identifier)))) body: (compound_statement (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (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))))) right: (identifier)))) (expression_statement (assignment_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: (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))))) right: (number_literal))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_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: (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))))) right: (number_literal))))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type)) value: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (parenthesized_expression (binary_expression left: (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))))) right: (number_literal))))) right: (parenthesized_expression (binary_expression left: (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))))) right: (number_literal))))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (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))))) right: (number_literal)))))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))))) (return_statement (identifier)))) (expression_statement (call_expression function: (identifier) arguments: (argument_list))))))

int MASKED(long param_1,int param_2,long param_3)

{
  long lVar1;
  long lVar2;
  int iVar3;
  
  if ((*(byte *)(param_1 + 0x20) & 1) != 0) {
    param_2 = *(int *)(param_1 + 8) + param_2;
    lVar1 = *(long *)(*(long *)(param_1 + 0x88) + 0x28);
    if (lVar1 != 0) {
      lVar2 = *(long *)(*(long *)(param_1 + 0x88) + 0x20);
      iVar3 = (int)*(undefined8 *)(lVar1 + 0x40);
      if (((lVar2 != 0) && (*(long *)(lVar2 + 0xd0) != 0)) && (*(long *)(param_3 + 0x378) != 0)) {
        iVar3 = iVar3 + *(int *)(*(long *)(param_3 + 0x378) + 0x10c);
      }
      param_2 = param_2 - iVar3;
    }
    return param_2;
  }
                    /* WARNING: Subroutine does not return */
  FUN_00291e90();
}

