[Mesa-dev] [PATCH v4 09/20] clover: Disallow creating libraries from other libraries
Pierre Moreau
pierre.morrow at free.fr
Thu Mar 8 00:21:18 UTC 2018
If creating a library, do not allow non-compiled object in it, as
executables are not allowed, and libraries would make it really hard to
enforce the "-enable-link-options" flag.
Reviewed-by: Francisco Jerez <currojerez at riseup.net>
Reviewed-by: Aaron Watry <awatry at gmail.com>
Signed-off-by: Pierre Moreau <pierre.morrow at free.fr>
---
Notes:
v3: Re-write the explanation as to why libraries can’t be created from other
libraries (Francisco Jerez)
src/gallium/state_trackers/clover/api/program.cpp | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp
index 134cebfdf7..7d57d3f0e9 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -253,8 +253,11 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
namespace {
ref_vector<device>
validate_link_devices(const ref_vector<program> &progs,
- const ref_vector<device> &all_devs) {
+ const ref_vector<device> &all_devs,
+ const std::string &opts) {
std::vector<device *> devs;
+ const bool create_library =
+ opts.find("-create-library") != std::string::npos;
for (auto &dev : all_devs) {
const auto has_binary = [&](const program &prog) {
@@ -263,10 +266,22 @@ namespace {
t == CL_PROGRAM_BINARY_TYPE_LIBRARY;
};
+ // According to the OpenCL 1.2 specification, a library is made of
+ // “compiled binaries specified in input_programs argument to
+ // clLinkProgram“; compiled binaries does not refer to libraries:
+ // “input_programs is an array of program objects that are compiled
+ // binaries or libraries that are to be linked to create the program
+ // executable”.
+ if (create_library && any_of([&](const program &prog) {
+ const auto t = prog.build(dev).binary_type();
+ return t != CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT;
+ }, progs))
+ throw error(CL_INVALID_OPERATION);
+
// According to the CL 1.2 spec, when "all programs specified [..]
// contain a compiled binary or library for the device [..] a link is
// performed",
- if (all_of(has_binary, progs))
+ else if (all_of(has_binary, progs))
devs.push_back(&dev);
// otherwise if "none of the programs contain a compiled binary or
@@ -293,7 +308,7 @@ clLinkProgram(cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
auto valid_devs = ref_vector<device>(ctx.devices());
auto devs = validate_link_devices(progs,
(d_devs ? objs(d_devs, num_devs) :
- valid_devs));
+ valid_devs), opts);
validate_build_common(prog, num_devs, d_devs, valid_devs, pfn_notify,
user_data);
--
2.16.2
More information about the mesa-dev
mailing list