X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Fppc%2Fcap.c;h=48ac5bca8d477a2e2a94fbd60416bde4e96481a1;hb=22aa1d51198689f5f3f01a874b405bf4449cbfb0;hp=1c45f4c724eb9d654f13988be3062d719406f60d;hpb=e98fe4f7b54cbdf29aef9287bbb1bea8801dd05a;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/ppc/cap.c b/sim/ppc/cap.c index 1c45f4c724..48ac5bca8d 100644 --- a/sim/ppc/cap.c +++ b/sim/ppc/cap.c @@ -1,10 +1,10 @@ /* This file is part of the program psim. - Copyright (C) 1994-1995, Andrew Cagney + Copyright (C) 1994-1995,1997, Andrew Cagney This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -13,8 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + along with this program; if not, see . */ @@ -22,15 +21,11 @@ #ifndef _CAP_C_ #define _CAP_C_ -#ifndef STATIC_INLINE_CAP -#define STATIC_INLINE_CAP STATIC_INLINE -#endif - #include "cap.h" typedef struct _cap_mapping cap_mapping; struct _cap_mapping { - unsigned32 external; + unsigned_cell external; void *internal; cap_mapping *next; }; @@ -40,28 +35,40 @@ struct _cap { cap_mapping *mappings; }; -INLINE_CAP cap * +INLINE_CAP\ +(cap *) cap_create(const char *key) { return ZALLOC(cap); } -INLINE_CAP void -cap_init(cap *map) +INLINE_CAP\ +(void) +cap_init(cap *db) { - cap_mapping *current_mapping = map->mappings; - while (current_mapping != NULL) { - cap_mapping *tbd = current_mapping; - current_mapping = tbd->next; - zfree(tbd); + cap_mapping *current_map = db->mappings; + if (current_map != NULL) { + db->nr_mappings = db->mappings->external; + /* verify that the mappings that were not removed are in sequence + down to nr 1 */ + while (current_map->next != NULL) { + if (current_map->external != current_map->next->external + 1) + error("cap: cap database possibly corrupt"); + current_map = current_map->next; + } + ASSERT(current_map->next == NULL); + if (current_map->external != 1) + error("cap: cap database possibly currupt"); + } + else { + db->nr_mappings = 0; } - map->nr_mappings = 0; - map->mappings = (cap_mapping*)0; } -INLINE_CAP void * +INLINE_CAP\ +(void *) cap_internal(cap *db, - signed32 external) + signed_cell external) { cap_mapping *current_map = db->mappings; while (current_map != NULL) { @@ -72,7 +79,8 @@ cap_internal(cap *db, return (void*)0; } -INLINE_CAP signed32 +INLINE_CAP\ +(signed_cell) cap_external(cap *db, void *internal) { @@ -82,13 +90,44 @@ cap_external(cap *db, return current_map->external; current_map = current_map->next; } - current_map = ZALLOC(cap_mapping); - current_map->next = db->mappings; - current_map->internal = internal; - db->nr_mappings += 1; - current_map->external = db->nr_mappings; - db->mappings = current_map; - return current_map->external; + return 0; +} + +INLINE_CAP\ +(void) +cap_add(cap *db, + void *internal) +{ + if (cap_external(db, internal) != 0) { + error("cap: attempting to add an object already in the data base"); + } + else { + /* insert at the front making things in decending order */ + cap_mapping *new_map = ZALLOC(cap_mapping); + new_map->next = db->mappings; + new_map->internal = internal; + db->nr_mappings += 1; + new_map->external = db->nr_mappings; + db->mappings = new_map; + } +} + +INLINE_CAP\ +(void) +cap_remove(cap *db, + void *internal) +{ + cap_mapping **current_map = &db->mappings; + while (*current_map != NULL) { + if ((*current_map)->internal == internal) { + cap_mapping *delete = *current_map; + *current_map = delete->next; + free(delete); + return; + } + current_map = &(*current_map)->next; + } + error("cap: attempt to remove nonexistant internal object"); } #endif