twister: footprints: Move footprint calculation
Adds operation "gather_footprint" after the build stage with minor refactoring. Before footprints were collected only at the very end of the twister workflow and there were situations were elf files were not available any more (for qemu and --runtime-artifact-cleanup used). Signed-off-by: Maciej Perkowski <Maciej.Perkowski@nordicsemi.no>
This commit is contained in:
parent
6c261f2e5a
commit
62c7774014
1 changed files with 32 additions and 36 deletions
|
@ -15,13 +15,11 @@ import shutil
|
|||
import shlex
|
||||
import signal
|
||||
import threading
|
||||
import concurrent.futures
|
||||
from collections import OrderedDict
|
||||
import queue
|
||||
import time
|
||||
import csv
|
||||
import glob
|
||||
import concurrent
|
||||
import xml.etree.ElementTree as ET
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
@ -2494,14 +2492,18 @@ class ProjectBuilder(FilterBuilder):
|
|||
inst = res.get("instance", None)
|
||||
if inst and inst.status == "skipped":
|
||||
results.skipped_runtime += 1
|
||||
|
||||
if res.get('returncode', 1) > 0:
|
||||
pipeline.put({"op": "report", "test": self.instance})
|
||||
else:
|
||||
if self.instance.run and self.instance.handler:
|
||||
pipeline.put({"op": "run", "test": self.instance})
|
||||
else:
|
||||
pipeline.put({"op": "report", "test": self.instance})
|
||||
pipeline.put({"op": "gather_metrics", "test": self.instance})
|
||||
|
||||
elif op == "gather_metrics":
|
||||
self.gather_metrics(self.instance)
|
||||
if self.instance.run and self.instance.handler:
|
||||
pipeline.put({"op": "run", "test": self.instance})
|
||||
else:
|
||||
pipeline.put({"op": "report", "test": self.instance})
|
||||
|
||||
# Run the generated binary using one of the supported handlers
|
||||
elif op == "run":
|
||||
logger.debug("run test: %s" % self.instance.name)
|
||||
|
@ -2719,6 +2721,29 @@ class ProjectBuilder(FilterBuilder):
|
|||
|
||||
sys.stdout.flush()
|
||||
|
||||
def gather_metrics(self, instance):
|
||||
if self.suite.enable_size_report and not self.suite.cmake_only:
|
||||
self.calc_one_elf_size(instance)
|
||||
else:
|
||||
instance.metrics["ram_size"] = 0
|
||||
instance.metrics["rom_size"] = 0
|
||||
instance.metrics["unrecognized"] = []
|
||||
|
||||
@staticmethod
|
||||
def calc_one_elf_size(instance):
|
||||
if instance.status not in ["error", "failed", "skipped"]:
|
||||
if instance.platform.type != "native":
|
||||
size_calc = instance.calculate_sizes()
|
||||
instance.metrics["ram_size"] = size_calc.get_ram_size()
|
||||
instance.metrics["rom_size"] = size_calc.get_rom_size()
|
||||
instance.metrics["unrecognized"] = size_calc.unrecognized_sections()
|
||||
else:
|
||||
instance.metrics["ram_size"] = 0
|
||||
instance.metrics["rom_size"] = 0
|
||||
instance.metrics["unrecognized"] = []
|
||||
|
||||
instance.metrics["handler_time"] = instance.handler.duration if instance.handler else 0
|
||||
|
||||
class TestSuite(DisablePyTestCollectionMixin):
|
||||
config_re = re.compile('(CONFIG_[A-Za-z0-9_]+)[=]\"?([^\"]*)\"?$')
|
||||
dt_re = re.compile('([A-Za-z0-9_]+)[=]\"?([^\"]*)\"?$')
|
||||
|
@ -3471,21 +3496,6 @@ class TestSuite(DisablePyTestCollectionMixin):
|
|||
for instance in instance_list:
|
||||
self.instances[instance.name] = instance
|
||||
|
||||
@staticmethod
|
||||
def calc_one_elf_size(instance):
|
||||
if instance.status not in ["error", "failed", "skipped"]:
|
||||
if instance.platform.type != "native":
|
||||
size_calc = instance.calculate_sizes()
|
||||
instance.metrics["ram_size"] = size_calc.get_ram_size()
|
||||
instance.metrics["rom_size"] = size_calc.get_rom_size()
|
||||
instance.metrics["unrecognized"] = size_calc.unrecognized_sections()
|
||||
else:
|
||||
instance.metrics["ram_size"] = 0
|
||||
instance.metrics["rom_size"] = 0
|
||||
instance.metrics["unrecognized"] = []
|
||||
|
||||
instance.metrics["handler_time"] = instance.handler.duration if instance.handler else 0
|
||||
|
||||
def add_tasks_to_queue(self, pipeline, build_only=False, test_only=False):
|
||||
for instance in self.instances.values():
|
||||
if build_only:
|
||||
|
@ -3553,20 +3563,6 @@ class TestSuite(DisablePyTestCollectionMixin):
|
|||
for p in processes:
|
||||
p.terminate()
|
||||
|
||||
# FIXME: This needs to move out.
|
||||
if self.enable_size_report and not self.cmake_only:
|
||||
# Parallelize size calculation
|
||||
executor = concurrent.futures.ThreadPoolExecutor(self.jobs)
|
||||
futures = [executor.submit(self.calc_one_elf_size, instance)
|
||||
for instance in self.instances.values()]
|
||||
concurrent.futures.wait(futures)
|
||||
else:
|
||||
for instance in self.instances.values():
|
||||
instance.metrics["ram_size"] = 0
|
||||
instance.metrics["rom_size"] = 0
|
||||
instance.metrics["handler_time"] = instance.handler.duration if instance.handler else 0
|
||||
instance.metrics["unrecognized"] = []
|
||||
|
||||
return results
|
||||
|
||||
def discard_report(self, filename):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue