Patchwork [Ada] Fix awkward stepping over CW var assignment in GDB

login
register
mail settings
Submitter Eric Botcazou
Date May 26, 2013, 8:54 a.m.
Message ID <136960562.lSWuMbc9x5@polaris>
Download mbox | patch
Permalink /patch/246373/
State New
Headers show

Comments

Eric Botcazou - May 26, 2013, 8:54 a.m.
On specific platforms, stepping over an assignment to a class-wide variable in 
GDB leads to an awkward behavior.  Fixed thusly.

Tested on x86_64-suse-linux, applied on the mainline.


2013-05-26  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/gigi.h (make_aligning_type): Adjust prototype.
	* gcc-interface/utils.c (make_aligning_type): Take GNAT_NODE parameter
	for the position of the associated TYPE_DECL.
	* gcc-interface/decl.c (gnat_to_gnu_entity): Adjust call to above.
	* gcc-interface/utils2.c (maybe_wrap_malloc): Likewise.

Patch

Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c	(revision 199330)
+++ gcc-interface/utils.c	(working copy)
@@ -653,11 +653,12 @@  gnat_pushdecl (tree decl, Node_Id gnat_n
 /* Create a record type that contains a SIZE bytes long field of TYPE with a
    starting bit position so that it is aligned to ALIGN bits, and leaving at
    least ROOM bytes free before the field.  BASE_ALIGN is the alignment the
-   record is guaranteed to get.  */
+   record is guaranteed to get.  GNAT_NODE is used for the position of the
+   associated TYPE_DECL.  */
 
 tree
 make_aligning_type (tree type, unsigned int align, tree size,
-		    unsigned int base_align, int room)
+		    unsigned int base_align, int room, Node_Id gnat_node)
 {
   /* We will be crafting a record type with one field at a position set to be
      the next multiple of ALIGN past record'address + room bytes.  We use a
@@ -739,7 +740,7 @@  make_aligning_type (tree type, unsigned
 
   /* Declare it now since it will never be declared otherwise.  This is
      necessary to ensure that its subtrees are properly marked.  */
-  create_type_decl (name, record_type, NULL, true, false, Empty);
+  create_type_decl (name, record_type, NULL, true, false, gnat_node);
 
   return record_type;
 }
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 199336)
+++ gcc-interface/decl.c	(working copy)
@@ -1368,7 +1368,7 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 	    tree gnu_new_type
 	      = make_aligning_type (gnu_type, TYPE_ALIGN (gnu_type),
 				    TYPE_SIZE_UNIT (gnu_type),
-				    BIGGEST_ALIGNMENT, 0);
+				    BIGGEST_ALIGNMENT, 0, gnat_entity);
 	    tree gnu_new_var
 	      = create_var_decl (create_concat_name (gnat_entity, "ALIGN"),
 				 NULL_TREE, gnu_new_type, NULL_TREE, false,
Index: gcc-interface/utils2.c
===================================================================
--- gcc-interface/utils2.c	(revision 199330)
+++ gcc-interface/utils2.c	(working copy)
@@ -6,7 +6,7 @@ 
  *                                                                          *
  *                          C Implementation File                           *
  *                                                                          *
- *          Copyright (C) 1992-2012, Free Software Foundation, Inc.         *
+ *          Copyright (C) 1992-2013, Free Software Foundation, Inc.         *
  *                                                                          *
  * GNAT is free software;  you can  redistribute it  and/or modify it under *
  * terms of the  GNU General Public License as published  by the Free Soft- *
@@ -2101,7 +2101,8 @@  maybe_wrap_malloc (tree data_size, tree
     = ((data_align > system_allocator_alignment)
        ? make_aligning_type (data_type, data_align, data_size,
 			     system_allocator_alignment,
-			     POINTER_SIZE / BITS_PER_UNIT)
+			     POINTER_SIZE / BITS_PER_UNIT,
+			     gnat_node)
        : NULL_TREE);
 
   tree size_to_malloc
Index: gcc-interface/gigi.h
===================================================================
--- gcc-interface/gigi.h	(revision 199330)
+++ gcc-interface/gigi.h	(working copy)
@@ -123,9 +123,10 @@  extern bool is_cplusplus_method (Entity_
 /* Create a record type that contains a SIZE bytes long field of TYPE with a
     starting bit position so that it is aligned to ALIGN bits, and leaving at
     least ROOM bytes free before the field.  BASE_ALIGN is the alignment the
-    record is guaranteed to get.  */
+    record is guaranteed to get.  GNAT_NODE is used for the position of the
+    associated TYPE_DECL.  */
 extern tree make_aligning_type (tree type, unsigned int align, tree size,
-				unsigned int base_align, int room);
+				unsigned int base_align, int room, Node_Id);
 
 /* TYPE is a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE that is being used
    as the field type of a packed record if IN_RECORD is true, or as the