*BSD News Article 10918


Return to BSD News archive

Received: by minnie.vk1xwt.ampr.org with NNTP
	id AA958 ; Wed, 10 Feb 93 07:00:18 EST
Path: sserve!manuel.anu.edu.au!munnari.oz.au!spool.mu.edu!sol.ctr.columbia.edu!ira.uka.de!math.fu-berlin.de!news.netmbx.de!Germany.EU.net!mcsun!sunic!dkuug!flshub!phk
From: phk@data.fls.dk (P-HK/Poul-Henning Kamp)
Newsgroups: comp.unix.bsd
Subject: [386BSD] Patches for gcc-2.3.3: part 1
Message-ID: <1993Feb9.134938.1808@data.fls.dk>
Date: 9 Feb 93 13:49:38 GMT
Organization: FLS Data A/S, Valby, Copenhagen, Denmark.
Lines: 305

# These are the patches I use to make gcc-2.3.3 compile and run in it self.
# The bulk of this stuff is for adding basic-block-profiling.
# You can do with only the 1st and last patch in this file.

diff -r -C2 ../R/here/gcc-2.3.3/config/i386bsd.h here/gcc-2.3.3/config/i386bsd.h
*** ../R/here/gcc-2.3.3/config/i386bsd.h	Tue Dec 29 02:55:43 1992
--- here/gcc-2.3.3/config/i386bsd.h	Wed Jan 20 18:50:57 1993
***************
*** 1,4 ****
--- 1,6 ----
  /* Configuration for an i386 running 386BSD as the target machine.  */
  
+ #define HANDLE_SYSV_PRAGMA
+ 
  /* This is tested by i386gas.h.  */
  #define YES_UNDERSCORES
***************
*** 47,50 ****
--- 49,85 ----
  }
  
+ #define BLOCK_PROFILER_REAL_FILENAME 1
+ #define BLOCK_PROFILER_COUNT_PROLOGUE 1
+ #define FUNCTION_BLOCK_PROFILER_BEFORE_PROLOGUE 1
+  
+    /* If we want to use the BB-stuff in the kernel we have to be reentrant,
+     * which means that we have to link the BB-areas in one atomic instruction.
+     * The bts here will ensure that each file is only done once.
+     */
+ 
+ #define FUNCTION_BLOCK_PROFILER(FILE,LABELNO) { \
+    fprintf (FILE, "\tbts $0,LPBX0\n"); \
+    fprintf (FILE, "\tjc 1f\n"); \
+    fprintf (FILE, "\tcall bb_link\n1:\n"); }
+ 
+    /* In theory bb_link could be a C-proc, except that we have to ensure that
+     * the load and store into __bb_head is atomic, therefore we output a small
+     * bb_link in FILE_BLOCK_PROFILER which uses a xchgl to do that trick.
+     * If __bb_head was zero, call __bb_once in libgcc2.c
+     */
+ #define FILE_BLOCK_PROFILER(FILE) { \
+    fprintf (FILE, ".comm\t___bb_head,4\n"); \
+    fprintf (FILE, "bb_link:\n\tmovl $LPBX0,%%eax\n"); \
+    fprintf (FILE, "\txchgl %%eax,___bb_head\n"); \
+    fprintf (FILE, "\tmovl %%eax,LPBX0+16\n"); \
+    fprintf (FILE, "\torl %%eax,%%eax\n"); \
+    fprintf (FILE, "\tjnz 1f\n"); \
+    fprintf (FILE, "\tcall ___bb_once\n"); \
+    fprintf (FILE, "1:\tret \n"); }
+ 
+    /* This is far to long for my taste: 6 bytes.  */
+ #define BLOCK_PROFILER(FILE,BLOCKNO) \
+    fprintf (FILE, "\tincl (LPBX2+%d)\n", 4*(BLOCKNO));
+ 
  /* There are conflicting reports about whether this system uses
     a different assembler syntax.  wilson@cygnus.com says # is right.  */
***************
*** 146,147 ****
--- 181,189 ----
  
  #define JUMP_TABLES_IN_TEXT_SECTION
+ 
+ #ifndef GPLUSPLUS_INCLUDE_DIR
+ #define GPLUSPLUS_INCLUDE_DIR "/usr/g++-include"
+ #endif
+ #ifndef GCC_INCLUDE_DIR 
+ #define GCC_INCLUDE_DIR "/usr/include"
+ #endif
Only in here/gcc-2.3.3/config: i386bsd.h.orig
diff -r -C2 ../R/here/gcc-2.3.3/final.c here/gcc-2.3.3/final.c
*** ../R/here/gcc-2.3.3/final.c	Tue Dec 29 02:53:27 1992
--- here/gcc-2.3.3/final.c	Wed Jan 20 18:50:58 1993
***************
*** 262,269 ****
    int i;
  
!   if (profile_block_flag)
      {
        char name[12];
  
        data_section ();
  
--- 262,275 ----
    int i;
  
!   if (profile_block_flag && count_basic_blocks)
      {
        char name[12];
  
+ #ifdef FILE_BLOCK_PROFILER
+       text_section ();
+       ASM_OUTPUT_ALIGN (asm_out_file,
+ 	 exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
+       FILE_BLOCK_PROFILER(asm_out_file);
+ #endif /* FILE_BLOCK_PROFILER */
        data_section ();
  
***************
*** 274,277 ****
--- 280,284 ----
  	 4:  number of counts in the table.
  	 5:  always 0, for compatibility with Sun.
+ 	      can be used to link the blocks together on other arch's.
  	 6:  extra word added by GNU: address of address table
  	      which contains addresses of basic blocks,
***************
*** 297,302 ****
--- 304,311 ----
  	char *data_file = (char *) alloca (len + 3);
  	strcpy (data_file, filename);
+ #ifndef BLOCK_PROFILER_REAL_FILENAME
  	strip_off_ending (data_file, len);
  	strcat (data_file, ".d");
+ #endif /* BLOCK_PROFILER_REAL_FILENAME */
  	assemble_string (data_file, strlen (data_file) + 1);
        }
***************
*** 717,720 ****
--- 726,750 ----
  #endif
  
+ #ifdef FUNCTION_BLOCK_PROFILER
+ #ifdef FUNCTION_BLOCK_PROFILER_BEFORE_PROLOGUE
+   if (profile_block_flag)
+     {
+       FUNCTION_BLOCK_PROFILER (file, profile_label_no);
+     }
+ #endif /* FUNCTION_BLOCK_PROFILER_BEFORE_PROLOGUE */
+ #endif /* FUNCTION_BLOCK_PROFILER */
+ 
+ #ifdef BLOCK_PROFILER
+ #ifdef BLOCK_PROFILER_COUNT_PROLOGUE
+   if (profile_block_flag)
+     {
+       ASM_OUTPUT_INTERNAL_LABEL (file, "LPB", count_basic_blocks);
+       BLOCK_PROFILER (file, count_basic_blocks);
+       CC_STATUS_INIT;
+       count_basic_blocks++;
+     }
+ #endif /* BLOCK_PROFILER_COUNT_PROLOGUE */
+ #endif /* BLOCK_PROFILER */
+ 
    /* The Sun386i and perhaps other machines don't work right
       if the profiling code comes after the prologue.  */
***************
*** 749,752 ****
--- 779,783 ----
  {
  #ifdef FUNCTION_BLOCK_PROFILER
+ #ifndef FUNCTION_BLOCK_PROFILER_BEFORE_PROLOGUE
    if (profile_block_flag)
      {
***************
*** 753,756 ****
--- 784,788 ----
        FUNCTION_BLOCK_PROFILER (file, profile_label_no);
      }
+ #endif /* FUNCTION_BLOCK_PROFILER_BEFORE_PROLOGUE */
  #endif /* FUNCTION_BLOCK_PROFILER */
  
***************
*** 874,877 ****
--- 906,917 ----
      xcoffout_end_epilogue (file);
  #endif
+ 
+   if (profile_block_flag)
+     {
+     /* Add a BB-point after each function, this allows us to determine the
+       exact contents of each BB */
+     ASM_OUTPUT_INTERNAL_LABEL (file, "LPB", count_basic_blocks);
+     count_basic_blocks++;
+     }
  
    /* If FUNCTION_EPILOGUE is not defined, then the function body
Only in here/gcc-2.3.3: final.c.orig
diff -r -C2 ../R/here/gcc-2.3.3/libgcc2.c here/gcc-2.3.3/libgcc2.c
*** ../R/here/gcc-2.3.3/libgcc2.c	Tue Dec 29 02:53:43 1992
--- here/gcc-2.3.3/libgcc2.c	Wed Jan 20 18:50:59 1993
***************
*** 1171,1180 ****
  
  #ifdef L_bb
- /* Avoid warning from ranlib about empty object file.  */
- void
- __bb_avoid_warning ()
- {}
  
- #if defined (__sun__) && defined (__mc68000__)
  struct bb
  {
--- 1171,1175 ----
***************
*** 1183,1189 ****
    int *counts;
    int ncounts;
!   int zero_word;
    int *addresses;
  };
  
  extern int ___tcov_init;
--- 1178,1241 ----
    int *counts;
    int ncounts;
!   struct bb *next;
    int *addresses;
  };
+ 
+ /* Avoid warning from ranlib about empty object file.  */
+ void
+ __bb_avoid_warning ()
+ {}
+ 
+ extern struct bb *__bb_head;
+ char *__bb_file = "BB.%05d.%08x";
+ 
+ void
+ __bb_final()
+   {
+   char buf[1024];
+   int i,j,f;
+   long l;
+   struct bb *pb = __bb_head;
+ 
+ /*
+   if(!__bb_file)
+ */
+     __bb_file = "BB.%05d.%08x";
+   time(&l);
+   sprintf(buf,__bb_file,getpid(),l);
+   f=open(buf,0x601,0666); /* 0x601 = WRONLY|CREAT|WRONLY */
+   if(f<0) return;
+ 
+   while(pb)
+     {
+     sprintf(buf,"%08x * %s\n",pb->addresses[0],pb->filename); 
+     j = strlen(buf);
+     if(j != write(f,buf,j)) { close(f); return; }
+     
+     for(i=0;i<pb->ncounts;i++)
+       {
+       if(pb->counts[i])
+         {
+         sprintf(buf,"%08x | %08x %08x\n",
+ 		pb->addresses[i],pb->counts[i],
+ 		pb->addresses[i+1]-pb->addresses[i]);
+         j = strlen(buf);
+         if(j != write(f,buf,j)) { close(f); return; }
+ 	}
+       }
+     pb=pb->next;
+     }
+   close(f);
+   }
+ 
+ void
+ __bb_once()
+   {
+ #ifdef HAVE_ATEXIT
+   atexit(__bb_final);
+ #endif
+   }
+ 
+ #if defined (__sun__) && defined (__mc68000__)
  
  extern int ___tcov_init;
Only in here/gcc-2.3.3: libgcc2.c.orig
*** /gandalf/D/here/gcc-2.3.3/toplev.c	Tue Dec 29 11:54:01 1992
--- here/gcc-2.3.3/toplev.c	Sun Jan 24 12:49:44 1993
***************
*** 3295,3298 ****
--- 3295,3299 ----
        fflush (stderr);
  
+ #ifndef __386BSD__
  #ifdef USG
        system ("ps -l 1>&2");
***************
*** 3300,3303 ****
--- 3301,3305 ----
        system ("ps v");
  #endif /* not USG */
+ #endif /* __386BSD__ */
      }
  #endif /* not VMS */
*** /gandalf/D/here/gcc-2.3.3/config/i386bsd.h	Sat Jan 23 10:02:46 1993
--- here/gcc-2.3.3/config/i386bsd.h	Sat Jan 30 16:52:18 1993
***************
*** 12,16 ****
  
  /* Like the default, except no -lg.  */
! #define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
  
  #undef SIZE_TYPE
--- 12,16 ----
  
  /* Like the default, except no -lg.  */
! #define LIB_SPEC "%{!p:%{!pg:-lc -lgcc -lc}}%{p:-lc_p -lgcc -lc_p}%{pg:-lc_p -lgcc -lc_p}"
  
  #undef SIZE_TYPE
-- 
phk@data.fls.dk		  ||  The seven hazards of computing:
Poul-Henning Kamp	  ||  The hardware, the software, the supplier
FLS DATA A/S, Denmark	  ||  the application, the user, the operator
Phone: (+45) 36 18 12 35  ||  and the data.		Stan Kelly-Bootle