13#ifndef OPENMP_TRAITS_H
14#define OPENMP_TRAITS_H
49 bool has_lookahead =
false;
60 has_lookahead =
false;
80 static_cast<size_t>(scan.end() - t.
text.
begin()));
108 virtual bool match([[maybe_unused]]
int device)
const {
109 KMP_ASSERT2(0,
"kmp_trait::match() must be overridden");
127 bool match([[maybe_unused]]
int device)
const override {
return true; }
141 assert(device_num >= 0 &&
"Device number must be non-negative");
144 bool match(
int device)
const override {
return device_num == device; }
171 bool match(
int device)
const override {
172 const char *device_uid = get_uid_from_device(device);
173 if (!device_uid || !uid)
175 return strcmp(device_uid, uid) == 0;
181 get_uid_from_device = uid_from_device;
185 if (!kmp_trait::operator==(other))
187 const char *other_uid =
static_cast<const kmp_uid_trait &
>(other).uid;
188 return uid && other_uid ? strcmp(uid, other_uid) == 0 : uid == other_uid;
210 [[maybe_unused]]
int num_devices)
const {
211 KMP_ASSERT2(0,
"kmp_trait_expr::match_impl() must be overridden");
226 bool match(
int device,
int num_devices = -1)
const {
227 if (num_devices == -1)
229 if (device < 0 || device >= num_devices)
254 bool match_impl(
int device, [[maybe_unused]]
int num_devices)
const override {
256 bool result = trait->match(device);
265 assert(trait &&
"kmp_trait_expr_single requires a non-null trait");
277 if (!kmp_trait_expr::operator==(other))
281 return trait && other_single.trait ? *trait == *other_single.trait
282 : trait == other_single.trait;
298 bool match_impl(
int device,
int num_devices)
const override {
301 if (expr->match(device, num_devices))
305 bool result = type ==
AND ? matched == exprs.size() : matched > 0;
323 exprs.push_back(expr);
335 expr->set_num_devices(num_devices);
339 if (!kmp_trait_expr::operator==(other))
343 return type == other_group.type &&
344 exprs.is_set_equal(other_group.exprs,
364 bool match(
int device,
int num_devices = -1)
const {
366 return expr->match(device, num_devices);
387 return expr && other.expr ? *expr == *other.expr : expr == other.expr;
400 bool evaluated =
false;
406 for (
int d = 0;
d < get_num_devices(); ++
d) {
408 devices.push_back(
d);
413 bool _match(
int device)
const {
414 if (device < 0 || device >= get_num_devices())
416 for (kmp_trait_clause *clause : clauses) {
417 if (clause->match(device))
426 for (kmp_trait_clause *clause : clauses)
439 const char *dbg_name =
nullptr);
443 clauses.push_back(clause);
445 if (kmp_trait_expr *expr = clause->
get_expr())
446 expr->set_num_devices(get_num_devices);
461 assert(evaluated &&
"kmp_trait_context not evaluated");
470 assert(evaluated &&
"kmp_trait_context not evaluated");
471 return devices.contains(device);
477 get_num_devices = num_devices;
478 for (kmp_trait_clause *clause : clauses) {
479 if (kmp_trait_expr *expr = clause->get_expr())
480 expr->set_num_devices(num_devices);
495 auto clause_comp = [](kmp_trait_clause *
const &
a,
496 kmp_trait_clause *
const &
b) {
return *
a == *
b; };
497 return clauses.is_set_equal(other.clauses, clause_comp);
kmp_str_ref is a non-owning string class (similar to llvm::StringRef).
const char * begin() const
Iterator support (raw pointers work as iterators for contiguous storage)
void set_num_devices(int(*num_devices)())
bool match(int device) const
const kmp_vector< int > & evaluate()
kmp_trait_context(const kmp_trait_context &)=delete
kmp_trait_context(kmp_trait_context &&)=delete
kmp_trait_context & operator=(const kmp_trait_context &)=delete
const int * begin() const
const kmp_vector< int > & evaluate() const
bool operator==(const kmp_trait_context &other) const
kmp_trait_context()=default
kmp_trait_context & operator=(kmp_trait_context &&)=delete
void add_clause(kmp_trait_clause *clause)
void trigger_evaluation()
static kmp_trait_context * parse_from_spec(kmp_str_ref spec, const char *dbg_name=nullptr)
kmp_literal_trait(int device_num)
bool match(int device) const override
bool operator==(const kmp_trait &other) const override
void set_expr(kmp_trait *trait)
kmp_trait_clause & operator=(kmp_trait_clause &&)=delete
kmp_trait_clause(const kmp_trait_clause &)=delete
kmp_trait_clause & operator=(const kmp_trait_clause &)=delete
bool operator==(const kmp_trait_clause &other) const
kmp_trait_clause(kmp_trait_clause &&)=delete
bool match(int device, int num_devices=-1) const
kmp_trait_clause()=default
kmp_trait_expr * get_expr()
void set_expr(kmp_trait_expr *new_expr)
void add_expr(kmp_trait_expr *expr)
void set_num_devices(int(*num_devices)())
bool match_impl(int device, int num_devices) const override
~kmp_trait_expr_group() override
bool operator==(const kmp_trait_expr &other) const override
void set_group_type(group_type new_type)
kmp_trait_expr_group(bool negated)
void add_expr(kmp_trait *trait)
group_type get_group_type() const
Represents a single (possibly negated) trait.
void set_trait(kmp_trait *new_trait)
bool match_impl(int device, int num_devices) const override
bool operator==(const kmp_trait_expr &other) const override
~kmp_trait_expr_single() override
kmp_trait_expr_single(kmp_trait *trait)
kmp_trait_expr_single(bool negated)
Abstract class representing either a single trait expression or a collection of trait expressions tha...
kmp_trait_expr(const kmp_trait_expr &)=delete
kmp_trait_expr(expr_type type)
kmp_trait_expr(kmp_trait_expr &&)=delete
kmp_trait_expr(expr_type type, bool negated)
virtual ~kmp_trait_expr()=default
virtual bool operator==(const kmp_trait_expr &other) const
bool match(int device, int num_devices=-1) const
void set_num_devices(int(*num_devices)())
kmp_trait_expr & operator=(kmp_trait_expr &&)=delete
kmp_trait_expr & operator=(const kmp_trait_expr &)=delete
void set_negated(bool neg=true)
virtual bool match_impl(int device, int num_devices) const
virtual ~kmp_trait()=default
kmp_trait & operator=(const kmp_trait &)=delete
virtual bool match(int device) const
kmp_trait & operator=(kmp_trait &&)=delete
virtual bool operator==(const kmp_trait &other) const
kmp_trait(const kmp_trait &)=delete
kmp_trait(trait_type type)
kmp_trait(kmp_trait &&)=delete
bool operator==(const kmp_trait &other) const override
bool match(int device) const override
~kmp_uid_trait() override
void set_uid_from_device(const char *(*uid_from_device)(int))
kmp_uid_trait(kmp_str_ref uid)
bool operator==(const kmp_trait &other) const override
bool match(int device) const override
kmp_vector is a vector class for managing small vectors.
T * begin()
Iterator support (raw pointers work as iterators for contiguous storage)
bool contains(const T &value, const Fn &comp=Fn{}) const
Check if the vector contains the given value.
kmp_lexer(kmp_str_ref source)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d int
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
#define KMP_INTERNAL_MALLOC(sz)
#define KMP_INTERNAL_FREE(p)
#define KMP_ASSERT2(cond, msg)
int omp_get_num_devices()
const char * omp_get_uid_from_device(int device_num)