public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  archer-jankratochvil-entryval: Fixed.
@ 2011-07-08 20:09 jkratoch
  0 siblings, 0 replies; only message in thread
From: jkratoch @ 2011-07-08 20:09 UTC (permalink / raw)
  To: archer-commits

The branch, archer-jankratochvil-entryval has been updated
       via  a488ff00883db8f3c28fba76741d098a22eb07fd (commit)
       via  b752d06ba2f64cb3b99a1d3df67e7e1528e68d5b (commit)
      from  ab247a5ebe8f153d10d53e830753309c3527c1b6 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit a488ff00883db8f3c28fba76741d098a22eb07fd
Author: Jan Kratochvil <jan.kratochvil@redhat.com>
Date:   Fri Jul 8 22:08:15 2011 +0200

    Fixed.

commit b752d06ba2f64cb3b99a1d3df67e7e1528e68d5b
Author: Jan Kratochvil <jan.kratochvil@redhat.com>
Date:   Fri Jul 8 22:01:59 2011 +0200

    compilable, not crashing, not working.

-----------------------------------------------------------------------

Summary of changes:
 gdb/block.c                 |   65 ++-----
 gdb/block.h                 |    2 +-
 gdb/dwarf2-frame-tailcall.c |    2 +-
 gdb/dwarf2loc.c             |  142 +++++---------
 gdb/dwarf2read.c            |  451 ++++++++++++++++++++-----------------------
 gdb/gdb-gdb.py              |   11 +-
 gdb/gdbtypes.c              |   10 +-
 gdb/gdbtypes.h              |   36 ++--
 gdb/symtab.h                |    3 +
 9 files changed, 309 insertions(+), 413 deletions(-)

First 500 lines of diff:
diff --git a/gdb/block.c b/gdb/block.c
index 942b1d8..6b58aaa 100644
--- a/gdb/block.c
+++ b/gdb/block.c
@@ -95,9 +95,9 @@ block_inlined_p (const struct block *bl)
    is none.  PBLOCK is a pointer to the block.  If PBLOCK is NULL, we
    don't pass this information back to the caller.  */
 
-static struct blockvector *
-blockvector_for_pc_sect_1 (CORE_ADDR pc, struct obj_section *section,
-			   struct block **pblock, struct symtab *symtab)
+struct blockvector *
+blockvector_for_pc_sect (CORE_ADDR pc, struct obj_section *section,
+			 struct block **pblock, struct symtab *symtab)
 {
   struct block *b;
   int bot, top, half;
@@ -162,60 +162,29 @@ blockvector_for_pc_sect_1 (CORE_ADDR pc, struct obj_section *section,
   return 0;
 }
 
-/* Wrapper for blockvector_for_pc_sect_1 masking out TYPE_CODE_CALL_SITE blocks
-   for the callers.  */
+/* Return call_site for specified PC.  Return NULL if it cannot be
+   found.  */
 
-struct blockvector *
-blockvector_for_pc_sect (CORE_ADDR pc, struct obj_section *section,
-			 struct block **pblock, struct symtab *symtab)
+struct call_site *
+call_site_for_pc (CORE_ADDR pc)
 {
-  struct blockvector *bv;
-
-  bv = blockvector_for_pc_sect_1 (pc, section, pblock, symtab);
+  struct symtab *symtab;
+  void **slot;
+  struct call_site call_site_local;
 
-  if (bv && pblock)
-    while (BLOCK_FUNCTION (*pblock) != NULL
-	   && TYPE_CODE (SYMBOL_TYPE (BLOCK_FUNCTION (*pblock)))
-	      == TYPE_CODE_CALL_SITE)
-      *pblock = BLOCK_SUPERBLOCK (*pblock);
-
-  return bv;
-}
+  /* -1 as tail call PC is already behind the compilation unit range.  */
 
-/* Return TYPE_CODE_CALL_SITE symbol for specified PC.  Return NULL if it
-   cannot be found.  */
+  symtab = find_pc_symtab (pc - 1);
 
-struct call_site_stuff *
-call_site_stuff_for_pc (CORE_ADDR pc)
-{
-  struct block *b;
-  struct symbol *sym;
-  struct type *type;
-  struct call_site_stuff *call_site_stuff;
-
-  /* GCC nests the block according to where the call/jump itself belongs.
-     Match the compensation at read_call_site_scope.  */
-  pc--;
-
-  if (!blockvector_for_pc_sect_1 (pc, find_pc_mapped_section (pc), &b, NULL))
+  if (symtab == NULL || symtab->call_site_htab == NULL)
     return NULL;
 
-  sym = BLOCK_FUNCTION (b);
-
-  /* It cannot be a TYPE_CODE_CALL_SITE block as TYPE_CODE_CALL_SITE has never
-     any child blocks.  */
-  if (sym == NULL)
-    return NULL;
-
-  if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_CALL_SITE)
+  call_site_local.pc = pc;
+  slot = htab_find_slot (symtab->call_site_htab, &call_site_local, NO_INSERT);
+  if (slot == NULL)
     return NULL;
 
-  type = SYMBOL_TYPE (sym);
-  gdb_assert (TYPE_CODE (type) == TYPE_CODE_CALL_SITE);
-  gdb_assert (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_CALL_SITE);
-  call_site_stuff = TYPE_MAIN_TYPE (type)->type_specific.call_site_stuff;
-
-  return call_site_stuff;
+  return *slot;
 }
 
 /* Return the blockvector immediately containing the innermost lexical block
diff --git a/gdb/block.h b/gdb/block.h
index fbda72a..6888996 100644
--- a/gdb/block.h
+++ b/gdb/block.h
@@ -142,7 +142,7 @@ extern struct blockvector *blockvector_for_pc_sect (CORE_ADDR,
 						    struct block **,
                                                     struct symtab *);
 
-extern struct call_site_stuff *call_site_stuff_for_pc (CORE_ADDR pc);
+extern struct call_site *call_site_for_pc (CORE_ADDR pc);
 
 extern struct block *block_for_pc (CORE_ADDR);
 
diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c
index 9a198c5..f23d2cc 100644
--- a/gdb/dwarf2-frame-tailcall.c
+++ b/gdb/dwarf2-frame-tailcall.c
@@ -283,7 +283,7 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame,
 
       /* Simulate frame_unwind_pc without setting this_frame->prev_pc.p.  */
       prev_pc = frame_unwind_register_unsigned (this_frame, pc_regnum);
-      if (call_site_stuff_for_pc (prev_pc) == NULL)
+      if (call_site_for_pc (prev_pc) == NULL)
 	break;
 
       /* call_site_find_chain can throw an exception.  */
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 96a9258..5e4e4e3 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -326,10 +326,10 @@ show_tailcall_debug (struct ui_file *file, int from_tty,
    CALLER_FRAME can be NULL if it is not known.  */
 
 static CORE_ADDR
-call_site_stuff_to_target_addr (struct call_site_stuff *specific,
-				struct frame_info *caller_frame)
+call_site_to_target_addr (struct call_site *call_site,
+			  struct frame_info *caller_frame)
 {
-  switch (FIELD_LOC_KIND (specific->target))
+  switch (FIELD_LOC_KIND (call_site->target))
     {
     case FIELD_LOC_KIND_DWARF_BLOCK:
       {
@@ -338,11 +338,11 @@ call_site_stuff_to_target_addr (struct call_site_stuff *specific,
 	struct type *caller_core_addr_type;
 	struct gdbarch *caller_arch;
 
-	dwarf_block = FIELD_DWARF_BLOCK (specific->target);
-	if (! dwarf_block)
+	dwarf_block = FIELD_DWARF_BLOCK (call_site->target);
+	if (!dwarf_block)
 	  throw_error (NOT_FOUND_ERROR,
 		       _("DW_AT_GNU_call_site_target is not specified"));
-	if (! caller_frame)
+	if (!caller_frame)
 	  throw_error (NOT_FOUND_ERROR,
 		       _("DW_AT_GNU_call_site_target DWARF block resolving "
 			 "requires known frame which is currently not "
@@ -359,12 +359,13 @@ call_site_stuff_to_target_addr (struct call_site_stuff *specific,
 	else
 	  return value_as_address (val);
       }
+
     case FIELD_LOC_KIND_PHYSNAME:
       {
 	const char *physname;
 	struct minimal_symbol *msym;
 
-	physname = FIELD_STATIC_PHYSNAME (specific->target);
+	physname = FIELD_STATIC_PHYSNAME (call_site->target);
 	msym = lookup_minimal_symbol_text (physname, NULL);
 	if (msym == NULL)
 	  throw_error (NOT_FOUND_ERROR,
@@ -372,24 +373,25 @@ call_site_stuff_to_target_addr (struct call_site_stuff *specific,
 		       physname);
 	return SYMBOL_VALUE_ADDRESS (msym);
       }
+
     case FIELD_LOC_KIND_PHYSADDR:
-      return FIELD_STATIC_PHYSADDR (specific->target);
+      return FIELD_STATIC_PHYSADDR (call_site->target);
+
     default:
       internal_error (__FILE__, __LINE__, _("invalid call site target kind"));
     }
 }
 
-/* Convert function entry point exact address ADDR to the function's
-   TYPE_SPECIFIC.FUNC_STUFF.  */
+/* Convert function entry point exact address ADDR to the function which is
+   compliant with TAIL_CALL_LIST_COMPLETE condition.  */
 
-static struct func_type *
-addr_to_func_specific (struct gdbarch *gdbarch, CORE_ADDR addr)
+static struct symbol *
+addr_to_tail_call_list_complete_func (struct gdbarch *gdbarch, CORE_ADDR addr)
 {
   struct symbol *sym = find_pc_function (addr);
   struct type *type;
-  struct func_type *specific;
 
-  if (! sym || BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) != addr)
+  if (sym == NULL || BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) != addr)
     throw_error (NOT_FOUND_ERROR,
 		 _("DW_TAG_GNU_call_site resolving failed to find function "
 		   "name for address %s"),
@@ -398,16 +400,15 @@ addr_to_func_specific (struct gdbarch *gdbarch, CORE_ADDR addr)
   type = SYMBOL_TYPE (sym);
   gdb_assert (TYPE_CODE (type) == TYPE_CODE_FUNC);
   gdb_assert (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_FUNC);
-  specific = TYPE_MAIN_TYPE (type)->type_specific.func_stuff;
 
-  if (! specific->tail_call_list_complete)
+  if (!TYPE_TAIL_CALL_LIST_COMPLETE (type))
     throw_error (NOT_FOUND_ERROR,
 		 _("DW_TAG_GNU_call_site resolving has found "
 		   "function \"%s\" at %s which does not have complete list "
 		   "of DW_AT_GNU_tail_call entries"),
 		 SYMBOL_PRINT_NAME (sym), paddress (gdbarch, addr));
 
-  return specific;
+  return sym;
 }
 
 /* Verify function with entry point exact address ADDR can never call itself
@@ -417,7 +418,6 @@ addr_to_func_specific (struct gdbarch *gdbarch, CORE_ADDR addr)
 static void
 func_verify_no_selftailcall (struct gdbarch *gdbarch, CORE_ADDR verify_addr)
 {
-  struct func_type *func_specific;
   struct obstack addr_obstack;
   htab_t addr_hash;
   struct cleanup *old_chain;
@@ -440,27 +440,19 @@ func_verify_no_selftailcall (struct gdbarch *gdbarch, CORE_ADDR verify_addr)
   addr = verify_addr;
   for (;;)
     {
-      struct symbol *call_site_sym;
+      struct symbol *func_sym;
+      struct call_site *call_site;
 
-      func_specific = addr_to_func_specific (gdbarch, addr);
+      func_sym = addr_to_tail_call_list_complete_func (gdbarch, addr);
 
-      call_site_sym = func_specific->tail_call_list;
-      while (call_site_sym)
+      for (call_site = TYPE_TAIL_CALL_LIST (SYMBOL_TYPE (func_sym));
+	   call_site; call_site = call_site->tail_call_next)
 	{
-	  struct type *call_site_type = SYMBOL_TYPE (call_site_sym);
-	  struct call_site_stuff *call_site_stuff;
 	  CORE_ADDR target_addr;
 	  CORE_ADDR **slot;
 
-	  call_site_type = SYMBOL_TYPE (call_site_sym);
-	  gdb_assert (TYPE_CODE (call_site_type) == TYPE_CODE_CALL_SITE);
-	  gdb_assert (TYPE_SPECIFIC_FIELD (call_site_type)
-		      == TYPE_SPECIFIC_CALL_SITE);
-	  call_site_stuff
-	    = TYPE_MAIN_TYPE (call_site_type)->type_specific.call_site_stuff;
-
 	  /* CALLER_FRAME is not available for tail-call jumped frames.  */
-	  target_addr = call_site_stuff_to_target_addr (call_site_stuff,
+	  target_addr = call_site_to_target_addr (call_site,
 							NULL);
 
 	  if (target_addr == verify_addr)
@@ -489,9 +481,6 @@ func_verify_no_selftailcall (struct gdbarch *gdbarch, CORE_ADDR verify_addr)
 
 	      *slot = &todo->addr;
 	    }
-
-	  /* Next iteration.  */
-	  call_site_sym = call_site_stuff->tail_call_next;
 	}
 
       /* Next iteration.  */
@@ -509,7 +498,7 @@ func_verify_no_selftailcall (struct gdbarch *gdbarch, CORE_ADDR verify_addr)
 DEF_VEC_I (CORE_ADDR);
 
 static void
-free_call_site_stuffp_vecp (void *arg)
+free_call_sitep_vecp (void *arg)
 {
   VEC (CORE_ADDR) **vecp = arg;
 
@@ -648,7 +637,7 @@ call_site_find_chain_1 (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
 
   make_cleanup (free_current_contents, &retval);
 
-  make_cleanup (free_call_site_stuffp_vecp, &chain);
+  make_cleanup (free_call_sitep_vecp, &chain);
 
   call_site_addr = caller_pc;
   call_site_addr_p = 1;
@@ -656,12 +645,11 @@ call_site_find_chain_1 (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
   while (call_site_addr_p)
     {
       CORE_ADDR **slot, target_func_addr;
-      struct func_type *target_func_specific;
-      struct call_site_stuff *call_site_stuff;
-      struct symbol *target_call_site_sym;
+      struct symbol *target_func;
+      struct call_site *call_site, *target_call_site;
 
-      call_site_stuff = call_site_stuff_for_pc (call_site_addr);
-      if (call_site_stuff == NULL)
+      call_site = call_site_for_pc (call_site_addr);
+      if (call_site == NULL)
 	{
 	  /* We do not have closed all the jump possibilities.  */
 	  do_cleanups (old_chain);
@@ -669,8 +657,7 @@ call_site_find_chain_1 (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
 	}
 
       /* CALLER_FRAME is not available for tail-call jumped frames.  */
-      target_func_addr = call_site_stuff_to_target_addr (call_site_stuff,
-							 NULL);
+      target_func_addr = call_site_to_target_addr (call_site, NULL);
 
       if (target_func_addr == callee_func_pc)
 	{
@@ -681,37 +668,16 @@ call_site_find_chain_1 (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
 	    }
 	}
 
-      target_func_specific = addr_to_func_specific (gdbarch,
-						    target_func_addr);
-
-      if (target_func_specific->tail_call_list)
-	target_call_site_sym = target_func_specific->tail_call_list;
-      else
-	target_call_site_sym = NULL;
+      target_func = addr_to_tail_call_list_complete_func (gdbarch,
+							  target_func_addr);
+      target_call_site = TYPE_TAIL_CALL_LIST (SYMBOL_TYPE (target_func));
 
       do
 	{
-	  if (target_call_site_sym)
+	  if (target_call_site)
 	    {
-	      struct type *target_call_site_type;
-	      CORE_ADDR target_call_site_addr;
-
-	      target_call_site_type = SYMBOL_TYPE (target_call_site_sym);
-	      gdb_assert (TYPE_CODE (target_call_site_type)
-			  == TYPE_CODE_CALL_SITE);
-	      gdb_assert (TYPE_SPECIFIC_FIELD (target_call_site_type)
-			  == TYPE_SPECIFIC_CALL_SITE);
-
-	      gdb_assert (SYMBOL_CLASS (target_call_site_sym) == LOC_BLOCK);
-	      target_call_site_addr
-	        = BLOCK_START (SYMBOL_BLOCK_VALUE (target_call_site_sym));
-
-	      /* GCC nests the block according to where the call/jump itself belongs.
-		 Match the compensation at read_call_site_scope.  */
-	      target_call_site_addr++;
-
 	      slot = (CORE_ADDR **) htab_find_slot (addr_hash,
-						    &target_call_site_addr,
+						    &target_call_site->pc,
 						    INSERT);
 
 	      /* Do not repeat traversal through non-CALLEE_FUNC_PC functions.
@@ -719,14 +685,14 @@ call_site_find_chain_1 (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
 	      if (*slot == NULL)
 		{
 		  *slot = obstack_alloc (&addr_obstack, sizeof (**slot));
-		  **slot = target_call_site_addr;
+		  **slot = target_call_site->pc;
 
-		  VEC_safe_push (CORE_ADDR, chain, target_call_site_addr);
+		  VEC_safe_push (CORE_ADDR, chain, target_call_site->pc);
 		  break;
 		}
 	    }
 
-	  target_call_site_sym = NULL;
+	  target_call_site = NULL;
 	  while (! VEC_empty (CORE_ADDR, chain))
 	    {
 	      CORE_ADDR call_site_addr;
@@ -737,19 +703,15 @@ call_site_find_chain_1 (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
 					  NO_INSERT) != NULL);
 	      htab_remove_elt (addr_hash, &call_site_addr);
 
-	      call_site_stuff = call_site_stuff_for_pc (call_site_addr);
-	      gdb_assert (call_site_stuff != NULL);
+	      call_site = call_site_for_pc (call_site_addr);
+	      gdb_assert (call_site != NULL);
 
-	      if (call_site_stuff->tail_call_next)
-		{
-		  target_call_site_sym = call_site_stuff->tail_call_next;
-		  break;
-		}
-	      else
-		target_call_site_sym = NULL;
+	      target_call_site = call_site->tail_call_next;
+	      if (target_call_site)
+		break;
 	    }
 	}
-      while (target_call_site_sym);
+      while (target_call_site);
 
       if (VEC_empty (CORE_ADDR, chain))
 	call_site_addr_p = 0;
@@ -810,7 +772,7 @@ dwarf_expr_regnum_entry_value (struct frame_info *frame, int regnum,
   CORE_ADDR caller_pc;
   struct gdbarch *caller_gdbarch = frame_unwind_arch (frame);
   struct frame_info *caller_frame = get_prev_frame (frame);
-  struct call_site_stuff *call_site_stuff;
+  struct call_site *call_site;
   int iparams;
   struct value *val;
   struct dwarf2_locexpr_baton *dwarf_block;
@@ -827,8 +789,8 @@ dwarf_expr_regnum_entry_value (struct frame_info *frame, int regnum,
     }
   caller_pc = get_frame_pc (caller_frame);
 
-  call_site_stuff = call_site_stuff_for_pc (caller_pc);
-  if (call_site_stuff == NULL)
+  call_site = call_site_for_pc (caller_pc);
+  if (call_site == NULL)
     {
       struct minimal_symbol *msym = lookup_minimal_symbol_by_pc (caller_pc);
 
@@ -841,7 +803,7 @@ dwarf_expr_regnum_entry_value (struct frame_info *frame, int regnum,
 		   ! msym ? "???" : SYMBOL_PRINT_NAME (msym));
     }
 
-  target_addr = call_site_stuff_to_target_addr (call_site_stuff, caller_frame);
+  target_addr = call_site_to_target_addr (call_site, caller_frame);
   if (target_addr != func_addr)
     {
       struct minimal_symbol *target_msym, *func_msym;
@@ -859,13 +821,13 @@ dwarf_expr_regnum_entry_value (struct frame_info *frame, int regnum,
 
   func_verify_no_selftailcall (caller_gdbarch, func_addr);
 
-  for (iparams = 0; iparams < call_site_stuff->parameter_count; iparams++)
+  for (iparams = 0; iparams < call_site->parameter_count; iparams++)
     {
-      parameter = &call_site_stuff->parameter[iparams];
+      parameter = &call_site->parameter[iparams];
       if (parameter->regnum == regnum)
 	break;
     }
-  if (iparams == call_site_stuff->parameter_count)
+  if (iparams == call_site->parameter_count)
     {
       struct minimal_symbol *msym = lookup_minimal_symbol_by_pc (caller_pc);
 
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index f84b3bf..3f1a2ab 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -58,6 +58,7 @@
 #include "c-lang.h"
 #include "valprint.h"
 #include <ctype.h>
+#include "arch-utils.h"
 
 #include <fcntl.h>
 #include "gdb_string.h"
@@ -400,6 +401,9 @@ struct dwarf2_cu
      after all type information has been read.  */
   VEC (delayed_method_info) *method_list;
 
+  /* To be copied to symtab->call_site_htab.  */
+  htab_t call_site_htab;
+
   /* Mark used when releasing cached dies.  */
   unsigned int mark : 1;
 
@@ -4759,6 +4763,8 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu)
 
       if (gcc_4_minor >= 5)
 	symtab->epilogue_unwind_valid = 1;
+
+      symtab->call_site_htab = cu->call_site_htab;
     }
 
   if (dwarf2_per_objfile->using_index)
@@ -6063,18 +6069,20 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu)
   using_directives = new->using_directives;
 }
 
-/* Read in DW_TAG_GNU_call_site's PC and create the block and symbol for it.
-   Parameters are read in using read_call_site_type.  */
+/* Read in DW_TAG_GNU_call_site's PC and create the block and symbol for
+   it.  */
 
 static void
 read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct objfile *objfile = cu->objfile;
-  CORE_ADDR lowpc, baseaddr;
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
+  CORE_ADDR pc, baseaddr;
   struct attribute *attr;
-  struct block *block;
-  struct pending *no_symbols = NULL;
-  struct symbol *sym;
+  struct call_site *call_site, call_site_local;


hooks/post-receive
--
Repository for Project Archer.


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-07-08 20:09 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-08 20:09 [SCM] archer-jankratochvil-entryval: Fixed jkratoch

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).