C++ keyword cleanliness, mostly auto-generated
[deliverable/binutils-gdb.git] / gdb / guile / scm-symbol.c
index 53cc2721b5fa7901f0b4c2756630fcebff057123..1891237975778c54c0f90edd9d2b8ff552a6daa9 100644 (file)
@@ -1,6 +1,6 @@
 /* Scheme interface to symbols.
 
-   Copyright (C) 2008-2014 Free Software Foundation, Inc.
+   Copyright (C) 2008-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -22,7 +22,6 @@
 
 #include "defs.h"
 #include "block.h"
-#include "exceptions.h"
 #include "frame.h"
 #include "symtab.h"
 #include "objfiles.h"
@@ -51,6 +50,13 @@ static SCM domain_keyword;
 static SCM frame_keyword;
 
 static const struct objfile_data *syscm_objfile_data_key;
+static struct gdbarch_data *syscm_gdbarch_data_key;
+
+struct syscm_gdbarch_data
+{
+  /* Hash table to implement eqable gdbarch symbols.  */
+  htab_t htab;
+};
 \f
 /* Administrivia for symbol smobs.  */
 
@@ -76,34 +82,47 @@ syscm_eq_symbol_smob (const void *ap, const void *bp)
          && a->symbol != NULL);
 }
 
+static void *
+syscm_init_arch_symbols (struct gdbarch *gdbarch)
+{
+  struct syscm_gdbarch_data *data
+    = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct syscm_gdbarch_data);
+
+  data->htab = gdbscm_create_eqable_gsmob_ptr_map (syscm_hash_symbol_smob,
+                                                  syscm_eq_symbol_smob);
+  return data;
+}
+
 /* Return the struct symbol pointer -> SCM mapping table.
    It is created if necessary.  */
 
 static htab_t
-syscm_objfile_symbol_map (struct symbol *symbol)
+syscm_get_symbol_map (struct symbol *symbol)
 {
-  struct objfile *objfile = SYMBOL_SYMTAB (symbol)->objfile;
-  htab_t htab = objfile_data (objfile, syscm_objfile_data_key);
+  htab_t htab;
 
-  if (htab == NULL)
+  if (SYMBOL_OBJFILE_OWNED (symbol))
     {
-      htab = gdbscm_create_eqable_gsmob_ptr_map (syscm_hash_symbol_smob,
-                                                syscm_eq_symbol_smob);
-      set_objfile_data (objfile, syscm_objfile_data_key, htab);
-    }
-
-  return htab;
-}
+      struct objfile *objfile = symbol_objfile (symbol);
 
-/* The smob "mark" function for <gdb:symbol>.  */
+      htab = objfile_data (objfile, syscm_objfile_data_key);
+      if (htab == NULL)
+       {
+         htab = gdbscm_create_eqable_gsmob_ptr_map (syscm_hash_symbol_smob,
+                                                    syscm_eq_symbol_smob);
+         set_objfile_data (objfile, syscm_objfile_data_key, htab);
+       }
+    }
+  else
+    {
+      struct gdbarch *gdbarch = symbol_arch (symbol);
+      struct syscm_gdbarch_data *data = gdbarch_data (gdbarch,
+                                                     syscm_gdbarch_data_key);
 
-static SCM
-syscm_mark_symbol_smob (SCM self)
-{
-  symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (self);
+      htab = data->htab;
+    }
 
-  /* Do this last.  */
-  return gdbscm_mark_eqable_gsmob (&s_smob->base);
+  return htab;
 }
 
 /* The smob "free" function for <gdb:symbol>.  */
@@ -115,7 +134,7 @@ syscm_free_symbol_smob (SCM self)
 
   if (s_smob->symbol != NULL)
     {
-      htab_t htab = syscm_objfile_symbol_map (s_smob->symbol);
+      htab_t htab = syscm_get_symbol_map (s_smob->symbol);
 
       gdbscm_clear_eqable_gsmob_ptr_slot (htab, &s_smob->base);
     }
@@ -159,7 +178,7 @@ syscm_make_symbol_smob (void)
 
   s_smob->symbol = NULL;
   s_scm = scm_new_smob (symbol_smob_tag, (scm_t_bits) s_smob);
-  gdbscm_init_eqable_gsmob (&s_smob->base);
+  gdbscm_init_eqable_gsmob (&s_smob->base, s_scm);
 
   return s_scm;
 }
@@ -193,7 +212,7 @@ syscm_scm_from_symbol (struct symbol *symbol)
 
   /* If we've already created a gsmob for this symbol, return it.
      This makes symbols eq?-able.  */
-  htab = syscm_objfile_symbol_map (symbol);
+  htab = syscm_get_symbol_map (symbol);
   s_smob_for_lookup.symbol = symbol;
   slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &s_smob_for_lookup.base);
   if (*slot != NULL)
@@ -202,7 +221,7 @@ syscm_scm_from_symbol (struct symbol *symbol)
   s_scm = syscm_make_symbol_smob ();
   s_smob = (symbol_smob *) SCM_SMOB_DATA (s_scm);
   s_smob->symbol = symbol;
-  gdbscm_fill_eqable_gsmob_ptr_slot (slot, &s_smob->base, s_scm);
+  gdbscm_fill_eqable_gsmob_ptr_slot (slot, &s_smob->base);
 
   return s_scm;
 }
@@ -331,8 +350,9 @@ gdbscm_symbol_type (SCM self)
   return tyscm_scm_from_type (SYMBOL_TYPE (symbol));
 }
 
-/* (symbol-symtab <gdb:symbol>) -> <gdb:symtab>
-   Return the symbol table of SELF.  */
+/* (symbol-symtab <gdb:symbol>) -> <gdb:symtab> | #f
+   Return the symbol table of SELF.
+   If SELF does not have a symtab (it is arch-owned) return #f.  */
 
 static SCM
 gdbscm_symbol_symtab (SCM self)
@@ -341,7 +361,9 @@ gdbscm_symbol_symtab (SCM self)
     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
   const struct symbol *symbol = s_smob->symbol;
 
-  return stscm_scm_from_symtab (SYMBOL_SYMTAB (symbol));
+  if (!SYMBOL_OBJFILE_OWNED (symbol))
+    return SCM_BOOL_F;
+  return stscm_scm_from_symtab (symbol_symtab (symbol));
 }
 
 /* (symbol-name <gdb:symbol>) -> string */
@@ -412,11 +434,11 @@ gdbscm_symbol_constant_p (SCM self)
   symbol_smob *s_smob
     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
   const struct symbol *symbol = s_smob->symbol;
-  enum address_class class;
+  enum address_class theclass;
 
-  class = SYMBOL_CLASS (symbol);
+  theclass = SYMBOL_CLASS (symbol);
 
-  return scm_from_bool (class == LOC_CONST || class == LOC_CONST_BYTES);
+  return scm_from_bool (theclass == LOC_CONST || theclass == LOC_CONST_BYTES);
 }
 
 /* (symbol-function? <gdb:symbol>) -> boolean */
@@ -427,11 +449,11 @@ gdbscm_symbol_function_p (SCM self)
   symbol_smob *s_smob
     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
   const struct symbol *symbol = s_smob->symbol;
-  enum address_class class;
+  enum address_class theclass;
 
-  class = SYMBOL_CLASS (symbol);
+  theclass = SYMBOL_CLASS (symbol);
 
-  return scm_from_bool (class == LOC_BLOCK);
+  return scm_from_bool (theclass == LOC_BLOCK);
 }
 
 /* (symbol-variable? <gdb:symbol>) -> boolean */
@@ -442,14 +464,14 @@ gdbscm_symbol_variable_p (SCM self)
   symbol_smob *s_smob
     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
   const struct symbol *symbol = s_smob->symbol;
-  enum address_class class;
+  enum address_class theclass;
 
-  class = SYMBOL_CLASS (symbol);
+  theclass = SYMBOL_CLASS (symbol);
 
   return scm_from_bool (!SYMBOL_IS_ARGUMENT (symbol)
-                       && (class == LOC_LOCAL || class == LOC_REGISTER
-                           || class == LOC_STATIC || class == LOC_COMPUTED
-                           || class == LOC_OPTIMIZED_OUT));
+                       && (theclass == LOC_LOCAL || theclass == LOC_REGISTER
+                           || theclass == LOC_STATIC || theclass == LOC_COMPUTED
+                           || theclass == LOC_OPTIMIZED_OUT));
 }
 
 /* (symbol-needs-frame? <gdb:symbol>) -> boolean
@@ -619,7 +641,7 @@ gdbscm_lookup_global_symbol (SCM name_scm, SCM rest)
 
   TRY_CATCH (except, RETURN_MASK_ALL)
     {
-      symbol = lookup_symbol_global (name, NULL, domain);
+      symbol = lookup_global_symbol (name, NULL, domain);
     }
   do_cleanups (cleanups);
   GDBSCM_HANDLE_GDB_EXCEPTION (except);
@@ -759,7 +781,6 @@ gdbscm_initialize_symbols (void)
 {
   symbol_smob_tag
     = gdbscm_make_smob_type (symbol_smob_name, sizeof (symbol_smob));
-  scm_set_smob_mark (symbol_smob_tag, syscm_mark_symbol_smob);
   scm_set_smob_free (symbol_smob_tag, syscm_free_symbol_smob);
   scm_set_smob_print (symbol_smob_tag, syscm_print_symbol_smob);
 
@@ -774,4 +795,8 @@ gdbscm_initialize_symbols (void)
      invalidate symbols when an object file is about to be deleted.  */
   syscm_objfile_data_key
     = register_objfile_data_with_cleanup (NULL, syscm_del_objfile_symbols);
+
+  /* Arch-specific symbol data.  */
+  syscm_gdbarch_data_key
+    = gdbarch_data_register_post_init (syscm_init_arch_symbols);
 }
This page took 0.027222 seconds and 4 git commands to generate.