bool FUN_00477904(char *param_1,uint param_2,code *param_3,undefined4 param_4)

{
  char cVar1;
  code *pcVar2;
  int iVar3;
  undefined4 uVar4;
  bool bVar5;
  char *pcVar6;
  char *local_178;
  char *local_174;
  uint local_170;
  char *local_16c;
  undefined1 *local_168;
  undefined4 local_164;
  int local_160;
  undefined1 *local_15c;
  undefined4 local_158;
  int local_154;
  undefined4 local_150;
  undefined4 local_14c;
  undefined4 local_148;
  uint local_144;
  undefined1 auStack_140 [256];
  int local_40;
  undefined1 local_3c;
  code *local_38;
  undefined4 local_34;
  undefined4 local_30;
  undefined4 local_2c;
  int local_28;
  
  if ((*param_1 != '_') || (bVar5 = false, param_1[1] != 'Z')) {
    iVar3 = FUN_00483ec0(param_1,"_GLOBAL_",8);
    if (((iVar3 == 0) &&
        ((((cVar1 = param_1[8], cVar1 == '.' || (cVar1 == '_')) || (cVar1 == '$')) &&   //possible issue identified - semgrep
         ((cVar1 = param_1[9], cVar1 == 'D' || (cVar1 == 'I')))))) && (param_1[10] == '_')) {   //possible issue identified - semgrep
      if (cVar1 == 'I') {
        pcVar6 = "global constructors keyed to ";
      }
      else {
        pcVar6 = "global destructors keyed to ";
      }
      uVar4 = FUN_00483e50(pcVar6);
      (*param_3)(pcVar6,uVar4,param_4);
      uVar4 = FUN_00483e50(param_1 + 0xb);
      (*param_3)(param_1 + 0xb,uVar4,param_4);
      return true;
    }
    bVar5 = true;
    if ((param_2 & 0x10) == 0) {
      return false;
    }
  }
  local_154 = FUN_00483e50(param_1);
  local_160 = local_154 * 2;
  iVar3 = -(local_154 * 0x18 + 8);
  local_168 = &stack0xfffffe80 + iVar3;
  local_15c = &stack0xfffffe80 + (iVar3 - (local_154 * 4 + 0xeU & 0xfffffff8));
  local_174 = param_1 + local_154;
  local_164 = 0;
  local_158 = 0;
  local_150 = 0;
  local_14c = 0;
  local_148 = 0;
  local_178 = param_1;
  local_170 = param_2;
  local_16c = param_1;
  if (bVar5) {
    iVar3 = FUN_004754f4(&local_178);
  }
  else {
    iVar3 = 0;
    if ((*param_1 == '_') && (local_16c = param_1 + 1, param_1[1] == 'Z')) {
      local_16c = param_1 + 2;
      iVar3 = FUN_004763b0(&local_178,1);
    }
  }
  if (((param_2 & 1) == 0) || (bVar5 = false, *local_16c == '\0')) {
    if (iVar3 == 0) {
      bVar5 = false;
    }
    else {
      local_40 = 0;
      local_3c = 0;
      local_30 = 0;
      local_2c = 0;
      local_28 = 0;
      local_144 = param_2;
      local_38 = param_3;
      local_34 = param_4;
      FUN_004739e0(&local_144);
      uVar4 = local_34;
      pcVar2 = local_38;
      iVar3 = local_40;
      auStack_140[local_40] = 0;
      (*pcVar2)(auStack_140,iVar3,uVar4);
      bVar5 = local_28 == 0;
    }
  }
  return bVar5;
}