Skip to content

Commit ff2c5f5

Browse files
samitolvanenmasahir0y
authored andcommitted
gendwarfksyms: Clean up kABI rule look-ups
Reduce code duplication by moving kABI rule look-ups to separate functions. Signed-off-by: Sami Tolvanen <[email protected]> Reviewed-by: Petr Pavlu <[email protected]> Signed-off-by: Masahiro Yamada <[email protected]>
1 parent 707f853 commit ff2c5f5

File tree

1 file changed

+44
-57
lines changed

1 file changed

+44
-57
lines changed

scripts/gendwarfksyms/kabi.c

Lines changed: 44 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -222,33 +222,55 @@ void kabi_read_rules(int fd)
222222
check(elf_end(elf));
223223
}
224224

225-
bool kabi_is_declonly(const char *fqn)
225+
static char *get_enumerator_target(const char *fqn, const char *field)
226+
{
227+
char *target = NULL;
228+
229+
if (asprintf(&target, "%s %s", fqn, field) < 0)
230+
error("asprintf failed for '%s %s'", fqn, field);
231+
232+
return target;
233+
}
234+
235+
static struct rule *find_rule(enum kabi_rule_type type, const char *target)
226236
{
227237
struct rule *rule;
228238

229239
if (!stable)
230-
return false;
231-
if (!fqn || !*fqn)
232-
return false;
240+
return NULL;
241+
if (!target || !*target)
242+
return NULL;
233243

234244
hash_for_each_possible(rules, rule, hash,
235-
rule_values_hash(KABI_RULE_TYPE_DECLONLY, fqn)) {
236-
if (rule->type == KABI_RULE_TYPE_DECLONLY &&
237-
!strcmp(fqn, rule->target))
238-
return true;
245+
rule_values_hash(type, target)) {
246+
if (rule->type == type && !strcmp(target, rule->target))
247+
return rule;
239248
}
240249

241-
return false;
250+
return NULL;
242251
}
243252

244-
static char *get_enumerator_target(const char *fqn, const char *field)
253+
static struct rule *find_enumerator_rule(enum kabi_rule_type type,
254+
const char *fqn, const char *field)
245255
{
246-
char *target = NULL;
256+
struct rule *rule;
257+
char *target;
247258

248-
if (asprintf(&target, "%s %s", fqn, field) < 0)
249-
error("asprintf failed for '%s %s'", fqn, field);
259+
if (!stable)
260+
return NULL;
261+
if (!fqn || !*fqn || !field || !*field)
262+
return NULL;
250263

251-
return target;
264+
target = get_enumerator_target(fqn, field);
265+
rule = find_rule(type, target);
266+
267+
free(target);
268+
return rule;
269+
}
270+
271+
bool kabi_is_declonly(const char *fqn)
272+
{
273+
return !!find_rule(KABI_RULE_TYPE_DECLONLY, fqn);
252274
}
253275

254276
static unsigned long get_ulong_value(const char *value)
@@ -267,58 +289,23 @@ static unsigned long get_ulong_value(const char *value)
267289

268290
bool kabi_is_enumerator_ignored(const char *fqn, const char *field)
269291
{
270-
bool match = false;
271-
struct rule *rule;
272-
char *target;
273-
274-
if (!stable)
275-
return false;
276-
if (!fqn || !*fqn || !field || !*field)
277-
return false;
278-
279-
target = get_enumerator_target(fqn, field);
280-
281-
hash_for_each_possible(
282-
rules, rule, hash,
283-
rule_values_hash(KABI_RULE_TYPE_ENUMERATOR_IGNORE, target)) {
284-
if (rule->type == KABI_RULE_TYPE_ENUMERATOR_IGNORE &&
285-
!strcmp(target, rule->target)) {
286-
match = true;
287-
break;
288-
}
289-
}
290-
291-
free(target);
292-
return match;
292+
return !!find_enumerator_rule(KABI_RULE_TYPE_ENUMERATOR_IGNORE, fqn,
293+
field);
293294
}
294295

295296
bool kabi_get_enumerator_value(const char *fqn, const char *field,
296297
unsigned long *value)
297298
{
298-
bool match = false;
299299
struct rule *rule;
300-
char *target;
301300

302-
if (!stable)
303-
return false;
304-
if (!fqn || !*fqn || !field || !*field)
305-
return false;
306-
307-
target = get_enumerator_target(fqn, field);
308-
309-
hash_for_each_possible(rules, rule, hash,
310-
rule_values_hash(KABI_RULE_TYPE_ENUMERATOR_VALUE,
311-
target)) {
312-
if (rule->type == KABI_RULE_TYPE_ENUMERATOR_VALUE &&
313-
!strcmp(target, rule->target)) {
314-
*value = get_ulong_value(rule->value);
315-
match = true;
316-
break;
317-
}
301+
rule = find_enumerator_rule(KABI_RULE_TYPE_ENUMERATOR_VALUE, fqn,
302+
field);
303+
if (rule) {
304+
*value = get_ulong_value(rule->value);
305+
return true;
318306
}
319307

320-
free(target);
321-
return match;
308+
return false;
322309
}
323310

324311
void kabi_free(void)

0 commit comments

Comments
 (0)