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));
|
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)
|
static char *get_enumerator_target(const char *fqn, const char *field)
|
||||||
{
|
{
|
||||||
char *target = NULL;
|
char *target = NULL;
|
||||||
@@ -251,6 +232,47 @@ static char *get_enumerator_target(const char *fqn, const char *field)
|
|||||||
return target;
|
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)
|
static unsigned long get_ulong_value(const char *value)
|
||||||
{
|
{
|
||||||
unsigned long result = 0;
|
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 kabi_is_enumerator_ignored(const char *fqn, const char *field)
|
||||||
{
|
{
|
||||||
bool match = false;
|
return !!find_enumerator_rule(KABI_RULE_TYPE_ENUMERATOR_IGNORE, fqn,
|
||||||
struct rule *rule;
|
field);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool kabi_get_enumerator_value(const char *fqn, const char *field,
|
bool kabi_get_enumerator_value(const char *fqn, const char *field,
|
||||||
unsigned long *value)
|
unsigned long *value)
|
||||||
{
|
{
|
||||||
bool match = false;
|
|
||||||
struct rule *rule;
|
struct rule *rule;
|
||||||
char *target;
|
|
||||||
|
|
||||||
if (!stable)
|
rule = find_enumerator_rule(KABI_RULE_TYPE_ENUMERATOR_VALUE, fqn,
|
||||||
return false;
|
field);
|
||||||
if (!fqn || !*fqn || !field || !*field)
|
if (rule) {
|
||||||
return false;
|
*value = get_ulong_value(rule->value);
|
||||||
|
return true;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(target);
|
return false;
|
||||||
return match;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void kabi_free(void)
|
void kabi_free(void)
|
||||||
|
|||||||
Reference in New Issue
Block a user