From: Matthias Braun Date: Wed, 26 May 2010 09:15:23 +0000 (+0000) Subject: remove the infrastructure for using a custom identifier module and simply always... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=4d6c06673e8fc5d144bfe16397697ff2812fc22e;p=libfirm remove the infrastructure for using a custom identifier module and simply always use the default UTF-8 one. Slightly cleanup the code while doing that [r27589] --- diff --git a/include/libfirm/firm_common.h b/include/libfirm/firm_common.h index 28b578b41..36c9b5bad 100644 --- a/include/libfirm/firm_common.h +++ b/include/libfirm/firm_common.h @@ -62,10 +62,10 @@ struct _firm_parameter_t { type_identify_if_t *ti_if; /** - * The interface for the ident module. - * If not set, the default libFirm ident module (using hash sets). + * dummy parameter + * (this used to hold an identifier module structure) */ - ident_if_t *id_if; + void *id_if; /** * dummy parameter diff --git a/include/libfirm/ident.h b/include/libfirm/ident.h index 3b159e53c..0c6c0ed65 100644 --- a/include/libfirm/ident.h +++ b/include/libfirm/ident.h @@ -24,61 +24,14 @@ * @version $Id$ * @brief * Declarations for identifiers in the firm library - * - * Identifiers are used in the firm library. This is the interface to it. */ -#ifndef FIRM_IDENT_IDENT_H -#define FIRM_IDENT_IDENT_H +#ifndef FIRM_IDENT_H +#define FIRM_IDENT_H +#include #include "firm_types.h" #include "begin.h" -/* Identifiers */ - -/** - * The ident module interface. - */ -struct ident_if_t { - /** The handle. */ - void *handle; - - /** - * Store a string and create an ident. - * This function may be NULL, new_id_from_chars() - * is then used to emulate its behavior. - * - * @param str the string which shall be stored - */ - ident *(*new_id_from_str)(void *handle, const char *str); - - /** - * Store a string and create an ident. - * - * @param str the string (or whatever) which shall be stored - * @param len the length of the data in bytes - */ - ident *(*new_id_from_chars)(void *handle, const char *str, int len); - - /** - * Returns a string represented by an ident. - */ - const char *(*get_id_str)(void *handle, ident *id); - - /** - * Returns the length of the string represented by an ident. - * This function may be NULL, get_id_str() is then used - * to emulate its behavior. - * - * @param id the ident - */ - int (*get_id_strlen)(void *handle, ident *id); - - /** - * Finish the ident module and frees all idents, may be NULL. - */ - void (*finish_ident)(void *handle); -}; - /** * Store a string and create an ident. * @@ -87,9 +40,7 @@ struct ident_if_t { * Copies the string. @p str must be zero terminated * * @param str the string which shall be stored - * * @return id a handle for the generated ident - * * @see get_id_str(), get_id_strlen() */ FIRM_API ident *new_id_from_str(const char *str); @@ -101,12 +52,10 @@ FIRM_API ident *new_id_from_str(const char *str); * * @param str the string (or whatever) which shall be stored * @param len the length of the data in bytes - * * @return id a handle for the generated ident - * * @see new_id_from_str(), get_id_strlen() */ -FIRM_API ident *new_id_from_chars(const char *str, int len); +FIRM_API ident *new_id_from_chars(const char *str, size_t len); /** * Returns a string represented by an ident. @@ -115,53 +64,46 @@ FIRM_API ident *new_id_from_chars(const char *str, int len); * NULL terminated. The string may not be changed. * * @param id the ident - * * @return cp a string - * * @see new_id_from_str(), new_id_from_chars(), get_id_strlen() */ -FIRM_API const char *get_id_str(ident *id); +FIRM_API const char *get_id_str(const ident *id); /** * Returns the length of the string represented by an ident. * * @param id the ident - * * @return len the length of the string - * * @see new_id_from_str(), new_id_from_chars(), get_id_str() */ -FIRM_API int get_id_strlen(ident *id); +FIRM_API size_t get_id_strlen(const ident *id); /** * Returns true if prefix is a prefix of an ident. * * @param prefix the prefix * @param id the ident - * * @see new_id_from_str(), new_id_from_chars(), get_id_str(), id_is_prefix() */ -FIRM_API int id_is_prefix(ident *prefix, ident *id); +FIRM_API int id_is_prefix(const ident *prefix, const ident *id); /** * Returns true if suffix is a suffix of an ident. * * @param suffix the suffix * @param id the ident - * * @see new_id_from_str(), new_id_from_chars(), get_id_str(), id_is_prefix() */ -FIRM_API int id_is_suffix(ident *suffix, ident *id); +FIRM_API int id_is_suffix(const ident *suffix, const ident *id); /** * Return true if an ident contains a given character. * * @param id the ident * @param c the character - * * @see new_id_from_str(), new_id_from_chars(), get_id_str() */ -FIRM_API int id_contains_char(ident *id, char c); +FIRM_API int id_contains_char(const ident *id, char c); /** * helper function for creating unique idents. It contains an internal counter @@ -169,29 +111,26 @@ FIRM_API int id_contains_char(ident *id, char c); */ FIRM_API ident *id_unique(const char *tag); -/** initializes the name mangling code */ -FIRM_API void firm_init_mangle (void); - /** Computes a definite name for this entity by concatenating the name of the owner type and the name of the entity with a separating "_". */ -FIRM_API ident *id_mangle_entity(ir_entity *ent); +FIRM_API ident *id_mangle_entity(const ir_entity *ent); /** mangle underscore: Returns a new ident that represents first_scnd. */ -FIRM_API ident *id_mangle_u(ident *first, ident* scnd); +FIRM_API ident *id_mangle_u(const ident *first, const ident* scnd); /** mangle dot: Returns a new ident that represents first.scnd. */ -FIRM_API ident *id_mangle_dot(ident *first, ident* scnd); +FIRM_API ident *id_mangle_dot(const ident *first, const ident* scnd); /** mangle: Returns a new ident that represents firstscnd. */ -FIRM_API ident *id_mangle(ident *first, ident* scnd); +FIRM_API ident *id_mangle(const ident *first, const ident* scnd); /** Returns a new ident that represents 'prefixscndsuffix'. */ -FIRM_API ident *id_mangle3(const char *prefix, ident *middle, +FIRM_API ident *id_mangle3(const char *prefix, const ident *middle, const char *suffix); /** returns a mangled name for a Win32 function using its calling convention */ -FIRM_API ident *id_decorate_win32_c_fkt(ir_entity *ent, ident *id); +FIRM_API ident *id_decorate_win32_c_fkt(const ir_entity *ent, const ident *id); #include "end.h" diff --git a/ir/common/firm.c b/ir/common/firm.c index 97987a336..e35f9cb9c 100644 --- a/ir/common/firm.c +++ b/ir/common/firm.c @@ -89,7 +89,7 @@ void ir_init(const firm_parameter_t *param) /* initialize firm flags */ firm_init_flags(); /* initialize all ident stuff */ - init_ident(def_params.id_if, 1024); + init_ident(); /* enhanced statistics, need idents and hooks */ if (def_params.enable_statistics != 0) firm_init_stat(def_params.enable_statistics); diff --git a/ir/ident/ident.c b/ir/ident/ident.c index 018ddc4ce..29ed01f2c 100644 --- a/ir/ident/ident.c +++ b/ir/ident/ident.c @@ -35,178 +35,73 @@ #include "ident_t.h" #include "set.h" #include "xmalloc.h" +#include "hashptr.h" -/* for debugging only, not the real implementation */ -struct _ident { - char reserved[sizeof(unsigned) + sizeof(size_t)]; - char data[1]; -}; +static set *id_set; -/** The current ident module implementation. */ -static ident_if_t impl; - -/** - * Stores a string in the ident module and returns a handle for the string. - * - * @param handle the handle for the set - * @param str the string which shall be stored - * @param len length of str in bytes - * - * @return id - a handle for the generated ident - * - * Default implementation using libfirm sets. - */ -static ident *set_new_id_from_chars(void *handle, const char *str, int len) +void init_ident(void) { - set *id_set = handle; - - return (ident *)set_hinsert0(id_set, str, len, ID_HASH(unsigned char, str, len)); + /* it's ok to use memcmp here, we check only strings */ + id_set = new_set(memcmp, 128); } -/** - * Stores a string in the ident module and returns a handle for the string. - * - * @param handle the handle for the set - * @param str the string (or whatever) which shall be stored - * - * Default implementation using libfirm sets. - */ -static ident *set_new_id_from_str(void *handle, const char *str) +ident *new_id_from_chars(const char *str, size_t len) { - assert(str); - return set_new_id_from_chars(handle, str, strlen(str)); -} - -/** - * Returns a string represented by an ident. - * - * @param handle the handle for the set - * @param id the ident - * - * Default implementation using libfirm sets. - */ -static const char *set_get_id_str(void *handle, ident *id) -{ - struct set_entry *entry = (struct set_entry *)id; - (void) handle; - - return (const char *)entry->dptr; -} - -/** - * Returns the length of the string represented by an ident. - * - * @param handle the handle for the set - * @param id the ident - * - * Default implementation using libfirm sets. - */ -static int set_get_id_strlen(void *handle, ident *id) -{ - struct set_entry *entry = (struct set_entry *)id; - (void) handle; - - return entry->size; -} - -/** - * Default implementation using libfirm sets. - */ -static void set_finish_ident(void *handle) -{ - set *id_set = handle; - - del_set(id_set); -} - -/** - * Default implementation if no new_id_from_str() is provided. - */ -static ident *def_new_id_from_str(void *handle, const char *str) -{ - return impl.new_id_from_chars(handle, str, strlen(str)); -} - -/** - * Default implementation if no get_id_strlen() is provided. - */ -static int def_get_id_strlen(void *handle, ident *id) -{ - return strlen(impl.get_id_str(handle, id)); -} - -/* Initialize the ident module. */ -void init_ident(ident_if_t *id_if, int initial_n_idents) -{ - if (id_if) { - memcpy(&impl, id_if, sizeof(impl)); - - if (! impl.new_id_from_str) - impl.new_id_from_str = def_new_id_from_str; - if (! impl.get_id_strlen) - impl.get_id_strlen = def_get_id_strlen; - } else { - impl.new_id_from_str = set_new_id_from_str; - impl.new_id_from_chars = set_new_id_from_chars; - impl.get_id_str = set_get_id_str; - impl.get_id_strlen = set_get_id_strlen; - impl.finish_ident = set_finish_ident; - - /* it's ok to use memcmp here, we check only strings */ - impl.handle = new_set(memcmp, initial_n_idents); - } + unsigned hash = HASH_STR(str, len); + ident *result = (ident*) set_hinsert0(id_set, str, len, hash); + return result; } ident *new_id_from_str(const char *str) { - assert(str != NULL); - return impl.new_id_from_str(impl.handle, str); -} - -ident *new_id_from_chars(const char *str, int len) -{ - return impl.new_id_from_chars(impl.handle, str, len); + assert(str != NULL); + return new_id_from_chars(str, strlen(str)); } -const char *get_id_str(ident *id) +const char *get_id_str(const ident *id) { - return impl.get_id_str(impl.handle, id); + struct set_entry *entry = (struct set_entry*) id; + return (const char*) entry->dptr; } -int get_id_strlen(ident *id) +size_t get_id_strlen(const ident *id) { - return impl.get_id_strlen(impl.handle, id); + struct set_entry *entry = (struct set_entry*) id; + return entry->size; } void finish_ident(void) { - if (impl.finish_ident) - impl.finish_ident(impl.handle); + del_set(id_set); + id_set = NULL; } -int id_is_prefix(ident *prefix, ident *id) +int id_is_prefix(const ident *prefix, const ident *id) { - if (get_id_strlen(prefix) > get_id_strlen(id)) return 0; - return 0 == memcmp(get_id_str(prefix), get_id_str(id), get_id_strlen(prefix)); + size_t prefix_len = get_id_strlen(prefix); + if (prefix_len > get_id_strlen(id)) + return 0; + return 0 == memcmp(get_id_str(prefix), get_id_str(id), prefix_len); } -int id_is_suffix(ident *suffix, ident *id) +int id_is_suffix(const ident *suffix, const ident *id) { - int suflen = get_id_strlen(suffix); - int idlen = get_id_strlen(id); - const char *part; + size_t suflen = get_id_strlen(suffix); + size_t idlen = get_id_strlen(id); + const char *part; - if (suflen > idlen) return 0; + if (suflen > idlen) + return 0; - part = get_id_str(id); - part = part + (idlen - suflen); + part = get_id_str(id); + part = part + (idlen - suflen); - return 0 == memcmp(get_id_str(suffix), part, suflen); + return 0 == memcmp(get_id_str(suffix), part, suflen); } -int id_contains_char(ident *id, char c) +int id_contains_char(const ident *id, char c) { - return strchr(get_id_str(id), c) != NULL; + return strchr(get_id_str(id), c) != NULL; } ident *id_unique(const char *tag) diff --git a/ir/ident/ident_t.h b/ir/ident/ident_t.h index 5919fbc00..b81aff68d 100644 --- a/ir/ident/ident_t.h +++ b/ir/ident/ident_t.h @@ -30,24 +30,15 @@ /** * Initialize the ident module. - * - * @param id_if The ident module interface, if NULL, the default - * libFirm ident module will be used. - * @param initial_n_idents Only used in the default libFirm ident module, initial - * number of entries in the hash table. */ -void init_ident (ident_if_t *id_if, int initial_n_idents); +void init_ident(void); /** * Finishes the ident module, frees all entries. */ -void finish_ident (void); +void finish_ident(void); -/** The hash function of the internal ident module implementation. */ -#define ID_HASH(type, str, len) \ - ((( ((type *)(str))[0] * 33 \ - + ((type *)(str))[(len)>>1]) * 31 \ - + ((type *)(str))[(len)-1]) * 9 \ - + (len)) +/** initializes the name mangling code */ +void firm_init_mangle(void); #endif diff --git a/ir/ident/mangle.c b/ir/ident/mangle.c index 175bd21a4..da790c677 100644 --- a/ir/ident/mangle.c +++ b/ir/ident/mangle.c @@ -25,9 +25,9 @@ */ #include "config.h" -# include +#include -#include "ident.h" +#include "ident_t.h" #include "obst.h" /* Make types visible to allow most efficient access */ @@ -39,13 +39,13 @@ static struct obstack mangle_obst; /** returned a mangled type name, currently no mangling */ -static inline ident *mangle_type(ir_type *tp) +static inline ident *mangle_type(const ir_type *tp) { assert(tp->kind == k_type); return tp->name; } -ident *id_mangle_entity(ir_entity *ent) +ident *id_mangle_entity(const ir_entity *ent) { ident *type_id; char *cp; @@ -65,7 +65,7 @@ ident *id_mangle_entity(ir_entity *ent) /* Returns a new ident that represents 'firstscnd'. */ -ident *id_mangle(ident *first, ident *scnd) +ident *id_mangle(const ident *first, const ident *scnd) { char *cp; int len; @@ -81,7 +81,7 @@ ident *id_mangle(ident *first, ident *scnd) } /** Returns a new ident that represents 'prefixscndsuffix'. */ -ident *id_mangle3(const char *prefix, ident *scnd, const char *suffix) +ident *id_mangle3(const char *prefix, const ident *scnd, const char *suffix) { char *cp; int len; @@ -98,7 +98,7 @@ ident *id_mangle3(const char *prefix, ident *scnd, const char *suffix) } /** Returns a new ident that represents firstscnd. */ -static ident *id_mangle_3(ident *first, char c, ident* scnd) +static ident *id_mangle_3(const ident *first, char c, const ident* scnd) { char *cp; int len; @@ -115,19 +115,19 @@ static ident *id_mangle_3(ident *first, char c, ident* scnd) } /* Returns a new ident that represents first_scnd. */ -ident *id_mangle_u(ident *first, ident* scnd) +ident *id_mangle_u(const ident *first, const ident* scnd) { return id_mangle_3(first, '_', scnd); } /* Returns a new ident that represents first.scnd. */ -ident *id_mangle_dot(ident *first, ident* scnd) +ident *id_mangle_dot(const ident *first, const ident* scnd) { return id_mangle_3(first, '.', scnd); } /* returns a mangled name for a Win32 function using it's calling convention */ -ident *id_decorate_win32_c_fkt(ir_entity *ent, ident *id) +ident *id_decorate_win32_c_fkt(const ir_entity *ent, const ident *id) { ir_type *tp = get_entity_type(ent); unsigned cc_mask = get_method_calling_convention(tp);