#include "ast_t.h"
#include "adt/error.h"
#include "adt/util.h"
+#include "adt/strutil.h"
const char *get_entity_kind_name(entity_kind_t kind)
{
case ENTITY_LOCAL_LABEL: return "local label";
case ENTITY_TYPEDEF: return "typedef";
case ENTITY_NAMESPACE: return "namespace";
- case ENTITY_INVALID: break;
}
panic("Invalid entity kind encountered in get_entity_kind_name");
*
* @param kind the kind of the entity to allocate
*/
-entity_t *allocate_entity_zero(entity_kind_t kind)
+entity_t *allocate_entity_zero(entity_kind_t const kind, entity_namespace_t const namespc, symbol_t *const symbol)
{
- size_t size = get_entity_struct_size(kind);
- entity_t *entity = allocate_ast_zero(size);
- entity->kind = kind;
+ size_t size = get_entity_struct_size(kind);
+ entity_t *entity = allocate_ast_zero(size);
+ entity->kind = kind;
+ entity->base.namespc = namespc;
+ entity->base.symbol = symbol;
return entity;
}
+
+elf_visibility_tag_t get_elf_visibility_from_string(const char *string)
+{
+ if (streq(string, "default")) {
+ return ELF_VISIBILITY_DEFAULT;
+ } else if (streq(string, "hidden")) {
+ return ELF_VISIBILITY_HIDDEN;
+ } else if (streq(string, "internal")) {
+ return ELF_VISIBILITY_INTERNAL;
+ } else if (streq(string, "protected")) {
+ return ELF_VISIBILITY_PROTECTED;
+ } else {
+ return ELF_VISIBILITY_ERROR;
+ }
+}
+
+entity_t *skip_unnamed_bitfields(entity_t *entry)
+{
+ for (; entry != NULL; entry = entry->base.next) {
+ assert(entry->kind == ENTITY_COMPOUND_MEMBER);
+ if (!entry->compound_member.bitfield || entry->base.symbol != NULL)
+ break;
+ }
+ return entry;
+}