This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Read corrrect auxiliary entry in AIX


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=55bcecda5703eb4647165cb3ddb86aed63fd44d2

commit 55bcecda5703eb4647165cb3ddb86aed63fd44d2
Author: Ulrich Weigand <ulrich.weigand@de.ibm.com>
Date:   Thu Apr 27 15:57:08 2017 +0200

    Read corrrect auxiliary entry in AIX
    
    Fix handling of XCOFF function auxiliary entries, in particular when
    the xlc -qfuncsect or gcc -ffunction-sections compiler option is used
    in AIX.  Also handle C_WEAKEXT storage class.
    
    gdb/
    2016-10-21  Sangamesh Mallayya  <sangamesh.swamy@in.ibm.com>
    	    Ulrich Weigand  <uweigand@de.ibm.com>
    
    	* xcoffread.c (read_xcoff_symtab): Read correct function auxiliary
    	entry if xlc -qfuncsect or gcc -ffunction-sections compiler option
    	is used in AIX.
    	(read_xcoff_symtab): Handle C_WEAKEXT storage class.
    	(process_xcoff_symbol): Likewise.
    	(scan_xcoff_symtab): Likewise.
    
    Signed-off-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>

Diff:
---
 gdb/ChangeLog   | 10 +++++++++
 gdb/xcoffread.c | 68 ++++++++++++++++++++++++++++++++++++---------------------
 2 files changed, 53 insertions(+), 25 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8ce7845..8381b8e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,13 @@
+2017-04-27  Sangamesh Mallayya  <sangamesh.swamy@in.ibm.com>
+	    Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* xcoffread.c (read_xcoff_symtab): Read correct function auxiliary
+	entry if xlc -qfuncsect or gcc -ffunction-sections compiler option
+	is used in AIX.
+	(read_xcoff_symtab): Handle C_WEAKEXT storage class.
+	(process_xcoff_symbol): Likewise.
+	(scan_xcoff_symtab): Likewise.
+
 2017-04-26  Alan Hayward  <alan.hayward@arm.com>
 
 	* ia64-tdep.c (examine_prologue): Use get_frame_register_unsigned.
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 4f22cec..138f941 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -1143,8 +1143,8 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst)
 	  /* Done with all files, everything from here on is globals.  */
 	}
 
-      if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT)
-	  && cs->c_naux == 1)
+      if (cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT ||
+	  cs->c_sclass == C_WEAKEXT)
 	{
 	  /* Dealing with a symbol with a csect entry.  */
 
@@ -1154,9 +1154,41 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst)
 #define	CSECT_SMTYP(PP) (SMTYP_SMTYP(CSECT(PP).x_smtyp))
 #define	CSECT_SCLAS(PP) (CSECT(PP).x_smclas)
 
-	  /* Convert the auxent to something we can access.  */
-	  bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
-				0, cs->c_naux, &main_aux);
+	  /* Convert the auxent to something we can access.
+	     XCOFF can have more than one auxiliary entries.
+
+	     Actual functions will have two auxiliary entries, one to have the
+	     function size and other to have the smtype/smclass (LD/PR).
+
+	     c_type value of main symbol table will be set only in case of
+	     C_EXT/C_HIDEEXT/C_WEAKEXT storage class symbols.
+	     Bit 10 of type is set if symbol is a function, ie the value is set
+	     to 32(0x20). So we need to read the first function auxiliay entry
+	     which contains the size. */
+	  if (cs->c_naux > 1 && ISFCN (cs->c_type))
+	  {
+	    /* a function entry point.  */
+
+	    fcn_start_addr = cs->c_value;
+
+	    /* save the function header info, which will be used
+	       when `.bf' is seen.  */
+	    fcn_cs_saved = *cs;
+
+	    /* Convert the auxent to something we can access.  */
+	    bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
+				  0, cs->c_naux, &fcn_aux_saved);
+	    continue;
+	  }
+	  /* Read the csect auxiliary header, which is always the last by
+	     onvention. */
+	  bfd_coff_swap_aux_in (abfd,
+			       raw_auxptr
+			       + ((coff_data (abfd)->local_symesz)
+			       * (cs->c_naux - 1)),
+			       cs->c_type, cs->c_sclass,
+			       cs->c_naux - 1, cs->c_naux,
+			       &main_aux);
 
 	  switch (CSECT_SMTYP (&main_aux))
 	    {
@@ -1241,16 +1273,11 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst)
 
 	      switch (CSECT_SCLAS (&main_aux))
 		{
+		/* We never really come to this part as this case has been
+		   handled in ISFCN check above.
+		   This and other cases of XTY_LD are kept just for
+		   reference. */
 		case XMC_PR:
-		  /* a function entry point.  */
-		function_entry_point:
-
-		  fcn_start_addr = cs->c_value;
-
-		  /* save the function header info, which will be used
-		     when `.bf' is seen.  */
-		  fcn_cs_saved = *cs;
-		  fcn_aux_saved = main_aux;
 		  continue;
 
 		case XMC_GL:
@@ -1283,16 +1310,6 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst)
 	    }
 	}
 
-      /* If explicitly specified as a function, treat is as one.  This check
-	 evaluates to true for @FIX* bigtoc CSECT symbols, so it must occur
-	 after the above CSECT check.  */
-      if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
-	{
-	  bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
-				0, cs->c_naux, &main_aux);
-	  goto function_entry_point;
-	}
-
       switch (cs->c_sclass)
 	{
 	case C_FILE:
@@ -1574,7 +1591,7 @@ process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
       SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
       SYMBOL_DUP (sym, sym2);
 
-      if (cs->c_sclass == C_EXT)
+      if (cs->c_sclass == C_EXT || C_WEAKEXT)
 	add_symbol_to_list (sym2, &global_symbols);
       else if (cs->c_sclass == C_HIDEXT || cs->c_sclass == C_STAT)
 	add_symbol_to_list (sym2, &file_symbols);
@@ -2250,6 +2267,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
 	{
 	case C_EXT:
 	case C_HIDEXT:
+	case C_WEAKEXT:
 	  {
 	    /* The CSECT auxent--always the last auxent.  */
 	    union internal_auxent csect_aux;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]