[alt.sources] gas-1.36 patches for COFF generation patch01

loic@adesign.uucp (Loic Dachary) (10/23/90)

	Here is the first bug fix to gas-coff patches (gas-coff/patch01).

. Special conditions where not tested when manipulating the double linked list
  of symbols. This was not very clean but harmless. However the code has
  been changed.
. The c_dot_file_symbol function messed up the symbol list if called by
  write_object instead of s_file. I.e. if .file was missing, gas bombed.

*** coff.c	Mon Oct 15 08:53:16 1990
--- /spare/usenet/port/gas-1.36/coff.c	Tue Oct 23 00:06:12 1990
***************
*** 242,250 ****
  char*	filename;
  {
      symbolS* symbolP;
-     symbolS* ante_lastP;
- 
-     ante_lastP = symbol_lastP;
      
      symbolP = symbol_new(".file", SEG_DEBUG, 0,
  			       C_FILE, &zero_address_frag);
--- 242,247 ----
***************
*** 254,262 ****
  
      /* Make sure that the symbol is first on the symbol chain */
      if(symbol_rootP != symbolP) {
! 	symbol_lastP = ante_lastP;
! 	symbol_lastP->sy_next = NULL;
! 	symbolP->sy_next = symbol_rootP;
  	symbol_rootP = symbolP;
      }
  }
--- 251,259 ----
  
      /* Make sure that the symbol is first on the symbol chain */
      if(symbol_rootP != symbolP) {
! 	symbol_lastP = symbol_lastP->sy_previous;
! 	DL_REMOVE(symbolP);
! 	DL_INSERT(symbolP, symbol_rootP);
  	symbol_rootP = symbolP;
      }
  }
*** coff.h	Mon Oct 15 09:59:28 1990
--- /spare/usenet/port/gas-1.36/coff.h	Mon Oct 22 17:29:56 1990
***************
*** 57,62 ****
--- 57,88 ----
  #define DO_NOT_STRIP	0
  #define DO_STRIP	1
  
+ /* Double linked list manipulations macros. */
+ /* See struc-symbol.h for a definition of symbolS. */
+ 
+ /* Remove the argument from the list. */
+ #define DL_REMOVE(p)	\
+     (((p)->sy_next && ((p)->sy_next->sy_previous = (p)->sy_previous)),\
+      ((p)->sy_previous && ((p)->sy_previous->sy_next = (p)->sy_next)))
+ 
+ /* Set the chain symbols to null. */
+ #define DL_CLEAR(p)	\
+     ((p)->sy_next = (symbolS*)0, (p)->sy_previous = (symbolS*)0)
+ 
+ /* Link symbol p after symbol w in the chain. */
+ #define DL_APPEND(p,w)	\
+     (((w)->sy_next && ((w)->sy_next->sy_previous = (p))),	\
+      ((p)->sy_next = (w)->sy_next),				\
+      ((w)->sy_next = (p)),       				\
+      ((p)->sy_previous = (w)))
+ 
+ /* Link symbol p before symbol w in the chain. */
+ #define DL_INSERT(p,w)	\
+     (((w)->sy_previous && ((w)->sy_previous->sy_next = (p))),	\
+      ((p)->sy_previous = (w)->sy_previous),			\
+      ((w)->sy_previous = (p)),					\
+      ((p)->sy_next = (w)))
+ 
  /* Symbol table macros and constants */
  
  /* Possible and usefull section number in symbol table 
*** read.c	Mon Oct 22 22:35:07 1990
--- /spare/usenet/port/gas-1.36/read.c	Mon Oct 22 22:39:11 1990
***************
*** 1395,1402 ****
  	symbolP = (symbolS *)obstack_alloc(&notes, sizeof(symbolS));
  	memcpy((char*)symbolP, &symbol, sizeof(symbolS));
  
! 	symbol_lastP->sy_next = symbolP;
! 	symbolP->sy_previous = symbol_lastP;
  	symbol_lastP = symbolP;
  
      } else {
--- 1395,1401 ----
  	symbolP = (symbolS *)obstack_alloc(&notes, sizeof(symbolS));
  	memcpy((char*)symbolP, &symbol, sizeof(symbolS));
  
! 	DL_APPEND(symbolP, symbol_lastP);
  	symbol_lastP = symbolP;
  
      } else {
***************
*** 1408,1424 ****
  	c_symbol_merge(&symbol, symbolP);
  	/* For the function, the symbol *must* be were the debug symbol
  	   appear. Move the existing symbol to the current place. */
- 	/* Do not take in account special cases where symbolP is first 
- 	   in the list. It is always after a .bf */
  	if(SF_GET_FUNCTION(symbolP)) {
  	    /* If it already is at the end of the symbol list, do nothing */
  	    if(symbolP != symbol_lastP) {
! 		/* Remove from the list */
! 		symbolP->sy_next->sy_previous = symbolP->sy_previous;
! 		symbolP->sy_previous->sy_next = symbolP->sy_next;
! 		/* Append at the end of the list */
! 		symbol_lastP->sy_next = symbolP;
! 		symbolP->sy_previous = symbol_lastP;
  		symbol_lastP = symbolP;
  	    }
  	} else
--- 1407,1417 ----
  	c_symbol_merge(&symbol, symbolP);
  	/* For the function, the symbol *must* be were the debug symbol
  	   appear. Move the existing symbol to the current place. */
  	if(SF_GET_FUNCTION(symbolP)) {
  	    /* If it already is at the end of the symbol list, do nothing */
  	    if(symbolP != symbol_lastP) {
! 		DL_REMOVE(symbolP);
! 		DL_APPEND(symbolP, symbol_lastP);
  		symbol_lastP = symbolP;
  	    }
  	} else
*** symbols.c	Mon Oct 22 22:35:10 1990
--- /spare/usenet/port/gas-1.36/symbols.c	Mon Oct 22 22:38:42 1990
***************
*** 220,227 ****
       * Link to end of symbol chain .
       */
      if (symbol_lastP) {
! 	symbol_lastP->sy_next = symbolP;
! 	symbolP->sy_previous = symbol_lastP;
      } else {
  	symbol_rootP = symbolP;
      }
--- 220,226 ----
       * Link to end of symbol chain .
       */
      if (symbol_lastP) {
! 	DL_APPEND(symbolP, symbol_lastP);
      } else {
  	symbol_rootP = symbolP;
      }
*** write.c	Mon Oct 22 22:35:15 1990
--- /spare/usenet/port/gas-1.36/write.c	Mon Oct 22 22:38:18 1990
***************
*** 405,416 ****
  		      /* The symbols will never be the last or the first
  			 because : 1st symbol is .file and 3 last symbols are
  			 .text, .data, .bss */
! 		      real_symbolP->sy_previous->sy_next = real_symbolP->sy_next;
! 		      real_symbolP->sy_next->sy_previous = real_symbolP->sy_previous;
! 		      symbolP->sy_previous->sy_next = real_symbolP;
! 		      symbolP->sy_next->sy_previous = real_symbolP;
! 		      real_symbolP->sy_next = symbolP->sy_next;
! 		      real_symbolP->sy_previous = symbolP->sy_previous;
  		      symbolP = real_symbolP;
  		  }
  		  if(flagseen['R'] && S_IS_DATA(symbolP))
--- 405,413 ----
  		      /* The symbols will never be the last or the first
  			 because : 1st symbol is .file and 3 last symbols are
  			 .text, .data, .bss */
! 		      DL_REMOVE(real_symbolP);
! 		      DL_INSERT(real_symbolP, symbolP);
! 		      DL_REMOVE(symbolP);
  		      symbolP = real_symbolP;
  		  }
  		  if(flagseen['R'] && S_IS_DATA(symbolP))
***************
*** 488,510 ****
  
  		  symbolP = thisP->sy_next;
  		  /* remove C_EFCN and LOCAL (L...) symbols */
! 		  if(SF_GET_LOCAL(thisP)) {
! 		      thisP->sy_next->sy_previous = thisP->sy_previous;
! 		      thisP->sy_previous->sy_next = thisP->sy_next;
! 		  } else {
  		      if(S_GET_STORAGE_CLASS(thisP) == C_EXT &&
  			 !SF_GET_FUNCTION(thisP)) {
  			  /* Remove from the list */
! 			  thisP->sy_next->sy_previous = thisP->sy_previous;
! 			  thisP->sy_previous->sy_next = thisP->sy_next;
  			  /* Move at the end of the list */
! 			  if (symbol_extern_lastP) {
! 			      symbol_extern_lastP->sy_next = thisP;
! 			      thisP->sy_previous = symbol_extern_lastP;
! 			  } else {
  			      symbol_externP = thisP;
! 			  }
! 			  thisP->sy_next = (symbolS*)0;
  			  symbol_extern_lastP = thisP;
  		      } else {
  			  if(SF_GET_STRING(thisP)) {
--- 485,503 ----
  
  		  symbolP = thisP->sy_next;
  		  /* remove C_EFCN and LOCAL (L...) symbols */
! 		  if(SF_GET_LOCAL(thisP))
! 		      DL_REMOVE(thisP);
! 		  else {
  		      if(S_GET_STORAGE_CLASS(thisP) == C_EXT &&
  			 !SF_GET_FUNCTION(thisP)) {
  			  /* Remove from the list */
! 			  DL_REMOVE(thisP);
! 			  DL_CLEAR(thisP);
  			  /* Move at the end of the list */
! 			  if (symbol_extern_lastP == (symbolS*)0)
  			      symbol_externP = thisP;
! 			  else
! 			      DL_APPEND(thisP, symbol_extern_lastP);
  			  symbol_extern_lastP = thisP;
  		      } else {
  			  if(SF_GET_STRING(thisP)) {
--
Loic Dachary 	loic@adesign.uucp or loic@afp.uucp 
Voice		+33 1 40 35 20 20