Expand each structure type only once per exported symbol. This is necessary to support self-referential structures, which would otherwise result in infinite recursion, and it's sufficient for catching ABI changes. Types defined in .c files are opaque to external users and thus cannot affect the ABI. Consider type definitions in .c files to be declarations to prevent opaque types from changing symbol versions. Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Reviewed-by: Petr Pavlu <petr.pavlu@suse.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
51 lines
869 B
C
51 lines
869 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 2024 Google LLC
|
|
*/
|
|
|
|
#include "gendwarfksyms.h"
|
|
|
|
struct cache_item {
|
|
unsigned long key;
|
|
int value;
|
|
struct hlist_node hash;
|
|
};
|
|
|
|
void cache_set(struct cache *cache, unsigned long key, int value)
|
|
{
|
|
struct cache_item *ci;
|
|
|
|
ci = xmalloc(sizeof(struct cache_item));
|
|
ci->key = key;
|
|
ci->value = value;
|
|
hash_add(cache->cache, &ci->hash, hash_32(key));
|
|
}
|
|
|
|
int cache_get(struct cache *cache, unsigned long key)
|
|
{
|
|
struct cache_item *ci;
|
|
|
|
hash_for_each_possible(cache->cache, ci, hash, hash_32(key)) {
|
|
if (ci->key == key)
|
|
return ci->value;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
void cache_init(struct cache *cache)
|
|
{
|
|
hash_init(cache->cache);
|
|
}
|
|
|
|
void cache_free(struct cache *cache)
|
|
{
|
|
struct hlist_node *tmp;
|
|
struct cache_item *ci;
|
|
|
|
hash_for_each_safe(cache->cache, ci, tmp, hash) {
|
|
free(ci);
|
|
}
|
|
|
|
hash_init(cache->cache);
|
|
}
|