head	1.2;
access;
symbols
	RELEASE_5_1_0:1.1
	RELEASE_4_8_0:1.1
	RELEASE_5_0_0:1.1
	RELEASE_4_7_0:1.1
	RELEASE_4_6_2:1.1
	RELEASE_4_6_1:1.1
	RELEASE_4_6_0:1.1
	RELEASE_5_0_DP1:1.1
	RELEASE_4_5_0:1.1
	RELEASE_4_4_0:1.1
	RELEASE_4_3_0:1.1
	RELEASE_4_2_0:1.1
	RELEASE_4_1_1:1.1
	RELEASE_4_1_0:1.1
	RELEASE_3_5_0:1.1
	RELEASE_4_0_0:1.1
	RELEASE_3_4_0:1.1
	RELEASE_3_3_0:1.1
	RELEASE_3_2_0:1.1
	RELEASE_3_1_0:1.1
	RELEASE_2_2_8:1.1
	RELEASE_3_0_0:1.1;
locks; strict;
comment	@# @;


1.2
date	2003.06.03.08.16.58;	author arved;	state dead;
branches;
next	1.1;

1.1
date	98.09.29.13.13.25;	author rnordier;	state Exp;
branches;
next	;


desc
@@


1.2
log
@- Update to CVS snapshot 20030526, which fixes the build problems on 5.x
- Give maintainership to submitter

"Unfortunately FreeBSD 5.x uses the GNU C extension
__attribute__((__aligned__(x))) in a couple of system headers
(<machine/npx.h>, <machine/signal.h> and <machine/ucontext.h> for i386).  To
avoid a syntax error __aligned(x) is removed by a #define, but programs that
use struct sigcontext, struct savexmm or mcontext_t probably won't work."

PR:		52619
Submitted by:	Stefan Farfeleder <stefan@@fafoe.dyndns.org>
@
text
@--- src/installers/80x86/freebsd/Makefile.orig	Mon Mar 16 12:38:37 1998
+++ src/installers/80x86/freebsd/Makefile	Mon Sep 28 16:28:42 1998
@@@@ -1,8 +1,7 @@@@
 # Automatically generated by make_mf version 1.1
 
 # Standard directories and files
-#BASE=/u/g/release/Source
-BASE=/usr/local/src/TenDRA-4.1.1
+BASE=/u/g/release/Source
 INST=${BASE}/src/installers
 SRC=${INST}/80x86/freebsd
 SRC1=${INST}/80x86/common
@@@@ -15,8 +14,8 @@@@
 
 # Standard variables
 
-CC=gcc
-#TCCOPTS=-Xc -Y32bit -Yansi
+CC=tcc
+TCCOPTS=-Xc -Y32bit -Yansi
 CCOPTS=${TCCOPTS} -I${SRC} -I${SRC1} -I${SRC2} -I${SRC3} -I${SRC5}\
  -I${SRC6}
 MAIN_CC=${CC} ${CCOPTS} -c
@@@@ -65,9 +64,11 @@@@
  ${SRC6}/ossg_api.h
 	${MAIN_CC} ${SRC2}/aldefs.c
 
-assembler.o : ${SRC}/assembler.c ${SRC6}/basicread.h ${SRC1}/coder.h\
- ${SRC6}/common_types.h ${SRC}/config.h ${SRC1}/expmacs.h\
- ${SRC1}/localflags.h ${SRC2}/machine.h ${SRC1}/operand.h ${SRC1}/out.h\
+assembler.o : ${SRC}/assembler.c ${SRC1}/assembler.h ${SRC6}/basicread.h\
+ ${SRC1}/coder.h ${SRC6}/common_types.h ${SRC}/config.h ${SRC2}/exp.h\
+ ${SRC1}/expmacs.h ${SRC2}/flags.h ${SRC2}/install_fns.h ${SRC1}/instr.h\
+ ${SRC1}/instr386.h ${SRC1}/localflags.h ${SRC2}/machine.h\
+ ${SRC1}/operand.h ${SRC1}/out.h ${SRC2}/shapemacs.h ${SRC6}/xalloc.h\
  ${SRC6}/codetypes.h ${SRC3}/dg_first.h ${SRC3}/dg_types.h\
  ${SRC}/diag_config.h ${SRC3}/diaginfo.h ${SRC3}/diagtypes.h\
  ${SRC1}/exptypes.h ${SRC2}/installtypes.h ${SRC5}/li_types.h\
--- src/installers/80x86/freebsd/assembler.c.orig	Mon Mar 16 12:38:37 1998
+++ src/installers/80x86/freebsd/assembler.c	Mon Sep 28 22:04:51 1998
@@@@ -34,11 +34,21 @@@@
 #include "common_types.h"
 #include "out.h"
 #include "expmacs.h"
+#include "exp.h"
+#include "localflags.h"
+#include "shapemacs.h"
 #include "operand.h"
 #include "machine.h"
-#include "localflags.h"
+#include "flags.h"
 #include "basicread.h"
 #include "coder.h"
+#include "assembler.h"
+#include "instr.h"
+#include "instr386.h"
+#include "xalloc.h"
+#include "install_fns.h"
+#include <string.h>
+
 
 
 /* PROCEDURES */
@@@@ -47,6 +57,10 @@@@
     PROTO_N ( (n) )
     PROTO_T ( int n )
 {
+  if (freebsd_elf) {
+    outs(".align "); outn((long)n); outnl();
+    return;
+  }
   if (n == 1)
     return;
   outs(".align ");
@@@@ -60,6 +74,7 @@@@
     default:
       n = 1; break;
   };
+
   outn((long)n); outnl();
   return;
 }
@@@@ -90,34 +105,67 @@@@
     PROTO_N ( (f, jr) )
     PROTO_T ( int f X exp jr )
 {
-  if (is80486 && !is80586 && ptno(jr) != last_jump_label) {
-    if (f == 1)	/* repeat jump */
-      outs(".align 3,0x90");
-    if (f == 2)	/* preceded by a jmp or ret */
-      outs(".align 4,0x90");
-    if (f == 3)
-      outs(".align 2,0x90");
-    outs("\n");
-  };
-  if (is80586 && ptno(jr) != last_jump_label)  {
-    if (f >= 1 && f <= 3)
-      outs(".align 2,0x90\n");
-  };
-  return;
+  if (freebsd_elf) {
+    if (is80486 && !is80586 && ptno(jr) != last_jump_label) {
+/* forward jump and continued into
+      if (f==0)
+        outs(".align 8");
+*/
+      if (f == 1)	/* repeat jump */
+        outs(".align 4");
+      if (f == 2)	/* preceded by a jmp or ret */
+        outs(".align 16");
+      outs("\n");
+    };
+    return;
+  }
+  else {
+    if (is80486 && !is80586 && ptno(jr) != last_jump_label)  {
+/* forward jump and continued into
+      if (f==0)
+        outs(".align 16,7,1");
+*/
+      if (f == 1)	/* repeat jump */
+        outs(".align 3,0x90");
+      if (f == 2)	/* preceded by a jmp or ret */
+        outs(".align 4,0x90");
+      if (f == 3)
+        outs(".align 2,0x90");
+      outs("\n");
+    };
+    if (is80586 && ptno(jr) != last_jump_label)  {
+      if (f >= 1 && f <= 3)
+        outs(".align 2,0x90\n");
+    };
+    return;
+  }
 }
 
 void eval_postlude
     PROTO_N ( (s, c) )
     PROTO_T ( char * s X exp c )
 {
-  UNUSED(s); UNUSED(c);
+  if (!freebsd_elf)
+    return;
+  outs(".size ");
+  outs (s);
+  outs (",");
+  outn((long)(shape_size(sh(c))+7)/8);
+  outnl();
+  outs(".type ");
+  outs (s);
+  outs (",@@object");
+  outnl();
   return;
 }
 
 void out_readonly_section
     PROTO_Z ()
 {
-  outs (".text");
+  if (freebsd_elf)
+    outs (".section .rodata");
+  else
+    outs (".text");
   return;
 }
 
@@@@ -125,11 +173,12 @@@@
     PROTO_N ( (id, sha) )
     PROTO_T ( char * id X shape sha )
 {
-  outs (".comm ");
-  outs (id);
-  outs (",");
-  outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
-  outnl ();
+	outs (".comm ");
+	outs (id);
+	outs (",");
+	outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
+
+	outnl ();
   return;
 }
 
@@@@ -137,11 +186,12 @@@@
     PROTO_N ( (id, sha) )
     PROTO_T ( char * id X shape sha )
 {
-  outs (".lcomm ");
-  outs (id);
-  outs (",");
-  outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
-  outnl ();
+	outs (".lcomm ");
+	outs (id);
+	outs (",");
+	outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
+
+	outnl ();
   return;
 }
 
@@@@ -149,17 +199,27 @@@@
     PROTO_N ( (id, sha) )
     PROTO_T ( char * id X shape sha )
 {
-  outs (".bss ");
-  outs (id);
-  outs (",");
-  outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
-  outnl ();
+	outs (".bss ");
+	outs (id);
+	outs (",");
+	outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
+
+	outnl ();
   return;
 }
 
+static int pic_label;
+
 void pic_prelude
     PROTO_Z ()
 {
+  int n = next_lab();
+  pic_label = n;
+  outs(" call "); outs(local_prefix); outn((long)n); outnl();
+  outs(local_prefix); outn((long)n); outs(":"); outnl();
+  outs(" popl %ebx"); outnl();
+  outs(" addl $_GLOBAL_OFFSET_TABLE_+[.-"); outs(local_prefix); outn((long)n); outs("],%ebx");
+    outnl();
   return;
 }
 
@@@@ -175,16 +235,47 @@@@
     PROTO_N ( (tab, a, min) )
     PROTO_T ( int tab X where a X int min )
 {
-  outs (" jmp *");
-  outs(local_prefix);
-  outn((long)tab);
-  outs("-");
-  outn((long)(4 * min));
-  outs ("(,");
-  operand (32, a, 1, 0);
-  outs (",4)");
-  outnl ();
-  return;
+  if (PIC_code)  {
+    if (min != 0) {
+      sub (slongsh, mw(zeroe,min), a, reg0);
+      a = reg0;
+    }
+    if (eq_where (a, reg0)) {
+      outs (" movl ");
+    }
+    else {
+      outs (" movl %ebx,%eax");
+      outnl();
+      outs (" subl ");
+    }
+    outs(local_prefix);
+    outn((long)tab);
+    outs("@@GOTOFF(%ebx,");
+    operand (32, a, 1, 0);
+    outs(",4),%eax");
+    outnl();
+    if (eq_where (a, reg0)) {
+      outs (" subl %ebx,%eax");
+      outnl();
+      outs (" negl %eax");
+      outnl();
+    }
+    outs(" jmp *%eax");
+    outnl();
+    return;
+  }
+  else  {
+    outs (" jmp *");
+    outs(local_prefix);
+    outn((long)tab);
+    outs("-");
+    outn((long)(4 * min));
+    outs ("(,");
+    operand (32, a, 1, 0);
+    outs (",4)");
+    outnl ();
+    return;
+  };
 }
 
 void out_switch_table
@@@@ -204,15 +295,31 @@@@
   for (i = min; i <= max; ++i) {
     outs (".long ");
     if (v[i - min] != -1)  {
-      outs(local_prefix);
-      outn ((long)v[i - min]);
+      if (PIC_code) {
+	outs(" _GLOBAL_OFFSET_TABLE_+[.-");
+	outs(local_prefix);
+	outn ((long)v[i - min]);
+	outs("]");
+      }
+      else {
+	outs(local_prefix);
+	outn ((long)v[i - min]);
+      }
     }
     else  {
       if (absent == -1)
         outn ((long)0);
       else {
-        outs(local_prefix);
-        outn ((long)absent);
+	if (PIC_code) {
+	  outs(" _GLOBAL_OFFSET_TABLE_+[.-");
+	  outs(local_prefix);
+	  outn ((long)absent);
+	  outs("]");
+	}
+	else {
+	  outs(local_prefix);
+	  outn ((long)absent);
+	}
       };
     };
     outnl ();
@@@@ -248,7 +355,7 @@@@
 
 void outend
     PROTO_Z ()
-{
+{		/* close the output */
   int   st;
   outs(".text");
   outnl();
@@@@ -287,8 +394,18 @@@@
     PROTO_N ( (id) )
     PROTO_T ( char* id )
 {
-  outs(".stabs \"___TDFI_LIST__\",22,0,0,");
+  if (!freebsd_elf) {
+    outs(".stabs \"___TDFI_LIST__\",22,0,0,");
+    outs (id);
+    outnl ();
+    outnl ();
+    return;
+  }
+  outs (".section .init\n");
+  outs (" call ");
   outs (id);
+  if (PIC_code)
+    outs ("@@PLT");
   outnl ();
   outnl ();
   return;
@@@@ -296,7 +413,7 @@@@
 
 
 void out_main_prelude
-    PROTO_Z ()
+    PROTO_Z ()		/* if (!freebsd_elf) */
 {
   int nl1 = next_lab ();
   int nl2 = next_lab ();
@@@@ -318,7 +435,7 @@@@
 }
 
 void out_main_postlude
-    PROTO_Z ()
+    PROTO_Z ()	/* if (!freebsd_elf) */
 {
   char * sdummy = "Idummy";
   char * pdummy = (char *) xcalloc (((int)strlen(local_prefix) +
@@@@ -332,3 +449,4 @@@@
   out_initialiser(pdummy);
   return;
 }
+
--- src/installers/80x86/freebsd/config.h.orig	Mon Mar 16 13:25:23 1998
+++ src/installers/80x86/freebsd/config.h	Mon Sep 28 22:08:24 1998
@@@@ -57,7 +57,7 @@@@
 #define issol86 0
 #define islinux 0
 #define isfreebsd 1
-#define remove_struct_ref 1
+#define remove_struct_ref (!freebsd_elf)
 
 #define has_setcc 1
 #define little_end 1
@@@@ -84,7 +84,7 @@@@
 #define do_case_transforms 1
 #define substitute_complex 1
 #define has_rotate 1
-#define GCC_STRUCTS 1
+#define GCC_STRUCTS -1	/* (freebsd_elf ? 0 : 1) */
 
 
 #define maxmin_implemented 1
@@@@ -96,7 +96,8 @@@@
 #define value_of_null 0
 #define no_trap_on_nil_contents 1
 
-#define prefix_length 1	/* strlen(name_prefix) */
+extern int freebsd_elf;  /* machine.c */
+#define prefix_length (freebsd_elf ? 0 : 1)	/* strlen(name_prefix) */
 #define AVOID_INTOV 0	/* No software interrupts */
 #define normal_fpucon 0x1272
 
--- src/installers/80x86/freebsd/diag_out.c.orig	Fri Mar 27 11:47:50 1998
+++ src/installers/80x86/freebsd/diag_out.c	Mon Sep 28 22:12:37 1998
@@@@ -248,13 +248,17 @@@@
 
     if (seg != 0)		/* 0 suppresses always */
     {
-      if (seg < 0)
+      if (seg < 0 && !freebsd_elf)
 	seg = - seg;
       if (seg > 0)		/* -ve line nos are put out in the stabs */
       {
 	i = next_lab () ;
 	fprintf ( dg_file, "%sL.%ld:\n", local_prefix, i ) ;
 	fprintf ( dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld",seg, lno, local_prefix, i ) ;
+	if (freebsd_elf && in_proc) {
+	  outs ("-");
+	  out_procname ();
+	}
 	outnl ();
       }
     }
--- src/installers/80x86/freebsd/machine.c.orig	Mon Mar 16 12:38:37 1998
+++ src/installers/80x86/freebsd/machine.c	Mon Sep 28 22:14:25 1998
@@@@ -40,13 +40,33 @@@@
 #include "szs_als.h"
 
 /* VARIABLES */
+/* All variables are initialised, jmf */
 
-char * local_prefix = "L";
-char * name_prefix = "_";
+int freebsd_elf = 1;
+
+char * local_prefix = ".L";
+char * name_prefix = "";
 
 
 
 /* PROCEDURES */
+
+void set_freebsd_format
+    PROTO_N ( (elf) )
+    PROTO_T ( int elf )
+{
+  freebsd_elf = elf;
+  if (elf) {
+    local_prefix = ".L";
+    name_prefix = "";
+  }
+  else {
+    local_prefix = "L";
+    name_prefix = "_";
+  }
+  return;
+}
+
 
 /* is the result of a procedure delivering
    this shape produced in registers. */
--- src/installers/80x86/freebsd/trans.1.orig	Mon Mar 16 12:38:37 1998
+++ src/installers/80x86/freebsd/trans.1	Mon Mar 16 13:25:24 1998
@@@@ -94,7 +94,7 @@@@
 .IP \fB-K\fIstr\fR
 Causes \fBtrans386\fR to optimise its code for a particular processor
 model, determined by \fIstr\fR.  The available values of \fIstr\fR are
-3 for the 80386, 4 for the 80486 (the default) and 5 for the Pentium.
+3 for the 80386, 4 for the 80486 and 5 for the Pentium (the default).
 So \fB-K3\fR means optimise for the 80386 etc.
 .\" ----------------------------------------------------------------------
 .IP \fB-M\fIswitch\fR
@


1.1
log
@TenDRA does ELF Part I
@
text
@@

