
/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */
/* DWARF original prototype: void add_mapping(Input_merge_map * this, section_offset_type
   input_offset, section_size_type length, section_offset_type output_offset) */

void __thiscall
gold::Object_merge_map::Input_merge_map::add_mapping
          (Input_merge_map *this,section_offset_type input_offset,section_size_type length,
          section_offset_type output_offset)

{
  iterator __position;
  uint uVar1;
  section_size_type sVar2;
  bool bVar3;
  Input_merge_entry entry;
  
  __position._M_current =
       (this->entries).
       super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>
       ._M_impl._M_finish;
  if ((this->entries).
      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>
      ._M_impl._M_start != __position._M_current) {
    uVar1 = __position._M_current[-1].input_offset;
    sVar2 = __position._M_current[-1].length;
    if ((uint)input_offset < uVar1 + sVar2) {
      if ((int)uVar1 <= input_offset) {
                    /* WARNING: Subroutine does not return */
        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");
      }
      if (uVar1 < length + input_offset) {
                    /* WARNING: Subroutine does not return */
        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");
      }
      this->sorted = false;
    }
    else if (uVar1 + sVar2 == input_offset) {
      if (output_offset == -1) {
        bVar3 = __position._M_current[-1].output_offset == -1;
      }
      else {
        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;
      }
      if (bVar3) {
        __position._M_current[-1].length = sVar2 + length;
        return;
      }
    }
  }
  entry.input_offset = input_offset;
  entry.length = length;
  entry.output_offset = output_offset;
  if (__position._M_current !=
      (this->entries).
      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>
      ._M_impl._M_end_of_storage) {
    (__position._M_current)->input_offset = input_offset;
    (__position._M_current)->length = length;
    (__position._M_current)->output_offset = output_offset;
    (this->entries).
    super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>
    ._M_impl._M_finish = __position._M_current + 1;
    return;
  }
  std::
  vector<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>
  ::_M_realloc_insert<const_gold::Object_merge_map::Input_merge_entry&>
            (&this->entries,__position,&entry);
  return;
}



/* WARNING: Function: __i686.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */

void FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)

{
  uint *puVar1;
  uint uVar2;
  uint uVar3;
  bool bVar4;
  uint local_28;
  uint local_24;
  uint local_20;
  undefined4 uStack_14;
  
  uStack_14 = 0x18a5d9;
  puVar1 = *(uint **)(param_1 + 8);
  if (*(uint **)(param_1 + 4) != puVar1) {
    uVar2 = puVar1[-3];
    uVar3 = puVar1[-2];
    if (param_2 < uVar2 + uVar3) {
      if ((int)uVar2 <= (int)param_2) {
                    /* WARNING: Subroutine does not return */
        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);
      }
      if (uVar2 < param_3 + param_2) {
                    /* WARNING: Subroutine does not return */
        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);
      }
      *(undefined1 *)(param_1 + 0x10) = 0;
    }
    else if (uVar2 + uVar3 == param_2) {
      if (param_4 == 0xffffffff) {
        bVar4 = puVar1[-1] == 0xffffffff;
      }
      else {
        bVar4 = puVar1[-1] + uVar3 == param_4;
      }
      if (bVar4) {
        puVar1[-2] = uVar3 + param_3;
        return;
      }
    }
  }
  local_28 = param_2;
  local_24 = param_3;
  local_20 = param_4;
  if (puVar1 != *(uint **)(param_1 + 0xc)) {
    *puVar1 = param_2;
    puVar1[1] = param_3;
    puVar1[2] = param_4;
    *(uint **)(param_1 + 8) = puVar1 + 3;
    return;
  }
  FUN_0018bca0(param_1 + 4,puVar1,&local_28);
  return;
}


PUSH EBP
PUSH EDI
PUSH ESI
PUSH EBX
CALL 0x00035680
ADD EBX,0x1b4a27
SUB ESP,0x1c
MOV EDX,dword ptr [ESP + 0x30]
MOV ECX,dword ptr [ESP + 0x34]
MOV EAX,dword ptr [EDX + 0x8]
CMP dword ptr [EDX + 0x4],EAX
JZ 0x0018a619
MOV ESI,dword ptr [EAX + -0xc]
MOV EDI,dword ptr [EAX + -0x8]
LEA EBP,[ESI + EDI*0x1]
CMP EBP,ECX
JBE 0x0018a650
CMP ESI,ECX
JLE 0x0018a6a0
MOV EDI,dword ptr [ESP + 0x38]
ADD EDI,ECX
CMP ESI,EDI
JC 0x0018a6b6
MOV byte ptr [EDX + 0x10],0x0
MOV EBX,dword ptr [ESP + 0x38]
MOV ESI,dword ptr [ESP + 0x3c]
MOV dword ptr [ESP + 0x4],ECX
MOV dword ptr [ESP + 0x8],EBX
MOV dword ptr [ESP + 0xc],ESI
CMP EAX,dword ptr [EDX + 0xc]
JZ 0x0018a678
MOV dword ptr [EAX],ECX
MOV ECX,dword ptr [ESP + 0x8]
ADD EAX,0xc
MOV dword ptr [EAX + -0x8],ECX
MOV ECX,dword ptr [ESP + 0xc]
MOV dword ptr [EAX + -0x4],ECX
MOV dword ptr [EDX + 0x8],EAX
ADD ESP,0x1c
POP EBX
POP ESI
POP EDI
POP EBP
RET
JNZ 0x0018a619
CMP dword ptr [ESP + 0x3c],-0x1
MOV EBX,dword ptr [EAX + -0x4]
JZ 0x0018a698
ADD EBX,EDI
CMP EBX,dword ptr [ESP + 0x3c]
SETZ BL
TEST BL,BL
JZ 0x0018a619
ADD EDI,dword ptr [ESP + 0x38]
MOV dword ptr [EAX + -0x8],EDI
JMP 0x0018a648
SUB ESP,0x4
ADD EDX,0x4
LEA ECX,[ESP + 0x8]
PUSH ECX
PUSH EAX
PUSH EDX
CALL 0x0018bca0
ADD ESP,0x10
ADD ESP,0x1c
POP EBX
POP ESI
POP EDI
POP EBP
RET
CMP EBX,-0x1
SETZ BL
JMP 0x0018a665
LEA EAX,[EBX + 0xfff29cc4]
PUSH EDX
PUSH EAX
LEA EAX,[EBX + 0xfff29936]
PUSH 0x71
PUSH EAX
CALL 0x0008b620
PUSH EAX
LEA EAX,[EBX + 0xfff29cc4]
PUSH EAX
LEA EAX,[EBX + 0xfff29936]
PUSH 0x73
PUSH EAX
CALL 0x0008b620
(translation_unit "/* WARNING: Function: __i686.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */\n\nvoid FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)\n\n{\n  uint *puVar1;\n  uint uVar2;\n  uint uVar3;\n  bool bVar4;\n  uint local_28;\n  uint local_24;\n  uint local_20;\n  undefined4 uStack_14;\n  \n  uStack_14 = 0x18a5d9;\n  puVar1 = *(uint **)(param_1 + 8);\n  if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }\n  local_28 = param_2;\n  local_24 = param_3;\n  local_20 = param_4;\n  if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }\n  FUN_0018bca0(param_1 + 4,puVar1,&local_28);\n  return;\n}\n\n" comment (function_definition "void FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)\n\n{\n  uint *puVar1;\n  uint uVar2;\n  uint uVar3;\n  bool bVar4;\n  uint local_28;\n  uint local_24;\n  uint local_20;\n  undefined4 uStack_14;\n  \n  uStack_14 = 0x18a5d9;\n  puVar1 = *(uint **)(param_1 + 8);\n  if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }\n  local_28 = param_2;\n  local_24 = param_3;\n  local_20 = param_4;\n  if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }\n  FUN_0018bca0(param_1 + 4,puVar1,&local_28);\n  return;\n}" primitive_type (function_declarator "FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)" identifier (parameter_list "(int param_1,uint param_2,uint param_3,uint param_4)" ( (parameter_declaration "int param_1" primitive_type identifier) , (parameter_declaration "uint param_2" type_identifier identifier) , (parameter_declaration "uint param_3" type_identifier identifier) , (parameter_declaration "uint param_4" type_identifier identifier) ))) (compound_statement "{\n  uint *puVar1;\n  uint uVar2;\n  uint uVar3;\n  bool bVar4;\n  uint local_28;\n  uint local_24;\n  uint local_20;\n  undefined4 uStack_14;\n  \n  uStack_14 = 0x18a5d9;\n  puVar1 = *(uint **)(param_1 + 8);\n  if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }\n  local_28 = param_2;\n  local_24 = param_3;\n  local_20 = param_4;\n  if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }\n  FUN_0018bca0(param_1 + 4,puVar1,&local_28);\n  return;\n}" { (declaration "uint *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "uint uVar3;" type_identifier identifier ;) (declaration "bool bVar4;" primitive_type identifier ;) (declaration "uint local_28;" type_identifier identifier ;) (declaration "uint local_24;" type_identifier identifier ;) (declaration "uint local_20;" type_identifier identifier ;) (declaration "undefined4 uStack_14;" type_identifier identifier ;) (expression_statement "uStack_14 = 0x18a5d9;" (assignment_expression "uStack_14 = 0x18a5d9" identifier = number_literal) ;) (expression_statement "puVar1 = *(uint **)(param_1 + 8);" (assignment_expression "puVar1 = *(uint **)(param_1 + 8)" identifier = (pointer_expression "*(uint **)(param_1 + 8)" * (cast_expression "(uint **)(param_1 + 8)" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) ))))) ;) (if_statement "if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }" if (parenthesized_expression "(*(uint **)(param_1 + 4) != puVar1)" ( (binary_expression "*(uint **)(param_1 + 4) != puVar1" (pointer_expression "*(uint **)(param_1 + 4)" * (cast_expression "(uint **)(param_1 + 4)" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 4)" ( (binary_expression "param_1 + 4" identifier + number_literal) )))) != identifier) )) (compound_statement "{\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }" { (expression_statement "uVar2 = puVar1[-3];" (assignment_expression "uVar2 = puVar1[-3]" identifier = (subscript_expression "puVar1[-3]" identifier [ number_literal ])) ;) (expression_statement "uVar3 = puVar1[-2];" (assignment_expression "uVar3 = puVar1[-2]" identifier = (subscript_expression "puVar1[-2]" identifier [ number_literal ])) ;) (if_statement "if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" if (parenthesized_expression "(param_2 < uVar2 + uVar3)" ( (binary_expression "param_2 < uVar2 + uVar3" identifier < (binary_expression "uVar2 + uVar3" identifier + identifier)) )) (compound_statement "{\n      if ((int)uVar2 <= (int)param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }" { (if_statement "if ((int)uVar2 <= (int)param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }" if (parenthesized_expression "((int)uVar2 <= (int)param_2)" ( (binary_expression "(int)uVar2 <= (int)param_2" (cast_expression "(int)uVar2" ( (type_descriptor "int" primitive_type) ) identifier) <= (cast_expression "(int)param_2" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }" { comment (expression_statement "FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);" (call_expression "FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1)" identifier (argument_list "("../../gold/merge.cc",0x71,"add_mapping",param_1)" ( (string_literal ""../../gold/merge.cc"" " string_content ") , number_literal , (string_literal ""add_mapping"" " string_content ") , identifier ))) ;) })) (if_statement "if (uVar2 < param_3 + param_2) {\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }" if (parenthesized_expression "(uVar2 < param_3 + param_2)" ( (binary_expression "uVar2 < param_3 + param_2" identifier < (binary_expression "param_3 + param_2" identifier + identifier)) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }" { comment (expression_statement "FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);" (call_expression "FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1)" identifier (argument_list "("../../gold/merge.cc",0x73,"add_mapping",puVar1)" ( (string_literal ""../../gold/merge.cc"" " string_content ") , number_literal , (string_literal ""add_mapping"" " string_content ") , identifier ))) ;) })) (expression_statement "*(undefined1 *)(param_1 + 0x10) = 0;" (assignment_expression "*(undefined1 *)(param_1 + 0x10) = 0" (pointer_expression "*(undefined1 *)(param_1 + 0x10)" * (cast_expression "(undefined1 *)(param_1 + 0x10)" ( (type_descriptor "undefined1 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x10)" ( (binary_expression "param_1 + 0x10" identifier + number_literal) )))) = number_literal) ;) }) (else_clause "else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" else (if_statement "if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" if (parenthesized_expression "(uVar2 + uVar3 == param_2)" ( (binary_expression "uVar2 + uVar3 == param_2" (binary_expression "uVar2 + uVar3" identifier + identifier) == identifier) )) (compound_statement "{\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" { (if_statement "if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" if (parenthesized_expression "(param_4 == 0xffffffff)" ( (binary_expression "param_4 == 0xffffffff" identifier == number_literal) )) (compound_statement "{\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }" { (expression_statement "bVar4 = puVar1[-1] == 0xffffffff;" (assignment_expression "bVar4 = puVar1[-1] == 0xffffffff" identifier = (binary_expression "puVar1[-1] == 0xffffffff" (subscript_expression "puVar1[-1]" identifier [ number_literal ]) == number_literal)) ;) }) (else_clause "else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" else (compound_statement "{\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" { (expression_statement "bVar4 = puVar1[-1] + uVar3 == param_4;" (assignment_expression "bVar4 = puVar1[-1] + uVar3 == param_4" identifier = (binary_expression "puVar1[-1] + uVar3 == param_4" (binary_expression "puVar1[-1] + uVar3" (subscript_expression "puVar1[-1]" identifier [ number_literal ]) + identifier) == identifier)) ;) }))) (if_statement "if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }" if (parenthesized_expression "(bVar4)" ( identifier )) (compound_statement "{\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }" { (expression_statement "puVar1[-2] = uVar3 + param_3;" (assignment_expression "puVar1[-2] = uVar3 + param_3" (subscript_expression "puVar1[-2]" identifier [ number_literal ]) = (binary_expression "uVar3 + param_3" identifier + identifier)) ;) (return_statement "return;" return ;) })) })))) })) (expression_statement "local_28 = param_2;" (assignment_expression "local_28 = param_2" identifier = identifier) ;) (expression_statement "local_24 = param_3;" (assignment_expression "local_24 = param_3" identifier = identifier) ;) (expression_statement "local_20 = param_4;" (assignment_expression "local_20 = param_4" identifier = identifier) ;) (if_statement "if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }" if (parenthesized_expression "(puVar1 != *(uint **)(param_1 + 0xc))" ( (binary_expression "puVar1 != *(uint **)(param_1 + 0xc)" identifier != (pointer_expression "*(uint **)(param_1 + 0xc)" * (cast_expression "(uint **)(param_1 + 0xc)" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 0xc)" ( (binary_expression "param_1 + 0xc" identifier + number_literal) ))))) )) (compound_statement "{\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }" { (expression_statement "*puVar1 = param_2;" (assignment_expression "*puVar1 = param_2" (pointer_expression "*puVar1" * identifier) = identifier) ;) (expression_statement "puVar1[1] = param_3;" (assignment_expression "puVar1[1] = param_3" (subscript_expression "puVar1[1]" identifier [ number_literal ]) = identifier) ;) (expression_statement "puVar1[2] = param_4;" (assignment_expression "puVar1[2] = param_4" (subscript_expression "puVar1[2]" identifier [ number_literal ]) = identifier) ;) (expression_statement "*(uint **)(param_1 + 8) = puVar1 + 3;" (assignment_expression "*(uint **)(param_1 + 8) = puVar1 + 3" (pointer_expression "*(uint **)(param_1 + 8)" * (cast_expression "(uint **)(param_1 + 8)" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) = (binary_expression "puVar1 + 3" identifier + number_literal)) ;) (return_statement "return;" return ;) })) (expression_statement "FUN_0018bca0(param_1 + 4,puVar1,&local_28);" (call_expression "FUN_0018bca0(param_1 + 4,puVar1,&local_28)" identifier (argument_list "(param_1 + 4,puVar1,&local_28)" ( (binary_expression "param_1 + 4" identifier + number_literal) , identifier , (pointer_expression "&local_28" & identifier) ))) ;) (return_statement "return;" return ;) })))
(translation_unit "/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */\n/* DWARF original prototype: void add_mapping(Input_merge_map * this, section_offset_type\n   input_offset, section_size_type length, section_offset_type output_offset) */\n\nvoid __thiscall\ngold::Object_merge_map::Input_merge_map::add_mapping\n          (Input_merge_map *this,section_offset_type input_offset,section_size_type length,\n          section_offset_type output_offset)\n\n{\n  iterator __position;\n  uint uVar1;\n  section_size_type sVar2;\n  bool bVar3;\n  Input_merge_entry entry;\n  \n  __position._M_current =\n       (this->entries).\n       super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n       ._M_impl._M_finish;\n  if ((this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_start != __position._M_current) {\n    uVar1 = __position._M_current[-1].input_offset;\n    sVar2 = __position._M_current[-1].length;\n    if ((uint)input_offset < uVar1 + sVar2) {\n      if ((int)uVar1 <= input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }\n      if (uVar1 < length + input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }\n      this->sorted = false;\n    }\n    else if (uVar1 + sVar2 == input_offset) {\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }\n  }\n  entry.input_offset = input_offset;\n  entry.length = length;\n  entry.output_offset = output_offset;\n  if (__position._M_current !=\n      (this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_end_of_storage) {\n    (__position._M_current)->input_offset = input_offset;\n    (__position._M_current)->length = length;\n    (__position._M_current)->output_offset = output_offset;\n    (this->entries).\n    super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1;\n    return;\n  }\n  std::\n  vector<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n  ::_M_realloc_insert<const_gold::Object_merge_map::Input_merge_entry&>\n            (&this->entries,__position,&entry);\n  return;\n}\n\n" comment comment (function_definition "void __thiscall\ngold::Object_merge_map::Input_merge_map::add_mapping\n          (Input_merge_map *this,section_offset_type input_offset,section_size_type length,\n          section_offset_type output_offset)\n\n{\n  iterator __position;\n  uint uVar1;\n  section_size_type sVar2;\n  bool bVar3;\n  Input_merge_entry entry;\n  \n  __position._M_current =\n       (this->entries).\n       super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n       ._M_impl._M_finish;\n  if ((this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_start != __position._M_current) {\n    uVar1 = __position._M_current[-1].input_offset;\n    sVar2 = __position._M_current[-1].length;\n    if ((uint)input_offset < uVar1 + sVar2) {\n      if ((int)uVar1 <= input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }\n      if (uVar1 < length + input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }\n      this->sorted = false;\n    }\n    else if (uVar1 + sVar2 == input_offset) {\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }\n  }\n  entry.input_offset = input_offset;\n  entry.length = length;\n  entry.output_offset = output_offset;\n  if (__position._M_current !=\n      (this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_end_of_storage) {\n    (__position._M_current)->input_offset = input_offset;\n    (__position._M_current)->length = length;\n    (__position._M_current)->output_offset = output_offset;\n    (this->entries).\n    super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1;\n    return;\n  }\n  std::\n  vector<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n  ::_M_realloc_insert<const_gold::Object_merge_map::Input_merge_entry&>\n            (&this->entries,__position,&entry);\n  return;\n}" primitive_type (ms_call_modifier "__thiscall" __thiscall) (ERROR "gold::Object_merge_map::Input_merge_map::" identifier : : identifier : : identifier : :) (function_declarator "add_mapping\n          (Input_merge_map *this,section_offset_type input_offset,section_size_type length,\n          section_offset_type output_offset)" identifier (parameter_list "(Input_merge_map *this,section_offset_type input_offset,section_size_type length,\n          section_offset_type output_offset)" ( (parameter_declaration "Input_merge_map *this" type_identifier (pointer_declarator "*this" * identifier)) , (parameter_declaration "section_offset_type input_offset" type_identifier identifier) , (parameter_declaration "section_size_type length" type_identifier identifier) , (parameter_declaration "section_offset_type output_offset" type_identifier identifier) ))) (compound_statement "{\n  iterator __position;\n  uint uVar1;\n  section_size_type sVar2;\n  bool bVar3;\n  Input_merge_entry entry;\n  \n  __position._M_current =\n       (this->entries).\n       super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n       ._M_impl._M_finish;\n  if ((this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_start != __position._M_current) {\n    uVar1 = __position._M_current[-1].input_offset;\n    sVar2 = __position._M_current[-1].length;\n    if ((uint)input_offset < uVar1 + sVar2) {\n      if ((int)uVar1 <= input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }\n      if (uVar1 < length + input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }\n      this->sorted = false;\n    }\n    else if (uVar1 + sVar2 == input_offset) {\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }\n  }\n  entry.input_offset = input_offset;\n  entry.length = length;\n  entry.output_offset = output_offset;\n  if (__position._M_current !=\n      (this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_end_of_storage) {\n    (__position._M_current)->input_offset = input_offset;\n    (__position._M_current)->length = length;\n    (__position._M_current)->output_offset = output_offset;\n    (this->entries).\n    super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1;\n    return;\n  }\n  std::\n  vector<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n  ::_M_realloc_insert<const_gold::Object_merge_map::Input_merge_entry&>\n            (&this->entries,__position,&entry);\n  return;\n}" { (declaration "iterator __position;" type_identifier identifier ;) (declaration "uint uVar1;" type_identifier identifier ;) (declaration "section_size_type sVar2;" type_identifier identifier ;) (declaration "bool bVar3;" primitive_type identifier ;) (declaration "Input_merge_entry entry;" type_identifier identifier ;) (ERROR "__position._M_current =\n       (this->entries).\n       super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::" (comma_expression "__position._M_current =\n       (this->entries).\n       super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std" (assignment_expression "__position._M_current =\n       (this->entries).\n       super__Vector_base<gold" (field_expression "__position._M_current" identifier . field_identifier) = (binary_expression "(this->entries).\n       super__Vector_base<gold" (field_expression "(this->entries).\n       super__Vector_base" (parenthesized_expression "(this->entries)" ( (field_expression "this->entries" identifier -> field_identifier) )) . field_identifier) < identifier)) (ERROR "::Object_merge_map::Input_merge_entry" : : identifier : : identifier) , identifier) : : (binary_expression "allocator<gold" identifier < identifier) : :) (labeled_statement "Object_merge_map::Input_merge_entry>_>\n       ._M_impl._M_finish;" statement_identifier : (ERROR ":" :) (expression_statement "Input_merge_entry>_>\n       ._M_impl._M_finish;" (field_expression "Input_merge_entry>_>\n       ._M_impl._M_finish" (field_expression "Input_merge_entry>_>\n       ._M_impl" (binary_expression "Input_merge_entry>_" identifier > identifier) (ERROR ">" >) . field_identifier) . field_identifier) ;)) (if_statement "if ((this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_start != __position._M_current) {\n    uVar1 = __position._M_current[-1].input_offset;\n    sVar2 = __position._M_current[-1].length;\n    if ((uint)input_offset < uVar1 + sVar2) {\n      if ((int)uVar1 <= input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }\n      if (uVar1 < length + input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }\n      this->sorted = false;\n    }\n    else if (uVar1 + sVar2 == input_offset) {\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }\n  }" if (parenthesized_expression "((this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_start != __position._M_current)" ( (ERROR "(this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::" (comma_expression "(this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std" (binary_expression "(this->entries).\n      super__Vector_base<gold" (field_expression "(this->entries).\n      super__Vector_base" (parenthesized_expression "(this->entries)" ( (field_expression "this->entries" identifier -> field_identifier) )) . field_identifier) < identifier) (ERROR "::Object_merge_map::Input_merge_entry" : : identifier : : identifier) , identifier) : : (binary_expression "allocator<gold" identifier < identifier) : : identifier : :) (binary_expression "Input_merge_entry>_>\n      ._M_impl._M_start != __position._M_current" (field_expression "Input_merge_entry>_>\n      ._M_impl._M_start" (field_expression "Input_merge_entry>_>\n      ._M_impl" (binary_expression "Input_merge_entry>_" identifier > identifier) (ERROR ">" >) . field_identifier) . field_identifier) != (field_expression "__position._M_current" identifier . field_identifier)) )) (compound_statement "{\n    uVar1 = __position._M_current[-1].input_offset;\n    sVar2 = __position._M_current[-1].length;\n    if ((uint)input_offset < uVar1 + sVar2) {\n      if ((int)uVar1 <= input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }\n      if (uVar1 < length + input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }\n      this->sorted = false;\n    }\n    else if (uVar1 + sVar2 == input_offset) {\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }\n  }" { (expression_statement "uVar1 = __position._M_current[-1].input_offset;" (assignment_expression "uVar1 = __position._M_current[-1].input_offset" identifier = (field_expression "__position._M_current[-1].input_offset" (subscript_expression "__position._M_current[-1]" (field_expression "__position._M_current" identifier . field_identifier) [ number_literal ]) . field_identifier)) ;) (expression_statement "sVar2 = __position._M_current[-1].length;" (assignment_expression "sVar2 = __position._M_current[-1].length" identifier = (field_expression "__position._M_current[-1].length" (subscript_expression "__position._M_current[-1]" (field_expression "__position._M_current" identifier . field_identifier) [ number_literal ]) . field_identifier)) ;) (if_statement "if ((uint)input_offset < uVar1 + sVar2) {\n      if ((int)uVar1 <= input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }\n      if (uVar1 < length + input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }\n      this->sorted = false;\n    }\n    else if (uVar1 + sVar2 == input_offset) {\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }" if (parenthesized_expression "((uint)input_offset < uVar1 + sVar2)" ( (binary_expression "(uint)input_offset < uVar1 + sVar2" (cast_expression "(uint)input_offset" ( (type_descriptor "uint" type_identifier) ) identifier) < (binary_expression "uVar1 + sVar2" identifier + identifier)) )) (compound_statement "{\n      if ((int)uVar1 <= input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }\n      if (uVar1 < length + input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }\n      this->sorted = false;\n    }" { (if_statement "if ((int)uVar1 <= input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }" if (parenthesized_expression "((int)uVar1 <= input_offset)" ( (binary_expression "(int)uVar1 <= input_offset" (cast_expression "(int)uVar1" ( (type_descriptor "int" primitive_type) ) identifier) <= identifier) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");\n      }" { comment (expression_statement "do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping");" (call_expression "do_gold_unreachable("../../gold/merge.cc",0x71,"add_mapping")" identifier (argument_list "("../../gold/merge.cc",0x71,"add_mapping")" ( (string_literal ""../../gold/merge.cc"" " string_content ") , number_literal , (string_literal ""add_mapping"" " string_content ") ))) ;) })) (if_statement "if (uVar1 < length + input_offset) {\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }" if (parenthesized_expression "(uVar1 < length + input_offset)" ( (binary_expression "uVar1 < length + input_offset" identifier < (binary_expression "length + input_offset" identifier + identifier)) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n        do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");\n      }" { comment (expression_statement "do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping");" (call_expression "do_gold_unreachable("../../gold/merge.cc",0x73,"add_mapping")" identifier (argument_list "("../../gold/merge.cc",0x73,"add_mapping")" ( (string_literal ""../../gold/merge.cc"" " string_content ") , number_literal , (string_literal ""add_mapping"" " string_content ") ))) ;) })) (expression_statement "this->sorted = false;" (assignment_expression "this->sorted = false" (field_expression "this->sorted" identifier -> field_identifier) = false) ;) }) (else_clause "else if (uVar1 + sVar2 == input_offset) {\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }" else (if_statement "if (uVar1 + sVar2 == input_offset) {\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }" if (parenthesized_expression "(uVar1 + sVar2 == input_offset)" ( (binary_expression "uVar1 + sVar2 == input_offset" (binary_expression "uVar1 + sVar2" identifier + identifier) == identifier) )) (compound_statement "{\n      if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }\n      if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }\n    }" { (if_statement "if (output_offset == -1) {\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }\n      else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }" if (parenthesized_expression "(output_offset == -1)" ( (binary_expression "output_offset == -1" identifier == number_literal) )) (compound_statement "{\n        bVar3 = __position._M_current[-1].output_offset == -1;\n      }" { (expression_statement "bVar3 = __position._M_current[-1].output_offset == -1;" (assignment_expression "bVar3 = __position._M_current[-1].output_offset == -1" identifier = (binary_expression "__position._M_current[-1].output_offset == -1" (field_expression "__position._M_current[-1].output_offset" (subscript_expression "__position._M_current[-1]" (field_expression "__position._M_current" identifier . field_identifier) [ number_literal ]) . field_identifier) == number_literal)) ;) }) (else_clause "else {\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }" else (compound_statement "{\n        bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;\n      }" { (expression_statement "bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset;" (assignment_expression "bVar3 = __position._M_current[-1].output_offset + sVar2 == output_offset" identifier = (binary_expression "__position._M_current[-1].output_offset + sVar2 == output_offset" (binary_expression "__position._M_current[-1].output_offset + sVar2" (field_expression "__position._M_current[-1].output_offset" (subscript_expression "__position._M_current[-1]" (field_expression "__position._M_current" identifier . field_identifier) [ number_literal ]) . field_identifier) + identifier) == identifier)) ;) }))) (if_statement "if (bVar3) {\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }" if (parenthesized_expression "(bVar3)" ( identifier )) (compound_statement "{\n        __position._M_current[-1].length = sVar2 + length;\n        return;\n      }" { (expression_statement "__position._M_current[-1].length = sVar2 + length;" (assignment_expression "__position._M_current[-1].length = sVar2 + length" (field_expression "__position._M_current[-1].length" (subscript_expression "__position._M_current[-1]" (field_expression "__position._M_current" identifier . field_identifier) [ number_literal ]) . field_identifier) = (binary_expression "sVar2 + length" identifier + identifier)) ;) (return_statement "return;" return ;) })) })))) })) (expression_statement "entry.input_offset = input_offset;" (assignment_expression "entry.input_offset = input_offset" (field_expression "entry.input_offset" identifier . field_identifier) = identifier) ;) (expression_statement "entry.length = length;" (assignment_expression "entry.length = length" (field_expression "entry.length" identifier . field_identifier) = identifier) ;) (expression_statement "entry.output_offset = output_offset;" (assignment_expression "entry.output_offset = output_offset" (field_expression "entry.output_offset" identifier . field_identifier) = identifier) ;) (if_statement "if (__position._M_current !=\n      (this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_end_of_storage) {\n    (__position._M_current)->input_offset = input_offset;\n    (__position._M_current)->length = length;\n    (__position._M_current)->output_offset = output_offset;\n    (this->entries).\n    super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1;\n    return;\n  }" if (parenthesized_expression "(__position._M_current !=\n      (this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n      ._M_impl._M_end_of_storage)" ( (ERROR "__position._M_current !=\n      (this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::" (comma_expression "__position._M_current !=\n      (this->entries).\n      super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std" (binary_expression "__position._M_current !=\n      (this->entries).\n      super__Vector_base<gold" (field_expression "__position._M_current" identifier . field_identifier) != (binary_expression "(this->entries).\n      super__Vector_base<gold" (field_expression "(this->entries).\n      super__Vector_base" (parenthesized_expression "(this->entries)" ( (field_expression "this->entries" identifier -> field_identifier) )) . field_identifier) < identifier)) (ERROR "::Object_merge_map::Input_merge_entry" : : identifier : : identifier) , identifier) : : (binary_expression "allocator<gold" identifier < identifier) : : identifier : :) (field_expression "Input_merge_entry>_>\n      ._M_impl._M_end_of_storage" (field_expression "Input_merge_entry>_>\n      ._M_impl" (binary_expression "Input_merge_entry>_" identifier > identifier) (ERROR ">" >) . field_identifier) . field_identifier) )) (compound_statement "{\n    (__position._M_current)->input_offset = input_offset;\n    (__position._M_current)->length = length;\n    (__position._M_current)->output_offset = output_offset;\n    (this->entries).\n    super__Vector_base<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1;\n    return;\n  }" { (expression_statement "(__position._M_current)->input_offset = input_offset;" (assignment_expression "(__position._M_current)->input_offset = input_offset" (field_expression "(__position._M_current)->input_offset" (parenthesized_expression "(__position._M_current)" ( (field_expression "__position._M_current" identifier . field_identifier) )) -> field_identifier) = identifier) ;) (expression_statement "(__position._M_current)->length = length;" (assignment_expression "(__position._M_current)->length = length" (field_expression "(__position._M_current)->length" (parenthesized_expression "(__position._M_current)" ( (field_expression "__position._M_current" identifier . field_identifier) )) -> field_identifier) = identifier) ;) (expression_statement "(__position._M_current)->output_offset = output_offset;" (assignment_expression "(__position._M_current)->output_offset = output_offset" (field_expression "(__position._M_current)->output_offset" (parenthesized_expression "(__position._M_current)" ( (field_expression "__position._M_current" identifier . field_identifier) )) -> field_identifier) = identifier) ;) (ERROR "(this->entries).\n    super__Vector_base<gold::" (binary_expression "(this->entries).\n    super__Vector_base<gold" (field_expression "(this->entries).\n    super__Vector_base" (parenthesized_expression "(this->entries)" ( (field_expression "this->entries" identifier -> field_identifier) )) . field_identifier) < identifier) : :) (labeled_statement "Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1;" statement_identifier (ERROR "::Input_merge_entry,_std::allocator<gold:" : : (comma_expression "Input_merge_entry,_std" identifier , identifier) : : (binary_expression "allocator<gold" identifier < identifier) :) : (labeled_statement "Object_merge_map::Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1;" statement_identifier : (ERROR ":" :) (expression_statement "Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1;" (assignment_expression "Input_merge_entry>_>\n    ._M_impl._M_finish = __position._M_current + 1" (field_expression "Input_merge_entry>_>\n    ._M_impl._M_finish" (field_expression "Input_merge_entry>_>\n    ._M_impl" (binary_expression "Input_merge_entry>_" identifier > identifier) (ERROR ">" >) . field_identifier) . field_identifier) = (binary_expression "__position._M_current + 1" (field_expression "__position._M_current" identifier . field_identifier) + number_literal)) ;))) (return_statement "return;" return ;) })) (labeled_statement "std::\n  vector<gold::Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n  ::_M_realloc_insert<const_gold::Object_merge_map::Input_merge_entry&>\n            (&this->entries,__position,&entry);" statement_identifier (ERROR "::\n  vector<gold:" : : (binary_expression "vector<gold" identifier < identifier) :) : (labeled_statement "Object_merge_map::Input_merge_entry,_std::allocator<gold::Object_merge_map::Input_merge_entry>_>\n  ::_M_realloc_insert<const_gold::Object_merge_map::Input_merge_entry&>\n            (&this->entries,__position,&entry);" statement_identifier (ERROR "::Input_merge_entry,_std::allocator<gold:" : : (comma_expression "Input_merge_entry,_std" identifier , identifier) : : (binary_expression "allocator<gold" identifier < identifier) :) : (labeled_statement "Object_merge_map::Input_merge_entry>_>\n  ::_M_realloc_insert<const_gold::Object_merge_map::Input_merge_entry&>\n            (&this->entries,__position,&entry);" statement_identifier (ERROR "::Input_merge_entry>_>\n  ::_M_realloc_insert<const_gold:" : : (binary_expression "Input_merge_entry>_" identifier > identifier) > : : (binary_expression "_M_realloc_insert<const_gold" identifier < identifier) :) : (labeled_statement "Object_merge_map::Input_merge_entry&>\n            (&this->entries,__position,&entry);" statement_identifier : (ERROR ":" :) (expression_statement "Input_merge_entry&>\n            (&this->entries,__position,&entry);" (binary_expression "Input_merge_entry&>\n            (&this->entries,__position,&entry)" identifier (ERROR "&" &) > (parenthesized_expression "(&this->entries,__position,&entry)" ( (comma_expression "&this->entries,__position,&entry" (pointer_expression "&this->entries" & (field_expression "this->entries" identifier -> field_identifier)) , (comma_expression "__position,&entry" identifier , (pointer_expression "&entry" & identifier))) ))) ;))))) (return_statement "return;" return ;) })))
(translation_unit "void FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)\n\n{\n  uint *puVar1;\n  uint uVar2;\n  uint uVar3;\n  bool bVar4;\n  uint local_28;\n  uint local_24;\n  uint local_20;\n  undefined4 uStack_14;\n  \n  uStack_14 = 0x18a5d9;\n  puVar1 = *(uint **)(param_1 + 8);\n  if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }\n  local_28 = param_2;\n  local_24 = param_3;\n  local_20 = param_4;\n  if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }\n  FUN_0018bca0(param_1 + 4,puVar1,&local_28);\n  return;\n}\n\n" (function_definition "void FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)\n\n{\n  uint *puVar1;\n  uint uVar2;\n  uint uVar3;\n  bool bVar4;\n  uint local_28;\n  uint local_24;\n  uint local_20;\n  undefined4 uStack_14;\n  \n  uStack_14 = 0x18a5d9;\n  puVar1 = *(uint **)(param_1 + 8);\n  if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }\n  local_28 = param_2;\n  local_24 = param_3;\n  local_20 = param_4;\n  if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }\n  FUN_0018bca0(param_1 + 4,puVar1,&local_28);\n  return;\n}" primitive_type (function_declarator "FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)" identifier (parameter_list "(int param_1,uint param_2,uint param_3,uint param_4)" ( (parameter_declaration "int param_1" primitive_type identifier) , (parameter_declaration "uint param_2" type_identifier identifier) , (parameter_declaration "uint param_3" type_identifier identifier) , (parameter_declaration "uint param_4" type_identifier identifier) ))) (compound_statement "{\n  uint *puVar1;\n  uint uVar2;\n  uint uVar3;\n  bool bVar4;\n  uint local_28;\n  uint local_24;\n  uint local_20;\n  undefined4 uStack_14;\n  \n  uStack_14 = 0x18a5d9;\n  puVar1 = *(uint **)(param_1 + 8);\n  if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }\n  local_28 = param_2;\n  local_24 = param_3;\n  local_20 = param_4;\n  if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }\n  FUN_0018bca0(param_1 + 4,puVar1,&local_28);\n  return;\n}" { (declaration "uint *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "uint uVar3;" type_identifier identifier ;) (declaration "bool bVar4;" primitive_type identifier ;) (declaration "uint local_28;" type_identifier identifier ;) (declaration "uint local_24;" type_identifier identifier ;) (declaration "uint local_20;" type_identifier identifier ;) (declaration "undefined4 uStack_14;" type_identifier identifier ;) (expression_statement "uStack_14 = 0x18a5d9;" (assignment_expression "uStack_14 = 0x18a5d9" identifier = number_literal) ;) (expression_statement "puVar1 = *(uint **)(param_1 + 8);" (assignment_expression "puVar1 = *(uint **)(param_1 + 8)" identifier = (pointer_expression "*(uint **)(param_1 + 8)" * (cast_expression "(uint **)(param_1 + 8)" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) ))))) ;) (if_statement "if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }" if (parenthesized_expression "(*(uint **)(param_1 + 4) != puVar1)" ( (binary_expression "*(uint **)(param_1 + 4) != puVar1" (pointer_expression "*(uint **)(param_1 + 4)" * (cast_expression "(uint **)(param_1 + 4)" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 4)" ( (binary_expression "param_1 + 4" identifier + number_literal) )))) != identifier) )) (compound_statement "{\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }" { (expression_statement "uVar2 = puVar1[-3];" (assignment_expression "uVar2 = puVar1[-3]" identifier = (subscript_expression "puVar1[-3]" identifier [ number_literal ])) ;) (expression_statement "uVar3 = puVar1[-2];" (assignment_expression "uVar3 = puVar1[-2]" identifier = (subscript_expression "puVar1[-2]" identifier [ number_literal ])) ;) (if_statement "if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" if (parenthesized_expression "(param_2 < uVar2 + uVar3)" ( (binary_expression "param_2 < uVar2 + uVar3" identifier < (binary_expression "uVar2 + uVar3" identifier + identifier)) )) (compound_statement "{\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }" { (if_statement "if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }" if (parenthesized_expression "((int)uVar2 <= (int)param_2)" ( (binary_expression "(int)uVar2 <= (int)param_2" (cast_expression "(int)uVar2" ( (type_descriptor "int" primitive_type) ) identifier) <= (cast_expression "(int)param_2" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }" { (expression_statement "FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);" (call_expression "FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1)" identifier (argument_list "("../../gold/merge.cc",0x71,"add_mapping",param_1)" ( (string_literal ""../../gold/merge.cc"" " string_content ") , number_literal , (string_literal ""add_mapping"" " string_content ") , identifier ))) ;) })) (if_statement "if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }" if (parenthesized_expression "(uVar2 < param_3 + param_2)" ( (binary_expression "uVar2 < param_3 + param_2" identifier < (binary_expression "param_3 + param_2" identifier + identifier)) )) (compound_statement "{\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }" { (expression_statement "FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);" (call_expression "FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1)" identifier (argument_list "("../../gold/merge.cc",0x73,"add_mapping",puVar1)" ( (string_literal ""../../gold/merge.cc"" " string_content ") , number_literal , (string_literal ""add_mapping"" " string_content ") , identifier ))) ;) })) (expression_statement "*(undefined1 *)(param_1 + 0x10) = 0;" (assignment_expression "*(undefined1 *)(param_1 + 0x10) = 0" (pointer_expression "*(undefined1 *)(param_1 + 0x10)" * (cast_expression "(undefined1 *)(param_1 + 0x10)" ( (type_descriptor "undefined1 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x10)" ( (binary_expression "param_1 + 0x10" identifier + number_literal) )))) = number_literal) ;) }) (else_clause "else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" else (if_statement "if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" if (parenthesized_expression "(uVar2 + uVar3 == param_2)" ( (binary_expression "uVar2 + uVar3 == param_2" (binary_expression "uVar2 + uVar3" identifier + identifier) == identifier) )) (compound_statement "{\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" { (if_statement "if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" if (parenthesized_expression "(param_4 == 0xffffffff)" ( (binary_expression "param_4 == 0xffffffff" identifier == number_literal) )) (compound_statement "{\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }" { (expression_statement "bVar4 = puVar1[-1] == 0xffffffff;" (assignment_expression "bVar4 = puVar1[-1] == 0xffffffff" identifier = (binary_expression "puVar1[-1] == 0xffffffff" (subscript_expression "puVar1[-1]" identifier [ number_literal ]) == number_literal)) ;) }) (else_clause "else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" else (compound_statement "{\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" { (expression_statement "bVar4 = puVar1[-1] + uVar3 == param_4;" (assignment_expression "bVar4 = puVar1[-1] + uVar3 == param_4" identifier = (binary_expression "puVar1[-1] + uVar3 == param_4" (binary_expression "puVar1[-1] + uVar3" (subscript_expression "puVar1[-1]" identifier [ number_literal ]) + identifier) == identifier)) ;) }))) (if_statement "if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }" if (parenthesized_expression "(bVar4)" ( identifier )) (compound_statement "{\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }" { (expression_statement "puVar1[-2] = uVar3 + param_3;" (assignment_expression "puVar1[-2] = uVar3 + param_3" (subscript_expression "puVar1[-2]" identifier [ number_literal ]) = (binary_expression "uVar3 + param_3" identifier + identifier)) ;) (return_statement "return;" return ;) })) })))) })) (expression_statement "local_28 = param_2;" (assignment_expression "local_28 = param_2" identifier = identifier) ;) (expression_statement "local_24 = param_3;" (assignment_expression "local_24 = param_3" identifier = identifier) ;) (expression_statement "local_20 = param_4;" (assignment_expression "local_20 = param_4" identifier = identifier) ;) (if_statement "if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }" if (parenthesized_expression "(puVar1 != *(uint **)(param_1 + 0xc))" ( (binary_expression "puVar1 != *(uint **)(param_1 + 0xc)" identifier != (pointer_expression "*(uint **)(param_1 + 0xc)" * (cast_expression "(uint **)(param_1 + 0xc)" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 0xc)" ( (binary_expression "param_1 + 0xc" identifier + number_literal) ))))) )) (compound_statement "{\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }" { (expression_statement "*puVar1 = param_2;" (assignment_expression "*puVar1 = param_2" (pointer_expression "*puVar1" * identifier) = identifier) ;) (expression_statement "puVar1[1] = param_3;" (assignment_expression "puVar1[1] = param_3" (subscript_expression "puVar1[1]" identifier [ number_literal ]) = identifier) ;) (expression_statement "puVar1[2] = param_4;" (assignment_expression "puVar1[2] = param_4" (subscript_expression "puVar1[2]" identifier [ number_literal ]) = identifier) ;) (expression_statement "*(uint **)(param_1 + 8) = puVar1 + 3;" (assignment_expression "*(uint **)(param_1 + 8) = puVar1 + 3" (pointer_expression "*(uint **)(param_1 + 8)" * (cast_expression "(uint **)(param_1 + 8)" ( (type_descriptor "uint **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) = (binary_expression "puVar1 + 3" identifier + number_literal)) ;) (return_statement "return;" return ;) })) (expression_statement "FUN_0018bca0(param_1 + 4,puVar1,&local_28);" (call_expression "FUN_0018bca0(param_1 + 4,puVar1,&local_28)" identifier (argument_list "(param_1 + 4,puVar1,&local_28)" ( (binary_expression "param_1 + 4" identifier + number_literal) , identifier , (pointer_expression "&local_28" & identifier) ))) ;) (return_statement "return;" return ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE IDENT) , (parameter_declaration TYPE 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 IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) != IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT < (binary_expression IDENT + IDENT)) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) <= (cast_expression ( (type_descriptor TYPE) ) IDENT)) )) (compound_statement { (expression_statement (call_expression IDENT (argument_list ( (string_literal " string_content ") , LIT , (string_literal " string_content ") , IDENT ))) ;) })) (if_statement if (parenthesized_expression ( (binary_expression IDENT < (binary_expression IDENT + IDENT)) )) (compound_statement { (expression_statement (call_expression IDENT (argument_list ( (string_literal " string_content ") , LIT , (string_literal " string_content ") , IDENT ))) ;) })) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) }) (else_clause else (if_statement if (parenthesized_expression ( (binary_expression (binary_expression IDENT + IDENT) == IDENT) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (subscript_expression IDENT [ LIT ]) == LIT)) ;) }) (else_clause else (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression (subscript_expression IDENT [ LIT ]) + IDENT) == IDENT)) ;) }))) (if_statement if (parenthesized_expression ( IDENT )) (compound_statement { (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (binary_expression IDENT + IDENT)) ;) (return_statement return ;) })) })))) })) (expression_statement (assignment_expression IDENT = IDENT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = IDENT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = (binary_expression IDENT + LIT)) ;) (return_statement return ;) })) (expression_statement (call_expression IDENT (argument_list ( (binary_expression IDENT + LIT) , IDENT , (pointer_expression & IDENT) ))) ;) (return_statement return ;) })))
(function_definition "void FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)\n\n{\n  uint *puVar1;\n  uint uVar2;\n  uint uVar3;\n  bool bVar4;\n  uint local_28;\n  uint local_24;\n  uint local_20;\n  undefined4 uStack_14;\n  \n  uStack_14 = 0x18a5d9;\n  puVar1 = *(uint **)(param_1 + 8);\n  if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }\n  local_28 = param_2;\n  local_24 = param_3;\n  local_20 = param_4;\n  if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }\n  FUN_0018bca0(param_1 + 4,puVar1,&local_28);\n  return;\n}" (primitive_type "void") (function_declarator "FUN_0018a5d0(int param_1,uint param_2,uint param_3,uint param_4)" (identifier "FUN_0018a5d0") (parameter_list "(int param_1,uint param_2,uint param_3,uint param_4)" (( "(") (parameter_declaration "int param_1" (primitive_type "int") (identifier "param_1")) (, ",") (parameter_declaration "uint param_2" (type_identifier "uint") (identifier "param_2")) (, ",") (parameter_declaration "uint param_3" (type_identifier "uint") (identifier "param_3")) (, ",") (parameter_declaration "uint param_4" (type_identifier "uint") (identifier "param_4")) () ")"))) (compound_statement "{\n  uint *puVar1;\n  uint uVar2;\n  uint uVar3;\n  bool bVar4;\n  uint local_28;\n  uint local_24;\n  uint local_20;\n  undefined4 uStack_14;\n  \n  uStack_14 = 0x18a5d9;\n  puVar1 = *(uint **)(param_1 + 8);\n  if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }\n  local_28 = param_2;\n  local_24 = param_3;\n  local_20 = param_4;\n  if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }\n  FUN_0018bca0(param_1 + 4,puVar1,&local_28);\n  return;\n}" ({ "{") (declaration "uint *puVar1;" (type_identifier "uint") (pointer_declarator "*puVar1" (* "*") (identifier "puVar1")) (; ";")) (declaration "uint uVar2;" (type_identifier "uint") (identifier "uVar2") (; ";")) (declaration "uint uVar3;" (type_identifier "uint") (identifier "uVar3") (; ";")) (declaration "bool bVar4;" (primitive_type "bool") (identifier "bVar4") (; ";")) (declaration "uint local_28;" (type_identifier "uint") (identifier "local_28") (; ";")) (declaration "uint local_24;" (type_identifier "uint") (identifier "local_24") (; ";")) (declaration "uint local_20;" (type_identifier "uint") (identifier "local_20") (; ";")) (declaration "undefined4 uStack_14;" (type_identifier "undefined4") (identifier "uStack_14") (; ";")) (expression_statement "uStack_14 = 0x18a5d9;" (assignment_expression "uStack_14 = 0x18a5d9" (identifier "uStack_14") (= "=") (number_literal "0x18a5d9")) (; ";")) (expression_statement "puVar1 = *(uint **)(param_1 + 8);" (assignment_expression "puVar1 = *(uint **)(param_1 + 8)" (identifier "puVar1") (= "=") (pointer_expression "*(uint **)(param_1 + 8)" (* "*") (cast_expression "(uint **)(param_1 + 8)" (( "(") (type_descriptor "uint **" (type_identifier "uint") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_1 + 8)" (( "(") (binary_expression "param_1 + 8" (identifier "param_1") (+ "+") (number_literal "8")) () ")"))))) (; ";")) (if_statement "if (*(uint **)(param_1 + 4) != puVar1) {\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }" (if "if") (parenthesized_expression "(*(uint **)(param_1 + 4) != puVar1)" (( "(") (binary_expression "*(uint **)(param_1 + 4) != puVar1" (pointer_expression "*(uint **)(param_1 + 4)" (* "*") (cast_expression "(uint **)(param_1 + 4)" (( "(") (type_descriptor "uint **" (type_identifier "uint") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_1 + 4)" (( "(") (binary_expression "param_1 + 4" (identifier "param_1") (+ "+") (number_literal "4")) () ")")))) (!= "!=") (identifier "puVar1")) () ")")) (compound_statement "{\n    uVar2 = puVar1[-3];\n    uVar3 = puVar1[-2];\n    if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }\n  }" ({ "{") (expression_statement "uVar2 = puVar1[-3];" (assignment_expression "uVar2 = puVar1[-3]" (identifier "uVar2") (= "=") (subscript_expression "puVar1[-3]" (identifier "puVar1") ([ "[") (number_literal "-3") (] "]"))) (; ";")) (expression_statement "uVar3 = puVar1[-2];" (assignment_expression "uVar3 = puVar1[-2]" (identifier "uVar3") (= "=") (subscript_expression "puVar1[-2]" (identifier "puVar1") ([ "[") (number_literal "-2") (] "]"))) (; ";")) (if_statement "if (param_2 < uVar2 + uVar3) {\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }\n    else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" (if "if") (parenthesized_expression "(param_2 < uVar2 + uVar3)" (( "(") (binary_expression "param_2 < uVar2 + uVar3" (identifier "param_2") (< "<") (binary_expression "uVar2 + uVar3" (identifier "uVar2") (+ "+") (identifier "uVar3"))) () ")")) (compound_statement "{\n      if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }\n      if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }\n      *(undefined1 *)(param_1 + 0x10) = 0;\n    }" ({ "{") (if_statement "if ((int)uVar2 <= (int)param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }" (if "if") (parenthesized_expression "((int)uVar2 <= (int)param_2)" (( "(") (binary_expression "(int)uVar2 <= (int)param_2" (cast_expression "(int)uVar2" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "uVar2")) (<= "<=") (cast_expression "(int)param_2" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "param_2"))) () ")")) (compound_statement "{\n                    \n        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);\n      }" ({ "{") (expression_statement "FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);" (call_expression "FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1)" (identifier "FUN_0008b620") (argument_list "("../../gold/merge.cc",0x71,"add_mapping",param_1)" (( "(") (string_literal ""../../gold/merge.cc"" (" """) (string_content "../../gold/merge.cc") (" """)) (, ",") (number_literal "0x71") (, ",") (string_literal ""add_mapping"" (" """) (string_content "add_mapping") (" """)) (, ",") (identifier "param_1") () ")"))) (; ";")) (} "}"))) (if_statement "if (uVar2 < param_3 + param_2) {\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }" (if "if") (parenthesized_expression "(uVar2 < param_3 + param_2)" (( "(") (binary_expression "uVar2 < param_3 + param_2" (identifier "uVar2") (< "<") (binary_expression "param_3 + param_2" (identifier "param_3") (+ "+") (identifier "param_2"))) () ")")) (compound_statement "{\n                    \n        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);\n      }" ({ "{") (expression_statement "FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);" (call_expression "FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1)" (identifier "FUN_0008b620") (argument_list "("../../gold/merge.cc",0x73,"add_mapping",puVar1)" (( "(") (string_literal ""../../gold/merge.cc"" (" """) (string_content "../../gold/merge.cc") (" """)) (, ",") (number_literal "0x73") (, ",") (string_literal ""add_mapping"" (" """) (string_content "add_mapping") (" """)) (, ",") (identifier "puVar1") () ")"))) (; ";")) (} "}"))) (expression_statement "*(undefined1 *)(param_1 + 0x10) = 0;" (assignment_expression "*(undefined1 *)(param_1 + 0x10) = 0" (pointer_expression "*(undefined1 *)(param_1 + 0x10)" (* "*") (cast_expression "(undefined1 *)(param_1 + 0x10)" (( "(") (type_descriptor "undefined1 *" (type_identifier "undefined1") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x10)" (( "(") (binary_expression "param_1 + 0x10" (identifier "param_1") (+ "+") (number_literal "0x10")) () ")")))) (= "=") (number_literal "0")) (; ";")) (} "}")) (else_clause "else if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" (else "else") (if_statement "if (uVar2 + uVar3 == param_2) {\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" (if "if") (parenthesized_expression "(uVar2 + uVar3 == param_2)" (( "(") (binary_expression "uVar2 + uVar3 == param_2" (binary_expression "uVar2 + uVar3" (identifier "uVar2") (+ "+") (identifier "uVar3")) (== "==") (identifier "param_2")) () ")")) (compound_statement "{\n      if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }\n      if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }\n    }" ({ "{") (if_statement "if (param_4 == 0xffffffff) {\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }\n      else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" (if "if") (parenthesized_expression "(param_4 == 0xffffffff)" (( "(") (binary_expression "param_4 == 0xffffffff" (identifier "param_4") (== "==") (number_literal "0xffffffff")) () ")")) (compound_statement "{\n        bVar4 = puVar1[-1] == 0xffffffff;\n      }" ({ "{") (expression_statement "bVar4 = puVar1[-1] == 0xffffffff;" (assignment_expression "bVar4 = puVar1[-1] == 0xffffffff" (identifier "bVar4") (= "=") (binary_expression "puVar1[-1] == 0xffffffff" (subscript_expression "puVar1[-1]" (identifier "puVar1") ([ "[") (number_literal "-1") (] "]")) (== "==") (number_literal "0xffffffff"))) (; ";")) (} "}")) (else_clause "else {\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" (else "else") (compound_statement "{\n        bVar4 = puVar1[-1] + uVar3 == param_4;\n      }" ({ "{") (expression_statement "bVar4 = puVar1[-1] + uVar3 == param_4;" (assignment_expression "bVar4 = puVar1[-1] + uVar3 == param_4" (identifier "bVar4") (= "=") (binary_expression "puVar1[-1] + uVar3 == param_4" (binary_expression "puVar1[-1] + uVar3" (subscript_expression "puVar1[-1]" (identifier "puVar1") ([ "[") (number_literal "-1") (] "]")) (+ "+") (identifier "uVar3")) (== "==") (identifier "param_4"))) (; ";")) (} "}")))) (if_statement "if (bVar4) {\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }" (if "if") (parenthesized_expression "(bVar4)" (( "(") (identifier "bVar4") () ")")) (compound_statement "{\n        puVar1[-2] = uVar3 + param_3;\n        return;\n      }" ({ "{") (expression_statement "puVar1[-2] = uVar3 + param_3;" (assignment_expression "puVar1[-2] = uVar3 + param_3" (subscript_expression "puVar1[-2]" (identifier "puVar1") ([ "[") (number_literal "-2") (] "]")) (= "=") (binary_expression "uVar3 + param_3" (identifier "uVar3") (+ "+") (identifier "param_3"))) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}"))) (} "}"))))) (} "}"))) (expression_statement "local_28 = param_2;" (assignment_expression "local_28 = param_2" (identifier "local_28") (= "=") (identifier "param_2")) (; ";")) (expression_statement "local_24 = param_3;" (assignment_expression "local_24 = param_3" (identifier "local_24") (= "=") (identifier "param_3")) (; ";")) (expression_statement "local_20 = param_4;" (assignment_expression "local_20 = param_4" (identifier "local_20") (= "=") (identifier "param_4")) (; ";")) (if_statement "if (puVar1 != *(uint **)(param_1 + 0xc)) {\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }" (if "if") (parenthesized_expression "(puVar1 != *(uint **)(param_1 + 0xc))" (( "(") (binary_expression "puVar1 != *(uint **)(param_1 + 0xc)" (identifier "puVar1") (!= "!=") (pointer_expression "*(uint **)(param_1 + 0xc)" (* "*") (cast_expression "(uint **)(param_1 + 0xc)" (( "(") (type_descriptor "uint **" (type_identifier "uint") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_1 + 0xc)" (( "(") (binary_expression "param_1 + 0xc" (identifier "param_1") (+ "+") (number_literal "0xc")) () ")"))))) () ")")) (compound_statement "{\n    *puVar1 = param_2;\n    puVar1[1] = param_3;\n    puVar1[2] = param_4;\n    *(uint **)(param_1 + 8) = puVar1 + 3;\n    return;\n  }" ({ "{") (expression_statement "*puVar1 = param_2;" (assignment_expression "*puVar1 = param_2" (pointer_expression "*puVar1" (* "*") (identifier "puVar1")) (= "=") (identifier "param_2")) (; ";")) (expression_statement "puVar1[1] = param_3;" (assignment_expression "puVar1[1] = param_3" (subscript_expression "puVar1[1]" (identifier "puVar1") ([ "[") (number_literal "1") (] "]")) (= "=") (identifier "param_3")) (; ";")) (expression_statement "puVar1[2] = param_4;" (assignment_expression "puVar1[2] = param_4" (subscript_expression "puVar1[2]" (identifier "puVar1") ([ "[") (number_literal "2") (] "]")) (= "=") (identifier "param_4")) (; ";")) (expression_statement "*(uint **)(param_1 + 8) = puVar1 + 3;" (assignment_expression "*(uint **)(param_1 + 8) = puVar1 + 3" (pointer_expression "*(uint **)(param_1 + 8)" (* "*") (cast_expression "(uint **)(param_1 + 8)" (( "(") (type_descriptor "uint **" (type_identifier "uint") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_1 + 8)" (( "(") (binary_expression "param_1 + 8" (identifier "param_1") (+ "+") (number_literal "8")) () ")")))) (= "=") (binary_expression "puVar1 + 3" (identifier "puVar1") (+ "+") (number_literal "3"))) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}"))) (expression_statement "FUN_0018bca0(param_1 + 4,puVar1,&local_28);" (call_expression "FUN_0018bca0(param_1 + 4,puVar1,&local_28)" (identifier "FUN_0018bca0") (argument_list "(param_1 + 4,puVar1,&local_28)" (( "(") (binary_expression "param_1 + 4" (identifier "param_1") (+ "+") (number_literal "4")) (, ",") (identifier "puVar1") (, ",") (pointer_expression "&local_28" (& "&") (identifier "local_28")) () ")"))) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}")))

/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */
/* DWARF original prototype: void add_mapping(Input_merge_map * this, section_offset_type
   input_offset, section_size_type length, section_offset_type output_offset) */

void __thiscall
gold::Object_merge_map::type_1::function_1
          (type_1 *this,type_2 var_4,type_3 var_6,
          type_2 var_7)

{
  type_4 __position;
  type_5 var_2;
  type_3 var_3;
  bool bVar3;
  type_6 entry;
  
  __position._M_current =
       (this->entries).
       super__Vector_base<gold::Object_merge_map::type_6,_std::allocator<gold::Object_merge_map::type_6>var_1>
       ._M_impl._M_finish;
  if ((this->entries).
      super__Vector_base<gold::Object_merge_map::type_6,_std::allocator<gold::Object_merge_map::type_6>var_1>
      ._M_impl._M_start != __position._M_current) {
    var_2 = __position._M_current[-1].var_4;
    var_3 = __position._M_current[-1].var_6;
    if ((type_5)var_4 < var_2 + var_3) {
      if ((int)var_2 <= var_4) {
                    /* WARNING: Subroutine does not return */
        var_5("../../gold/merge.cc",0x71,"add_mapping");
      }
      if (var_2 < var_6 + var_4) {
                    /* WARNING: Subroutine does not return */
        var_5("../../gold/merge.cc",0x73,"add_mapping");
      }
      this->sorted = false;
    }
    else if (var_2 + var_3 == var_4) {
      if (var_7 == -1) {
        bVar3 = __position._M_current[-1].var_7 == -1;
      }
      else {
        bVar3 = __position._M_current[-1].var_7 + var_3 == var_7;
      }
      if (bVar3) {
        __position._M_current[-1].var_6 = var_3 + var_6;
        return;
      }
    }
  }
  entry.var_4 = var_4;
  entry.var_6 = var_6;
  entry.var_7 = var_7;
  if (__position._M_current !=
      (this->entries).
      super__Vector_base<gold::Object_merge_map::type_6,_std::allocator<gold::Object_merge_map::type_6>var_1>
      ._M_impl._M_end_of_storage) {
    (__position._M_current)->var_4 = var_4;
    (__position._M_current)->var_6 = var_6;
    (__position._M_current)->var_7 = var_7;
    (this->entries).
    super__Vector_base<gold::Object_merge_map::type_6,_std::allocator<gold::Object_merge_map::type_6>var_1>
    ._M_impl._M_finish = __position._M_current + 1;
    return;
  }
  std::
  vector<gold::Object_merge_map::type_6,_std::allocator<gold::Object_merge_map::type_6>var_1>
  ::_M_realloc_insert<const_gold::Object_merge_map::type_6&>
            (&this->entries,__position,&entry);
  return;
}


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

/* WARNING: Function: __i686.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */

void MASKED(int param_1,uint param_2,uint param_3,uint param_4)

{
  uint *puVar1;
  uint uVar2;
  uint uVar3;
  bool bVar4;
  uint local_28;
  uint local_24;
  uint local_20;
  undefined4 uStack_14;
  
  uStack_14 = 0x18a5d9;
  puVar1 = *(uint **)(param_1 + 8);
  if (*(uint **)(param_1 + 4) != puVar1) {
    uVar2 = puVar1[-3];
    uVar3 = puVar1[-2];
    if (param_2 < uVar2 + uVar3) {
      if ((int)uVar2 <= (int)param_2) {
                    /* WARNING: Subroutine does not return */
        FUN_0008b620("../../gold/merge.cc",0x71,"add_mapping",param_1);
      }
      if (uVar2 < param_3 + param_2) {
                    /* WARNING: Subroutine does not return */
        FUN_0008b620("../../gold/merge.cc",0x73,"add_mapping",puVar1);
      }
      *(undefined1 *)(param_1 + 0x10) = 0;
    }
    else if (uVar2 + uVar3 == param_2) {
      if (param_4 == 0xffffffff) {
        bVar4 = puVar1[-1] == 0xffffffff;
      }
      else {
        bVar4 = puVar1[-1] + uVar3 == param_4;
      }
      if (bVar4) {
        puVar1[-2] = uVar3 + param_3;
        return;
      }
    }
  }
  local_28 = param_2;
  local_24 = param_3;
  local_20 = param_4;
  if (puVar1 != *(uint **)(param_1 + 0xc)) {
    *puVar1 = param_2;
    puVar1[1] = param_3;
    puVar1[2] = param_4;
    *(uint **)(param_1 + 8) = puVar1 + 3;
    return;
  }
  FUN_0018bca0(param_1 + 4,puVar1,&local_28);
  return;
}

