home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3918 < prev    next >
Internet Message Format  |  1991-08-28  |  42KB

  1. Xref: wupost comp.unix.xenix.sco:4108 alt.sources:3918
  2. Path: wupost!uunet!mcsun!ukc!stl!robobar!ronald
  3. From: Steve.Bleazard@robobar.Co.Uk
  4. Newsgroups: comp.unix.xenix.sco,alt.sources
  5. Subject: Xenix Patch Kit for GAS 1.38.1/GCC 1.40/GDB 3.5 (part 3/4)
  6. Message-ID: <Xenix/gcc-1.40.pch@robobar.co.uk>
  7. Date: 27 Aug 91 14:27:13 GMT
  8. Sender: ronald@robobar.co.uk (Ronald S H Khoo)
  9. Organization: Robobar Ltd., Perivale, Middx., ENGLAND.
  10. Lines: 1351
  11. X-Md4-Signature: e1d76c98f31452d65b8c0e7ece839772
  12.  
  13. Archive-Name: Xenix/gcc-1.40.pch
  14.  
  15. This is part 3 of a 4 part posting.
  16. Part 1 (the README) describes this package
  17.  
  18. *** gcc-1.40/Makefile    Mon Jul 29 13:15:49 1991
  19. --- Makefile    Mon Jul 29 13:45:38 1991
  20. ***************
  21. *** 157,162 ****
  22. --- 157,167 ----
  23.   # HARD_PARAMS_FLAGS= -Anansi
  24.   # (Says vasta@apollo.com.)
  25.   
  26. + # To compile GCC with Microsoft CC use the following CFLAGS and then
  27. + # 'make msc'.  Note that the resultant cc1 CANNOT compile with optimization
  28. + # switched on, ie stage 2 should not have '-O' in CFLAGS
  29. + CFLAGS = -g $(XCFLAGS)
  30. + PRAGMA=pragmapack.o
  31.   
  32.   # Dependency on obstack, alloca, malloc or whatever library facilities
  33.   # are not installed in the system libraries.
  34. ***************
  35. *** 192,198 ****
  36.    symout.o dbxout.o sdbout.o emit-rtl.o insn-emit.o \
  37.    integrate.o jump.o cse.o loop.o flow.o stupid.o combine.o \
  38.    regclass.o local-alloc.o global-alloc.o reload.o reload1.o caller-save.o \
  39. !  insn-peep.o final.o recog.o insn-recog.o insn-extract.o insn-output.o
  40.   
  41.   # Files to be copied away after each stage in building.
  42.   STAGE_GCC=gcc
  43. --- 197,203 ----
  44.    symout.o dbxout.o sdbout.o emit-rtl.o insn-emit.o \
  45.    integrate.o jump.o cse.o loop.o flow.o stupid.o combine.o \
  46.    regclass.o local-alloc.o global-alloc.o reload.o reload1.o caller-save.o \
  47. !  insn-peep.o final.o recog.o insn-recog.o insn-extract.o insn-output.o $(PRAGMA)
  48.   
  49.   # Files to be copied away after each stage in building.
  50.   STAGE_GCC=gcc
  51. ***************
  52. *** 239,244 ****
  53. --- 244,257 ----
  54.   # is include the system varargs.h.
  55.   
  56.   all: config.status gnulib gcc cc1 cpp float.h gnulib2 # cc1plus
  57. + msc: config.status gnulib cc1 cpp float.h gcc.msc gnulib2 # cc1plus
  58. + gcc.msc:    cc1 cpp version.o $(LIBDEPS)
  59. +     ./cpp -I/usr/include $(CPPFLAGS) $(INCLUDES) gcc.c > tmpgcc.i
  60. +     -./cc1 -quiet $(CFLAGS) -o tmpgcc.s tmpgcc.i
  61. +     /usr/local/lib/gcc-as -o gcc.o tmpgcc.s
  62. +     rm -f tmpgcc.s
  63. +     $(CC) $(CFLAGS) $(LDFLAGS) -o gcc gcc.o version.o $(LIBS)
  64.   
  65.   # Use this instead of `all' if you need to convert the libraries
  66.   # before you can use the compiler.
  67. ***************
  68. *** 433,440 ****
  69.   # from the GNU Emacs distribution.
  70.   # Note some machines won't allow $(CC) without -S on this source file.
  71.   alloca.o:    alloca.c
  72. !     $(CC) $(CFLAGS) -S `echo $(srcdir)/alloca.c | sed 's,^\./,,'`
  73. !     as alloca.s -o alloca.o
  74.   
  75.   # Now the source files that are generated from the machine description.
  76.   
  77. --- 446,452 ----
  78.   # from the GNU Emacs distribution.
  79.   # Note some machines won't allow $(CC) without -S on this source file.
  80.   alloca.o:    alloca.c
  81. !     $(CC) $(CFLAGS) -c `echo $(srcdir)/alloca.c | sed 's,^\./,,'`
  82.   
  83.   # Now the source files that are generated from the machine description.
  84.   
  85. *** gcc-1.40/Makefile.msc
  86. --- Makefile.msc    Wed Jul 10 16:36:39 1991
  87. ***************
  88. *** 0 ****
  89. --- 1,22 ----
  90. + # Microsoft C 5.1's built in cpp does not grok the large macros.
  91. + # Therefore use the AT&T cpp instead for the files that fail.
  92. + # Use this command line:
  93. + #    make -f Makefile -f Makefile.msc msc ALLOCA=alloca.o
  94. + explow.o:    explow.c
  95. +     /lib/cpp -P ${INCLUDES} explow.c >explow.i
  96. +     mv explow.i x.c
  97. +     cc ${CFLAGS} -c x.c
  98. +     mv x.o explow.o
  99. + reload.o:    reload.c
  100. +     /lib/cpp -P ${INCLUDES} reload.c >reload.i
  101. +     mv reload.i x.c
  102. +     cc ${CFLAGS} -c x.c
  103. +     mv x.o reload.o
  104. + recog.o:    recog.c
  105. +     /lib/cpp -P ${INCLUDES} recog.c >recog.i
  106. +     mv recog.i x.c
  107. +     cc ${CFLAGS} -c x.c
  108. +     mv x.o recog.o
  109. *** gcc-1.40/c-parse.y    Mon Jul 29 13:15:54 1991
  110. --- c-parse.y    Wed Jul 10 15:56:21 1991
  111. ***************
  112. *** 1803,1808 ****
  113. --- 1803,1849 ----
  114.             && getc (finput) == 'm'
  115.             && getc (finput) == 'a'
  116.             && ((c = getc (finput)) == ' ' || c == '\t' || c == '\n'))
  117. + #ifdef PRAGMA_PACK
  118. +       {
  119. +         token = yylex();
  120. +             if (token != IDENTIFIER) 
  121. +             goto skipline;
  122. +             if (strcmp(token_buffer, "pack") != 0)
  123. +                 goto skipline;
  124. +         
  125. +         token = yylex();
  126. +           if (token != '(') {
  127. +             error ("invalid #pragma pack expecting '('");
  128. +             goto skipline;
  129. +         }
  130. +         /* setup default alignment first */
  131. +         pragma_pack_default();
  132. +         token = yylex();
  133. +         if (token != ')')
  134. +         {
  135. +             if (token == CONSTANT
  136. +                 && TREE_CODE (yylval.ttype) == INTEGER_CST) {
  137. +                 int l = TREE_INT_CST_LOW (yylval.ttype);
  138. +                 pragma_pack(l);
  139. +             }
  140. +             else {
  141. +                 error ("invalid #pragma pack expecting 1, 2 or 4");
  142. +                 goto skipline;
  143. +             }
  144. +             token = yylex();
  145. +         }
  146. +           if (token != ')') {
  147. +             error ("invalid #pragma pack expecting ')'");
  148. +             goto skipline;
  149. +         }
  150. +         }
  151. + #endif
  152.           goto skipline;
  153.       }
  154.   
  155. *** gcc-1.40/config/tm-xenix386.h
  156. --- config/tm-xenix386.h    Thu Aug 22 15:28:27 1991
  157. ***************
  158. *** 0 ****
  159. --- 1,146 ----
  160. + /* Definitions for Intel 386 running SCO XENIX 386.
  161. +    Copyright (C) 1988 Free Software Foundation, Inc.
  162. + This file is part of GNU CC.
  163. + GNU CC is free software; you can redistribute it and/or modify
  164. + it under the terms of the GNU General Public License as published by
  165. + the Free Software Foundation; either version 1, or (at your option)
  166. + any later version.
  167. + GNU CC is distributed in the hope that it will be useful,
  168. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  169. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  170. + GNU General Public License for more details.
  171. + You should have received a copy of the GNU General Public License
  172. + along with GNU CC; see the file COPYING.  If not, write to
  173. + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  174. + #include "tm-i386.h"
  175. + /* Use the XENIX GAS assembler syntax.  */
  176. + #include "tm-xgas386.h"
  177. + /* By default, target has a 80387 -- XENIX emulates it anyway  */
  178. + #define TARGET_DEFAULT 1
  179. + /* Use crt1.o as a startup file and crtn.o as a closing file.  */
  180. + #define STARTFILE_SPEC  "Sseg.o%s %{!p:Scrt0.o%s} %{p:Smcrt0.o%s}"
  181. + #define STANDARD_STARTFILE_PREFIX_1 "/lib/386/"
  182. + /* -v is appropriate for use with GAS */
  183. + #define ASM_SPEC    "%{v} %{g}"
  184. + #define LIB_SPEC "Slibcfp.a%s Slibc.a%s"
  185. + #define FULL_LINK_SPEC "%{!c:%{!M*:%{!E:%{!S:ld %{o*} %l %{g:-g} \
  186. +  %{A} %{r} %{s} %{u*} \
  187. +  %{!nostdlib:%S} %{L*} %{!o:-o a.out} %o %{!nostdlib:gnulib%s %L gnulib%s}\n \
  188. +   }}}}";
  189. + #define LINK_SPEC "-i"
  190. + /* This is for use with G++.  FASCIST_LDR is defined in G++'s Makefile */
  191. + #ifdef FASCIST_LDR
  192. + #define FULL_COLLECT_SPEC \
  193. +   "%{!c:%{!M*:%{!E:%{!S:collect -o %g.S %g.R\n\
  194. + as %g.S -o %g.O\n\
  195. + ld %{o*} %{!o:-o a.out} %{!nostdlib:%S } %l %{g:-g} \
  196. + %{L*} %o %g.O %{!nostdlib:gnulib++%s gnulib%s %L } \n\
  197. + }}}}"
  198. + #define PLUS_FULL_LINK_SPEC \
  199. +   "%{!c:%{!M*:%{!E:%{!S:ld -o %g.R \
  200. +   %{!nostdlib:%S } %l %{g:-g}\
  201. +   %{L*} %o %{!nostdlib:gnulib++%s gnulib%s g++dummy%s %L }\n }}}}";
  202. + #else /* not FASCIST_LDR */
  203. + #define FULL_COLLECT_SPEC \
  204. +   "%{!c:%{!M*:%{!E:%{!S:collect -o %g.S %g.R\n\
  205. + as %g.S -o %g.O\n\
  206. + ld %{o*} %{!o:-o a.out} %{!nostdlib:%S } %g.R %g.O \
  207. +   %{!nostdlib:gnulib++%s gnulib%s %L } \n\
  208. + }}}}"
  209. + #define PLUS_FULL_LINK_SPEC \
  210. +   "%{!c:%{!M*:%{!E:%{!S:ld -r -o %g.R %l %{g:-g}\
  211. +   %{L*} %o %{!nostdlib:%L }\n }}}}";
  212. + #endif /* not FASCIST_LDR */
  213. + /* Specify predefined symbols in preprocessor.  */
  214. + /* You may wish to add -DM_INTERNAT, depending on your libraries. */
  215. + #define CPP_PREDEFINES "-Dunix \
  216. + -DM_I86 -DM_I86SM -DM_SDATA -DM_STEXT -DM_I386 -DM_XENIX -DM_BITFIELDS \
  217. + -Di386 -DM_XOUT -DM_SYS5 -DM_SYSV -DM_SYS3 -DM_SYSIII \
  218. + -DM_WORDSWAP"
  219. + /* no #sccs in preprocessor.  */
  220. + #undef SCCS_DIRECTIVE
  221. + /* no #ident */
  222. + /* #define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME); */
  223. + /* We dont want to output SDB debugging information.  */
  224. + #undef SDB_DEBUGGING_INFO
  225. + /* We want to output DBX debugging information, for use with GDB only  */
  226. + #define DBX_DEBUGGING_INFO
  227. + /* Implicit library calls should use memcpy, not bcopy, etc.  */
  228. + #define TARGET_MEM_FUNCTIONS
  229. + /* Writing `int' for a bitfield forces int alignment for the structure.  */
  230. + #undef PCC_BITFIELD_TYPE_MATTERS
  231. + /* Generate an external symbol request for __fltused if 80387 selected */
  232. + #undef ASM_FILE_START
  233. + #define ASM_FILE_START(FILE)                    \
  234. +   { fprintf (FILE, "\t.file\t\"%s\"\n", dump_base_name);     \
  235. +     if (TARGET_80387)                         \
  236. +       fprintf (FILE, "\t.stabs\t\"__fltused\",0,0,0,0\n"); }
  237. + /* Machines that use the AT&T assembler syntax
  238. +    also return floating point values in an FP register.  */
  239. + /* Define how to find the value returned by a function.
  240. +    VALTYPE is the data type of the value (as a tree).
  241. +    If the precise function being called is known, FUNC is its FUNCTION_DECL;
  242. +    otherwise, FUNC is 0.  */
  243. + #define VALUE_REGNO(MODE) \
  244. +   (((MODE)==SFmode || (MODE)==DFmode) ? FIRST_FLOAT_REG : 0)
  245. + /* 1 if N is a possible register number for a function value. */
  246. + #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0 || (N)== FIRST_FLOAT_REG)
  247. + /* Put address tables in data segment */
  248. + #undef ASM_OUTPUT_CASE_LABEL
  249. + #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE)    \
  250. +   { data_section();                        \
  251. +     ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM); }
  252. + #undef ASM_OUTPUT_CASE_END
  253. + #define ASM_OUTPUT_CASE_END(FILE,NUM,INSN) text_section()
  254. + #undef FUNCTION_PROFILER
  255. + #define FUNCTION_PROFILER(FILE, LABELNO)  \
  256. +    fprintf (FILE, "\tmovl $%sP%d,%%edx\n\tcall __mcount\n", LPREFIX, (LABELNO));
  257. *** gcc-1.40/config/tm-xgas386.h
  258. --- config/tm-xgas386.h    Wed Jul 10 15:56:17 1991
  259. ***************
  260. *** 0 ****
  261. --- 1,253 ----
  262. + /* Definitions for AT&T assembler syntax for the Intel 80386.
  263. +    Copyright (C) 1988 Free Software Foundation, Inc.
  264. + This file is part of GNU CC.
  265. + GNU CC is free software; you can redistribute it and/or modify
  266. + it under the terms of the GNU General Public License as published by
  267. + the Free Software Foundation; either version 1, or (at your option)
  268. + any later version.
  269. + GNU CC is distributed in the hope that it will be useful,
  270. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  271. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  272. + GNU General Public License for more details.
  273. + You should have received a copy of the GNU General Public License
  274. + along with GNU CC; see the file COPYING.  If not, write to
  275. + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  276. + #ifdef PRAGMA_PACK
  277. + #define TARGET_VERSION fprintf (stderr, " (80386, Xenix GAS syntax, #pragma pack() support included)");
  278. + #else
  279. + #define TARGET_VERSION fprintf (stderr, " (80386, Xenix GAS syntax)");
  280. + #endif
  281. + /* Define the syntax of instructions and addresses.  */
  282. + /* Define some concatenation macros to concatenate an opcode
  283. +    and one, two or three operands.  In other assembler syntaxes
  284. +    they may alter the order of ther operands.  */
  285. + #ifdef __STDC__
  286. + #define AS2(a,b,c) #a " " #b "," #c
  287. + #define AS3(a,b,c,d) #a " " #b "," #c "," #d
  288. + #define AS1(a,b) #a " " #b
  289. + #else
  290. + #define AS1(a,b) "a b"
  291. + #define AS2(a,b,c) "a b,c"
  292. + #define AS3(a,b,c,d) "a b,c,d"
  293. + #endif  
  294. + /* Output the size-letter for an opcode.
  295. +    CODE is the letter used in an operand spec (L, B, W, S or Q).
  296. +    CH is the corresponding lower case letter
  297. +      (except if CODE is L then CH is `l').  */
  298. + #define PUT_OP_SIZE(CODE,CH,FILE) putc (CH,(FILE))
  299. + /* Opcode suffix for fullword insn.  */
  300. + #define L_SIZE "l"
  301. + /* Prefix for register names in this syntax.  */
  302. + #define RP "%"
  303. + /* Prefix for immediate operands in this syntax.  */
  304. + #define IP "$"
  305. + /* Prefix for internally generated assembler labels.  */
  306. + #define LPREFIX ".L"
  307. + /* Output the prefix for an immediate operand, or for an offset operand.  */
  308. + #define PRINT_IMMED_PREFIX(FILE)  fputs ("$", (FILE))
  309. + #define PRINT_OFFSET_PREFIX(FILE)  fputs ("$", (FILE))
  310. + /* Indirect call instructions should use `*'.  */
  311. + #define USE_STAR 1
  312. + /* Prefix for a memory-operand X.  */
  313. + #define PRINT_PTR(X, FILE)
  314. + /* Delimiters that surround base reg and index reg.  */
  315. + #define ADDR_BEG(FILE) putc('(', (FILE))
  316. + #define ADDR_END(FILE) putc(')', (FILE))
  317. + /* Print an index register (whose rtx is IREG).  */
  318. + #define PRINT_IREG(FILE,IREG) \
  319. +   do                                \
  320. +   { fputs (",", (FILE)); PRINT_REG ((IREG), 0, (FILE)); }    \
  321. +   while (0)
  322. +   
  323. + /* Print an index scale factor SCALE.  */
  324. + #define PRINT_SCALE(FILE,SCALE) \
  325. +   if ((SCALE) != 1) fprintf ((FILE), ",%d", (SCALE))
  326. + /* Print a base/index combination.
  327. +    BREG is the base reg rtx, IREG is the index reg rtx,
  328. +    and SCALE is the index scale factor (an integer).  */
  329. + #define PRINT_B_I_S(BREG,IREG,SCALE,FILE) \
  330. +   { ADDR_BEG (FILE);                 \
  331. +     if (BREG) PRINT_REG ((BREG), 0, (FILE));    \
  332. +     if ((IREG) != 0)                \
  333. +       { PRINT_IREG ((FILE), (IREG));        \
  334. +         PRINT_SCALE ((FILE), (SCALE)); }    \
  335. +     ADDR_END (FILE); }
  336. + /* Define the syntax of pseudo-ops, labels and comments.  */
  337. + /* Assembler pseudos to introduce constants of various size.  */
  338. + #define ASM_BYTE "\t.byte "
  339. + #define ASM_SHORT "\t.value "
  340. + #define ASM_LONG "\t.long "
  341. + #define ASM_DOUBLE "\t.double "
  342. + /* String containing the assembler's comment-starter.  */
  343. + #define COMMENT_BEGIN "/"
  344. + /* Output at beginning of assembler file.  */
  345. + /* The .file command should always begin the output.  */
  346. + #undef ASM_FILE_START
  347. + #define ASM_FILE_START(FILE) \
  348. +   fprintf (FILE, "\t.file\t\"%s\"\n", dump_base_name);
  349. + /* Don't write a `.optim' pseudo; this assembler doesn't handle them.  */
  350. + #undef ASM_FILE_START_1
  351. + #define ASM_FILE_START_1(FILE)
  352. + /* Output to assembler file text saying following lines
  353. +    may contain character constants, extra white space, comments, etc.  */
  354. + #define ASM_APP_ON "/APP\n"
  355. + /* Output to assembler file text saying following lines
  356. +    no longer contain unusual constructs.  */
  357. + #define ASM_APP_OFF "/NO_APP\n"
  358. + /* This is how to output an assembler line
  359. +    that says to advance the location counter by SIZE bytes.  */
  360. + #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
  361. +   fprintf ((FILE), "\t.set .,.+%d\n", (SIZE))
  362. + /* Output before read-only data.  */
  363. + #define TEXT_SECTION_ASM_OP ".text"
  364. + /* Output before writable data.  */
  365. + #define DATA_SECTION_ASM_OP ".data"
  366. + /* Define the syntax of labels and symbol definitions/declarations.  */
  367. + /* This says how to output an assembler line
  368. +    to define a global common symbol.  */
  369. + /* We don't use ROUNDED because the standard compiler doesn't,
  370. +    and the linker gives error messages if a common symbol
  371. +    has more than one length value.  */
  372. + #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \
  373. + ( fputs (".comm ", (FILE)),            \
  374. +   assemble_name ((FILE), (NAME)),        \
  375. +   fprintf ((FILE), ",%d\n", (SIZE)))
  376. + /* This says how to output an assembler line
  377. +    to define a local common symbol.  */
  378. + /* Try lcomm to generate local bss 
  379. +  *
  380. +  * #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \
  381. +  *   (data_section (),                \
  382. +  *    ASM_OUTPUT_LABEL ((FILE), (NAME)),        \
  383. +  *    fprintf ((FILE), "\t.set .,.+%d\n", (ROUNDED)))
  384. +  */
  385. + #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \
  386. + ( fputs (".lcomm ", (FILE)),            \
  387. +   assemble_name ((FILE), (NAME)),        \
  388. +   fprintf ((FILE), ",%d\n", (SIZE)))
  389. + /* This is how to output an assembler line
  390. +    that says to advance the location counter
  391. +    by a multiple of 2**LOG bytes.  */
  392. + #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  393. +      if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", (LOG))
  394. + /* This is how to store into the string BUF
  395. +    the symbol_ref name of an internal numbered label where
  396. +    PREFIX is the class of label and NUM is the number within the class.
  397. +    This is suitable for output with `assemble_name'.  */
  398. + #define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER)    \
  399. +   sprintf ((BUF), "*.%s%d", (PREFIX), (NUMBER))
  400. + /* This is how to output an internal numbered label where
  401. +    PREFIX is the class of label and NUM is the number within the class.  */
  402. + #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)    \
  403. +   fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
  404. + /* This is how to output a reference to a user-level label named NAME.  */
  405. + #define ASM_OUTPUT_LABELREF(FILE,NAME)    \
  406. +   fprintf (FILE, "_%s", NAME)
  407. + /* This is how to output a command to make the user-level label named NAME
  408. +    defined for reference from other files.  */
  409. + #define ASM_GLOBALIZE_LABEL(FILE,NAME)    \
  410. +   (fputs (".globl ", FILE), assemble_name (FILE, NAME), fputs ("\n", FILE))
  411. + /* How to output an ASCII string constant.  */
  412. + #define ASM_OUTPUT_ASCII(FILE, p, size) \
  413. + { int i=0;                         \
  414. +   while (i < size)                    \
  415. +     { if (i%10 == 0) { if (i!=0) fprintf (FILE, "\n");    \
  416. +                fprintf (FILE, ASM_BYTE); }    \
  417. +       else fprintf (FILE, ",");                \
  418. +     fprintf (FILE, "0x%x",(p[i++] & 0377)) ;}    \
  419. +       fprintf (FILE, "\n"); }
  420. + #define EXTRA_SECTIONS in_cdata
  421. + /* Define the additional functions to select our additional sections.  */
  422. + #define CDATA_SECTION_ASM_OP ".data 1"
  423. + #define EXTRA_SECTION_FUNCTIONS                        \
  424. + void                                    \
  425. + cdata_section ()                            \
  426. + {                                    \
  427. +   if (in_section != in_cdata)                        \
  428. +     {                                    \
  429. +       fprintf (asm_out_file, "%s\n", CDATA_SECTION_ASM_OP);        \
  430. +       in_section = in_cdata;                        \
  431. +     }                                \
  432. + }
  433. + /* Given a decl node or constant node, choose the section to output it in
  434. +    and select that section.  */
  435. +        /* following takes  care of constants  emitted from
  436. +       the hash table entries (see above comment)
  437. +        */
  438. + #define SELECT_SECTION_MODE(MODE,RTX) cdata_section();
  439. + #define SELECT_RTX_SECTION(MODE, RTX) cdata_section();
  440. + #define SELECT_SECTION(DECL)                        \
  441. +   { if (TREE_CODE (DECL) == STRING_CST) {                \
  442. +        if (flag_writable_strings)                    \
  443. +           data_section ();                        \
  444. +        else                                \
  445. +         cdata_section ();                        \
  446. +     }                                    \
  447. +     else if (TREE_READONLY (DECL) && ! TREE_VOLATILE (DECL))        \
  448. +       cdata_section ();                            \
  449. +     else                                \
  450. +       data_section (); }
  451. *** gcc-1.40/config/xm-xenix386.h
  452. --- config/xm-xenix386.h    Fri Jul 12 07:43:58 1991
  453. ***************
  454. *** 0 ****
  455. --- 1,55 ----
  456. + /* Configuration for GNU C-compiler for Intel 80386 running SCO Xenix 386
  457. +    Copyright (C) 1988 Free Software Foundation, Inc.
  458. + This file is part of GNU CC.
  459. + GNU CC is free software; you can redistribute it and/or modify
  460. + it under the terms of the GNU General Public License as published by
  461. + the Free Software Foundation; either version 1, or (at your option)
  462. + any later version.
  463. + GNU CC is distributed in the hope that it will be useful,
  464. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  465. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  466. + GNU General Public License for more details.
  467. + You should have received a copy of the GNU General Public License
  468. + along with GNU CC; see the file COPYING.  If not, write to
  469. + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  470. + /* #defines that need visibility everywhere.  */
  471. + #define FALSE 0
  472. + #define TRUE 1
  473. + /* This describes the machine the compiler is hosted on.  */
  474. + #define HOST_BITS_PER_CHAR 8
  475. + #define HOST_BITS_PER_SHORT 16
  476. + #define HOST_BITS_PER_INT 32
  477. + #define HOST_BITS_PER_LONG 32
  478. + /* Arguments to use with `exit'.  */
  479. + #define SUCCESS_EXIT_CODE 0
  480. + #define FATAL_EXIT_CODE 33
  481. + #define USG
  482. + #ifndef __GNUC__
  483. + #define register auto /* Register variables are broken */
  484. + #endif
  485. + /* target machine dependencies.
  486. +    tm.h is a symbolic link to the actual target specific file.   */
  487. + #include "tm.h"
  488. + #define bcopy(a,b,c) memcpy (b,a,c)
  489. + #define bzero(a,b) memset (a,0,b)
  490. + #define bcmp(a,b,c) memcmp (a,b,c)
  491. + #ifdef __GNUC__
  492. + #define alloca(n) __builtin_alloca(n)
  493. + #endif
  494. + /* Implement Microsoft C compatible #pragma pack() */
  495. + #define PRAGMA_PACK
  496. *** gcc-1.40/config.gcc    Mon Jul 29 13:16:42 1991
  497. --- config.gcc    Wed Jul 10 15:56:16 1991
  498. ***************
  499. *** 331,336 ****
  500. --- 331,340 ----
  501.   #    370)
  502.   #        machine=370
  503.   #        ;;
  504. +     xenix386)        # for SCO Xenix/386
  505. +         cpu_type=i386
  506. +         configuration_file=xm-${machine}.h
  507. +         ;;
  508.       esac
  509.   
  510.           # if cpu_type is not set, define cpu_type to machine.
  511. *** gcc-1.40/gcc.c    Mon Jul 29 13:16:57 1991
  512. --- gcc.c    Fri Jul 12 08:15:31 1991
  513. ***************
  514. *** 303,312 ****
  515. --- 303,316 ----
  516.   };
  517.   
  518.   /* Here is the spec for running the linker, after compiling all files.  */
  519. + #ifdef FULL_LINK_SPEC
  520. + char *link_spec = FULL_LINK_SPEC
  521. + #else
  522.   char *link_spec = "%{!c:%{!M*:%{!E:%{!S:ld %{o*} %l\
  523.    %{A} %{d} %{e*} %{N} %{n} %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z}\
  524.    %{y*} %{!A:%{!nostdlib:%S}} \
  525.    %{L*} %o %{!nostdlib:%G gnulib%s %L gnulib%s %{!A:%E}}\n }}}}";
  526. + #endif
  527.   
  528.   /* Accumulate a command (program name and args), and run it.  */
  529.   
  530. ***************
  531. *** 361,368 ****
  532.   #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
  533.   #endif /* !defined STANDARD_STARTFILE_PREFIX */
  534.   
  535.   char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
  536. ! char *standard_startfile_prefix_1 = "/lib/";
  537.   char *standard_startfile_prefix_2 = "/usr/lib/";
  538.   
  539.   /* Clear out the vector of arguments (after a command is executed).  */
  540. --- 365,376 ----
  541.   #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
  542.   #endif /* !defined STANDARD_STARTFILE_PREFIX */
  543.   
  544. + #ifndef STANDARD_STARTFILE_PREFIX_1
  545. + #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
  546. + #endif /* !defined STANDARD_STARTFILE_PREFIX_1 */
  547.   char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
  548. ! char *standard_startfile_prefix_1 = STANDARD_STARTFILE_PREFIX_1;
  549.   char *standard_startfile_prefix_2 = "/usr/lib/";
  550.   
  551.   /* Clear out the vector of arguments (after a command is executed).  */
  552. ***************
  553. *** 1383,1389 ****
  554.   
  555.   char *
  556.   handle_braces (p)
  557. !      register char *p;
  558.   {
  559.     register char *q;
  560.     char *filter;
  561. --- 1391,1397 ----
  562.   
  563.   char *
  564.   handle_braces (p)
  565. !      char *p;
  566.   {
  567.     register char *q;
  568.     char *filter;
  569. *** gcc-1.40/pragmapack.c
  570. --- pragmapack.c    Wed Jul 10 16:57:32 1991
  571. ***************
  572. *** 0 ****
  573. --- 1,26 ----
  574. + #define DEFAULT_ALIGN    32
  575. + static int pack_align = DEFAULT_ALIGN;
  576. + static int was_pragma = 0;
  577. + pragma_pack(val)
  578. + int val;
  579. + {
  580. +     pack_align = 8 * val;
  581. +     was_pragma = 1;
  582. + }
  583. + pragma_align_val()
  584. + {
  585. +     return pack_align;
  586. + }
  587. + pragma_pack_default()
  588. + {
  589. +     pack_align = DEFAULT_ALIGN;
  590. + }
  591. + int pragma_pack_seen()
  592. + {
  593. +     return was_pragma;
  594. + }
  595. *** gcc-1.40/stor-layout.c    Mon Jul 29 13:17:35 1991
  596. --- stor-layout.c    Wed Jul 10 15:56:23 1991
  597. ***************
  598. *** 514,519 ****
  599. --- 514,523 ----
  600.        or some divisor of it.  */
  601.   
  602.         layout_decl (field, var_size ? size_unit : const_size);
  603. + #ifdef PRAGMA_PACK
  604. +       if (pragma_pack_seen())
  605. +         DECL_ALIGN(field) = MIN(pragma_align_val(), DECL_ALIGN(field));
  606. + #endif
  607.         desired_align = DECL_ALIGN (field);
  608.   
  609.         /* Record must have at least as much alignment as any field.
  610. *** gcc-1.40/c-parse.tab.c    Mon Jul 29 13:21:25 1991
  611. --- c-parse.tab.c    Mon Jul 29 13:53:35 1991
  612. ***************
  613. *** 3201,3206 ****
  614. --- 3205,3251 ----
  615.             && getc (finput) == 'm'
  616.             && getc (finput) == 'a'
  617.             && ((c = getc (finput)) == ' ' || c == '\t' || c == '\n'))
  618. + #ifdef PRAGMA_PACK
  619. +       {
  620. +         token = yylex();
  621. +             if (token != IDENTIFIER) 
  622. +             goto skipline;
  623. +             if (strcmp(token_buffer, "pack") != 0)
  624. +                 goto skipline;
  625. +         
  626. +         token = yylex();
  627. +           if (token != '(') {
  628. +             error ("invalid #pragma pack expecting '('");
  629. +             goto skipline;
  630. +         }
  631. +         /* setup default alignment first */
  632. +         pragma_pack_default();
  633. +         token = yylex();
  634. +         if (token != ')')
  635. +         {
  636. +             if (token == CONSTANT
  637. +                 && TREE_CODE (yylval.ttype) == INTEGER_CST) {
  638. +                 int l = TREE_INT_CST_LOW (yylval.ttype);
  639. +                 pragma_pack(l);
  640. +             }
  641. +             else {
  642. +                 error ("invalid #pragma pack expecting 1, 2 or 4");
  643. +                 goto skipline;
  644. +             }
  645. +             token = yylex();
  646. +         }
  647. +           if (token != ')') {
  648. +             error ("invalid #pragma pack expecting ')'");
  649. +             goto skipline;
  650. +         }
  651. +         }
  652. + #endif
  653.           goto skipline;
  654.       }
  655.   
  656. *** fix.h.xenix
  657. --- fix.h.xenix    Thu Aug 22 21:18:21 1991
  658. ***************
  659. *** 0 ****
  660. --- 1,198 ----
  661. + # @(#) $Id: fix.h.xenix,v 1.3 1991/08/22 05:39:05 ronald Exp $
  662. + #
  663. + # (C) Copyright 1990, 1991 Ronald Khoo <ronald@ibmpcug.co.uk>
  664. + # Permission granted to use or abuse this program for any purpose,
  665. + # provided that all modified copies are clearly marked as such.
  666. + # No warranty is given for the fitness of this program for any purpose.
  667. + #
  668. + # Please treat this file as a document saying what I did and not really
  669. + # a program.  i.e.  Please read it through before considering running it.
  670. + #
  671. + # This is a quick hack to fix the SCO Xenix 386 include files so that
  672. + # they work with gcc at all.  No attempt has been made to do this
  673. + # in a general way whatsoever, and this script was not made with any
  674. + # reference to the GCC fixincludes script:  I still have no idea what
  675. + # that does.  This works (ish) for me.  Your mileage may vary.
  676. + # My include files were from the 2.3.4 operating system and the 2.3.1b
  677. + # development system.
  678. + #
  679. + # What the script does do:
  680. + #
  681. + # * stream edit files from /usr/include and /usr/include/sys
  682. + #   into /usr/local/lib/gcc-include, skipping those which are
  683. + #   provided by GCC.
  684. + # * make all references to M_I386 refer to __M_I386__ instead.
  685. + #   This enables programs compiled with gcc -ansi not to coredump.
  686. + #   This only works with gcc so don't give these hacked .h files to cc !!
  687. + # * put protection #ifdef tests to all files to allow them to be safely
  688. + #   multiply included.
  689. + # * time_t and size_t seem to be typedefed all over the place.  Protect them.
  690. + # * remove definition and use of va_list in stdio.h -- that's bogus.
  691. + #   (SCO has already fixed this one in 2.3.1)
  692. + # * make types of SIG_IGN, etc consistently void * in sys/signal.h
  693. + #   (to be consistent with <signal.h>)
  694. + # * various other individual hacks I've come across.  Note that these
  695. + #   are entirely ad-hoc.  You can find them in the lines starting with
  696. + #   sed_<name>="
  697. + #
  698. + # In particular, the ad-hocery was intended to make rcs 5.5 compile without
  699. + # hacking, even with all the recommended warning options set.
  700. + # It doesn't quite work -- rcs 5.5's configuration script is slightly broken.
  701. + # I hate gratuitous declarations.
  702. + #
  703. + # Note that this is only a beginning.  I keep finding annoyances which
  704. + # have to be fixed by hand.  Many prototypes are wrong in places like
  705. + # <stdio.h>, <stdlib.h> etc.  An afternoon spent with an editor in one
  706. + # hand and the ANSI standard in the other would probably not go amiss.
  707. + #
  708. + # This script will probably fall flat on its face if you've already
  709. + # modified the system include files to do what it wants to do.
  710. + # Starting from a fresh set may be a reasonable approach.
  711. + #
  712. + # $Log: fix.h.xenix,v $
  713. + # Revision 1.3  1991/08/22  05:39:05  ronald
  714. + # pre-release version for gfm@mencon.oz to try out.
  715. + #
  716. + # Revision 1.2  1991/08/19  10:55:30  ronald
  717. + # Interim release for gcc 1.40, beta testers.
  718. + #
  719. + # Revision 1.1  90/04/25  18:51:21  ronald
  720. + # Initial revision
  721. + # 
  722. + PATH=/etc:/bin:/usr/bin export PATH
  723. + # usage: /usr/local/lib/fix.h.xenix
  724. + lib=${lib-/usr/local/lib}
  725. + include=$lib/gcc-include
  726. + stdinc=${stdinc-/usr/include}
  727. + sed_mi386=" -e '/\\([^_]\\)M_I386/s//\\1__M_I386__/g'"
  728. + sed_timet=" -e '/typedef.*[     ]time_t/ {
  729. + i\\
  730. + #ifndef _TIME_T
  731. + i\\
  732. + #define _TIME_T
  733. + a\\
  734. + #endif /* _TIME_T */
  735. + }'"
  736. + sed_sizet=" -e '/typedef.*[     ]size_t/ {
  737. + i\\
  738. + #ifndef _SIZE_T
  739. + i\\
  740. + #define _SIZE_T
  741. + a\\
  742. + #endif /* _SIZE_T */
  743. + }'"
  744. + # No prizes for guessing what this macro is used for.
  745. + # Also, no prizes for guessing which editor I use.
  746. + # :s/^[     ]*\([^( ]*\)[     ]*\((.*\);[     ]*$/    \/\\\\(\1[     ]*\\\\)([^)][^)]*)\/s\/\/\\\\1 \2\//
  747. + #
  748. + sed_param=" -e '
  749. +     /\(\/\*[^/]*\)\/\*/s//\1 *\/ \/*/
  750. +     /^\/\*.*\/\*.*pdp11[     ]*\$/s/\$/*\//
  751. + '"
  752. + sed_errno=" -e '
  753. +     /\\(perror[     ]*\\)([^)][^)]*)/s//\\1 ( const char * )/
  754. + '"
  755. + sed_stdlib=" -e '
  756. +     /\\(getenv[     ]*\\)([^)][^)]*)/s//\\1 (const char *)/
  757. +     /\\(atoi[     ]*\\)([^)][^)]*)/s//\\1 (const char *)/
  758. +     /.*\\(free[     ]*\\)([^)][^)]*)/s//extern void \\1 ( void * )/
  759. +     /.*\\(malloc[     ]*\\)([^)][^)]*)/s//extern void *\\1 (unsigned)/
  760. +     /.*\\(realloc[     ]*\\)([^)][^)]*)/s//extern void *\\1 (void *, unsigned)/
  761. +     /.*\\(calloc[     ]*\\)([^)][^)]*)/s//extern void *\\1 (unsigned, unsigned)/
  762. + '"
  763. + sed_stdio=" -e '
  764. +     /\\(printf[     ]*\\)([^)][^)]*)/s//\\1 ( const char *, ...)/
  765. +     /\\(fprintf[     ]*\\)([^)][^)]*)/s//\\1 ( FILE *, const char *, ... )/
  766. +     /\\(vfprintf[     ]*\\)([^)][^)]*)/s//\\1 ( FILE *, const char *, char * )/
  767. +     /\\(vprintf[     ]*\\)([^)][^)]*)/s//\\1 ( const char *, char * )/
  768. +     /\\(sprintf[     ]*\\)([^)][^)]*)/s//\\1 ( char *, const char *, ... )/
  769. +     /\\(vsprintf[     ]*\\)([^)][^)]*)/s//\\1 ( char *, const char *, char * )/
  770. +     /\\(fopen[     ]*\\)([^)][^)]*)/s//\\1 ( const char *, const char * )/
  771. +     /\\(fdopen[     ]*\\)([^)][^)]*)/s//\\1 ( int, const char * )/
  772. +     /\\(fputs[     ]*\\)([^)][^)]*)/s//\\1 ( const char *, FILE * )/
  773. +     /\\(fread[     ]*\\)([^)][^)]*)/s//\\1 ( void *, size_t, size_t, FILE * )/
  774. +     /\\(fwrite[     ]*\\)([^)][^)]*)/s//\\1 ( const void *, size_t, size_t, FILE * )/
  775. +     /typedef.*va_list/d
  776. +     /va_list/s//char */
  777. + '"
  778. + sed_string=" -e '
  779. +      /\\(strlen[     ]*\\)([^)][^)]*)/s//\\1 ( const char * )/
  780. +      /\\(strcat[     ]*\\)([^)][^)]*)/s//\\1 ( char *, const char * )/
  781. +      /\\(strncat[     ]*\\)([^)][^)]*)/s//\\1 ( char *, const char *, int )/
  782. +      /\\(strcpy[     ]*\\)([^)][^)]*)/s//\\1 ( char *, const char * )/
  783. +      /\\(strncpy[     ]*\\)([^)][^)]*)/s//\\1 ( char *, const char *, int )/
  784. +      /\\(strchr[     ]*\\)([^)][^)]*)/s//\\1 ( const char *, int )/
  785. +      /\\(strrchr[     ]*\\)([^)][^)]*)/s//\\1 ( const char *, int )/
  786. +      /\\(strcmp[     ]*\\)([^)][^)]*)/s//\\1 ( const char *, const char * )/
  787. +      /\\(strncmp[     ]*\\)([^)][^)]*)/s//\\1 ( const char *, const char *, int )/
  788. +     /define.*strerror.*;[     ]*\$/s/;[     ]*\$//
  789. + '"
  790. + sed_signal=" -e '/int.*(\\*)/s/int/void/g'"
  791. + sed_error=" -e '/^[     ]*ERROR[     ]\\(.*\\)\$/ {
  792. + s//\\1/
  793. + s/\"//g
  794. + s/[     ][     ]*/ /g
  795. + s/.*/    #error \"&\"/
  796. + }'"
  797. + hackit()
  798. + {
  799. +     echo "\r                         \rHacking $1\c"  >&2 
  800. +     idemp=
  801. +     expr "`sed 1q $1`" : '.*ifn.*_H.*' > /dev/null && idemp=yes
  802. +     test "$idemp" || {
  803. +         name=_INCLUDED_`echo $1 | tr './[a-z]' '__[A-Z]'`_AUTOFIX
  804. +         echo "#ifndef $name" > $include/$1
  805. +         echo "#define $name" >> $include/$1
  806. +     }
  807. +     script="$sed_mi386"
  808. +     grep -s size_t $1 > /dev/null &&
  809. +         grep -s _SIZE_T $1 > /dev/null || script="$script $sed_sizet"
  810. +     grep -s time_t $1 > /dev/null &&
  811. +         grep -s _TIME_T $1 > /dev/null || script="$script $sed_timet"
  812. +     case $1 in
  813. +         errno.h)    script="$script $sed_errno"    ;;
  814. +         stdlib.h)    script="$script $sed_stdlib"    ;;
  815. +         string.h)    script="$script $sed_string"    ;;
  816. +         stdio.h)    script="$script $sed_errno $sed_stdio"    ;;
  817. +         sys/param.h)    script="$script $sed_param"    ;;
  818. +         sys/signal.h)    script="$script $sed_signal"    ;;
  819. +         curses.h|sys/emap.h|sys/param.h|sys/sxt.h)
  820. +                 script="$script $sed_error"    ;;
  821. +     esac
  822. +     eval sed "$script" $1 >> $include/$1
  823. +     test "$idemp" || echo "#endif /* $name */" >> $include/$1
  824. + }
  825. + [ -d $include ] || mkdir $include
  826. + [ -d $include/sys ] || mkdir $include/sys
  827. + cd $stdinc || exit 1
  828. + echo "\rHacking files from $stdinc into $include" >&2
  829. + # This bit is useful for hacking the sed scripts above.
  830. + # for i in sys/param.h # stdio.h stdlib.h errno.h curses.h string.h 
  831. + # do hackit $i ; done
  832. + # exit 1
  833. + for i in *.h 
  834. + do
  835. +     case $i in
  836. +         # Use the GCC supplied versions of these files:
  837. +         assert.h|float.h|limits.h|stdarg.h|stddef.h|varargs.h)    ;;
  838. +         *) hackit $i ;;
  839. +     esac
  840. + done
  841. + echo "\rHacking files from $stdinc/sys into $include/sys" >&2
  842. + for i in sys/*.h ; do hackit $i ; done
  843. + cd $include
  844. + cd sys ; chgrp bin . *.h ; chmod 664 *.h ; chmod 775 . ; chown bin . *.h
  845. + cd .. ; chgrp bin . *.h ; chmod 664 *.h ; chmod 775 . ; chown bin . *.h
  846. + echo '\r..... done.  Have a nice day.  --Ronald' >&2
  847. *** fixmin.xenix
  848. --- fixmin.xenix    Thu Aug 22 21:09:28 1991
  849. ***************
  850. *** 0 ****
  851. --- 1,76 ----
  852. + # $Id: fixmin.xenix,v 1.1 1991/08/22 20:06:32 ronald Exp $
  853. + # Change Log is at the end of the file.
  854. + #
  855. + # This is the bare minimum of header fixing that I could get away with
  856. + # in order to compile GCC.  This applies to Xenix 2.3.3 with 2.3.1
  857. + # Development System.  You're on your own with other versions.
  858. + # These changes should only be in effect while building gcc.
  859. + # You should undo them, and replace the fixes with something better
  860. + # in /usr/local/lib/gcc-include once you've installed gcc.
  861. + # usage: fixmin.xenix [ undo ]
  862. + # If the "undo" parameter is specified, reverses the actions of a
  863. + # previous run of fixmin.
  864. + cd /usr/include
  865. + if test "$1" = undo ; then
  866. +     for i in *.bfm ; do
  867. +         j=`basename $i .bfm`
  868. +         mv $i $j
  869. +         echo restored $j >&2
  870. +     done
  871. +     cd sys
  872. +     for i in *.bfm ; do
  873. +         j=`basename $i .bfm`
  874. +         mv $i $j
  875. +         echo restored sys/$j >&2
  876. +     done
  877. +     exit 0
  878. + fi
  879. + for i in stdio.h time.h string.h sys/types.h ; do
  880. +     if egrep '(_SIZE_T|_TIME_T)' $i  > /dev/null || test -r $i.bfm; then
  881. +         : do nothing, already there
  882. +     else
  883. +         echo fixing $i
  884. +         sed '/typedef.*[     ]size_t/ {
  885. + i\
  886. + #ifndef _SIZE_T
  887. + i\
  888. + #define _SIZE_T
  889. + a\
  890. + #endif
  891. + }
  892. + /typedef.*[     ]time_t/ {
  893. + i\
  894. + #ifndef _TIME_T
  895. + i\
  896. + #define _TIME_T
  897. + a\
  898. + #endif
  899. + }'        $i > $i.new
  900. +         mv $i $i.bfm
  901. +         mv $i.new $i
  902. +     fi
  903. + done
  904. + if sed 1q stdio.h | grep -s 'ifndef[     ][     ]*FILE' > /dev/null ; then
  905. +     : do nothing -- already there.
  906. + else
  907. +     echo stdio.h once more ...
  908. +     ed stdio.h <<-\EOF
  909. +         0a
  910. +         #ifndef FILE
  911. +         .
  912. +         $a
  913. +         #endif
  914. +         .
  915. +         w
  916. + EOF
  917. + fi
  918. + #
  919. + # $Log: fixmin.xenix,v $
  920. + # Revision 1.1  1991/08/22  20:06:32  ronald
  921. + # Initial revision
  922. + #
  923. *** xenixld.c
  924. --- xenixld.c    Thu Aug 22 21:17:40 1991
  925. ***************
  926. *** 0 ****
  927. --- 1,264 ----
  928. + static char rcsid[] = "@(#) $Id: xenixld.c,v 1.2 1991/08/22 20:17:03 ronald Exp $\n";
  929. + /*
  930. +  * This is the version distributed by RoboBar limited, currently maintained
  931. +  * by Ronald Khoo <ronald@ibmpcug.co.uk>
  932. +  *
  933. +  * $Log: xenixld.c,v $
  934. +  * Revision 1.2  1991/08/22  20:17:03  ronald
  935. +  * Baseline for release with GCC 1.40
  936. +  * Various mods by Steve, and a hack to prevent loading of COFF files.
  937. +  *
  938. +  */
  939. + /* Linker driver program for Xenix that can handle gcc command lines
  940. +    Copyright (C) 1990 Christoph Badura
  941. +    Comments and buggestions are welcome. Write to bad@flatlin.sub.org.
  942. + This file is not part of GNU CC.
  943. + This program is free software; you can redistribute it and/or modify
  944. + it under the terms of the GNU General Public License as published by
  945. + the Free Software Foundation; either version 1, or (at your option)
  946. + any later version.
  947. + This program is distributed in the hope that it will be useful,
  948. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  949. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  950. + GNU General Public License for more details.
  951. + You should have received a copy of the GNU General Public License
  952. + along with GNU CC; see the file COPYING.  If not, write to
  953. + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  954. + */
  955. + #include <stdio.h>
  956. + #include "config.h"
  957. + #ifdef USG
  958. + #define R_OK 4
  959. + #define W_OK 2
  960. + #define X_OK 1
  961. + #define vfork fork
  962. + #endif /* USG */
  963. + extern void free ();
  964. + /* Default prefixes to attach to command names.  */
  965. + #ifndef STANDARD_STARTFILE_PREFIX
  966. + #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
  967. + #endif /* !defined STANDARD_STARTFILE_PREFIX */
  968. + char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
  969. + char *standard_startfile_prefix_1 = "/lib/386/";
  970. + char *standard_startfile_prefix_2 = "/usr/lib/";
  971. + char * progname;        /* who am i */
  972. + fatal (char *msg)
  973. + {
  974. +     fprintf (stderr, "%s:%s\n", progname, msg);
  975. +     exit (1);
  976. + }
  977. + xmalloc (size)
  978. +      int size;
  979. + {
  980. +   register int value = malloc (size);
  981. +   if (!value)
  982. +     fatal ("Virtual memory full.");
  983. +   return value;
  984. + }
  985. + xrealloc (void *ptr, int size)
  986. + {
  987. +   register int value = realloc (ptr, size);
  988. +   if (!value)
  989. +     fatal ("Virtual memory full.");
  990. +   return value;
  991. + }
  992. + struct lib_path {
  993. +     struct lib_path *next;
  994. +     int    length;            /* length of following string */
  995. +     char *path;
  996. + };
  997. + struct lib_path *lib_path;    /* the library search path */
  998. + struct lib_path *
  999. + add_path (char *name, struct lib_path *prev)
  1000. + {
  1001. +     int size;
  1002. +     struct lib_path *lp;
  1003. + #ifdef DEBUG
  1004. +     fprintf (stderr, "%s: adding %s to library path\n", progname, name);
  1005. + #endif
  1006. +     lp = (struct lib_path *) xmalloc (sizeof (struct lib_path));
  1007. +     lp->next = prev;
  1008. +     lp->length = strlen (name);
  1009. +     lp->path = name;
  1010. +     return lp;
  1011. + }
  1012. + /*
  1013. +  * Added by Ronald.Khoo@ibmpcug.co.uk:
  1014. +  * SCO systems have two kinds of libraries, OMF and COFF.  XENIX GCC/G++
  1015. +  * only works with OMF, this hack prevents the program accidentally finding
  1016. +  * COFF libraries earlier in the search path from the corresponding OMF one.
  1017. +  */
  1018. + int
  1019. + islib(char *name)
  1020. + {
  1021. +     int i;
  1022. +     FILE *fp = fopen(name, "r");
  1023. +     if (fp == 0)
  1024. +         return 0;
  1025. +     i = getw(fp);
  1026. +     fclose(fp);
  1027. +     return (i & 0xff) == 0x80 /* OMF */ || (i & 0xffff) == 0xff65 /* ar */;
  1028. + }
  1029. + char *
  1030. + find_library_1 (char *name)
  1031. + {
  1032. +     struct lib_path *lp;
  1033. +     int name_size, size = 0;
  1034. +     char *temp_name = 0;
  1035. +     int win = 0;
  1036. +     name_size = strlen (name) + 1;
  1037. +     for (lp=lib_path; lp && !win; lp=lp->next) {
  1038. +     if ((lp->length + name_size + 1) > size) {
  1039. +         size = lp->length + name_size + 1;
  1040. +         if (temp_name)
  1041. +         free (temp_name);
  1042. +         temp_name = 0;
  1043. +     }
  1044. +     if (!temp_name)
  1045. +         temp_name = (char *)xmalloc (size);
  1046. +     strcpy (temp_name, lp->path);
  1047. +     if (temp_name[lp->length - 1] != '/')
  1048. +         strcat (temp_name, "/");
  1049. +     strcat (temp_name, name);
  1050. +     win = islib(temp_name);
  1051. + #ifdef DEBUG
  1052. +     fprintf (stderr, "%s: searching %s -> %d\n", progname, temp_name, win);
  1053. + #endif
  1054. +     }
  1055. +     if (win)
  1056. +     return temp_name;
  1057. +     else {
  1058. +     free (temp_name);
  1059. +     return name;
  1060. +     }
  1061. + }
  1062. + char *
  1063. + find_library (char *name)
  1064. + {
  1065. +     char *temp_name;
  1066. +     char *lib_name;
  1067. +     temp_name = (char *)xmalloc (strlen (name) + 7); /* 6 chars for "Slib" and ".a" */
  1068. +     strcpy (temp_name, "lib");
  1069. +     strcat (temp_name, name);
  1070. +     strcat (temp_name, ".a");
  1071. +     if ((lib_name = find_library_1 (temp_name)) == temp_name) {
  1072. +     strcpy (temp_name, "Slib"); /* system libraries start with "Slib" */
  1073. +     strcat (temp_name, name);
  1074. +     strcat (temp_name, ".a");
  1075. +     lib_name = find_library_1 (temp_name);
  1076. +     }
  1077. +     free (temp_name);
  1078. + #ifdef DEBUG
  1079. +     fprintf (stderr, "%s: library name is %s\n", progname, lib_name);
  1080. +     fprintf (stderr, "%s: returning %s\n", progname,
  1081. +          (lib_name == temp_name) ? name : lib_name);
  1082. + #endif
  1083. +     return (lib_name == temp_name) ? name : lib_name;
  1084. + }
  1085. + char **argbuf;            /* this holds the argument vector for ld */
  1086. + int argbuf_index, argbuf_length;
  1087. + /* Add one argument to the vector at the end. */
  1088. + void
  1089. + store_arg (char *arg)
  1090. + {
  1091. +   if (argbuf_index + 1 == argbuf_length)
  1092. +     {
  1093. +       argbuf = (char **) xrealloc (argbuf, (argbuf_length*=2)*sizeof (char *));
  1094. +     }
  1095. +   argbuf[argbuf_index++] = arg;
  1096. +   argbuf[argbuf_index] = 0;
  1097. + }
  1098. + /*
  1099. +  * The standard Xenix ld is seriously braindamaged. It does not understand
  1100. +  * -llib options.  So we expand them here and furthermore we process -Lpath
  1101. +  * options as used by the GNU tools.
  1102. +  */
  1103. + int
  1104. + main (int argc, char **argv)
  1105. + {
  1106. +     int size;
  1107. +     char *lib_name;
  1108. + #ifdef DEBUG
  1109. +     char **argp;
  1110. + #endif
  1111. +     progname = *argv;
  1112. +     argbuf_length = 10;
  1113. +     argbuf_index = 0;
  1114. +     argbuf = (char **) xmalloc (argbuf_length * sizeof (char *));
  1115. +     /* push default library search paths on lib_stack */
  1116. +     lib_path = add_path (standard_startfile_prefix_2, (struct lib_path *)0);
  1117. +     lib_path = add_path (standard_startfile_prefix_1, lib_path);
  1118. +     lib_path = add_path (standard_startfile_prefix, lib_path);
  1119. +     /*
  1120. +      * Copy argv to argbuf processing -L switches and
  1121. +      * resolving library names. Preserve the order of the arguments.
  1122. +      */
  1123. +     store_arg ("ld"); /* provide argv[0] for ld */
  1124. +     for (++argv; --argc > 0; ++argv) {
  1125. +     if ((*argv)[0] == '-')
  1126. +         switch ((*argv)[1]) {
  1127. +         case 'L':
  1128. +         lib_path = add_path ((*argv)+2, lib_path);
  1129. +         break;
  1130. +         case 'l':
  1131. +         lib_name = find_library ((*argv)+2);
  1132. + #ifdef DEBUG
  1133. +         fprintf (stderr, "%s: found library %s\n", progname, lib_name);
  1134. + #endif
  1135. +         store_arg (lib_name);
  1136. +         break;
  1137. +         default:
  1138. +         store_arg (*argv);
  1139. +         }
  1140. +     else
  1141. +         /* just an input file */
  1142. +         store_arg (*argv);
  1143. +     }
  1144. + #ifdef DEBUG
  1145. +     fprintf (stderr, "%s: linker call: \"", progname);
  1146. +     for (argp=argbuf; *argp; argp++)
  1147. +     fprintf (stderr, "%s ", *argp);
  1148. +     putc ('\n', stderr);
  1149. + #endif
  1150. +     execv ("/bin/ld", argbuf);
  1151. +     /* maybe ld is not ld */
  1152. +     fprintf (stderr, "%s: unable to run /bin/ld", progname);
  1153. +     exit (1);
  1154. + }
  1155. -- 
  1156. Steve.Bleazard@RoboBar.Co.Uk        | Phone:  +44 81 991 1142 x153
  1157. Snr Software Engineer, Robobar Ltd. | Fax:    +44 81 998 8343 (G3)
  1158. 22 Wadsworth Road, Perivale.        |
  1159. Middx., UB6 7JD ENGLAND.            | ...!ukc!robobar!steve
  1160.