Skip to content

Commit

Permalink
Add blame server experiment (#898)
Browse files Browse the repository at this point in the history
* Add blame server experiment

* Adjustments to blame server experiment

* Add blame server experiment to docs

* Fix return type annotation

* Don't return in finally block

* Cleanup

---------

Co-authored-by: Sebastian Böhm <boehmseb@cs.uni-saarland.de>
  • Loading branch information
LeonievonMann and boehmseb authored Jan 15, 2025
1 parent 9eed9a9 commit f63bc9a
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 0 deletions.
10 changes: 10 additions & 0 deletions docs/source/vara-ts-api/experiments/blame_report_experiments.rst
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,13 @@ Module: BlameExperiment
:members:
:undoc-members:
:show-inheritance:

------

Module: BlameServerExperiment
-----------------------------

.. automodule:: varats.experiments.vara.blame_server_experiment
:members:
:undoc-members:
:show-inheritance:
103 changes: 103 additions & 0 deletions varats/varats/experiments/vara/blame_server_experiment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
"""
Implements blame experiment using a blame cache server.
The experiment starts the blame server, compiles with blame annotations and
kills the server at the end.
"""
import socket
import typing as tp

from benchbuild import Project
from benchbuild.utils import actions
from plumbum import local
from plumbum.cmd import kill

import varats.experiments.vara.blame_experiment as BE
from varats.data.reports.blame_annotations import BlameAnnotations as BA
from varats.experiment.experiment_util import (
VersionExperiment,
create_default_compiler_error_handler,
)
from varats.experiment.wllvm import BCFileExtensions, Extract
from varats.experiments.vara.blame_ast_experiment import (
BlameAnnotationGeneration,
)
from varats.report.report import ReportSpecification


class CompileWithBlameServer(actions.Compile): # type: ignore
"""Start blame server before and kill server after compilation."""

NAME = "BlameServerSteps"
DESCRIPTION = "Start server before and kill server after compilation."

def __init__(self, project: Project, port: int):
super().__init__(project)
self.__port = port

def __call__(self) -> actions.StepResult:
server_cmd = local["vara-blamed"][
f"--blame-server=0.0.0.0:{self.__port}"]
server_proc = server_cmd.popen()
step_result = actions.StepResult.ERROR
try:
step_result = super().__call__()
finally:
kill[str(server_proc.pid)]()

return step_result

@staticmethod
def find_open_port() -> tp.Any:
"""Finds and returns an available port on the local machine."""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 0)) # Bind to a free port provided by the OS
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
return s.getsockname()[1]


class BlameServerExperiment(VersionExperiment, shorthand="BSE"):
"""Generate a blame annotation report using blame server."""

NAME = "RunBlameServer"

REPORT_SPEC = ReportSpecification(BA)

def actions_for_project(
self, project: Project
) -> tp.MutableSequence[actions.Step]:
"""
Returns the specified steps to run the project(s) specified in the call
in a fixed order.
Args:
project: to analyze
"""
project.cflags += ["-O1", "-Xclang", "-disable-llvm-optzns", "-g"]
bc_file_extensions = [
BCFileExtensions.NO_OPT,
BCFileExtensions.TBAA,
BCFileExtensions.BLAME
]

BE.setup_basic_blame_experiment(self, project, BA)
open_port = CompileWithBlameServer.find_open_port()
project.cflags += [f"-fvara-blame-server=0.0.0.0:{open_port}"]
analysis_actions = []
analysis_actions.append(CompileWithBlameServer(project, open_port))
analysis_actions.append(
Extract(
project,
bc_file_extensions,
handler=create_default_compiler_error_handler(
self.get_handle(), project, self.REPORT_SPEC.main_report
)
)
)
analysis_actions.append(
BlameAnnotationGeneration(
project, self.get_handle(), bc_file_extensions
)
)

return analysis_actions
1 change: 1 addition & 0 deletions varats/varats/tools/bb_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ def update_experiments(bb_cfg: s.Configuration) -> None:
'varats.experiments.vara.agg_region_interaction_perf_runner',
'varats.experiments.vara.blame_ast_experiment',
'varats.experiments.vara.blame_report_experiment',
'varats.experiments.vara.blame_server_experiment',
'varats.experiments.vara.blame_verifier_experiment',
'varats.experiments.vara.commit_report_experiment',
'varats.experiments.vara.feature_perf_runner',
Expand Down

0 comments on commit f63bc9a

Please sign in to comment.