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

  1. Xref: wupost comp.unix.xenix.sco:4107 alt.sources:3917
  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 2/4)
  6. Message-ID: <Xenix/gas-1.38.pch@robobar.co.uk>
  7. Date: 27 Aug 91 14:26:30 GMT
  8. Sender: ronald@robobar.co.uk (Ronald S H Khoo)
  9. Organization: Robobar Ltd., Perivale, Middx., ENGLAND.
  10. Lines: 1781
  11. X-Md4-Signature: 865bdb9bc2aed86a7bcc5fe75eab77d9
  12.  
  13. Archive-Name: Xenix/gas-1.38.pch
  14.  
  15. This is part 2 of a 4 part posting.
  16. Part 1 (the README) describes this package
  17.  
  18. *** gas-1.38/Makefile    Thu Oct 18 15:26:42 1990
  19. --- Makefile    Fri Jul 12 06:02:10 1991
  20. ***************
  21. *** 50,55 ****
  22. --- 50,61 ----
  23.   # and un-comment the next two lines.
  24.   # G0 = -g -I. -DUSE_SYSTEM_HDR -DEXEC_VERSION=1
  25.   # LOADLIBES = -lc /usr/att/lib/libc.a
  26. + #
  27. + # To compile gas for a Xenix 386, comment out all the above lines,
  28. + # and un-comment the next two lines.  (If you are using GCC, comment out the
  29. + # alloca.o part) (Get alloca from the emacs distribution, or use GCC.)
  30. + G0 = -O -I. -DUSG -DWORKING_DOT_WORD
  31. + LOADLIBES = alloca.o -lmalloc
  32.   
  33.   # If you just want to compile the vax assembler, type 'make avax'
  34.   
  35. ***************
  36. *** 129,134 ****
  37. --- 135,144 ----
  38.   CFLAGS = $(G0) $(G1) $(G2) $(G3) $(G4)
  39.   
  40.   #
  41. + #
  42. + # To make the XENIX 386 assembler compile as the default, un-comment the next
  43. + # line and commment out all the other lines that start with DEFAULT_GAS
  44. + #DEFAULT_GAS=ax386
  45.   # To make the 68020 assembler compile as the default, un-comment the next
  46.   # line, and comment out all the other lines that start with DEFAULT_GAS
  47.   DEFAULT_GAS=a68
  48. ***************
  49. *** 245,250 ****
  50. --- 255,269 ----
  51.   
  52.   a386: $a $x
  53.       $(CC) -o a386 $(LDFLAGS) $a $x $(LOADLIBES)
  54. + # XENIX 80386 GAS --------------------------------------------------------------
  55. + u = xenixomf.o omfwrite.o
  56. + U = xenixomf.c xenixomf.h msomf.h omfwrite.c
  57. + xenixomf.o:    xenixomf.h msomf.h
  58. + ax386: $a $x $u
  59. +     $(CC) -o ax386 $(LDFLAGS) $a $u $x $(LOADLIBES)
  60.   
  61.   # 68020 GAS ------------------------------------------------------------------
  62.   y = m68k.o  atof-ieee.o write.o read.o
  63. *** gas-1.38/as.c    Thu Oct 11 11:26:17 1990
  64. --- as.c    Wed Jul 10 09:01:54 1991
  65. ***************
  66. *** 84,89 ****
  67. --- 84,90 ----
  68.       myname=argv[0];
  69.       bzero (flagseen, sizeof(flagseen)); /* aint seen nothing yet */
  70.       out_file_name    = "a.out";    /* default .o file */
  71. +     module_name = "unknown.s";
  72.       symbol_begin();        /* symbols.c */
  73.       subsegs_begin();        /* subsegs.c */
  74.       read_begin();            /* read.c */
  75. *** gas-1.38/as.h    Thu Oct 11 11:26:18 1990
  76. --- as.h    Wed Jul 10 09:01:58 1991
  77. ***************
  78. *** 286,291 ****
  79. --- 286,292 ----
  80.   
  81.   COMMON int    need_pass_2;    /* TRUE if we need a second pass. */
  82.   
  83. + COMMON char *module_name;    /* Name given in the file directive */
  84.   
  85.   #endif                /* #ifdef asH */
  86.   
  87. *** gas-1.38/config.h
  88. --- config.h    Wed Jul 10 09:16:07 1991
  89. ***************
  90. *** 0 ****
  91. --- 1 ----
  92. + #define XENIX
  93. *** gas-1.38/msomf.h
  94. --- msomf.h    Wed Jul 10 09:02:22 1991
  95. ***************
  96. *** 0 ****
  97. --- 1,24 ----
  98. + /* Segment indexes for segdefs */
  99. + #define SDEF_TEXT    1
  100. + #define SDEF_DATA    2
  101. + #define SDEF_CONST    3
  102. + #define SDEF_BSS    4
  103. + #define SDEF_SYMBOLS    5
  104. + #define SDEF_TYPES    6
  105. + #define SDEF_SIZE    4
  106. + #define SDEF_G_SIZE    6
  107. + #define GDEF_DGROUP    1
  108. + #define I386        1
  109. + #define FRAME_THREAD    1
  110. + #define TARGET_THREAD    0
  111. + #define TEXT_FRAME_THREAD    0
  112. + #define DGROUP_FRAME_THREAD    1
  113. + #define CONST_TGT_THREAD    0
  114. + #define DATA_TGT_THREAD        1
  115. + #define TEXT_TGT_THREAD        2
  116. + #define BSS_TGT_THREAD        3
  117. *** gas-1.38/omfwrite.c
  118. --- omfwrite.c    Wed Jul 10 09:02:24 1991
  119. ***************
  120. *** 0 ****
  121. --- 1,672 ----
  122. + /* write.c - emit .o file - Copyright(C)1986 Free Software Foundation, Inc.
  123. +    Copyright (C) 1986,1987 Free Software Foundation, Inc.
  124. + This file is part of GAS, the GNU Assembler.
  125. + GAS is free software; you can redistribute it and/or modify
  126. + it under the terms of the GNU General Public License as published by
  127. + the Free Software Foundation; either version 1, or (at your option)
  128. + any later version.
  129. + GAS is distributed in the hope that it will be useful,
  130. + but WITHOUT ANY WARRANTY; without even the implied warranty of
  131. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  132. + GNU General Public License for more details.
  133. + You should have received a copy of the GNU General Public License
  134. + along with GAS; see the file COPYING.  If not, write to
  135. + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  136. + #include "as.h"
  137. + #include "md.h"
  138. + #include "subsegs.h"
  139. + #include "obstack.h"
  140. + #include "struc-symbol.h"
  141. + #include "write.h"
  142. + #include "symbols.h"
  143. + #include "xenixomf.h"
  144. + #include "msomf.h"
  145. + #if __STDC__
  146. + #include <stddef.h>
  147. + #else
  148. + #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
  149. + #endif
  150. + void    append();
  151. + /*
  152. +  * In: length of relocation (or of address) in chars: 1, 2 or 4.
  153. +  * Out: OMF LOC type.
  154. +  */
  155. + static unsigned char nbytes_r_length [] = {
  156. +   15, LOC_LOBYTE, LOC_OFFSET, 15, LOC_OFFSET32
  157. +   };
  158. + static struct frag *    text_frag_root;
  159. + static struct frag *    data_frag_root;
  160. + static struct frag *    text_last_frag;    /* Last frag in segment. */
  161. + static struct frag *    data_last_frag;    /* Last frag in segment. */
  162. + static struct exec    the_exec;
  163. + static long int string_byte_count;
  164. + static long int stab_symbol_count;
  165. + void    relax_segment();
  166. + long int    fixup_segment();
  167. + static void threads(type, trgt_thrd, frm_thrd)
  168. + int type;
  169. + int *trgt_thrd, *frm_thrd;
  170. + {
  171. +       switch (type)
  172. +       {
  173. +         case PRIVDATA:    *trgt_thrd = DATA_TGT_THREAD;
  174. +                 *frm_thrd = DGROUP_FRAME_THREAD;
  175. +                 break;
  176. +         case PRIVBSS:    *trgt_thrd = BSS_TGT_THREAD;
  177. +                 *frm_thrd = DGROUP_FRAME_THREAD;
  178. +                 break;
  179. +         case PRIVTEXT:    *trgt_thrd = TEXT_TGT_THREAD;
  180. +                 *frm_thrd = TEXT_FRAME_THREAD;
  181. +                 break;
  182. +         case PUBLICDATA:    *trgt_thrd = DATA_TGT_THREAD;
  183. +                 *frm_thrd = DGROUP_FRAME_THREAD;
  184. +                 break;
  185. +         case PUBLICTEXT:    *trgt_thrd = TEXT_TGT_THREAD;
  186. +                 *frm_thrd = TEXT_FRAME_THREAD;
  187. +                 break;
  188. +         default:        *trgt_thrd = CONST_TGT_THREAD;
  189. +                 *frm_thrd = DGROUP_FRAME_THREAD;
  190. +                 break;
  191. +       }
  192. + }
  193. + void
  194. + write_object_file()
  195. + {
  196. +   register struct frchain *    frchainP; /* Track along all frchains. */
  197. +   register fragS *        fragP;    /* Track along all frags. */
  198. +   register struct frchain *    next_frchainP;
  199. +   register fragS * *        prev_fragPP;
  200. +   register char *        name;
  201. +   register symbolS *        symbolP;
  202. +   register symbolS **        symbolPP;
  203. +   /* register fixS *        fixP; JF unused */
  204. +   unsigned long
  205. +       text_siz,
  206. +     data_siz,
  207. +     syms_siz,
  208. +     tr_siz,
  209. +     dr_siz;
  210. +   void output_file_create();
  211. +   void output_file_append();
  212. +   void output_file_close();
  213. +   extern long omagic;        /* JF magic # to write out.  Is different for
  214. +                    Suns and Vaxen and other boxes */
  215. +   /*
  216. +    * After every sub-segment, we fake an ".align ...". This conforms to BSD4.2
  217. +    * brane-damage. We then fake ".fill 0" because that is the kind of frag
  218. +    * that requires least thought. ".align" frags like to have a following
  219. +    * frag since that makes calculating their intended length trivial.
  220. +    */
  221. + #define SUB_SEGMENT_ALIGN (2)
  222. +   for ( frchainP=frchain_root; frchainP; frchainP=frchainP->frch_next )
  223. +     {
  224. +       subseg_new (frchainP -> frch_seg, frchainP -> frch_subseg);
  225. +       frag_align (SUB_SEGMENT_ALIGN, 0);
  226. +                 /* frag_align will have left a new frag. */
  227. +                 /* Use this last frag for an empty ".fill". */
  228. +       /*
  229. +        * For this segment ...
  230. +        * Create a last frag. Do not leave a "being filled in frag".
  231. +        */
  232. +       frag_wane (frag_now);
  233. +       frag_now -> fr_fix    = 0;
  234. +       know( frag_now -> fr_next == NULL );
  235. +       /* know( frags . obstack_c_base == frags . obstack_c_next_free ); */
  236. +       /* Above shows we haven't left a half-completed object on obstack. */
  237. +     }
  238. +   /*
  239. +    * From now on, we don't care about sub-segments.
  240. +    * Build one frag chain for each segment. Linked thru fr_next.
  241. +    * We know that there is at least 1 text frchain & at least 1 data frchain.
  242. +    */
  243. +   prev_fragPP = &text_frag_root;
  244. +   for ( frchainP=frchain_root; frchainP; frchainP=next_frchainP )
  245. +     {
  246. +       know( frchainP -> frch_root );
  247. +       * prev_fragPP = frchainP -> frch_root;
  248. +       prev_fragPP = & frchainP -> frch_last -> fr_next;
  249. +       if (   ((next_frchainP = frchainP->frch_next) == NULL)
  250. +       || next_frchainP == data0_frchainP)
  251. +     {
  252. +       prev_fragPP = & data_frag_root;
  253. +       if ( next_frchainP )
  254. +         {
  255. +           text_last_frag = frchainP -> frch_last;
  256. +         }
  257. +       else
  258. +         {
  259. +           data_last_frag = frchainP -> frch_last;
  260. +         }
  261. +     }
  262. +     }                /* for(each struct frchain) */
  263. +   relax_segment (text_frag_root, SEG_TEXT);
  264. +   relax_segment (data_frag_root, SEG_DATA);
  265. +   /*
  266. +    * Now the addresses of frags are correct within the segment.
  267. +    */
  268. +   text_siz=text_last_frag->fr_address;
  269. +   /*
  270. +    *
  271. +    * Determine a_data [length of data segment].
  272. +    */
  273. +   if (data_frag_root)
  274. +       data_siz=data_last_frag->fr_address;
  275. +   else
  276. +       data_siz = 0;
  277. +   bss_address_frag . fr_address = 0;
  278. +           
  279. +   /*
  280. +    *
  281. +    * Crawl the symbol chain.
  282. +    *
  283. +    * For each symbol whose value depends on a frag, take the address of
  284. +    * that frag and subsume it into the value of the symbol.
  285. +    * After this, there is just one way to lookup a symbol value.
  286. +    * Values are left in their final state for object file emission.
  287. +    * We adjust the values of 'L' local symbols, even if we do
  288. +    * not intend to emit them to the object file, because their values
  289. +    * are needed for fix-ups.
  290. +    *
  291. +    * Unless we saw a -L flag, remove all symbols that begin with 'L'
  292. +    * from the symbol chain.
  293. +    *
  294. +    * Count the (length of the nlists of the) (remaining) symbols.
  295. +    * Assign a symbol number to each symbol.
  296. +    * Count the number of string-table chars we will emit.
  297. +    *
  298. +    */
  299. +   string_byte_count = sizeof( string_byte_count );
  300. +   /* JF deal with forward references first. . . */
  301. +   for(symbolP=symbol_rootP;symbolP;symbolP=symbolP->sy_next) {
  302. +       if(symbolP->sy_forward) {
  303. +         symbolP->sy_value+=symbolP->sy_forward->sy_value+symbolP->sy_forward->sy_frag->fr_address;
  304. +         symbolP->sy_forward=0;
  305. +     }
  306. +   }
  307. +   symbolPP = & symbol_rootP;    /* -> last symbol chain link. */
  308. +   {
  309. +     register long int        symbol_number;
  310. +     symbol_number = 1;  stab_symbol_count = 0;
  311. +     while (symbolP  = * symbolPP)
  312. +       {
  313. +     name = symbolP -> sy_name;
  314. +     symbolP -> sy_value += symbolP -> sy_frag -> fr_address;
  315. +     if ( !name || (symbolP->sy_nlist.n_type&N_STAB)
  316. +         || (name[0]!='\001' && (flagseen ['L'] || name [0] != 'L' )))
  317. +       {
  318. +         if (EXTDEF(symbolP->sy_nlist.n_type))
  319. +             symbolP -> sy_number = symbol_number ++;
  320. +         else
  321. +             symbolP -> sy_number = 0;
  322. +         if (symbolP->sy_nlist.n_type&N_STAB)
  323. +         stab_symbol_count++;
  324. +         if (name && symbolP->sy_nlist.n_type&N_STAB)
  325. +           {            /* Ordinary case. */
  326. +         symbolP -> sy_name_offset = string_byte_count;
  327. +         string_byte_count += strlen (symbolP  -> sy_name) + 1;
  328. +           }
  329. +         else            /* .Stabd case. */
  330. +         symbolP -> sy_name_offset = 0;
  331. +         symbolPP = & (symbolP -> sy_next);
  332. +       }
  333. +     else
  334. +         * symbolPP = symbolP -> sy_next;
  335. +       }                /* for each symbol */
  336. +     syms_siz = sizeof( struct nlist) * symbol_number;
  337. +   }
  338. +   /*
  339. +    * Addresses of frags now reflect addresses we use in the object file.
  340. +    * Symbol values are correct.
  341. +    * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
  342. +    * Also converting any machine-dependent frags using md_convert_frag();
  343. +    */
  344. +   subseg_change( SEG_TEXT, 0);
  345. +   for (fragP = text_frag_root;  fragP;  fragP = fragP -> fr_next)
  346. +     {
  347. +       switch (fragP -> fr_type)
  348. +     {
  349. +     case rs_align:
  350. +     case rs_org:
  351. +       fragP -> fr_type = rs_fill;
  352. +       know( fragP -> fr_var == 1 );
  353. +       know( fragP -> fr_next );
  354. +       fragP -> fr_offset
  355. +         =     fragP -> fr_next -> fr_address
  356. +           -   fragP -> fr_address
  357. +         - fragP -> fr_fix;
  358. +       break;
  359. +     case rs_fill:
  360. +       break;
  361. +     case rs_machine_dependent:
  362. +       md_convert_frag (fragP);
  363. +       /*
  364. +        * After md_convert_frag, we make the frag into a ".space 0".
  365. +        * Md_convert_frag() should set up any fixSs and constants
  366. +        * required.
  367. +        */
  368. +       frag_wane (fragP);
  369. +       break;
  370. +     default:
  371. +       BAD_CASE( fragP -> fr_type );
  372. +       break;
  373. +     }            /* switch (fr_type) */
  374. +     }                /* for each frag. */
  375. +   subseg_change( SEG_DATA, 0);
  376. +   for (fragP = data_frag_root;  fragP;  fragP = fragP -> fr_next)
  377. +     {
  378. +       switch (fragP -> fr_type)
  379. +     {
  380. +     case rs_align:
  381. +     case rs_org:
  382. +       fragP -> fr_type = rs_fill;
  383. +       know( fragP -> fr_var == 1 );
  384. +       know( fragP -> fr_next );
  385. +       fragP -> fr_offset
  386. +         =     fragP -> fr_next -> fr_address
  387. +           -   fragP -> fr_address
  388. +         - fragP -> fr_fix;
  389. +       break;
  390. +     case rs_fill:
  391. +       break;
  392. +     case rs_machine_dependent:
  393. +       md_convert_frag (fragP);
  394. +       /*
  395. +        * After md_convert_frag, we make the frag into a ".space 0".
  396. +        * Md_convert_frag() should set up any fixSs and constants
  397. +        * required.
  398. +        */
  399. +       frag_wane (fragP);
  400. +       break;
  401. +     default:
  402. +       BAD_CASE( fragP -> fr_type );
  403. +       break;
  404. +     }            /* switch (fr_type) */
  405. +     }                /* for each frag. */
  406. +   subseg_change( SEG_TEXT, 0);
  407. +   fixup_segment (text_fix_root, N_TEXT);
  408. +   fixup_segment (data_fix_root, N_DATA);
  409. +   output_file_create (out_file_name);
  410. +   omf_initialize_a_out(module_name, text_siz, data_siz,
  411. +                (long) local_bss_counter, 0L,
  412. +                flagseen['g'], stab_symbol_count * sizeof(struct nlist),
  413. +                string_byte_count);
  414. + /*  Traverse the symbol chain emitting external symbol definitions
  415. +  *  for external, public and common symbols.
  416. +  */
  417. +   for (   symbolP = symbol_rootP;   symbolP;   symbolP = symbolP -> sy_next   )
  418. +   {
  419. +       if (EXTDEF(symbolP->sy_type))
  420. +       {
  421. +           if (COMMDEF(symbolP->sy_type))
  422. +           {
  423. +               omf_start_comdef();
  424. +               omf_comdef(symbolP->sy_name, TD_CNEAR, symbolP->sy_value, 0L);
  425. +               omf_end_comdef();
  426. +           }
  427. +           else
  428. +               omf_extdef(symbolP->sy_name, 0);
  429. +       }
  430. +   }
  431. + /*  Traverse the symbol chain emitting public definitions
  432. +  */
  433. +   for (   symbolP = symbol_rootP;   symbolP;   symbolP = symbolP -> sy_next   )
  434. +   {
  435. +     if (PUBLIC(symbolP->sy_type))
  436. +     {
  437. +         unsigned int group = 0, segment = 0;
  438. +         if (symbolP->sy_type == PUBLICTEXT)
  439. +             segment = SDEF_TEXT;
  440. +         if (symbolP->sy_type == PUBLICDATA)
  441. +         {
  442. +             group = GDEF_DGROUP;  segment = SDEF_DATA;
  443. +         }
  444. +         
  445. +         omf_start_pubdef(I386, group, segment, 0);
  446. +         omf_pubdef(I386, symbolP->sy_name, symbolP->sy_value, 0);
  447. +         omf_end_pubdef();
  448. +     }
  449. +   }
  450. +   
  451. +   /* Setup threads for DGROUP and the segments ready for relocation */
  452. +   omf_start_thread(I386);
  453. +   omf_thread(CONST_TGT_THREAD, TARGET_THREAD, FRM_SI, SDEF_CONST);
  454. +   omf_thread(DATA_TGT_THREAD, TARGET_THREAD, FRM_SI, SDEF_DATA);
  455. +   omf_thread(TEXT_TGT_THREAD, TARGET_THREAD, FRM_SI, SDEF_TEXT);
  456. +   omf_thread(BSS_TGT_THREAD, TARGET_THREAD, FRM_SI, SDEF_BSS);
  457. +   omf_thread(TEXT_FRAME_THREAD, FRAME_THREAD, FRM_SI, SDEF_TEXT);
  458. +   omf_thread(DGROUP_FRAME_THREAD, FRAME_THREAD, FRM_GI, GDEF_DGROUP);
  459. +   omf_end_thread();
  460. +   
  461. +   /*
  462. +    * Emit code.
  463. +    */
  464. +   for (fragP = data_frag_root;  fragP;  fragP = fragP -> fr_next)
  465. +   {
  466. +       register long int count;
  467. +       register char * fill_literal;
  468. +       register long int fill_size;
  469. +       register fixS * fixP;
  470. +       register symbolS * symbolP;
  471. +       int started_fixup;
  472. +       know( fragP -> fr_type == rs_fill );
  473. +       if (fragP->fr_fix != 0 || fragP->fr_offset != 0)
  474. +       {
  475. +           omf_start_ledata(I386, SDEF_DATA, fragP->fr_address);
  476. +           if (fragP->fr_fix != 0)
  477. +               omf_ledata(fragP->fr_literal, (int)fragP->fr_fix);
  478. +           fill_literal = fragP->fr_literal + fragP -> fr_fix;
  479. +           fill_size = fragP->fr_var;
  480. +           count = fragP -> fr_offset;
  481. +       if ((fragP->fr_fix + count * fill_size) < 1016)
  482. +       {
  483. +               for ( ; count; count--)
  484. +                   omf_ledata(fill_literal, (int)fill_size);
  485. +       }
  486. +       else  /* filling will exceed the 1024 byte record size */
  487. +       {
  488. +           /* This code assumes that fill_size <= 8 bytes.
  489. +            * This is infact the case because of
  490. +            * compatability with other assemblers 
  491. +            */
  492. +           register int fcount;
  493. +           fcount = (1016 - fragP->fr_fix) / fill_size;
  494. +           count -= fcount;
  495. +           for ( ; fcount > 0; fcount--)
  496. +                   omf_ledata(fill_literal, (int)fill_size);
  497. +           
  498. +       }
  499. +           omf_end_ledata();
  500. +           /* Emit the relocations for this frag
  501. +            */
  502. +           fixP = data_fix_root;  started_fixup = 0;
  503. +           for ( ;  fixP;  fixP = fixP -> fx_next)
  504. +           {
  505. +               if (fixP->fx_frag == fragP && (symbolP = fixP->fx_addsy))
  506. +               {
  507. +           int trgt_thrd, frm_thrd;
  508. +           int external = EXTDEF(symbolP->sy_type);
  509. +           threads(symbolP->sy_type, &trgt_thrd, &frm_thrd);
  510. +           if (fixP->fx_pcrel)
  511. +             frm_thrd = TEXT_FRAME_THREAD;
  512. +                   if (!started_fixup)
  513. +                   {
  514. +                       omf_start_fixup(I386);
  515. +                       started_fixup++;
  516. +                   }
  517. +                   omf_fixup(I386, !fixP->fx_pcrel,
  518. +                 nbytes_r_length [fixP->fx_size], fixP->fx_where,
  519. +                 external ? 0 : 1,
  520. +                 external ? FRM_TRGT : frm_thrd,
  521. +                 external ? 0 : 1,
  522. +                 external ? TGT_EI : trgt_thrd,
  523. +                 1, /* No offset */
  524. +             0, /* No frame required */
  525. +                 EXTDEF(symbolP->sy_type) ? symbolP->sy_number : 0,
  526. +             0);
  527. +           }
  528. +           }
  529. +           if (started_fixup)
  530. +               omf_end_fixup();
  531. +       
  532. +       while (count > 0)    /* still sum fill data to emit */
  533. +       {
  534. +           unsigned long address;
  535. +           unsigned int len;
  536. +               address = fragP->fr_address + fragP->fr_fix +
  537. +               (fragP->fr_offset - count) * fill_size;
  538. +               omf_start_ledata(I386, SDEF_DATA, address);
  539. +               for ( len = 0; count && (len < 1000); count--, len += fill_size)
  540. +                   omf_ledata(fill_literal, (int)fill_size);
  541. +               omf_end_ledata();
  542. +       }
  543. +       }
  544. +   }
  545. +   for (fragP = text_frag_root;  fragP;  fragP = fragP -> fr_next)
  546. +   {
  547. +       register long int count;
  548. +       register char * fill_literal;
  549. +       register long int fill_size;
  550. +       register fixS * fixP;
  551. +       register symbolS * symbolP;
  552. +       int started_fixup;
  553. +       know( fragP -> fr_type == rs_fill );
  554. +       if (fragP->fr_fix != 0 || fragP->fr_offset != 0)
  555. +       {
  556. +           omf_start_ledata(I386, SDEF_TEXT, fragP->fr_address);
  557. +           if (fragP->fr_fix != 0)
  558. +               omf_ledata(fragP->fr_literal, (int)fragP->fr_fix);
  559. +           fill_literal = fragP->fr_literal + fragP -> fr_fix;
  560. +           fill_size = fragP->fr_var;
  561. +           for (count = fragP -> fr_offset;  count;  count --)
  562. +               omf_ledata(fill_literal, (int)fill_size);
  563. +           omf_end_ledata();
  564. +           /* Emit the relocations for this frag
  565. +            */
  566. +           fixP = text_fix_root;  started_fixup = 0;
  567. +           for ( ;  fixP;  fixP = fixP -> fx_next)
  568. +           {
  569. +               if (fixP->fx_frag == fragP && (symbolP = fixP->fx_addsy))
  570. +               {
  571. +           int trgt_thrd, frm_thrd;
  572. +           int external = EXTDEF(symbolP->sy_type);
  573. +           threads(symbolP->sy_type, &trgt_thrd, &frm_thrd);
  574. +           if (fixP->fx_pcrel)
  575. +             frm_thrd = TEXT_FRAME_THREAD;
  576. +                   if (!started_fixup)
  577. +                   {
  578. +                       omf_start_fixup(I386);
  579. +                       started_fixup++;
  580. +                   }
  581. +                   omf_fixup(I386, !fixP->fx_pcrel,
  582. +                 nbytes_r_length [fixP->fx_size], fixP->fx_where,
  583. +                 external ? 0 : 1,
  584. +                 external ? FRM_TRGT : frm_thrd,
  585. +                 external ? 0 : 1,
  586. +                 external ? TGT_EI : trgt_thrd,
  587. +                 1, /* No offset */
  588. +             0, /* No frame required */
  589. +                 external ? symbolP->sy_number : 0,
  590. +             0);
  591. +           }
  592. +           }
  593. +           if (started_fixup)
  594. +               omf_end_fixup();
  595. +       }
  596. +   }
  597. + /*  Traverse the symbol chain emitting stabs.
  598. +  */
  599. + #define VAL_OFF offsetof(struct nlist, n_value)
  600. +   if (flagseen['g'] && stab_symbol_count)
  601. +   {   
  602. +       long count = 0, ncount = 0;
  603. +       symbolS *last_startP;
  604. +       char *temp;
  605. +       symbolS *fsymP;
  606. +       int i;
  607. +       int start_fixup = 0;
  608. +       omf_start_ledata(I386, SDEF_SYMBOLS, 0);
  609. +       last_startP = symbol_rootP;
  610. +       for (symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next)
  611. +       {
  612. +      if (symbolP->sy_nlist.n_type & N_STAB)
  613. +      {
  614. +             if ((ncount + 1) * sizeof(struct nlist) >= 1016)
  615. +             {
  616. +                omf_end_ledata();
  617. +                /* emit relocations */
  618. +                start_fixup = 0;
  619. +            for (i = 0, fsymP=last_startP; i < ncount; fsymP=fsymP->sy_next)
  620. +            {
  621. +               if (fsymP->sy_nlist.n_type & N_STAB)
  622. +           {
  623. +                      if (fsymP->sy_type & N_TYPE) /* if relocation required */
  624. +              {
  625. +                int trgt_thrd, frm_thrd;
  626. +                int external = EXTDEF(fsymP->sy_type & N_TYPE);
  627. +                threads(fsymP->sy_type & N_TYPE,&trgt_thrd,&frm_thrd);
  628. +                if (!start_fixup)
  629. +                {
  630. +                            omf_start_fixup(I386);
  631. +                start_fixup++;
  632. +                }
  633. +                omf_fixup(I386, 1, /* segment relative */
  634. +                   LOC_OFFSET32, i * sizeof(struct nlist) + VAL_OFF,
  635. +                   external ? 0 : 1,
  636. +                   external ? FRM_TRGT : frm_thrd,
  637. +                   external ? 0 : 1,
  638. +                   external ? TGT_EI : trgt_thrd,
  639. +                   1, /* No offset */
  640. +               0, /* No frame required */
  641. +                   external ? fsymP->sy_number : 0,
  642. +               0);
  643. +              }
  644. +              i++;
  645. +           }
  646. +            }
  647. +            if (start_fixup)
  648. +                   omf_end_fixup();
  649. +                /* start new segment */
  650. +                ncount = 0;  last_startP = symbolP;
  651. +                omf_start_ledata(I386, SDEF_SYMBOLS, count*sizeof(struct nlist));
  652. +             }
  653. +             temp = symbolP->sy_nlist.n_un.n_name;
  654. +             symbolP->sy_nlist.n_un.n_strx = symbolP->sy_name_offset;
  655. +             omf_ledata(&(symbolP->sy_nlist), sizeof(struct nlist));
  656. +             symbolP->sy_nlist.n_un.n_name = temp;
  657. +            ncount++;  count++;
  658. +      }
  659. +       }
  660. +       omf_end_ledata();
  661. +       start_fixup = 0;
  662. +       for (i = 0, fsymP = last_startP; i < ncount; fsymP = fsymP->sy_next)
  663. +       {
  664. +          if (fsymP->sy_nlist.n_type & N_STAB)
  665. +      {
  666. +             if (fsymP->sy_type & N_TYPE) /* if relocation required */
  667. +         {
  668. +           int trgt_thrd, frm_thrd;
  669. +           int external = EXTDEF(fsymP->sy_type & N_TYPE);
  670. +           threads(fsymP->sy_type & N_TYPE,&trgt_thrd,&frm_thrd);
  671. +           if (!start_fixup)
  672. +               {
  673. +                  omf_start_fixup(I386);
  674. +                  start_fixup++;
  675. +               }
  676. +           omf_fixup(I386, 1, /* segment relative */
  677. +              LOC_OFFSET32, i * sizeof(struct nlist) + VAL_OFF,
  678. +              external ? 0 : 1,
  679. +              external ? FRM_TRGT : frm_thrd,
  680. +              external ? 0 : 1,
  681. +              external ? TGT_EI : trgt_thrd,
  682. +              1, /* No offset */
  683. +                   0, /* No frame required */
  684. +              external ? fsymP->sy_number : 0,
  685. +           0);
  686. +         }
  687. +         i++;
  688. +      }
  689. +       }
  690. +       if (start_fixup)
  691. +          omf_end_fixup();
  692. +       count = sizeof(string_byte_count);  ncount = count;
  693. +       omf_start_ledata(I386, SDEF_TYPES, 0);
  694. +       omf_ledata(&string_byte_count, sizeof(string_byte_count));
  695. +       for (symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next)
  696. +       {
  697. +          if (symbolP->sy_nlist.n_type & N_STAB && symbolP -> sy_name)
  698. +      {
  699. +         int len = strlen(symbolP -> sy_name) + 1;
  700. +         if (ncount + len > 1016)
  701. +         {
  702. +            omf_end_ledata();
  703. +                omf_start_ledata(I386, SDEF_TYPES, count);
  704. +            ncount = 0;
  705. +         }
  706. +             omf_ledata(symbolP->sy_name, len);
  707. +         count += len;  ncount += len;
  708. +      }
  709. +       }
  710. +       omf_end_ledata();
  711. +   }
  712. +   
  713. +   omf_modend(I386);
  714. +   output_file_close (out_file_name);
  715. + }                /* write_object_file() */
  716. *** gas-1.38/read.c    Tue Oct 30 13:42:03 1990
  717. --- read.c    Wed Jul 10 12:53:36 1991
  718. ***************
  719. *** 711,717 ****
  720.       int    length;
  721.   
  722.       /* Some assemblers tolerate immediately following '"' */
  723. !     if ( s = demand_copy_string( & length ) ) {
  724.           new_logical_line (s, -1);
  725.           demand_empty_rest_of_line();
  726.       }
  727. --- 711,718 ----
  728.       int    length;
  729.   
  730.       /* Some assemblers tolerate immediately following '"' */
  731. !     if ( s = demand_copy_C_string( & length ) ) {
  732. !         module_name = s;
  733.           new_logical_line (s, -1);
  734.           demand_empty_rest_of_line();
  735.       }
  736. ***************
  737. *** 1697,1703 ****
  738.   void    /* JF was static, but can't be if VAX.C is goning to use it */
  739.   float_cons(float_type)        /* Worker to do .float etc statements. */
  740.                   /* Clobbers input_line-pointer, checks end-of-line. */
  741. !      register float_type;    /* 'f':.ffloat ... 'F':.float ... */
  742.   {
  743.     register char *    p;
  744.     register char        c;
  745. --- 1698,1704 ----
  746.   void    /* JF was static, but can't be if VAX.C is goning to use it */
  747.   float_cons(float_type)        /* Worker to do .float etc statements. */
  748.                   /* Clobbers input_line-pointer, checks end-of-line. */
  749. !      register int float_type;    /* 'f':.ffloat ... 'F':.float ... */
  750.   {
  751.     register char *    p;
  752.     register char        c;
  753. *** gas-1.38/subsegs.c    Thu Oct 11 11:26:23 1990
  754. --- subsegs.c    Wed Jul 10 09:02:02 1991
  755. ***************
  756. *** 96,102 ****
  757. --- 96,106 ----
  758.     know( SEG_MAXIMUM_ORDINAL == SEG_DIFFERENCE );
  759.     know( seg_name [(int) SEG_MAXIMUM_ORDINAL + 1] [0] == 0 );
  760.   
  761. + #ifdef M_XENIX
  762. +   obstack_begin( &frags, 1000);
  763. + #else
  764.     obstack_begin( &frags, 5000);
  765. + #endif /* M_XENIX */
  766.     frchain_root = NULL;
  767.     frchain_now  = NULL;        /* Warn new_subseg() that we are booting. */
  768.                   /* Fake up 1st frag. */
  769. *** gas-1.38/write.c    Thu Oct 11 11:26:15 1990
  770. --- write.c    Wed Jul 10 09:06:47 1991
  771. ***************
  772. *** 38,43 ****
  773. --- 38,46 ----
  774.   #include "write.h"
  775.   #include "symbols.h"
  776.   
  777. + static relax_addressT    relax_align();
  778. + #ifndef M_XENIX
  779.   #ifdef SPARC
  780.   #include "sparc.h"
  781.   #endif
  782. ***************
  783. *** 93,103 ****
  784.   
  785.   static void    relax_segment();
  786.   void        emit_segment();
  787. - static relax_addressT    relax_align();
  788.   static long int    fixup_segment();
  789.   #if !defined(SPARC) && !defined(I860)
  790.   static void        emit_relocations();
  791.   #endif
  792.    /*
  793.    *            fix_new()
  794.    *
  795. --- 96,107 ----
  796.   
  797.   static void    relax_segment();
  798.   void        emit_segment();
  799.   static long int    fixup_segment();
  800.   #if !defined(SPARC) && !defined(I860)
  801.   static void        emit_relocations();
  802.   #endif
  803. + #endif /* M_XENIX */
  804.    /*
  805.    *            fix_new()
  806.    *
  807. ***************
  808. *** 146,151 ****
  809. --- 150,156 ----
  810.     * seg_fix_rootP = fixP;
  811.   }
  812.   
  813. + #ifndef M_XENIX
  814.   void
  815.   write_object_file()
  816.   {
  817. ***************
  818. *** 683,688 ****
  819. --- 688,694 ----
  820.     VMS_write_object_file(text_siz, data_siz, text_frag_root, data_frag_root);
  821.   #endif    /* VMS */
  822.   }                /* write_object_file() */
  823. + #endif /* M_XENIX */
  824.   
  825.   /*
  826.    *            relax_segment()
  827. ***************
  828. *** 697,703 ****
  829. --- 703,711 ----
  830.    * these frag addresses may not be the same as final object-file addresses.
  831.    */
  832.   #ifndef    VMS
  833. + #ifndef M_XENIX
  834.   static
  835. + #endif    /* not M_XENIX */
  836.   #endif    /* not VMS */
  837.   void
  838.   relax_segment (segment_frag_root, segment_type)
  839. ***************
  840. *** 1010,1016 ****
  841.   /*
  842.    *            fixup_segment()
  843.    */
  844. ! static long int
  845.   fixup_segment (fixP, this_segment_type)
  846.        register fixS *    fixP;
  847.        int        this_segment_type; /* N_TYPE bits for segment. */
  848. --- 1018,1027 ----
  849.   /*
  850.    *            fixup_segment()
  851.    */
  852. ! #ifndef M_XENIX 
  853. ! static
  854. ! #endif /* not M_XENIX */
  855. ! long int
  856.   fixup_segment (fixP, this_segment_type)
  857.        register fixS *    fixP;
  858.        int        this_segment_type; /* N_TYPE bits for segment. */
  859. ***************
  860. *** 1137,1142 ****
  861. --- 1148,1156 ----
  862.       }            /* if there was a + symbol */
  863.         if (pcrel)
  864.       {
  865. + #ifdef M_XENIX
  866. +       if (add_symbol_N_TYPE != N_UNDF)
  867. + #endif
  868.         add_number -=
  869.   #ifndef NS32K
  870.             size + 
  871. ***************
  872. *** 1184,1189 ****
  873. --- 1198,1204 ----
  874.   }                /* fixup_segment() */
  875.   
  876.   
  877. + #ifndef M_XENIX
  878.   /* The sparc needs its own emit_relocations() */
  879.   #if !defined(SPARC) && !defined(I860)
  880.   /*
  881. ***************
  882. *** 1244,1249 ****
  883. --- 1259,1265 ----
  884.   
  885.   }
  886.   #endif
  887. + #endif /* M_XENIX */
  888.   
  889.   int
  890.   is_dnrange(f1,f2)
  891. *** gas-1.38/xenixomf.c
  892. --- xenixomf.c    Wed Jul 10 09:02:18 1991
  893. ***************
  894. *** 0 ****
  895. --- 1,660 ----
  896. + #include <string.h>
  897. + #include <stdio.h>
  898. + #include "xenixomf.h"
  899. + #include "msomf.h"
  900. + #ifdef M_XENIX
  901. + #  undef i386
  902. + #endif
  903. + #define MAXRECORDSIZE    (14 * 1024)    /* 1k data => 1024 fixups */
  904. + #define I386    1
  905. + extern char *out_file_name;
  906. + static char chksum = 0;
  907. + static unsigned char recordbuff[MAXRECORDSIZE];
  908. + static unsigned char *record_ptr;
  909. + static void copy_bytes_to_record(p, count)
  910. + unsigned char *p;
  911. + int count;
  912. + {
  913. +     while (count--)
  914. +     {
  915. +         *record_ptr++ = *p;
  916. +         chksum += *p++;
  917. +     }
  918. + }
  919. + static void start_record(type)
  920. + unsigned char type;
  921. + {
  922. +     chksum = 0;
  923. +     record_ptr = recordbuff;
  924. +     copy_bytes_to_record(&type, 1);
  925. +     record_ptr += 2;    /* leave space for the record size */
  926. + }
  927. + static void output_record()
  928. + {
  929. +     int length;
  930. +     unsigned char b;
  931. +     length = (record_ptr - recordbuff) + 1; /* 1 for chksum */
  932. +     /* patch the record length into the header and put -chksum
  933. +      * at the end of the record.
  934. +      */
  935. +     b = (length - 3) & 0xff;  /* -3 as record length excludes type + len */
  936. +     chksum += b;  recordbuff[1] = b;
  937. +     b = ((length - 3) >> 8) & 0xff;
  938. +     chksum += b;  recordbuff[2] = b;
  939. +     *record_ptr = (unsigned char)(-chksum);
  940. +     output_file_append (recordbuff, length, out_file_name);
  941. + }
  942. + static void copy_string_to_record(s)
  943. + char *s;
  944. + {
  945. +     unsigned char len;
  946. +     len = strlen(s);
  947. +     if (len > OMFNAMELENGTH)
  948. +     {
  949. +         char tname[OMFNAMELENGTH+2];
  950. +         strncpy(tname, s, OMFNAMELENGTH);
  951. +         tname[OMFNAMELENGTH] = '\0';
  952. +         fprintf(stderr, "Identifier truncated to %s (%d chars)\n",
  953. +                 tname, OMFNAMELENGTH);
  954. +         len = OMFNAMELENGTH;
  955. +         copy_bytes_to_record(&len, 1);
  956. +         copy_bytes_to_record(s, OMFNAMELENGTH);
  957. +     }
  958. +     else
  959. +     {
  960. +         copy_bytes_to_record(&len, 1);
  961. +         if (len > 0)
  962. +             copy_bytes_to_record(s, len);
  963. +     }
  964. + }
  965. + static void copy_index_to_record(index)
  966. + unsigned int index;
  967. + {
  968. +     unsigned char b;
  969. +     if (index < 128)
  970. +     {
  971. +         b = (unsigned char)(index & 0xff);
  972. +         copy_bytes_to_record(&b, 1);
  973. +     }
  974. +     else
  975. +     {
  976. +         b = (unsigned char)(((index >> 8) & 0xff) | 0x80);
  977. +         copy_bytes_to_record(&b, 1);
  978. +         b = (unsigned char)(index & 0xff);
  979. +         copy_bytes_to_record(&b, 1);
  980. +     }
  981. + }
  982. + static void copy_vint_to_record(value, count)
  983. + long value;
  984. + int count;
  985. + {
  986. +     unsigned char b;
  987. +     while (count--)
  988. +     {
  989. +         b = (unsigned char)(value & 0xff);
  990. +         copy_bytes_to_record(&b, 1);
  991. +         value >>= 8;
  992. +     }
  993. + }
  994. + static void copy_word_to_record(value)
  995. + unsigned int value;
  996. + {
  997. +     copy_vint_to_record((long)value, 2);
  998. + }
  999. + static void copy_offset_to_record(i386, value)
  1000. + int i386;
  1001. + long value;
  1002. + {
  1003. +     copy_vint_to_record(value, i386 ? 4 : 2);
  1004. + }
  1005. + static void copy_comsize_to_record(value)
  1006. + long value;
  1007. + {
  1008. +     unsigned char b;
  1009. +     if (value < 128)
  1010. +         copy_vint_to_record((long)value, 1);
  1011. +     else if (value < 65536L)
  1012. +     {
  1013. +         b = 0x81;
  1014. +         copy_bytes_to_record(&b, 1);
  1015. +         copy_vint_to_record((long)value, 2);
  1016. +     }
  1017. +     else if (value < 16777216L)
  1018. +     {
  1019. +         b = 0x84;
  1020. +         copy_bytes_to_record(&b, 1);
  1021. +         copy_vint_to_record((long)value, 3);
  1022. +     }
  1023. +     else
  1024. +     {
  1025. +         b = 0x88;
  1026. +         copy_bytes_to_record(&b, 1);
  1027. +         copy_vint_to_record((long)value, 4);
  1028. +     }
  1029. + }
  1030. + void omf_theadr(name)
  1031. + unsigned char *name;
  1032. + {
  1033. +     start_record(MTHEADR);
  1034. +     copy_string_to_record(name);
  1035. +     output_record();
  1036. + }
  1037. + void omf_coment(p, count, class)
  1038. + unsigned char *p;
  1039. + int count;
  1040. + unsigned char class;
  1041. + {
  1042. +     unsigned char attrib;
  1043. +     start_record(MCOMENT);
  1044. +     attrib = 0;        /* Purge and List attributes */
  1045. +     copy_bytes_to_record(&attrib, 1);
  1046. +     copy_bytes_to_record(&class, 1);
  1047. +     copy_bytes_to_record(p, count);
  1048. +     output_record();
  1049. + }
  1050. + void omf_extdef(name, type)
  1051. + unsigned char *name;
  1052. + {
  1053. +     start_record(MEXTDEF);
  1054. +     copy_string_to_record(name);
  1055. +     copy_bytes_to_record(&type, 1);
  1056. +     output_record();
  1057. + }
  1058. + void omf_start_pubdef(i386, group, segment, frame)
  1059. + int i386;
  1060. + int group, segment, frame;
  1061. + {
  1062. +     if (i386)
  1063. +         start_record(MPUB386);
  1064. +     else
  1065. +         start_record(MPUBDEF);
  1066. +     copy_index_to_record(group);
  1067. +     copy_index_to_record(segment);
  1068. +     if (group == 0 && segment == 0)
  1069. +         copy_word_to_record(frame);
  1070. + }
  1071. + void omf_pubdef(i386, name, offset, type)
  1072. + int i386;
  1073. + unsigned char *name;
  1074. + int type;
  1075. + long offset;
  1076. + {
  1077. +     copy_string_to_record(name);
  1078. +     copy_offset_to_record(i386, offset);
  1079. +     copy_index_to_record(type);
  1080. + }
  1081. + void omf_end_pubdef()
  1082. + {
  1083. +     output_record();
  1084. + }
  1085. + void omf_start_lnames()
  1086. + {
  1087. +     start_record(MLNAMES);
  1088. + }
  1089. + void omf_lnames(name)
  1090. + unsigned char *name;
  1091. + {
  1092. +     copy_string_to_record(name);
  1093. + }
  1094. + void omf_end_lnames()
  1095. + {
  1096. +     output_record();
  1097. + }
  1098. + void omf_segdef(i386, acbp, frame, offset, seglen, segname, segclass)
  1099. + int i386;
  1100. + unsigned char acbp;
  1101. + unsigned int frame;
  1102. + unsigned int offset;
  1103. + long seglen;
  1104. + unsigned int segname, segclass;
  1105. + {
  1106. +     unsigned int ovlindex = 0;
  1107. +     if (i386)
  1108. +         start_record(MSEG386);
  1109. +     else
  1110. +         start_record(MSEGDEF);
  1111. +     copy_bytes_to_record(&acbp, 1);
  1112. +     if ((acbp & SD_ALIGN) == SD_ABS)
  1113. +     {
  1114. +         copy_word_to_record(frame);
  1115. +         copy_word_to_record(offset);  /* should be byte - Fix Me */
  1116. +     }
  1117. +     copy_offset_to_record(i386, seglen);
  1118. +     copy_index_to_record(segname);
  1119. +     copy_index_to_record(segclass);
  1120. +     copy_index_to_record(ovlindex);
  1121. +     output_record();
  1122. + }
  1123. + void omf_start_grpdef(grpname)
  1124. + unsigned int grpname;
  1125. + {
  1126. +     start_record(MGRPDEF);
  1127. +     copy_index_to_record(grpname);
  1128. + }
  1129. + void omf_grpdef(segindex)
  1130. + unsigned int segindex;
  1131. + {
  1132. +     unsigned char b = 0xff;
  1133. +     copy_bytes_to_record(&b, 1);
  1134. +     copy_index_to_record(segindex);
  1135. + }
  1136. + void omf_end_grpdef()
  1137. + {
  1138. +     output_record();
  1139. + }
  1140. + void omf_start_comdef()
  1141. + {
  1142. +     start_record(MCOMDEF);
  1143. + }
  1144. + void omf_comdef(name, dataseg_type, length, el_size)
  1145. + unsigned char *name;
  1146. + unsigned char dataseg_type;
  1147. + {
  1148. +     unsigned char type = 0;
  1149. +     copy_string_to_record(name);
  1150. +     copy_bytes_to_record(&type, 1);
  1151. +     copy_bytes_to_record(&dataseg_type, 1);
  1152. +     copy_comsize_to_record(length);
  1153. +     if (dataseg_type == TD_CFAR)
  1154. +     {
  1155. +         copy_comsize_to_record(el_size);
  1156. +     }
  1157. + }
  1158. + void omf_end_comdef()
  1159. + {
  1160. +     output_record();
  1161. + }
  1162. + void omf_start_linnum(i386, segindex)
  1163. + {
  1164. +     unsigned char grpindex = 0;
  1165. +     if (i386)
  1166. +         start_record(MLIN386);
  1167. +     else
  1168. +         start_record(MLINNUM);
  1169. +     copy_bytes_to_record(&grpindex, 1);
  1170. +     copy_index_to_record(segindex);
  1171. + }
  1172. + void omf_linnum(i386, line, offset)
  1173. + int i386;
  1174. + unsigned int line;
  1175. + long offset;
  1176. + {
  1177. +     copy_word_to_record(line);
  1178. +     copy_offset_to_record(i386, offset);
  1179. + }
  1180. + void omf_end_linnum()
  1181. + {
  1182. +     output_record();
  1183. + }
  1184. + void omf_start_thread(i386)
  1185. + {
  1186. +     if (i386)
  1187. +         start_record(MFIX386);
  1188. +     else
  1189. +         start_record(MFIXUPP);
  1190. + }
  1191. + void omf_thread(thread, framethread, method, index)
  1192. + unsigned char thread;
  1193. + int framethread;
  1194. + unsigned char method;
  1195. + unsigned int index;
  1196. + {
  1197. +     unsigned char thread_data;
  1198. +     thread_data = thread | (method << TRD_MTHDSHFT);
  1199. +     if (framethread)
  1200. +         thread_data |= TRD_FRAME;
  1201. +     copy_bytes_to_record(&thread_data, 1);
  1202. +     if (framethread)
  1203. +     {
  1204. +         switch (method)
  1205. +         {
  1206. +         case FRM_SI:
  1207. +         case FRM_GI:
  1208. +         case FRM_EI:
  1209. +         case FRM_ABS:
  1210. +             copy_index_to_record(index);
  1211. +             break;
  1212. +         case FRM_LOC:
  1213. +         case FRM_TRGT:
  1214. +             break;
  1215. +         }
  1216. +     }
  1217. +     else
  1218. +         copy_index_to_record(index);
  1219. + }
  1220. + void omf_end_thread()
  1221. + {
  1222. +     output_record();
  1223. + }
  1224. + void omf_start_fixup(i386)
  1225. + {
  1226. +     if (i386)
  1227. +         start_record(MFIX386);
  1228. +     else
  1229. +         start_record(MFIXUPP);
  1230. + }
  1231. + static void generate_fixdat(i386, f_thrd, frame, t_thrd, trgt, t_sec,
  1232. +                        frame_index, target_index, offset)
  1233. + int i386;
  1234. + int f_thrd;
  1235. + unsigned int frame;
  1236. + int t_thrd;
  1237. + unsigned int trgt;
  1238. + int t_sec;
  1239. + unsigned int frame_index, target_index;
  1240. + long offset;
  1241. + {
  1242. +     unsigned char fixdat, b;
  1243. +     fixdat = (f_thrd ? FIXDAT_FTHRD : 0) | (frame << FIXDAT_FRSHFT);
  1244. +     fixdat |= (t_thrd ? FIXDAT_TTHRD : 0) | trgt | (t_sec ? FIXDAT_TSCND:0);
  1245. +     copy_bytes_to_record(&fixdat, 1);
  1246. +     if (!f_thrd)
  1247. +     {
  1248. +         switch (frame)
  1249. +         {
  1250. +         case FRM_SI:
  1251. +         case FRM_GI:
  1252. +         case FRM_EI:
  1253. +         case FRM_ABS:
  1254. +             copy_index_to_record(frame_index);
  1255. +             break;
  1256. +         case FRM_LOC:
  1257. +         case FRM_TRGT:
  1258. +             break;
  1259. +         }
  1260. +     }
  1261. +     if (!t_thrd)
  1262. +         copy_index_to_record(target_index);
  1263. +     
  1264. +     if (!t_sec)
  1265. +         copy_offset_to_record(i386, offset);
  1266. + }
  1267. + void omf_fixup(i386, segrel, loc, data_off, f_thrd, frame, t_thrd, trgt, t_sec,
  1268. +            frame_index, target_index, offset)
  1269. + int i386, segrel;
  1270. + unsigned char loc;
  1271. + unsigned int data_off;
  1272. + int f_thrd;
  1273. + unsigned int frame;
  1274. + int t_thrd;
  1275. + unsigned int trgt;
  1276. + int t_sec;
  1277. + unsigned int frame_index, target_index;
  1278. + long offset;
  1279. + {
  1280. +     unsigned int locat = 0x8000;
  1281. +     unsigned char fixdat, b;
  1282. +     locat |= (segrel ? FIX_SEG : 0) | (loc << FIX_LOCSHFT) |
  1283. +          (data_off & FIX_DATAOFF);
  1284. +     b = (locat >> 8) & 0xff;  copy_bytes_to_record(&b, 1);
  1285. +     b = locat & 0xff;  copy_bytes_to_record(&b, 1);
  1286. +     generate_fixdat(i386, f_thrd, frame, t_thrd, trgt, t_sec, frame_index,
  1287. +             target_index, offset);
  1288. + }
  1289. + void omf_end_fixup()
  1290. + {
  1291. +     output_record();
  1292. + }
  1293. + void omf_start_ledata(i386, segindex, start_offset)
  1294. + int i386;
  1295. + unsigned int segindex;
  1296. + long start_offset;
  1297. + {
  1298. +     if (i386)
  1299. +         start_record(MLED386);
  1300. +     else
  1301. +         start_record(MLEDATA);
  1302. +     copy_index_to_record(segindex);
  1303. +     copy_offset_to_record(i386, start_offset);
  1304. + }
  1305. + void omf_ledata(data, count)
  1306. + unsigned char *data;
  1307. + int count;
  1308. + {
  1309. +     copy_bytes_to_record(data, count);
  1310. +     
  1311. + }
  1312. + void omf_end_ledata()
  1313. + {
  1314. +     output_record();
  1315. + }
  1316. + void omf_main_modend(i386, f_thrd, frame, t_thrd, trgt, t_sec, frame_index,
  1317. +              target_index, offset)
  1318. + int i386;
  1319. + int f_thrd;
  1320. + unsigned int frame;
  1321. + int t_thrd;
  1322. + unsigned int trgt;
  1323. + int t_sec;
  1324. + unsigned int frame_index, target_index;
  1325. + long offset;
  1326. + {
  1327. +     unsigned char mtype = 0xc1;
  1328. +     if (i386)
  1329. +         start_record(M386END);
  1330. +     else
  1331. +         start_record(MMODEND);
  1332. +     copy_bytes_to_record(&mtype, 1);
  1333. +     generate_fixdat(i386, f_thrd, frame, t_thrd, trgt, t_sec, frame_index,
  1334. +             target_index, offset);
  1335. +     output_record();
  1336. + }
  1337. + void omf_modend(i386)
  1338. + int i386;
  1339. + {
  1340. +     unsigned char mtype = 0;
  1341. +     if (i386)
  1342. +         start_record(M386END);
  1343. +     else
  1344. +         start_record(MMODEND);
  1345. +     copy_bytes_to_record(&mtype, 1);
  1346. +     output_record();
  1347. + }
  1348. + /** Definitions required to produce a standard Microsoft .o file
  1349. +  */
  1350. + /** LNAMES, SEGDEF, GRPDEF and COMENT stuff
  1351. +  *
  1352. +  *  NB the following defines must reflect the position of the string in
  1353. +  *  the lnames_tab table.
  1354. +  */
  1355. + #define    L_BLANK        1
  1356. + #define    L_DGROUP    2
  1357. + #define L_UTEXT        3
  1358. + #define L_CODE        4
  1359. + #define L_UDATA        5
  1360. + #define L_DATA        6
  1361. + #define L_CONST        7
  1362. + #define L_UBSS        8
  1363. + #define L_BSS        9
  1364. + #define L_TYPES        10
  1365. + #define L_DEBTYP    11
  1366. + #define L_SYMBOLS    12
  1367. + #define L_DEBSYM    13
  1368. + #define L_TSIZE        9
  1369. + #define L_G_TSIZE    13
  1370. + char *lnames_tab[] = {
  1371. +     "",
  1372. +     "",
  1373. +     "DGROUP",
  1374. +     "_TEXT",
  1375. +     "CODE",
  1376. +     "_DATA",
  1377. +     "DATA",
  1378. +     "CONST",
  1379. +     "_BSS",
  1380. +     "BSS",
  1381. +     "$$TYPES",
  1382. +     "DEBTYP",
  1383. +     "$$SYMBOLS",
  1384. +     "DEBSYM"
  1385. + };
  1386. + struct segtable {
  1387. +     unsigned char attrib;
  1388. +     long length;
  1389. +     unsigned nameindex;
  1390. +     unsigned classindex;
  1391. + };
  1392. + /* SEGDEF's */
  1393. + static struct segtable segt[] = {
  1394. +     {0, NULL, 0, 0},
  1395. +     {SD_DWORD|SD_PUBLIC|SD_PGRES, 0, L_UTEXT, L_CODE},
  1396. +     {SD_DWORD|SD_PUBLIC|SD_PGRES, 0, L_UDATA, L_DATA},
  1397. +     {SD_DWORD|SD_PUBLIC|SD_PGRES, 0, L_CONST, L_CONST},
  1398. +     {SD_DWORD|SD_PUBLIC|SD_PGRES, 0, L_UBSS, L_BSS},
  1399. +     {SD_BYTE|SD_PGRES, 0, L_SYMBOLS, L_DEBSYM},
  1400. +     {SD_BYTE|SD_PGRES, 0, L_TYPES, L_DEBTYP}
  1401. + };
  1402. + /* GRPDEF */
  1403. + #define GRPTABSIZ 3
  1404. + unsigned int group_tab[GRPTABSIZ] = {3, 4, 2};
  1405. + /* COMENTs */
  1406. + struct comment {
  1407. +     unsigned char class;
  1408. +     unsigned char count;
  1409. +     unsigned char *data;
  1410. + };
  1411. + #define NUMFIXEDCOMMENTS 4
  1412. + static unsigned char gas_comment[] = "gas-1.38.1a";
  1413. + static unsigned char lib_comment[] = "SLIBCE";
  1414. + static unsigned char model_comment[] = "3s";
  1415. + static unsigned char msext_comment[] = {1, 0x43, 0x56};
  1416. + struct comment fix_cmnt[NUMFIXEDCOMMENTS] = {
  1417. +     {0, 8, gas_comment},
  1418. +     {0x9f, 6, lib_comment},
  1419. +     {0x9d, 2, model_comment},
  1420. +     {0xa1, 3, msext_comment}
  1421. + };
  1422. + void omf_initialize_a_out(name, text_size, data_size, bss_size, const_size,
  1423. +               gdb, syms_size, str_size)
  1424. + unsigned char *name;
  1425. + long text_size, data_size, bss_size, const_size;
  1426. + int gdb;
  1427. + long syms_size, str_size;
  1428. + {
  1429. +     int i;
  1430. +     omf_theadr(name);
  1431. +     /* static comments */
  1432. +     for (i = 0; i < NUMFIXEDCOMMENTS; i++)
  1433. +       omf_coment(fix_cmnt[i].data, fix_cmnt[i].count, fix_cmnt[i].class);
  1434. +     /* LNAMES */
  1435. +     omf_start_lnames();
  1436. +     for (i = 1; i <= (gdb ? L_G_TSIZE : L_TSIZE); i++)
  1437. +         omf_lnames(lnames_tab[i]);
  1438. +     omf_end_lnames();
  1439. +     /* SEGDEFS */
  1440. +     segt[SDEF_TEXT].length = text_size;
  1441. +     segt[SDEF_DATA].length = data_size;
  1442. +     segt[SDEF_BSS].length = bss_size;
  1443. +     segt[SDEF_CONST].length = const_size;
  1444. +     if (gdb)
  1445. +     {
  1446. +         segt[SDEF_SYMBOLS].length = syms_size;
  1447. +         segt[SDEF_TYPES].length = str_size;
  1448. +     }
  1449. +     for (i = 1; i <= (gdb ? SDEF_G_SIZE : SDEF_SIZE); i++)
  1450. +         omf_segdef(I386, segt[i].attrib, 0, 0L, segt[i].length,
  1451. +                segt[i].nameindex, segt[i].classindex);
  1452. +     /* DGROUP */
  1453. +     omf_start_grpdef(L_DGROUP);
  1454. +     for (i = 0; i < GRPTABSIZ; i++)
  1455. +         omf_grpdef(group_tab[i]);
  1456. +     omf_end_grpdef();
  1457. + }
  1458. *** gas-1.38/xenixomf.h
  1459. --- xenixomf.h    Wed Jul 10 09:02:21 1991
  1460. ***************
  1461. *** 0 ****
  1462. --- 1,140 ----
  1463. + /* Defines to map a.out definitions to OMF style definitions
  1464. +  */
  1465. + #define    PUBLICDATA    (N_DATA|N_EXT)
  1466. + #define    PUBLICTEXT    (N_TEXT|N_EXT)
  1467. + #define    PUBLICABS    (N_ABS|N_EXT)
  1468. + #define COMMDEF(x)    ((x) == (N_UNDF|N_EXT))
  1469. + #define PRIVDATA    (N_DATA)
  1470. + #define PRIVTEXT    (N_TEXT)
  1471. + #define PRIVBSS        (N_BSS)
  1472. + #define EXTERNAL    (N_UNDF)
  1473. + #define PUBLIC(x)    ((x)==PUBLICDATA || (x)==PUBLICTEXT || (x)==PUBLICABS)
  1474. + #define EXTDEF(x)    ((x)==EXTERNAL || COMMDEF(x))
  1475. + #define PRIVATE(x)    ((x)==PRIVDATA || (x)==PRIVTEXT || (x)==PRIVBSS)
  1476. + #define MTHEADR        0x80    /* module header */
  1477. + #define MCOMENT        0x88    /* comment */
  1478. + #define MMODEND        0x8a    /* module end */
  1479. + #define M386END        0x8b    /* 32 bit module end */
  1480. + #define MEXTDEF        0x8c    /* external definition */
  1481. + #define MTYPDEF        0x8e    /* type definition */
  1482. + #define MPUBDEF        0x90    /* public definition */
  1483. + #define MPUB386        0x91    /* 32 bit public definition */
  1484. + #define MLINNUM        0x94    /* source line number */
  1485. + #define MLIN386        0x95    /* 32 bit source line number */
  1486. + #define MLNAMES        0x96    /* name list */
  1487. + #define MSEGDEF        0x98    /* segment definition */
  1488. + #define MSEG386        0x99    /* 32 bit segment definition */
  1489. + #define MGRPDEF        0x9a    /* group definition */
  1490. + #define MFIXUPP        0x9c    /* fix up previous data image */
  1491. + #define MFIX386        0x9d    /* fix up previous 32 bit data image */
  1492. + #define MLEDATA        0xa0    /* logical data image */
  1493. + #define MLED386        0xa1    /* 32 bit logical data image */
  1494. + #define    MCOMDEF        0xb0    /* communal names definition */
  1495. + /* The maximum length of an identifier.
  1496. +  */
  1497. + #define OMFNAMELENGTH    127
  1498. + /* alignment required
  1499. +  */
  1500. + #define SD_ABS        0x00        /* absolute */
  1501. + #define SD_BYTE        0x20        /* byte */
  1502. + #define SD_WORD        0x40        /* word */
  1503. + #define SD_PARA        0x60        /* paragraph */
  1504. + #define SD_PAGE        0x80        /* page */
  1505. + #define SD_DWORD    0xa0        /* double word */
  1506. + #define SD_LTL        0xc0        /* load-time locatable */
  1507. + #define SD_ALIGN    0xe0        /* alignment mask */
  1508. + #define SD_ASHIFT    5        /* alignment shift */
  1509. + /* segment combine classes */
  1510. + #define SD_PRIV        0x00        /* private, can't be combined */
  1511. + #define SD_HCOMM    0x04        /* common, place in high mem */
  1512. + #define SD_PUBLIC    0x08        /* public, sequential */
  1513. + #define SD_BAD        0x0c        /* undefined */
  1514. + #define SD_C4        0x10        /* not used */
  1515. + #define SD_STACK    0x14        /* stack segment */
  1516. + #define SD_COMM        0x18        /* common segment */
  1517. + #define SD_RCOMM    0x1c        /* not used, reverse common segment */
  1518. + #define SD_COMBO    0x1c        /* combine mask */
  1519. + #define SD_CSHIFT    2        /* combine shift */
  1520. + #define SD_PGRES    0x01        /* page resident */
  1521. + #define SD_64K        0x02        /* segment size is exactly 64k */
  1522. + /* BSSDEF record definitions
  1523. +  */
  1524. + #define    TD_CNEAR    0x62        /* near .comm variable */
  1525. + #define    TD_CFAR        0x61        /* far .comm variable */
  1526. + /* COMENT record definitions
  1527. +  */
  1528. + #define     CMT_PURGE    0x80        /* comment can be purged */
  1529. + #define  CMT_LIST    0x40        /* don't list when listing comments */
  1530. + /* FIXUP record definitions
  1531. +  */
  1532. + #define  FIX_FIXUP    0x80        /* fixup is a fixup (else thread def) */
  1533. + #define  TRD_FRAME    0x40        /* thread def for a frame (else tgt) */
  1534. + #define  TRD_MTHDSHFT    2        /* frame / target method shift */
  1535. + #define  TRD_MTHDMSK    0x1c        /* frame / target method mask */
  1536. + #define  TRD_THRED    0x03        /* thread number mask */
  1537. + /* Target method defines.  0 - 3 are primary, they include an offset, while 
  1538. +  * 4 - 7 or secondary, the offset 0 and not specified.
  1539. +  */
  1540. + #define  TGT_SI        0        /* target is Segment Index(N) + M */
  1541. + #define  TGT_GI        1        /* target is Group Index(N) + M */
  1542. + #define  TGT_EI        2        /* target is External Index(N) + M */
  1543. + #define  TGT_ABS    3        /* target is absolute frame N + N */
  1544. + #define  TGT_SI_0    4        /* target is Segment Index(N) + 0 */
  1545. + #define  TGT_GI_0    5        /* target is Group Index(N) + 0 */
  1546. + #define  TGT_EI_0    6        /* target is External Index(N) + 0 */
  1547. + #define  TGT_ABS_0    7        /* target is Absolute Segmnent N + 0 */
  1548. + /* Frame fixup method
  1549. +  */
  1550. + #define  FRM_SI        0        /* Frame is Segment index(N) */
  1551. + #define  FRM_GI        1        /* Frame is Group index(N) */
  1552. + #define  FRM_EI        2        /* Frame is External index(N) */
  1553. + #define  FRM_ABS    3        /* Frame is Absolute frame(N) */
  1554. + #define  FRM_LOC    4        /* Frame is LSEG of LOCATION */
  1555. + #define  FRM_TRGT    5        /* Frame is the frame of the target */
  1556. + /* FIXUP fixdat field definitions
  1557. +  */
  1558. + #define  FIX_SEG    0x4000        /* Fixup is seg relative (else self) */
  1559. + #define  FIX_24BIT    0x2000        /* Fixup has 24b tgt disp (NOT USED) */
  1560. + #define  FIX_LOCMSK    0x3c00        /* Fixup location type mask */
  1561. + #define  FIX_LOCSHFT    10        /* Fixup location type shift */
  1562. + #define  FIX_DATAOFF    0x3ff        /* location in prev data rec of fixup */
  1563. + #define  FIXDAT_FTHRD    0x80        /* Fixup frame by thread else direct */
  1564. + #define  FIXDAT_FRAME    0x70        /* Frame thread or method mask */
  1565. + #define  FIXDAT_FRSHFT    4        /* Frame thread or method shift */
  1566. + #define  FIXDAT_TTHRD    0x08        /* Fixup target by thread else direct */
  1567. + #define  FIXDAT_TSCND    0x04        /* Primary or secondary target method */
  1568. + #define  FIXDAT_TRGT    0x03        /* Target thread or method mask */
  1569. + /* Location type definitions
  1570. +  */
  1571. + #define  LOC_LOBYTE    0        /* low 8 bits */
  1572. + #define  LOC_OFFSET    1        /* 16 bit offset */
  1573. + #define  LOC_BASE    2        /* 16 bit frame number */
  1574. + #define  LOC_POINTER    3        /* 32 bit pointer */
  1575. + #define  LOC_HIBTE    4        /* second 8 bits */
  1576. + #define  LOC_OFFSETL    5        /* 16 bit offset (liner resolved) */
  1577. + #define  LOC_OFFSET32    9        /* 32 bit offset */
  1578. + #define  LOC_POINTER48    11        /* 48 bit pointer */
  1579. + #define  LOC_OFFSETL32    13        /* 32 bit offset (liner resolved) */
  1580. -- 
  1581. Steve.Bleazard@RoboBar.Co.Uk        | Phone:  +44 81 991 1142 x153
  1582. Snr Software Engineer, Robobar Ltd. | Fax:    +44 81 998 8343 (G3)
  1583. 22 Wadsworth Road, Perivale.        |
  1584. Middx., UB6 7JD ENGLAND.            | ...!ukc!robobar!steve
  1585.