def add_cycles_to_function()

in ArmPlatformPkg/Scripts/Ds5/profile.py [0:0]


def add_cycles_to_function(functions, func_name, addr, cycles):
    if func_name != "<Unknown>":
        # Check if we are still in the previous function
        if add_cycles_to_function.prev_func_name == func_name:
            add_cycles_to_function.prev_entry['cycles'] += cycles
            return (add_cycles_to_function.prev_func_name, add_cycles_to_function.prev_module_name)

        if func_name in functions.keys():
            for module_name, module_value in functions[func_name].iteritems():
                if (module_value['start'] <= addr) and (addr < module_value['end']):
                    module_value['cycles'] += cycles

                    add_cycles_to_function.prev_func_name   = func_name
                    add_cycles_to_function.prev_module_name = module_name
                    add_cycles_to_function.prev_entry       = module_value
                    return (func_name, module_name)
                elif (module_value['end'] == 0):
                    module_value['cycles'] += cycles

                    add_cycles_to_function.prev_func_name   = func_name
                    add_cycles_to_function.prev_module_name = module_name
                    add_cycles_to_function.prev_entry       = module_value
                    return (func_name, module_name)

        # Workaround to fix the 'info func' limitation that does not expose the 'static' function
        module_name = get_module_from_addr(modules, addr)
        functions[func_name] = {}
        functions[func_name][module_name] = {}
        functions[func_name][module_name]['start']  = 0
        functions[func_name][module_name]['end']    = 0
        functions[func_name][module_name]['cycles'] = cycles
        functions[func_name][module_name]['count']  = 0

        add_cycles_to_function.prev_func_name   = func_name
        add_cycles_to_function.prev_module_name = module_name
        add_cycles_to_function.prev_entry       = functions[func_name][module_name]
        return (func_name, module_name)
    else:
        # Check if we are still in the previous function
        if (add_cycles_to_function.prev_entry is not None) and (add_cycles_to_function.prev_entry['start'] <= addr) and (addr < add_cycles_to_function.prev_entry['end']):
            add_cycles_to_function.prev_entry['cycles'] += cycles
            return (add_cycles_to_function.prev_func_name, add_cycles_to_function.prev_module_name)

        # Generate the key for the given address
        key = addr & ~0x0FFF

        if key not in functions_addr.keys():
            if 'Unknown' not in functions.keys():
                functions['Unknown'] = {}
            if 'Unknown' not in functions['Unknown'].keys():
                functions['Unknown']['Unknown'] = {}
                functions['Unknown']['Unknown']['cycles'] = 0
                functions['Unknown']['Unknown']['count'] = 0
            functions['Unknown']['Unknown']['cycles'] += cycles

            add_cycles_to_function.prev_func_name = None
            return None

        for func_key, module in functions_addr[key].iteritems():
            for module_key, module_value in module.iteritems():
                if (module_value['start'] <= addr) and (addr < module_value['end']):
                    module_value['cycles'] += cycles

                    # In case o <Unknown> we prefer to fallback on the direct search
                    add_cycles_to_function.prev_func_name   = func_key
                    add_cycles_to_function.prev_module_name = module_key
                    add_cycles_to_function.prev_entry       = module_value
                    return (func_key, module_key)

    print "Warning: Function %s @ 0x%x not found" % (func_name, addr)

    add_cycles_to_function.prev_func_name = None
    return None