(self, addr: int, irsb: pyvex.IRSB, func_addr: int,
                                     caller_gp: Optional[int]=None)
According to arch types ['ARMEL', 'ARMHF', 'MIPS32'] does different
        fixes

        For ARM deals with link register on the stack
        (see _arm_track_lr_on_stack)
        For MIPS32 simulates a new state where the global pointer is 0xffffffff
        from current address after three steps if the first successor does not
        adjust this value updates this function address (in function manager)
        to use a conrete global pointer

        :param addr: irsb address
        :param irsb: irsb
        :param func_addr: function address
        :param caller_gp:   The gp register value that the caller function has. MIPS-specific.
According to arch types ['ARMEL', 'ARMHF', 'MIPS32'] does different
        fixes
According to arch types [ ARMEL ARMHF MIPS32 ] does different fixes
def _process_block_arch_specific(self, addr: int, irsb: pyvex.IRSB, func_addr: int,
                                     caller_gp: Optional[int]=None) -> None:  # pylint: disable=unused-argument
        """
        According to arch types ['ARMEL', 'ARMHF', 'MIPS32'] does different
        fixes

        For ARM deals with link register on the stack
        (see _arm_track_lr_on_stack)
        For MIPS32 simulates a new state where the global pointer is 0xffffffff
        from current address after three steps if the first successor does not
        adjust this value updates this function address (in function manager)
        to use a conrete global pointer

        :param addr: irsb address
        :param irsb: irsb
        :param func_addr: function address
        :param caller_gp:   The gp register value that the caller function has. MIPS-specific.
        """
        if is_arm_arch(self.project.arch):
            if self._arch_options.ret_jumpkind_heuristics:
                if addr == func_addr:
                    self._arm_track_lr_on_stack(addr, irsb, self.functions[func_addr])

                elif 'lr_saved_on_stack' in self.functions[func_addr].info and \
                        self.functions[func_addr].info['lr_saved_on_stack'] and \
                        irsb.jumpkind == 'Ijk_Boring' and \
                        irsb.next is not None and \
                        isinstance(irsb.next, pyvex.IRExpr.RdTmp):
                    # do a bunch of checks to avoid unnecessary simulation from happening
                    self._arm_track_read_lr_from_stack(irsb, self.functions[func_addr])

        elif self.project.arch.name in {"MIPS32", "MIPS64"}:
            func = self.kb.functions.function(func_addr)
            if 'gp' not in func.info and addr >= func_addr and addr - func_addr < 15 * 4:
                gp_value = self._mips_determine_function_gp(addr, irsb, func_addr)
                if gp_value is not None and self._gp_value is None:
                    self._gp_value = gp_value
                if gp_value is None:
                    gp_value = caller_gp  # fallback
                if gp_value is None:
                    gp_value = self._gp_value  # fallback to a previously found value
                func.info['gp'] = gp_value
def _process_block_arch_specific ( self , addr : int , irsb : pyvex . IRSB , func_addr : int , caller_gp : Optional [ int ] = None ) -> None : # pylint: disable=unused-argument if is_arm_arch ( self . project . arch ) : if self . _arch_options . ret_jumpkind_heuristics : if addr == func_addr : self . _arm_track_lr_on_stack ( addr , irsb , self . functions [ func_addr ] ) elif 'lr_saved_on_stack' in self . functions [ func_addr ] . info and self . functions [ func_addr ] . info [ 'lr_saved_on_stack' ] and irsb . jumpkind == 'Ijk_Boring' and irsb . next is not None and isinstance ( irsb . next , pyvex . IRExpr . RdTmp ) : # do a bunch of checks to avoid unnecessary simulation from happening self . _arm_track_read_lr_from_stack ( irsb , self . functions [ func_addr ] ) elif self . project . arch . name in { "MIPS32" , "MIPS64" } : func = self . kb . functions . function ( func_addr ) if 'gp' not in func . info and addr >= func_addr and addr - func_addr < 15 * 4 : gp_value = self . _mips_determine_function_gp ( addr , irsb , func_addr ) if gp_value is not None and self . _gp_value is None : self . _gp_value = gp_value if gp_value is None : gp_value = caller_gp # fallback if gp_value is None : gp_value = self . _gp_value # fallback to a previously found value func . info [ 'gp' ] = gp_value