Patches for GCC 1.37.1 on SCO Unix 3.2
Chip Salzenberg
chip at tct.uucp
Wed Aug 8 02:22:17 AEST 1990
[ Contents: Patches for GCC under SCO Unix/386 using the SCO assembler
and SDB debugging information. ]
This article consists of a patch and a sharchive of new files for GCC
1.37.1 under SCO Unix/386. This patch, which is the second one I have
released, works with the standard SCO assembler and CodeView debugger.
It also provides configuration for G++, but the modifications to G++
code I have saved for a separate article.
This set of patches might be a good candidate for incorporation into
the standard GCC distribution. There are a lot of SCO Unix users out
there.
Besides the typical porting modifications, this patch includes code to
support the Microsoft C "#pragma pack()" directive. This pragma
controls structure packing on a structure-by-structure basis, which
feature is important under SCO Unix, and quite useful in its own
right. I lifted the code from Steve Bleazard's Xenix patches.
Thanks, Steve.
The use of shared libraries ("-lc_s") under SCO Unix requires that the
linker be called, not with crt0.o as usual, but rather with crt1.o at
as the first object file and crtn.o as the last. Therefore, I added a
new entry to the "spec" string of gcc: "%E", for ENDFILE_SPEC. It is
defined appropriately in the SCO Unix configuration file; all versions
of Unix/386 should probably define it similarly.
Miscellaneous changes:
SysV-specific modifications to the Makefile do NOT appear in this
patch, so everyone can apply these patches without trouble.
The name "stamp-extract.c" is longer than 14 characters, so SCO
Unix, in a fit of POSIX compliance, won't create it. Makefile now
uses the name "stamp-extract".
Even if /bin/ranlib exists, you may not want to use it. SCO Unix,
for example, has a "ranlib" command, but it's just a holdover from
the Xenix development system. The new make variable $(RANLIB)
takes care of this little hiccup.
Under SCO Unix, the type "va_list" is defined in <stdio.h>, and
the preprocessor macro "_VA_LIST" is used to prevent duplicate
definition. So this patch changes the GNU <stdarg.h> to use the
same macro. This change should be harmless on other systems.
Additional notes for SCO Unix users:
SCO Unix sites should set "CC" and "OLDCC" to "rcc", the AT&T
compiler, and make all other modifications to the Makefile that
are suggested in the comments for SysV. Specifically, include
-lPW.
Don't install GNU <limits.h>; SCO's version is POSIX-compliant.
SCO International Language support is included with the "-scointl"
flag; otherwise, it is omitted.
SHAR AND ENJOY.
-- Chip Salzenberg, <chip at tct.uucp> or <chip%tct at pdn.paradyne.com>
Index: Makefile
***************
*** 28,31 ****
--- 28,34 ----
AR = ar
SHELL = /bin/sh
+ # on SysV, define this as ":"
+ RANLIB = /usr/bin/ranlib
+ #RANLIB = :
# on sysV, define this as cp.
INSTALL = install -c
***************
*** 144,149 ****
rtl.o rtlanal.o expr.o stmt.o expmed.o explow.o optabs.o varasm.o \
symout.o dbxout.o sdbout.o emit-rtl.o insn-emit.o \
! integrate.o jump.o cse.o loop.o flow.o stupid.o combine.o \
! regclass.o local-alloc.o global-alloc.o reload.o reload1.o caller-save.o \
insn-peep.o final.o recog.o insn-recog.o insn-extract.o insn-output.o
--- 147,152 ----
rtl.o rtlanal.o expr.o stmt.o expmed.o explow.o optabs.o varasm.o \
symout.o dbxout.o sdbout.o emit-rtl.o insn-emit.o \
! integrate.o jump.o cse.o loop.o flow.o stupid.o combine.o regclass.o \
! local-alloc.o global-alloc.o reload.o reload1.o caller-save.o pragma.o \
insn-peep.o final.o recog.o insn-recog.o insn-extract.o insn-output.o
***************
*** 153,157 ****
insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
stamp-flags.h stamp-config.h stamp-codes.h \
! stamp-output.c stamp-recog.c stamp-emit.c stamp-extract.c stamp-peep.c \
genemit genoutput genrecog genextract genflags gencodes genconfig genpeep \
cc1 cpp cccp # cc1plus
--- 156,160 ----
insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
stamp-flags.h stamp-config.h stamp-codes.h \
! stamp-output.c stamp-recog.c stamp-emit.c stamp-extract stamp-peep.c \
genemit genoutput genrecog genextract genflags gencodes genconfig genpeep \
cc1 cpp cccp # cc1plus
***************
*** 230,234 ****
rm -f $${name}.[co]; \
done
! if [ -f /usr/bin/ranlib -o -f /bin/ranlib ] ; then ranlib tmpgnulib ;fi
# Actually build it in tmpgnulib above, then rename now,
# so that gnulib itself remains nonexistent if compilation is aborted.
--- 233,237 ----
rm -f $${name}.[co]; \
done
! $(RANLIB) tmpgnulib
# Actually build it in tmpgnulib above, then rename now,
# so that gnulib itself remains nonexistent if compilation is aborted.
***************
*** 248,252 ****
rm -f $${name}.o; \
done
! if [ -f /usr/bin/ranlib -o -f /bin/ranlib ] ; then ranlib gnulib ;fi
# On HPUX, if you are working with the GNU assembler and linker,
# the previous line must be commented out.
--- 251,255 ----
rm -f $${name}.o; \
done
! $(RANLIB) gnulib
# On HPUX, if you are working with the GNU assembler and linker,
# the previous line must be commented out.
***************
*** 432,440 ****
$(CC) $(CFLAGS) $(INCLUDES) -c insn-extract.c
! insn-extract.c: stamp-extract.c ;
! stamp-extract.c : md genextract
./genextract md > tmp-extract.c
$(srcdir)/move-if-change tmp-extract.c insn-extract.c
! touch stamp-extract.c
insn-peep.o : insn-peep.c $(CONFIG_H) $(RTL_H) regs.h real.h
--- 435,443 ----
$(CC) $(CFLAGS) $(INCLUDES) -c insn-extract.c
! insn-extract.c: stamp-extract ;
! stamp-extract : md genextract
./genextract md > tmp-extract.c
$(srcdir)/move-if-change tmp-extract.c insn-extract.c
! touch stamp-extract
insn-peep.o : insn-peep.c $(CONFIG_H) $(RTL_H) regs.h real.h
***************
*** 561,565 ****
-if [ -f cc1plus ] ; then $(INSTALL) cc1plus $(libdir)/gcc-cc1plus ;fi
$(INSTALL) gnulib $(libdir)/gcc-gnulib
! -if [ -f /usr/bin/ranlib ] ; then (cd $(libdir); ranlib gcc-gnulib) ;fi
$(INSTALL) cpp $(libdir)/gcc-cpp
$(INSTALL) gcc $(bindir)
--- 564,568 ----
-if [ -f cc1plus ] ; then $(INSTALL) cc1plus $(libdir)/gcc-cc1plus ;fi
$(INSTALL) gnulib $(libdir)/gcc-gnulib
! (cd $(libdir); $(RANLIB) gcc-gnulib)
$(INSTALL) cpp $(libdir)/gcc-cpp
$(INSTALL) gcc $(bindir)
***************
*** 610,614 ****
-mv $(STAGESTUFF) $(STAGE_GCC) stage1
-rm -f stage1/gnulib
! -ln gnulib stage1 || (cp gnulib stage1 && ranlib stage1/gnulib)
stage2: force
--- 613,617 ----
-mv $(STAGESTUFF) $(STAGE_GCC) stage1
-rm -f stage1/gnulib
! -ln gnulib stage1 || (cp gnulib stage1 && $(RANLIB) stage1/gnulib)
stage2: force
***************
*** 616,620 ****
-mv $(STAGESTUFF) $(STAGE_GCC) stage2
-rm -f stage2/gnulib
! -ln gnulib stage2 || (cp gnulib stage2 && ranlib stage2/gnulib)
stage3: force
--- 619,623 ----
-mv $(STAGESTUFF) $(STAGE_GCC) stage2
-rm -f stage2/gnulib
! -ln gnulib stage2 || (cp gnulib stage2 && $(RANLIB) stage2/gnulib)
stage3: force
***************
*** 622,626 ****
-mv $(STAGESTUFF) $(STAGE_GCC) stage3
-rm -f stage3/gnulib
! -ln gnulib stage3 || (cp gnulib stage3 && ranlib stage3/gnulib)
stage4: force
--- 625,629 ----
-mv $(STAGESTUFF) $(STAGE_GCC) stage3
-rm -f stage3/gnulib
! -ln gnulib stage3 || (cp gnulib stage3 && $(RANLIB) stage3/gnulib)
stage4: force
***************
*** 628,632 ****
-mv $(STAGESTUFF) $(STAGE_GCC) stage4
-rm -f stage4/gnulib
! -ln gnulib stage4 || (cp gnulib stage4 && ranlib stage4/gnulib)
TAGS: force
--- 631,635 ----
-mv $(STAGESTUFF) $(STAGE_GCC) stage4
-rm -f stage4/gnulib
! -ln gnulib stage4 || (cp gnulib stage4 && $(RANLIB) stage4/gnulib)
TAGS: force
Index: config/xm-i386v.h
***************
*** 44,47 ****
#ifdef __GNUC__
! #define alloca(n) __builtin_alloca(n)
#endif
--- 44,47 ----
#ifdef __GNUC__
! #define alloca __builtin_alloca
#endif
Index: gcc.c
***************
*** 81,84 ****
--- 81,85 ----
%L process LIB_SPEC as a spec.
%S process STARTFILE_SPEC as a spec. A capital S is actually used here.
+ %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
%c process SIGNED_CHAR_SPEC as a spec.
%C process CPP_SPEC as a spec. A capital C is actually used here.
***************
*** 194,197 ****
--- 195,203 ----
#endif
+ /* config.h can define ENDFILE_SPEC to override the default crtn files. */
+ #ifndef ENDFILE_SPEC
+ #define ENDFILE_SPEC ""
+ #endif
+
/* This spec is used for telling cpp whether char is signed or not. */
#define SIGNED_CHAR_SPEC \
***************
*** 288,292 ****
%{A} %{d} %{e*} %{N} %{n} %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z}\
%{y*} %{!A:%{!nostdlib:%S}} \
! %{L*} %o %{!nostdlib:gnulib%s %{g:-lg} %L gnulib%s}\n }}}}";
/* Accumulate a command (program name and args), and run it. */
--- 294,298 ----
%{A} %{d} %{e*} %{N} %{n} %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z}\
%{y*} %{!A:%{!nostdlib:%S}} \
! %{L*} %o %{!nostdlib:gnulib%s %{g:-lg} %L gnulib%s %{!A:%E}}\n }}}}";
/* Accumulate a command (program name and args), and run it. */
***************
*** 1310,1313 ****
--- 1316,1323 ----
case 'S':
do_spec_1 (STARTFILE_SPEC, 0);
+ break;
+
+ case 'E':
+ do_spec_1 (ENDFILE_SPEC, 0);
break;
Index: c-parse.tab.c
***************
*** 2906,2911 ****
&& getc (finput) == 'm'
&& getc (finput) == 'a'
! && ((c = getc (finput)) == ' ' || c == '\t' || c == '\n'))
goto skipline;
}
--- 2906,2955 ----
&& getc (finput) == 'm'
&& getc (finput) == 'a'
! && ((c = getc (finput)) == ' ' || c == '\t'))
! {
! #ifdef PRAGMA_PACK
! int i;
!
! while ((c = getc (finput)) == ' ' || c == '\t')
! ;
! ungetc (c, finput);
! for (i = 0; i < 32; ++i) /* arbitrary pragma directive size */
! {
! if ((c = getc (finput)) < 'a' || c > 'z')
! {
! ungetc (c, finput);
! break;
! }
! token_buffer[i] = c;
! }
! token_buffer[i] = '\0';
!
! if (strcmp(token_buffer, "pack") != 0)
! goto skipline;
!
! if ((c = getc (finput)) != '(')
! {
! ungetc (c, finput);
! error ("invalid #pragma pack");
! goto skipline;
! }
!
! if ((c = getc (finput)) == '1' || c == '2' || c == '4')
! {
! pragma_pack (c - '0');
! c = getc (finput);
! }
! else
! pragma_pack_default ();
!
! if (c != ')')
! {
! ungetc (c, finput);
! error ("invalid #pragma pack");
! goto skipline;
! }
! #endif
goto skipline;
+ }
}
Index: c-parse.y
***************
*** 1783,1788 ****
&& getc (finput) == 'm'
&& getc (finput) == 'a'
! && ((c = getc (finput)) == ' ' || c == '\t' || c == '\n'))
goto skipline;
}
--- 1783,1832 ----
&& getc (finput) == 'm'
&& getc (finput) == 'a'
! && ((c = getc (finput)) == ' ' || c == '\t'))
! {
! #ifdef PRAGMA_PACK
! int i;
!
! while ((c = getc (finput)) == ' ' || c == '\t')
! ;
! ungetc (c, finput);
! for (i = 0; i < 32; ++i) /* arbitrary pragma directive size */
! {
! if ((c = getc (finput)) < 'a' || c > 'z')
! {
! ungetc (c, finput);
! break;
! }
! token_buffer[i] = c;
! }
! token_buffer[i] = '\0';
!
! if (strcmp(token_buffer, "pack") != 0)
! goto skipline;
!
! if ((c = getc (finput)) != '(')
! {
! ungetc (c, finput);
! error ("invalid #pragma pack");
! goto skipline;
! }
!
! if ((c = getc (finput)) == '1' || c == '2' || c == '4')
! {
! pragma_pack (c - '0');
! c = getc (finput);
! }
! else
! pragma_pack_default ();
!
! if (c != ')')
! {
! ungetc (c, finput);
! error ("invalid #pragma pack");
! goto skipline;
! }
! #endif
goto skipline;
+ }
}
Index: hard-params.c
***************
*** 195,198 ****
--- 195,209 ----
#include <stdio.h>
+ /* Kludge around the possiblity that <stdio.h> includes <limits.h> */
+ #ifdef CHAR_BIT
+ # undef CHAR_BIT
+ # undef CHAR_MAX
+ # undef CHAR_MIN
+ # undef SCHAR_MAX
+ # undef SCHAR_MIN
+ # undef UCHAR_MAX
+ # undef UCHAR_MIN
+ #endif
+
#ifdef VERIFY
#include "limits.h"
Index: stdarg.h
***************
*** 2,6 ****
--- 2,9 ----
#define _STDARG_H
+ #ifndef _VA_LIST
+ #define _VA_LIST
typedef char *va_list;
+ #endif
/* Amount of space required in an argument list for an arg of type TYPE.
Index: stor-layout.c
***************
*** 499,502 ****
--- 499,506 ----
layout_decl (field, var_size ? size_unit : const_size);
+ #ifdef PRAGMA_PACK
+ if (pragma_pack_seen())
+ DECL_ALIGN(field) = MIN(pragma_align_val(), DECL_ALIGN(field));
+ #endif
desired_align = DECL_ALIGN (field);
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: config/tm-i386v-sco.h pragma.c packtest.c
# Wrapped by chip at tct on Wed Aug 1 10:36:32 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'config/tm-i386v-sco.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'config/tm-i386v-sco.h'\"
else
echo shar: Extracting \"'config/tm-i386v-sco.h'\" \(1820 characters\)
sed "s/^X//" >'config/tm-i386v-sco.h' <<'END_OF_FILE'
X/* Definitions for Intel 386 running SCO Unix System V.
X Copyright (C) 1988 Free Software Foundation, Inc.
X
XThis file is part of GNU CC.
X
XGNU CC is free software; you can redistribute it and/or modify
Xit under the terms of the GNU General Public License as published by
Xthe Free Software Foundation; either version 1, or (at your option)
Xany later version.
X
XGNU CC is distributed in the hope that it will be useful,
Xbut WITHOUT ANY WARRANTY; without even the implied warranty of
XMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
XGNU General Public License for more details.
X
XYou should have received a copy of the GNU General Public License
Xalong with GNU CC; see the file COPYING. If not, write to
Xthe Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
X
X
X/* Mostly it's like AT&T Unix System V. */
X
X#include "tm-i386v.h"
X
X/* Support the Microsloth "#pragma pack()" directive. */
X
X#define PRAGMA_PACK
X
X/* Version string. */
X
X#undef TARGET_VERSION
X#ifdef PRAGMA_PACK
X#define TARGET_VERSION \
X fprintf (stderr, " (SCO 80386, #pragma pack)");
X#else
X#define TARGET_VERSION \
X fprintf (stderr, " (SCO 80386)");
X#endif
X
X/* Use crt1.o as a startup file and crtn.o as a closing file. */
X
X#undef STARTFILE_SPEC
X#define STARTFILE_SPEC \
X "%{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}"
X
X#undef ENDFILE_SPEC
X#define ENDFILE_SPEC \
X "crtn.o%s"
X
X/* Library spec, including SCO international language support. */
X
X#undef LIB_SPEC
X#define LIB_SPEC \
X "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} %{scointl:libintl.a%s} -lc"
X
X/* Specify predefined symbols in preprocessor. */
X
X#undef CPP_PREDEFINES
X#define CPP_PREDEFINES \
X"-Dunix -Di386 -DM_UNIX -DM_I386 -DM_COFF -DM_WORDSWAP%{scointl: -DM_INTERNAT}"
X
X/* SCO's assember doesn't grok '$' in labels (for g++) */
X
X#define NO_DOLLAR_IN_LABEL
END_OF_FILE
if test 1820 -ne `wc -c <'config/tm-i386v-sco.h'`; then
echo shar: \"'config/tm-i386v-sco.h'\" unpacked with wrong size!
fi
# end of 'config/tm-i386v-sco.h'
fi
if test -f 'pragma.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'pragma.c'\"
else
echo shar: Extracting \"'pragma.c'\" \(311 characters\)
sed "s/^X//" >'pragma.c' <<'END_OF_FILE'
X#define DEFAULT_ALIGN 32
X
Xstatic int pack_align = DEFAULT_ALIGN;
Xstatic int was_pragma = 0;
X
Xpragma_pack(val)
Xint val;
X{
X pack_align = 8 * val;
X was_pragma = 1;
X}
X
Xpragma_align_val()
X{
X return pack_align;
X}
X
Xpragma_pack_default()
X{
X pack_align = DEFAULT_ALIGN;
X}
X
Xint pragma_pack_seen()
X{
X return was_pragma;
X}
END_OF_FILE
if test 311 -ne `wc -c <'pragma.c'`; then
echo shar: \"'pragma.c'\" unpacked with wrong size!
fi
# end of 'pragma.c'
fi
if test -f 'packtest.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'packtest.c'\"
else
echo shar: Extracting \"'packtest.c'\" \(2439 characters\)
sed "s/^X//" >'packtest.c' <<'END_OF_FILE'
Xstatic char *rcsid = "@(#)$Header: /pdsrc/Local/RCS/packtest.c,v 1.1 90/04/26 17:50:35 root Exp $";
X
X/*
X * Regression test to check that gcc's #pragma pack() support does the
X * same thing as Microsoft C's.
X *
X * Run with this command from sh, not csh, since SCO's csh is BROKEN.
X * cc packtest.c && ./a.out > m && gcc packtest.c && ./a.out > g && diff m g
X * You should not see any output.
X *
X * $Log: packtest.c,v $
X * Revision 1.1 90/04/26 17:50:35 root
X * Initial revision
X *
X */
X
X#pragma pack(4)
Xstruct s1 {
X char one;
X int two;
X long three;
X double four;
X} s1;
X#pragma pack(2)
Xstruct s2 {
X char one;
X int two;
X long three;
X double four;
X} s2;
X#pragma pack(1)
Xstruct s3 {
X char one;
X int two;
X long three;
X double four;
X} s3;
X#pragma pack()
Xstruct s4 {
X char one;
X int two;
X long three;
X double four;
X} s4;
Xstruct biggie {
X struct s3 x1;
X struct s1 b1;
X struct s3 x2;
X struct s2 b2;
X struct s3 x3;
X struct s3 b3;
X struct s3 x4;
X struct s4 b4;
X} b;
X#define offsetof(TYPE, MEMBER) ((unsigned) &((TYPE *)0)->MEMBER)
Xmain()
X{
X printf("% 4d% 4d% 4d\n",
X offsetof(struct s1, two),
X offsetof(struct s1, three),
X offsetof(struct s1, four));
X printf("% 4d% 4d% 4d\n",
X offsetof(struct s2, two),
X offsetof(struct s2, three),
X offsetof(struct s2, four));
X printf("% 4d% 4d% 4d\n",
X offsetof(struct s3, two),
X offsetof(struct s3, three),
X offsetof(struct s3, four));
X printf("% 4d% 4d% 4d\n",
X offsetof(struct s4, two),
X offsetof(struct s4, three),
X offsetof(struct s4, four));
X printf("\n% 4d% 4d% 4d\n",
X ((char *)&b.b1.two) - ((char *)&b.b1.one),
X ((char *)&b.b1.three) - ((char *)&b.b1.one),
X ((char *)&b.b1.four) - ((char *)&b.b1.one));
X printf("% 4d% 4d% 4d\n",
X ((char *)&b.b2.two) - ((char *)&b.b2.one),
X ((char *)&b.b2.three) - ((char *)&b.b2.one),
X ((char *)&b.b2.four) - ((char *)&b.b2.one));
X printf("% 4d% 4d% 4d\n",
X ((char *)&b.b3.two) - ((char *)&b.b3.one),
X ((char *)&b.b3.three) - ((char *)&b.b3.one),
X ((char *)&b.b3.four) - ((char *)&b.b3.one));
X printf("% 4d% 4d% 4d\n\n",
X ((char *)&b.b4.two) - ((char *)&b.b4.one),
X ((char *)&b.b4.three) - ((char *)&b.b4.one),
X ((char *)&b.b4.four) - ((char *)&b.b4.one));
X printf(" % 4d% 4d\n", sizeof b.b1, (char *)&b.b1 - (char *)&b);
X printf(" % 4d% 4d\n", sizeof b.b2, (char *)&b.b2 - (char *)&b);
X printf(" % 4d% 4d\n", sizeof b.b3, (char *)&b.b3 - (char *)&b);
X printf(" % 4d% 4d\n", sizeof b.b4, (char *)&b.b4 - (char *)&b);
X exit(0);
X}
END_OF_FILE
if test 2439 -ne `wc -c <'packtest.c'`; then
echo shar: \"'packtest.c'\" unpacked with wrong size!
fi
# end of 'packtest.c'
fi
echo shar: End of shell archive.
exit 0
--
Chip Salzenberg at ComDev/TCT <chip at tct.uucp>, <uunet!ateng!tct!chip>
More information about the Comp.unix.i386
mailing list