Skip to content

Commit 26ed564

Browse files
authored
Support for Pluggable Validation Layer Checkers (#155)
* Support for Pluggable Validation Layer Checkers Signed-off-by: Neil R. Spruit <[email protected]>
1 parent b5def34 commit 26ed564

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+7001
-3919
lines changed

scripts/generate_checker.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
"""
2+
Copyright (C) 2024 Intel Corporation
3+
4+
SPDX-License-Identifier: MIT
5+
6+
"""
7+
import os
8+
import re
9+
import util
10+
import argparse
11+
12+
templates_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates/checker/")
13+
14+
"""
15+
generates checker files from the templates
16+
"""
17+
if __name__ == '__main__':
18+
parser = argparse.ArgumentParser()
19+
parser.add_argument("name", type=str, help="Name of your Validation Layer checker in the form of 'CheckerName'.")
20+
parser.add_argument("out_dir", type=str, help="Root of the loader repository.")
21+
args = parser.parse_args()
22+
name = args.name
23+
env_name = name.upper()
24+
srcpath = os.path.join(args.out_dir, "source/layers/validation/checkers/")
25+
srcpath = os.path.join(srcpath, name)
26+
if not os.path.exists(srcpath):
27+
os.makedirs(srcpath)
28+
print("Generating Checker Template for %s\n" %(name))
29+
loc = 0
30+
template = "template.h.mako"
31+
fin = os.path.join(templates_dir, template)
32+
33+
filename = "zel_%s_checker.h"%(name)
34+
fout = os.path.join(srcpath, filename)
35+
36+
print("Generating %s..."%fout)
37+
loc += util.makoWrite(
38+
fin, fout,
39+
name=name)
40+
41+
template = "template.cpp.mako"
42+
fin = os.path.join(templates_dir, template)
43+
44+
filename = "zel_%s_checker.cpp"%(name)
45+
fout = os.path.join(srcpath, filename)
46+
47+
print("Generating %s..."%fout)
48+
loc += util.makoWrite(
49+
fin, fout,
50+
name=name,
51+
env_name=env_name)
52+
53+
template = "template.cmake.mako"
54+
fin = os.path.join(templates_dir, template)
55+
56+
filename = "CMakeLists.txt"
57+
fout = os.path.join(srcpath, filename)
58+
59+
print("Generating %s..."%fout)
60+
loc += util.makoWrite(
61+
fin, fout,
62+
name=name,
63+
TARGET_NAME="${TARGET_NAME}",
64+
CMAKE_CURRENT_LIST_DIR="${CMAKE_CURRENT_LIST_DIR}")

scripts/generate_code.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ def _mako_loader_cpp(path, namespace, tags, version, specs, meta):
143143
validation_files = {
144144
'valddi.cpp.mako': ('','valddi.cpp'),
145145
'entry_points.h.mako' : ('common', 'entry_points.h'),
146-
'param.cpp.mako' : ('parameter_validation', 'parameter_validation.cpp'),
147-
'param.h.mako' : ('parameter_validation', 'parameter_validation.h'),
146+
'param.cpp.mako' : ('checkers/parameter_validation', 'parameter_validation.cpp'),
147+
'param.h.mako' : ('checkers/parameter_validation', 'parameter_validation.h'),
148148
'handle_lifetime.h.mako' : ('handle_lifetime_tracking', 'handle_lifetime.h'),
149149
'handle_lifetime.cpp.mako' : ('handle_lifetime_tracking', 'handle_lifetime.cpp')
150150
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
target_sources(${TARGET_NAME}
2+
PRIVATE
3+
${CMAKE_CURRENT_LIST_DIR}/zel_${name}_checker.h
4+
${CMAKE_CURRENT_LIST_DIR}/zel_${name}_checker.cpp
5+
)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (C) 2024 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
* @file zel_${name}_checker.cpp
7+
*
8+
*/
9+
#include "zel_${name}_checker.h"
10+
11+
namespace validation_layer
12+
{
13+
class ${name}Checker ${name}_checker;
14+
15+
${name}Checker::${name}Checker() {
16+
enable${name} = getenv_tobool( "ZEL_ENABLE_${env_name}_CHECKER" );
17+
if(enable${name}) {
18+
${name}Checker::ZE${name}Checker *zeChecker = new ${name}Checker::ZE${name}Checker;
19+
${name}Checker::ZES${name}Checker *zesChecker = new ${name}Checker::ZES${name}Checker;
20+
${name}Checker::ZET${name}Checker *zetChecker = new ${name}Checker::ZET${name}Checker;
21+
${name}_checker.zeValidation = zeChecker;
22+
${name}_checker.zetValidation = zetChecker;
23+
${name}_checker.zesValidation = zesChecker;
24+
validation_layer::context.validationHandlers.push_back(&${name}_checker);
25+
}
26+
}
27+
28+
${name}Checker::~${name}Checker() {
29+
if(enable${name}) {
30+
delete ${name}_checker.zeValidation;
31+
delete ${name}_checker.zetValidation;
32+
delete ${name}_checker.zesValidation;
33+
}
34+
}
35+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
*
3+
* Copyright (C) 2024 Intel Corporation
4+
*
5+
* SPDX-License-Identifier: MIT
6+
*
7+
* @file zel_${name}_checker.h
8+
*
9+
*/
10+
11+
#pragma once
12+
13+
#include <string>
14+
#include "ze_api.h"
15+
#include "ze_validation_layer.h"
16+
17+
namespace validation_layer
18+
{
19+
class __zedlllocal ${name}Checker : public validationChecker{
20+
public:
21+
${name}Checker();
22+
~${name}Checker();
23+
24+
class ZE${name}Checker : public ZEValidationEntryPoints {};
25+
class ZES${name}Checker : public ZESValidationEntryPoints {};
26+
class ZET${name}Checker : public ZETValidationEntryPoints {};
27+
bool enable${name} = false;
28+
};
29+
extern class ${name}Checker ${name}_checker;
30+
}

scripts/templates/validation/entry_points.h.mako

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ namespace validation_layer
2727
class ${N}ValidationEntryPoints {
2828
public:
2929
%for obj in th.extract_objs(specs, r"function"):
30-
virtual ${x}_result_t ${th.make_func_name(n, tags, obj)}( \
30+
virtual ${x}_result_t ${th.make_func_name(n, tags, obj)}Prologue( \
31+
%for line in th.make_param_lines(n, tags, obj, format=["type", "name", "delim"]):
32+
${line} \
33+
%endfor
34+
) {return ZE_RESULT_SUCCESS;}
35+
virtual ${x}_result_t ${th.make_func_name(n, tags, obj)}Epilogue( \
3136
%for line in th.make_param_lines(n, tags, obj, format=["type", "name", "delim"]):
3237
${line} \
3338
%endfor

scripts/templates/validation/handle_lifetime.cpp.mako

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace validation_layer
2727
## don't genrate function if it has no handles as parameters
2828
%if th.obj_traits.is_function_with_input_handles(obj):
2929
${x}_result_t
30-
${N}HandleLifetimeValidation::${th.make_func_name(n, tags, obj)}(
30+
${N}HandleLifetimeValidation::${th.make_func_name(n, tags, obj)}Prologue(
3131
%for line in th.make_param_lines(n, tags, obj):
3232
${line}
3333
%endfor

scripts/templates/validation/handle_lifetime.h.mako

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace validation_layer
3232
%if not th.obj_traits.is_function_with_input_handles(obj):
3333
<% continue %>
3434
%endif
35-
${x}_result_t ${th.make_func_name(n, tags, obj)} ( \
35+
${x}_result_t ${th.make_func_name(n, tags, obj)}Prologue( \
3636
%for line in th.make_param_lines(n, tags, obj, format=["type", "name", "delim"]):
3737
${line} \
3838
%endfor

scripts/templates/validation/param.cpp.mako

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,38 @@ from templates import helper as th
1919
*
2020
*/
2121
#include "${x}_validation_layer.h"
22-
#include "${x}_parameter_validation.h"
22+
#include "param_validation.h"
2323

2424
namespace validation_layer
2525
{
26+
%if 'ze' == n:
27+
class parameterValidationChecker parameterChecker;
28+
29+
parameterValidationChecker::parameterValidationChecker() {
30+
enableParameterValidation = getenv_tobool( "ZE_ENABLE_PARAMETER_VALIDATION" );
31+
if(enableParameterValidation) {
32+
ZEParameterValidation *zeChecker = new ZEParameterValidation;
33+
ZESParameterValidation *zesChecker = new ZESParameterValidation;
34+
ZETParameterValidation *zetChecker = new ZETParameterValidation;
35+
parameterChecker.zeValidation = zeChecker;
36+
parameterChecker.zetValidation = zetChecker;
37+
parameterChecker.zesValidation = zesChecker;
38+
validation_layer::context.validationHandlers.push_back(&parameterChecker);
39+
}
40+
}
41+
42+
parameterValidationChecker::~parameterValidationChecker() {
43+
if(enableParameterValidation) {
44+
delete parameterChecker.zeValidation;
45+
delete parameterChecker.zetValidation;
46+
delete parameterChecker.zesValidation;
47+
}
48+
}
49+
%endif
2650
%for obj in th.extract_objs(specs, r"function"):
2751

2852
${x}_result_t
29-
${N}ParameterValidation::${th.make_func_name(n, tags, obj)}(
53+
${N}ParameterValidation::${th.make_func_name(n, tags, obj)}Prologue(
3054
%for line in th.make_param_lines(n, tags, obj):
3155
${line}
3256
%endfor

scripts/templates/validation/param.h.mako

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ from templates import helper as th
1919
*
2020
*/
2121

22-
#pragma once
22+
#pragma once
23+
#include "${x}_validation_layer.h"
2324
#include "${n}_entry_points.h"
2425

2526

@@ -29,12 +30,11 @@ namespace validation_layer
2930
class ${N}ParameterValidation : public ${N}ValidationEntryPoints {
3031
public:
3132
%for obj in th.extract_objs(specs, r"function"):
32-
${x}_result_t ${th.make_func_name(n, tags, obj)} ( \
33+
${x}_result_t ${th.make_func_name(n, tags, obj)}Prologue( \
3334
%for line in th.make_param_lines(n, tags, obj, format=["type", "name", "delim"]):
3435
${line} \
3536
%endfor
3637
) override;
3738
%endfor
3839
};
39-
4040
}

0 commit comments

Comments
 (0)