UPSTREAM: gendwarfksyms: Clean up kABI rule look-ups
Reduce code duplication by moving kABI rule look-ups to separate functions. Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Reviewed-by: Petr Pavlu <petr.pavlu@suse.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> (cherry picked from commit ff2c5f5a9e01b9fc3b4959c2b3f40843cc0a5ecb) Bug: 400972353 Link: https://lore.kernel.org/lkml/20250507231403.377725-8-samitolvanen@google.com/ Change-Id: I997f55602b71a85903cd7fc23f7ed1b14cf1ead2 Signed-off-by: Giuliano Procida <gprocida@google.com> [jstultz: Switched to UPSTREAM] Signed-off-by: John Stultz <jstultz@google.com>
This commit is contained in:
committed by
John Stultz
parent
ede5aa33f4
commit
8b73dde524
@@ -222,25 +222,6 @@ void kabi_read_rules(int fd)
|
||||
check(elf_end(elf));
|
||||
}
|
||||
|
||||
bool kabi_is_declonly(const char *fqn)
|
||||
{
|
||||
struct rule *rule;
|
||||
|
||||
if (!stable)
|
||||
return false;
|
||||
if (!fqn || !*fqn)
|
||||
return false;
|
||||
|
||||
hash_for_each_possible(rules, rule, hash,
|
||||
rule_values_hash(KABI_RULE_TYPE_DECLONLY, fqn)) {
|
||||
if (rule->type == KABI_RULE_TYPE_DECLONLY &&
|
||||
!strcmp(fqn, rule->target))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static char *get_enumerator_target(const char *fqn, const char *field)
|
||||
{
|
||||
char *target = NULL;
|
||||
@@ -251,6 +232,47 @@ static char *get_enumerator_target(const char *fqn, const char *field)
|
||||
return target;
|
||||
}
|
||||
|
||||
static struct rule *find_rule(enum kabi_rule_type type, const char *target)
|
||||
{
|
||||
struct rule *rule;
|
||||
|
||||
if (!stable)
|
||||
return NULL;
|
||||
if (!target || !*target)
|
||||
return NULL;
|
||||
|
||||
hash_for_each_possible(rules, rule, hash,
|
||||
rule_values_hash(type, target)) {
|
||||
if (rule->type == type && !strcmp(target, rule->target))
|
||||
return rule;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct rule *find_enumerator_rule(enum kabi_rule_type type,
|
||||
const char *fqn, const char *field)
|
||||
{
|
||||
struct rule *rule;
|
||||
char *target;
|
||||
|
||||
if (!stable)
|
||||
return NULL;
|
||||
if (!fqn || !*fqn || !field || !*field)
|
||||
return NULL;
|
||||
|
||||
target = get_enumerator_target(fqn, field);
|
||||
rule = find_rule(type, target);
|
||||
|
||||
free(target);
|
||||
return rule;
|
||||
}
|
||||
|
||||
bool kabi_is_declonly(const char *fqn)
|
||||
{
|
||||
return !!find_rule(KABI_RULE_TYPE_DECLONLY, fqn);
|
||||
}
|
||||
|
||||
static unsigned long get_ulong_value(const char *value)
|
||||
{
|
||||
unsigned long result = 0;
|
||||
@@ -267,58 +289,23 @@ static unsigned long get_ulong_value(const char *value)
|
||||
|
||||
bool kabi_is_enumerator_ignored(const char *fqn, const char *field)
|
||||
{
|
||||
bool match = false;
|
||||
struct rule *rule;
|
||||
char *target;
|
||||
|
||||
if (!stable)
|
||||
return false;
|
||||
if (!fqn || !*fqn || !field || !*field)
|
||||
return false;
|
||||
|
||||
target = get_enumerator_target(fqn, field);
|
||||
|
||||
hash_for_each_possible(
|
||||
rules, rule, hash,
|
||||
rule_values_hash(KABI_RULE_TYPE_ENUMERATOR_IGNORE, target)) {
|
||||
if (rule->type == KABI_RULE_TYPE_ENUMERATOR_IGNORE &&
|
||||
!strcmp(target, rule->target)) {
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free(target);
|
||||
return match;
|
||||
return !!find_enumerator_rule(KABI_RULE_TYPE_ENUMERATOR_IGNORE, fqn,
|
||||
field);
|
||||
}
|
||||
|
||||
bool kabi_get_enumerator_value(const char *fqn, const char *field,
|
||||
unsigned long *value)
|
||||
{
|
||||
bool match = false;
|
||||
struct rule *rule;
|
||||
char *target;
|
||||
|
||||
if (!stable)
|
||||
return false;
|
||||
if (!fqn || !*fqn || !field || !*field)
|
||||
return false;
|
||||
|
||||
target = get_enumerator_target(fqn, field);
|
||||
|
||||
hash_for_each_possible(rules, rule, hash,
|
||||
rule_values_hash(KABI_RULE_TYPE_ENUMERATOR_VALUE,
|
||||
target)) {
|
||||
if (rule->type == KABI_RULE_TYPE_ENUMERATOR_VALUE &&
|
||||
!strcmp(target, rule->target)) {
|
||||
*value = get_ulong_value(rule->value);
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
rule = find_enumerator_rule(KABI_RULE_TYPE_ENUMERATOR_VALUE, fqn,
|
||||
field);
|
||||
if (rule) {
|
||||
*value = get_ulong_value(rule->value);
|
||||
return true;
|
||||
}
|
||||
|
||||
free(target);
|
||||
return match;
|
||||
return false;
|
||||
}
|
||||
|
||||
void kabi_free(void)
|
||||
|
||||
Reference in New Issue
Block a user