// Copyright (c) 2020 Intel Corporation // SPDX-License-Identifer: Apache-2.0 // In patch mode, patch all device instance to const (if not already). // In report mode: // Generate a q&d python database (a dict actually) of all the // declared zephyr functions. It will store each function name in 2 // separate dicts: one storing all function having 1+ void* parameter // and one for all the other functions. It will store the positions // of the void* parameter in the first dict, and the actual number of // parameters in the second. // Then find_dev_usage.cocci can be used to verify if device instance // are not loosing their const qualifier. virtual patch virtual report //////////////////// // Initialization // //////////////////// @initialize:python depends on report @ @@ import pickle f_void = {} f_other = {} // Insert a function into right dict depending on parameters def insert_function(f, params): void_pos = [] i = 0 for prm in params: if prm.startswith("void *"): void_pos.append(i) i += 1 if len(void_pos) != 0: f_void[f] = void_pos else: f_other[f] = i + 1 /////////// // Rules // /////////// // Switch device instance to constant. @r_const_dev depends on patch disable optional_qualifier @ @@ -struct device * +const struct device * // Find function declarations @r_find_func_declare depends on report @ identifier f; type ret_type; parameter list[nb_params] params; @@ ret_type f(params); // Insert function declaration @script:python depends on report @ f << r_find_func_declare.f; params << r_find_func_declare.params; @@ insert_function(f, params) // Find function implementations and inlines // (maybe it should focus on static only? // but then first rule should not match statics.) @r_find_func_impl_inlines depends on report @ identifier f; type ret_type; parameter list[nb_params] params; @@ ( ret_type f(params) { ... } | static inline ret_type f(params) { ... } ) // Insert function implentations and inlines @script:python depends on report @ f << r_find_func_impl_inlines.f; params << r_find_func_impl_inlines.params; @@ insert_function(f, params) ////////////////// // Finalization // ////////////////// @finalize:python depends on report @ @@ with open("function_names.pickle", "wb") as f: data = {} data['f_void'] = f_void data['f_other'] = f_other pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)