Re: [PATCH,AIX] Cleanup in libiberty for AIX.

2017-08-30 Thread Ian Lance Taylor
On Tue, Aug 29, 2017 at 8:10 AM, REIX, Tony  wrote:
> Description:
>  * This patch does some cleanup in libiberty for AIX.
>
> Tests:
>  * AIX: Build: SUCCESS
>- build made by means of gmake in trunk.
>- patch generated by:
> cd gcc-svn-trunk/
> svn diff libiberty/ChangeLog libiberty/simple-object-xcoff.c
>
> ChangeLog:
>+   * simple-object-xcoff.c (simple_object_xcoff_find_sections):
>+   Improve .go_export csect handling.  Don't make assumptions
>+   on containing section or number of auxiliary entries.

Thanks.  Committed.

Ian


RE:[PATCH,AIX] Cleanup in libiberty for AIX.

2017-08-29 Thread REIX, Tony
Description:
 * This patch does some cleanup in libiberty for AIX.

Tests:
 * AIX: Build: SUCCESS
   - build made by means of gmake in trunk.
   - patch generated by: 
cd gcc-svn-trunk/
svn diff libiberty/ChangeLog libiberty/simple-object-xcoff.c

ChangeLog:
   +   * simple-object-xcoff.c (simple_object_xcoff_find_sections):
   +   Improve .go_export csect handling.  Don't make assumptions
   +   on containing section or number of auxiliary entries.

Cordialement,

Tony Reix

Bull - ATOS
IBM Coop Architect & Technical Leader

Office : +33 (0) 4 76 29 72 67
1 rue de Provence - 38432 Échirolles - France
www.atos.net
Index: ./libiberty/ChangeLog
===
--- ./libiberty/ChangeLog	(revision 251399)
+++ ./libiberty/ChangeLog	(working copy)
@@ -1,3 +1,9 @@
+2017-08-29  Tony Reix  
+
+	* simple-object-xcoff.c (simple_object_xcoff_find_sections):
+	Improve .go_export csect handling.  Don't make assumptions
+	on containing section or number of auxiliary entries.
+
 2017-08-28  Richard Biener  
 
 	PR lto/81968
Index: libiberty/simple-object-xcoff.c
===
--- libiberty/simple-object-xcoff.c	(revision 251399)
+++ libiberty/simple-object-xcoff.c	(working copy)
@@ -255,11 +255,15 @@ union external_auxent
 #define IMAGE_SYM_TYPE \
   ((IMAGE_SYM_DTYPE_NULL << 4) | IMAGE_SYM_TYPE_NULL)
 
+#define C_EXT		(2)
 #define C_STAT		(3)
 #define C_FILE		(103)
+#define C_HIDEXT	(107)
 
-#define DBXMASK		0x80
+#define XTY_SD		(1)	/* section definition */
 
+#define XMC_XO		(7)	/* extended operation */
+
 /* Private data for an simple_object_read.  */
 
 struct simple_object_xcoff_read
@@ -400,6 +404,7 @@ simple_object_xcoff_find_sections (simple_object_r
   size_t scnhdr_size;
   unsigned char *scnbuf;
   const char *errmsg;
+  unsigned short (*fetch_16) (const unsigned char *);
   unsigned int (*fetch_32) (const unsigned char *);
   ulong_type (*fetch_64) (const unsigned char *);
   unsigned int nscns;
@@ -407,7 +412,6 @@ simple_object_xcoff_find_sections (simple_object_r
   size_t strtab_size;
   struct external_syment *symtab = NULL;
   unsigned int i;
-  off_t textptr = 0;
 
   scnhdr_size = u64 ? SCNHSZ64 : SCNHSZ32;
   scnbuf = XNEWVEC (unsigned char, scnhdr_size * ocr->nscns);
@@ -420,6 +424,7 @@ simple_object_xcoff_find_sections (simple_object_r
   return errmsg;
 }
 
+  fetch_16 = simple_object_fetch_big_16;
   fetch_32 = simple_object_fetch_big_32;
   fetch_64 = simple_object_fetch_big_64;
 
@@ -433,7 +438,7 @@ simple_object_xcoff_find_sections (simple_object_r
   char namebuf[SCNNMLEN + 1];
   char *name;
   off_t scnptr;
-  unsigned int size;
+  off_t size;
 
   scnhdr = scnbuf + i * scnhdr_size;
   scnname = scnhdr + offsetof (struct external_scnhdr, s_name);
@@ -489,24 +494,24 @@ simple_object_xcoff_find_sections (simple_object_r
 	  u.xcoff32.s_size));
 	}
 
-  if (strcmp (name, ".text") == 0)
-	textptr = scnptr;
   if (!(*pfn) (data, name, scnptr, size))
 	break;
 }
 
-  /* Special handling for .go_export CSECT. */
-  if (textptr != 0 && ocr->nsyms > 0)
+  /* Special handling for .go_export csect.  */
+  if (ocr->nsyms > 0)
 {
-  unsigned char *sym, *aux;
+  unsigned char *sym;
   const char *n_name;
-  unsigned long n_value, n_offset, n_zeroes, x_scnlen;
+  off_t size, n_value;
+  unsigned int n_numaux, n_offset, n_zeroes;
+  short n_scnum;
 
-  /* Read symbol table. */
+  /* Read symbol table.  */
   symtab = XNEWVEC (struct external_syment, ocr->nsyms * SYMESZ);
   if (!simple_object_internal_read (sobj->descriptor,
 	sobj->offset + ocr->symptr,
-	(unsigned char *)symtab,
+	(unsigned char *) symtab,
 	ocr->nsyms * SYMESZ,
 	&errmsg, err))
 	{
@@ -515,17 +520,25 @@ simple_object_xcoff_find_sections (simple_object_r
 	  return NULL;
 	}
 
-  /* Search in symbol table if we have a ".go_export" symbol. */
-  for (i = 0; i < ocr->nsyms; ++i)
+  /* Search in symbol table if we have a ".go_export" symbol.  */
+  for (i = 0; i < ocr->nsyms; i += n_numaux + 1)
 	{
-	  sym = (unsigned char *)&symtab[i];
+	  sym = (unsigned char *) &symtab[i];
+	  n_numaux = symtab[i].n_numaux[0];
 
-	  if (symtab[i].n_sclass[0] & DBXMASK)
-	{
-	  /* Skip debug symbols whose names are in stabs. */
-	  i += symtab[i].n_numaux[0];
-	  continue;
-	}
+	  if (symtab[i].n_sclass[0] != C_EXT
+	  && symtab[i].n_sclass[0] != C_HIDEXT)
+	continue;
+
+	  /* Must have at least one csect auxiliary entry.  */
+	  if (n_numaux < 1 || i + n_numaux >= ocr->nsyms)
+	continue;
+
+	  n_scnum = fetch_16 (sym + offsetof (struct external_syment,
+	  n_scnum));
+	  if (n_scnum < 1 || (unsigned int) n_scnum > nscns)
+	continue;
+
 	  if (u64)
 	{
 	  n_value = fetch_64 (sym + offsetof (struct external_syment,
@@ -535,15 +548,12 @@