ld: Require GCC 5 for Build pr25749-1b (-pie -fPIE)
[deliverable/binutils-gdb.git] / sim / ppc / cap.c
index 1c45f4c724eb9d654f13988be3062d719406f60d..48ac5bca8d477a2e2a94fbd60416bde4e96481a1 100644 (file)
@@ -1,10 +1,10 @@
 /*  This file is part of the program psim.
 
 /*  This file is part of the program psim.
 
-    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
+    Copyright (C) 1994-1995,1997, Andrew Cagney <cagney@highland.com.au>
 
     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
 
     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,
     (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
     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 <http://www.gnu.org/licenses/>.
  
     */
 
  
     */
 
 #ifndef _CAP_C_
 #define _CAP_C_
 
 #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 {
 #include "cap.h"
 
 typedef struct _cap_mapping cap_mapping;
 struct _cap_mapping {
-  unsigned32 external;
+  unsigned_cell external;
   void *internal;
   cap_mapping *next;
 };
   void *internal;
   cap_mapping *next;
 };
@@ -40,28 +35,40 @@ struct _cap {
   cap_mapping *mappings;
 };
 
   cap_mapping *mappings;
 };
 
-INLINE_CAP cap *
+INLINE_CAP\
+(cap *)
 cap_create(const char *key)
 {
   return ZALLOC(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,
 cap_internal(cap *db,
-            signed32 external)
+            signed_cell external)
 {
   cap_mapping *current_map = db->mappings;
   while (current_map != NULL) {
 {
   cap_mapping *current_map = db->mappings;
   while (current_map != NULL) {
@@ -72,7 +79,8 @@ cap_internal(cap *db,
   return (void*)0;
 }
 
   return (void*)0;
 }
 
-INLINE_CAP signed32
+INLINE_CAP\
+(signed_cell)
 cap_external(cap *db,
             void *internal)
 {
 cap_external(cap *db,
             void *internal)
 {
@@ -82,13 +90,44 @@ cap_external(cap *db,
       return current_map->external;
     current_map = current_map->next;
   }
       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
 }
 
 #endif
This page took 0.024629 seconds and 4 git commands to generate.