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:
Sami Tolvanen
2025-05-07 23:14:05 +00:00
committed by John Stultz
parent ede5aa33f4
commit 8b73dde524

View File

@@ -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)