|
|
1.1 root 1: *** /dev/null Wed Nov 7 08:15:02 1990
2: --- Makefile.new Wed Nov 7 08:03:16 1990
3: ***************
4: *** 0 ****
5: --- 1,203 ----
6: + # Makefile for GAS.
7: + # Copyright (C) 1989, Free Software Foundation
8: + #
9: + # This file is part of GAS, the GNU Assembler.
10: + #
11: + # GAS is free software; you can redistribute it and/or modify
12: + # it under the terms of the GNU General Public License as published by
13: + # the Free Software Foundation; either version 1, or (at your option)
14: + # any later version.
15: + #
16: + # GAS is distributed in the hope that it will be useful,
17: + # but WITHOUT ANY WARRANTY; without even the implied warranty of
18: + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19: + # GNU General Public License for more details.
20: + #
21: + # You should have received a copy of the GNU General Public License
22: + # along with GAS; see the file COPYING. If not, write to
23: + # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24: +
25: + BINDIR = /usr/local/bin
26: +
27: + BINARY = gas
28: +
29: + #
30: + # Add these flags to XCFLAGS below for specific use.
31: + #
32: + # If you machine does not have vfprintf, but does have _doprnt(),
33: + # -DNO_VARARGS
34: + #
35: + # If the return-type of a signal-hander is void (instead of int),
36: + # -DSIGTY
37: + #
38: + # To include the mc68851 mmu coprocessor instructions in the 68020 assembler,
39: + # -Dm68851
40: + #
41: + # If you want the 80386 assembler to correctly handle fsub/fsubr and fdiv/fdivr
42: + # opcodes (unlike most 80386 assemblers)
43: + # -DNON_BROKEN_WORDS
44: + #
45: + XCFLAGS =
46: +
47: + # Your favorite compiler
48: + CC = gcc
49: +
50: + # Uncomment the following lines if you use USG
51: +
52: + INCLUDE_DIRS = -I.
53: + COFF_OBJECTS = stack.o
54: + CPPFLAGS = -DUSG
55: + CFLAGS = -g $(CPPFLAGS) $(XCFLAGS)
56: + LDFLAGS =
57: + #LOADLIBES = -lPW
58: +
59: + # Uncomment the following lines if you use BSD
60: + #INCLUDE_DIRS = -I.
61: + #CPPFLAGS =
62: + #CFLAGS = -g $(CPPFLAGS) $(XCFLAGS)
63: + #LDFLAGS =
64: + #LOADLIBES =
65: +
66: + CONFIG_FILES = \
67: + machine.c machine.h atof.c oformat.c oformat.h opcode.h
68: +
69: + OBJECTS = \
70: + as.o xrealloc.o xmalloc.o hash.o hex-value.o \
71: + atof-generic.o append.o messages.o expr.o app.o \
72: + frags.o input-file.o input-scrub.o output-file.o \
73: + subsegs.o symbols.o version.o flonum-const.o flonum-copy.o \
74: + flonum-mult.o strstr.o bignum-copy.o obstack.o write.o read.o \
75: + oformat.o machine.o atof.o $(COFF_OBJECTS)
76: +
77: + SOURCES = $(OBJECTS:.o=.c)
78: +
79: + all : $(BINARY)
80: +
81: + install : all
82: + cp $(BINARY) $(BINDIR)
83: +
84: + clean :
85: + rm -f $(OBJECTS)
86: +
87: + clobber : clean
88: + rm -f $(BINARY) $(CONFIG_FILES) dependencies TAGS m68k.h
89: +
90: + $(BINARY) : $(OBJECTS)
91: + $(CC) -o $(BINARY) $(LDFLAGS) $(OBJECTS) $(LOADLIBES)
92: +
93: + TAGS : $(SOURCES)
94: + etags $(SOURCES) *.h
95: +
96: + CXREF : $(SOURCES)
97: + cxref -c $(INCLUDE_DIRS) $(SOURCES)
98: +
99: + stack.o: stack.c
100: + $(CC) $(CFLAGS) -c stack.c
101: +
102: + atof.o: \
103: + flonum.h \
104: + bignum.h
105: + oformat.o: \
106: + as.h \
107: + md.h \
108: + aout.h \
109: + a.out.gnu.h \
110: + struc-symbol.h \
111: + write.h \
112: + append.h
113: + read.o: \
114: + oformat.h \
115: + a.out.gnu.h \
116: + as.h \
117: + read.h \
118: + md.h \
119: + hash.h \
120: + obstack.h \
121: + frags.h \
122: + flonum.h \
123: + bignum.h \
124: + struc-symbol.h \
125: + expr.h \
126: + symbols.h \
127: + sparc.h
128: + write.o: \
129: + oformat.h \
130: + a.out.gnu.h \
131: + as.h \
132: + md.h \
133: + subsegs.h \
134: + obstack.h \
135: + struc-symbol.h \
136: + write.h \
137: + symbols.h \
138: + append.h \
139: + sparc.h
140: + obstack.o: \
141: + obstack.h
142: + bignum-copy.o: \
143: + bignum.h
144: + flonum-mult.o: \
145: + flonum.h \
146: + bignum.h
147: + flonum-copy.o: \
148: + flonum.h \
149: + bignum.h
150: + flonum-const.o: \
151: + flonum.h \
152: + bignum.h
153: + symbols.o: \
154: + oformat.h \
155: + a.out.gnu.h \
156: + as.h \
157: + hash.h \
158: + obstack.h \
159: + struc-symbol.h \
160: + symbols.h \
161: + frags.h
162: + subsegs.o: \
163: + oformat.h \
164: + a.out.gnu.h \
165: + as.h \
166: + subsegs.h \
167: + obstack.h \
168: + frags.h \
169: + struc-symbol.h \
170: + write.h
171: + input-scrub.o: \
172: + as.h \
173: + read.h \
174: + input-file.h
175: + input-file.o: \
176: + input-file.h
177: + frags.o: \
178: + oformat.h \
179: + a.out.gnu.h \
180: + as.h \
181: + subsegs.h \
182: + obstack.h \
183: + frags.h \
184: + struc-symbol.h
185: + expr.o: \
186: + oformat.h \
187: + a.out.gnu.h \
188: + as.h \
189: + flonum.h \
190: + bignum.h \
191: + read.h \
192: + struc-symbol.h \
193: + expr.h \
194: + obstack.h \
195: + symbols.h
196: + messages.o: \
197: + as.h
198: + atof-generic.o: \
199: + flonum.h \
200: + bignum.h
201: + hash.o: \
202: + hash.h
203: + as.o: \
204: + oformat.h \
205: + a.out.gnu.h \
206: + as.h \
207: + struc-symbol.h \
208: + write.h
209: *** /dev/null Wed Nov 7 08:15:02 1990
210: --- README.coff Wed Nov 7 07:33:23 1990
211: ***************
212: *** 0 ****
213: --- 1,79 ----
214: + The coff patches intend to do the following :
215: +
216: + . Generate coff files very compatible with vanilla linker.
217: + . Understands coff debug directives.
218: +
219: + Here are the guidelines of the work I have done :
220: +
221: + . Encapsulate format dependent code in macros where it is possible.
222: + . Where not possible differenciate with #ifdef
223: + . try not to change the calling conventions of the existing functions.
224: + I made one exception : symbol_new. I would be pleased to hear about
225: + a better solution. (symbols.c)
226: + . Extend the use of N_TYPE_seg seg_N_TYPE tables so that segments can
227: + be manipulated without using their format dependent name. (subsegs.c)
228: + . Write a function to parse the .def debug directives
229: + . Write two small peaces of code to handle the .ln directive.
230: + . In write.c try to move all the cross compilation specifics (md_..) to
231: + format dependent files.
232: + . Encapsulate the data structures using generic types, macros calls.
233: + . Added too much code to resolve the complexity of the symbol table
234: + generated. Most of the code deals with debug stuff.
235: + . Create another makefile, shorter, cleaner.
236: + . Create a config.gas shell script to mimic the gcc,gdb... configuration
237: + mechanism. This reduce the complexity of the makefile.
238: + . Isolate the format dependent code in two files
239: + coff.c coff.h
240: + aout.c aout.h
241: + elf.c elf.h [ Not yet ;-]
242: + . added a little stack management routine for coff in file stack.c
243: + . isolate os specific flags in m- files
244: +
245: + If further development is planed on it is should solve the following problems :
246: +
247: + . Encapsulate DESC & OTHER tests in a macro call. I'm not aware
248: + of their exact semantics.
249: + . Clean up the seg_N_TYPE N_TYPE_seg naming scheme
250: + . Try to remove as much reference to segment dependent names as possible
251: + . Find a cleaner solution for symbol_new.
252: + . Report the modifications on vax, ns32k, sparc machine dependent files.
253: + To acheive this goal, search for \<N_, sy_, symbol_new and symbolS.
254: + . Allow an arbitrary number of segments (spare sections .ctor .dtor .bletch)
255: + . Find a way to extend the debug information without breaking sdb
256: + compatibility. Mainly intended for G++.
257: + . should it do something to generate shared libraries objects ?
258: +
259: + I have tested this code on the following processor/os. gcc-1.37.1 was
260: + used for all the tests.
261: +
262: + 386 SCO unix ODT
263: + gcc-1.37.1, gas, emacs-18.55
264: +
265: + 386 Esix rev C
266: + gas-1.37/write.s
267: +
268: + 386 Ix 2.02
269: + gas, all the X11R4 mit clients
270: +
271: + 386 CTIX 3.2
272: + xsol (X11R4 solitary game), gas
273: +
274: + 68030 unisoft 1.3
275: + the kernel (V.3.2) + tcp/ip extensions
276: + bash-1.05, bison-1.11, compress-4.0, cproto, shar-3.49, diff-1.14,
277: + dist-18.55, flex-2.3, gas-1.37, gcc-1.37.1, gdb-3.6, grep-1.5,
278: + kermit, make-3.58, makedep, patch, printf, makeinfo, g++-1.37.1,
279: + tar-1.08, texi2roff, uuencode, uutraf-1.2, libg++-1.37.2, groff-0.5
280: +
281: + 68020 sunos 3.5 (no, not coff, just to be sure that I didn't
282: + introduce errors)
283: + gcc-1.37.1, gas, emacs-18.55, gdb-3.6, bison-1.11, diff-1.14,
284: + make-3.58, tar-1.08
285: +
286: + 68030 sunos 4.0.3 (idem)
287: + gas
288: +
289: + I would be glad to hear about new experiences
290: +
291: + Loic ([email protected] or [email protected])
292: +
293: *** /dev/null Wed Nov 7 08:15:02 1990
294: --- aout.c Wed Nov 7 07:33:24 1990
295: ***************
296: *** 0 ****
297: --- 1,146 ----
298: + #include "as.h"
299: + #include "md.h"
300: + #include "aout.h"
301: + #include "struc-symbol.h"
302: + #include "write.h"
303: + #include "append.h"
304: +
305: + /* Relocation. */
306: +
307: + /*
308: + * In: length of relocation (or of address) in chars: 1, 2 or 4.
309: + * Out: GNU LD relocation length code: 0, 1, or 2.
310: + */
311: +
312: + static unsigned char
313: +
314: + nbytes_r_length [] = {
315: + 42, 0, 1, 42, 2
316: + };
317: +
318: +
319: + /* The sparc needs its own emit_relocations() */
320: + #if !defined(SPARC) && !defined(I860)
321: + /*
322: + * emit_relocations()
323: + *
324: + * Crawl along a fixS chain. Emit the segment's relocations.
325: + */
326: + void
327: + emit_relocations (fixP, segment_address_in_file)
328: + register fixS * fixP; /* Fixup chain for this segment. */
329: + relax_addressT segment_address_in_file;
330: + {
331: + struct relocation_info ri;
332: + register symbolS * symbolP;
333: +
334: + /* JF this is for paranoia */
335: + bzero((char *)&ri,sizeof(ri));
336: + for ( ; fixP; fixP = fixP -> fx_next)
337: + {
338: + if (symbolP = fixP -> fx_addsy)
339: + {
340: +
341: + #ifdef NS32K
342: + /* These two 'cuz of NS32K */
343: + ri . r_bsr = fixP -> fx_bsr;
344: + ri . r_disp = fixP -> fx_im_disp;
345: + #endif
346: +
347: + ri . r_length = nbytes_r_length [fixP -> fx_size];
348: + ri . r_pcrel = fixP -> fx_pcrel;
349: + ri . r_address = fixP -> fx_frag -> fr_address
350: + + fixP -> fx_where
351: + - segment_address_in_file;
352: + if ((symbolP -> sy_type & N_TYPE) == N_UNDF)
353: + {
354: + ri . r_extern = 1;
355: + ri . r_symbolnum = symbolP -> sy_number;
356: + }
357: + else
358: + {
359: + ri . r_extern = 0;
360: + ri . r_symbolnum = symbolP -> sy_type & N_TYPE;
361: + }
362: +
363: + /*
364: + The 68k machines assign bit-fields from higher bits to
365: + lower bits ("left-to-right") within the int. VAXen assign
366: + bit-fields from lower bits to higher bits ("right-to-left").
367: + Both handle multi-byte numbers in their usual fashion
368: + (Big-endian and little-endian stuff).
369: + Thus we need a machine dependent routine to make
370: + sure the structure is written out correctly. FUN!
371: + */
372: + md_ri_to_chars((char *) &ri, ri);
373: + append (&next_object_file_charP, (char *)& ri, (unsigned long)sizeof(ri));
374: + }
375: + }
376: +
377: + }
378: + #endif
379: +
380: + /* Aout file generation & utilities */
381: +
382: + /* Convert a lvalue to machine dependent data */
383: + #define MD(v) \
384: + md_number_to_chars((char *)&header->v,header->v, sizeof(header->v))
385: +
386: + void a_header_append(header, where)
387: + struct exec * header;
388: + char** where;
389: + {
390: + MD(a_text);
391: + MD(a_data);
392: + MD(a_bss);
393: + MD(a_trsize);
394: + MD(a_drsize);
395: + MD(a_syms);
396: + MD(a_info);
397: + MD(a_entry);
398: + #ifdef EXEC_MACHINE_TYPE
399: + MD(a_machtype);
400: + #endif /* EXEC_MACHINE_TYPE */
401: + #ifdef EXEC_VERSION
402: + MD(a_version);
403: + #endif /* EXEC_VERSION */
404: + append(where, (char *)header, sizeof(struct exec));
405: + }
406: +
407: + #undef MD
408: + /* Convert a lvalue to machine dependent data */
409: + #define MD(v) \
410: + md_number_to_chars((char *)&symbolP->v,symbolP->v, sizeof(symbolP->v))
411: +
412: + void a_symbol_append(symbolP, where)
413: + symbolS * symbolP;
414: + char** where;
415: + {
416: + MD(sy_strx);
417: + MD(sy_desc);
418: + MD(sy_value);
419: + append(where, (char *)&symbolP->sy_symbol, sizeof(symbol_type));
420: + }
421: +
422: + void emit_symbols(symbol_rootP, where)
423: + symbolS * symbol_rootP;
424: + char** where;
425: + {
426: + symbolS * symbolP;
427: + /*
428: + * Emit all symbols left in the symbol chain.
429: + */
430: + for(symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next) {
431: + /* Used to save the offset of the name. It is used to point
432: + to the string in memory but must be a file offset. */
433: + register char * temp;
434: +
435: + temp = S_GET_NAME(symbolP);
436: + S_SET_OFFSET(symbolP, symbolP->sy_name_offset);
437: + /* Any symbol still undefined and is not a dbg symbol is made N_EXT. */
438: + if (symbolP->sy_type == N_UNDF)
439: + S_SET_EXTERNAL(symbolP);
440: + SYMBOL_OUTPUT(symbolP, where);
441: + S_SET_NAME(symbolP,temp);
442: + }
443: + }
444: *** /dev/null Wed Nov 7 08:15:02 1990
445: --- aout.h Wed Nov 7 07:33:25 1990
446: ***************
447: *** 0 ****
448: --- 1,166 ----
449: + #ifndef AOUT_H
450: + #define AOUT_H
451: +
452: + #include "machine.h"
453: +
454: + #ifndef VMS
455: + #include "a.out.gnu.h" /* Needed to define struct nlist. Sigh. */
456: + #else
457: + #include "a_out.h"
458: + #endif
459: +
460: + /* Tag to validate a.out object file format processing */
461: + #define aout
462: +
463: + /* RELOCATION INFORMATION */
464: +
465: + #define relocation_type struct relocation_info /* Relocation table entry */
466: + #define RELSZ sizeof(relocation_type) /* For coff compatibility */
467: +
468: + /* SYMBOL TABLE */
469: + /* Symbol table entry data type */
470: +
471: + #define symbol_type struct nlist /* Symbol table entry */
472: +
473: + /* If compiler generate leading underscores, remove them. */
474: +
475: + #ifndef STRIP_UNDERSCORE
476: + #define STRIP_UNDERSCORE 0
477: + #endif /* STRIP_UNDERSCORE */
478: +
479: + /* Symbol table macros and constants */
480: +
481: + /*
482: + * Macros to extract information from a symbol table entry.
483: + * This syntaxic indirection allows independence regarding a.out or coff.
484: + * The argument (s) of all these macros is a pointer to a symbol table entry.
485: + */
486: +
487: + /* Predicates */
488: + /* True if in text segment */
489: + #define S_IS_TEXT(s) (((s)->sy_type & N_TYPE) == N_TEXT)
490: + /* True if in data segment */
491: + #define S_IS_DATA(s) (((s)->sy_type & N_TYPE) == N_DATA)
492: + /* True if in bss segment */
493: + #define S_IS_BSS(s) (((s)->sy_type & N_TYPE) == N_BSS)
494: + /* True if in abs segment */
495: + #define S_IS_ABS(s) (((s)->sy_type & N_TYPE) == N_ABS)
496: + /* True if the symbol is external */
497: + #define S_IS_EXTERNAL(s) ((s)->sy_type & N_EXT)
498: + /* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */
499: + #define S_IS_DEFINED(s) (((s)->sy_type & N_TYPE) != N_UNDF)
500: + /* True if a debug special symbol entry */
501: + #define S_IS_DEBUG(s) ((s)->sy_type & N_STAB)
502: + /* True if a symbol is local symbol name */
503: + /* A symbol name whose name begin with ^A is a gas internal pseudo symbol
504: + nameless symbols come from .stab directives. */
505: + #define S_IS_LOCAL(s) (S_GET_NAME(s) && \
506: + !S_IS_DEBUG(s) && \
507: + (S_GET_NAME(s)[0] == '\001' || \
508: + (S_LOCAL_NAME(s) && !flagseen['L'])))
509: + /* True if a symbol is not defined in this file */
510: + #define S_IS_EXTERN(s) ((s)->sy_type & N_EXT)
511: + /* True if the symbol has been generated because of a .stabd directive */
512: + #define S_IS_STABD(s) ((s)->sy_name == (char *)0)
513: +
514: + /* Accessors */
515: + /* The value of the symbol */
516: + #define S_GET_VALUE(s) ((s)->sy_value)
517: + /* The name of the symbol */
518: + #define S_GET_NAME(s) ((s)->sy_name)
519: + /* The pointer to the string table */
520: + #define S_GET_OFFSET(s) ((s)->sy_strx)
521: + /* The numeric value of the segment */
522: + #define S_GET_SEGMENT(s) ((s)->sy_type & N_TYPE)
523: + /* The n_other expression value */
524: + #define S_GET_OTHER(s) ((s)->sy_other)
525: + /* The n_desc expression value */
526: + #define S_GET_DESC(s) ((s)->sy_desc)
527: +
528: + /* Modifiers */
529: + /* Set the value of the symbol */
530: + #define S_SET_VALUE(s,v) ((s)->sy_value = (v))
531: + /* Assume that a symbol cannot be simultaneously in more than on segment */
532: + /* Set the segment to text */
533: + #define S_SET_TEXT(s) ((s)->sy_type &= ~N_TYPE,(s)->sy_type|=N_TEXT)
534: + /* Set the segment to data */
535: + #define S_SET_DATA(s) ((s)->sy_type &= ~N_TYPE,(s)->sy_type|=N_DATA)
536: + /* Set the segment to bss */
537: + #define S_SET_BSS(s) ((s)->sy_type &= ~N_TYPE,(s)->sy_type|=N_BSS)
538: + /* Set the segment to abs */
539: + #define S_SET_ABS(s) ((s)->sy_type &= ~N_TYPE,(s)->sy_type|=N_ABS)
540: + /* The symbol is external */
541: + #define S_SET_EXTERNAL(s) ((s)->sy_type |= N_EXT)
542: + /* The symbol is not external */
543: + #define S_CLEAR_EXTERNAL(s) ((s)->sy_type &= ~N_EXT)
544: + /* Set the name of the symbol */
545: + #define S_SET_NAME(s,v) ((s)->sy_name = v)
546: + /* Set the offset in the string table */
547: + #define S_SET_OFFSET(s,v) ((s)->sy_strx = v)
548: + /* Set the n_other expression value */
549: + #define S_SET_OTHER(s,v) ((s)->sy_other = (v))
550: + /* Set the n_desc expression value */
551: + #define S_SET_DESC(s,v) ((s)->sy_desc = (v))
552: +
553: + /* File header macro and type definition */
554: +
555: + #define H_GET_FILE_SIZE(h) (sizeof(struct exec) + \
556: + H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
557: + H_GET_SYMBOL_TABLE_SIZE(h) + \
558: + H_GET_TEXT_RELOCATION_SIZE(h) + \
559: + H_GET_DATA_RELOCATION_SIZE(h) + \
560: + (h)->string_table_size)
561: +
562: + #define H_GET_TEXT_SIZE(h) ((h)->header.a_text)
563: + #define H_GET_DATA_SIZE(h) ((h)->header.a_data)
564: + #define H_GET_BSS_SIZE(h) ((h)->header.a_bss)
565: + #define H_GET_TEXT_RELOCATION_SIZE(h) ((h)->header.a_trsize)
566: + #define H_GET_DATA_RELOCATION_SIZE(h) ((h)->header.a_drsize)
567: + #define H_GET_SYMBOL_TABLE_SIZE(h) ((h)->header.a_syms)
568: + #define H_GET_MAGIC_NUMBER(h) ((h)->header.a_info)
569: + #define H_GET_ENTRY_POINT(h) ((h)->header.a_entry)
570: + #define H_GET_STRING_SIZE(h) ((h)->string_table_size)
571: + #ifdef EXEC_MACHINE_TYPE
572: + #define H_GET_MACHINE_TYPE(h) ((h)->header.a_machtype)
573: + #endif /* EXEC_MACHINE_TYPE */
574: + #ifdef EXEC_VERSION
575: + #define H_GET_VERSION(h) ((h)->header.a_version)
576: + #endif /* EXEC_VERSION */
577: +
578: + #define H_SET_TEXT_SIZE(h,v) ((h)->header.a_text = (v))
579: + #define H_SET_DATA_SIZE(h,v) ((h)->header.a_data = (v))
580: + #define H_SET_BSS_SIZE(h,v) ((h)->header.a_bss = (v))
581: + #define H_SET_RELOCATION_SIZE(h,t,d) (H_SET_TEXT_RELOCATION_SIZE((h),(t)),\
582: + H_SET_DATA_RELOCATION_SIZE((h),(d)))
583: + #define H_SET_TEXT_RELOCATION_SIZE(h,v) ((h)->header.a_trsize = (v))
584: + #define H_SET_DATA_RELOCATION_SIZE(h,v) ((h)->header.a_drsize = (v))
585: + #define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->header.a_syms = (v) * \
586: + sizeof(struct nlist))
587: + #define H_SET_MAGIC_NUMBER(h,v) ((h)->header.a_info = (v))
588: + #define H_SET_ENTRY_POINT(h,v) ((h)->header.a_entry = (v))
589: + #define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v))
590: + #ifdef EXEC_MACHINE_TYPE
591: + #define H_SET_MACHINE_TYPE(h,v) ((h)->header.a_machtype = (v))
592: + #endif /* EXEC_MACHINE_TYPE */
593: + #ifdef EXEC_VERSION
594: + #define H_SET_VERSION(h,v) ((h)->header.a_version = (v))
595: + #endif /* EXEC_VERSION */
596: +
597: + /* Output the file(s) header(s) in a character array */
598: + #define H_OUTPUT(h,where) a_header_append(&(h)->header,(where))
599: +
600: + /* Output a symbol entry */
601: + #define SYMBOL_OUTPUT(s,w) a_symbol_append((s), (w))
602: +
603: + typedef struct {
604: + struct exec header; /* a.out header */
605: + long int string_table_size; /* names + '\0' + sizeof(int) */
606: + } object_headers;
607: +
608: + /* Format independent interface functions */
609: + extern void emit_relocations();
610: + extern void emit_symbols();
611: + extern void a_header_append();
612: + extern void a_symbol_append();
613: +
614: + #endif /* AOUT_H */
615: *** /dev/null Wed Nov 7 08:15:02 1990
616: --- append.h Wed Nov 7 07:33:26 1990
617: ***************
618: *** 0 ****
619: --- 1,1 ----
620: + extern void append();
621: *** /dev/null Wed Nov 7 08:15:02 1990
622: --- coff.c Wed Nov 7 07:33:27 1990
623: ***************
624: *** 0 ****
625: --- 1,364 ----
626: + #include "oformat.h"
627: + #include "as.h"
628: + #include "md.h"
629: + #include "struc-symbol.h"
630: + #include "symbols.h"
631: + #include "write.h"
632: +
633: + /* Relocation. */
634: +
635: + /*
636: + * emit_relocations()
637: + *
638: + * Crawl along a fixS chain. Emit the segment's relocations.
639: + */
640: +
641: + void
642: + emit_relocations (fixP, segment_address_in_file)
643: + register fixS * fixP; /* Fixup chain for this segment. */
644: + relax_addressT segment_address_in_file;
645: + {
646: + RELOC ri;
647: + register symbolS * symbolP;
648: +
649: + bzero((char *)&ri,sizeof(ri));
650: + for ( ; fixP; fixP = fixP->fx_next) {
651: + if (symbolP = fixP->fx_addsy) {
652: + #if defined(PROCESSOR_68000)
653: + ri.r_type = (fixP->fx_pcrel ?
654: + ( fixP->fx_size == 1 ? R_PCRBYTE :
655: + fixP->fx_size == 2 ? R_PCRWORD :
656: + R_PCRLONG):
657: + ( fixP->fx_size == 1 ? R_RELBYTE :
658: + fixP->fx_size == 2 ? R_RELWORD :
659: + R_RELLONG));
660: + #elif defined(PROCESSOR_i386)
661: + /* !!!! R_OFF8 & R_DIR16 are a vague guess, completly unested. */
662: + ri.r_type = (fixP->fx_pcrel ?
663: + ( fixP->fx_size == 1 ? R_PCRBYTE :
664: + fixP->fx_size == 2 ? R_PCRWORD :
665: + R_PCRLONG):
666: + ( fixP->fx_size == 1 ? R_OFF8 :
667: + fixP->fx_size == 2 ? R_DIR16 :
668: + R_DIR32));
669: + #else
670: + you lose
671: + #endif /* PROCESSOR_68000 || PROCESSOR_i386 */
672: + ri.r_vaddr = fixP->fx_frag->fr_address + fixP->fx_where;
673: + /* If symbol associated to relocation entry is a bss symbol
674: + or undefined symbol just remember the index of the symbol.
675: + Otherwise store the index of the symbol describing the
676: + section the symbol belong to. This heuristic speeds up ld.
677: + */
678: + /* Local symbols can generate relocation information. In case
679: + of structure return for instance. But they have no symbol
680: + number because they won't be emitted in the final object.
681: + In the case where they are in the BSS section, this leads
682: + to an incorrect r_symndx.
683: + Under bsd the loader do not care if the symbol reference is
684: + incorrect. But the SYS V ld complains about this. To avoid
685: + this we associate the symbol to the associated section,
686: + *even* if it is the BSS section. */
687: + /* If someone can tell me why the other symbols of the bss
688: + section are not associated with the .bss section entry,
689: + I'd be gratefull. I guess that it has to do with the special
690: + nature of the .bss section. Or maybe this is because the
691: + bss symbols are declared in the common section and can
692: + be resized later. Can it break code some where ? */
693: + ri.r_symndx =
694: + S_GET_SEGMENT(symbolP) == C_TEXT_SECTION ? dot_text_symbol->sy_number :
695: + S_GET_SEGMENT(symbolP) == C_DATA_SECTION ? dot_data_symbol->sy_number :
696: + (SF_GET_LOCAL(symbolP) ? dot_bss_symbol->sy_number :
697: + symbolP->sy_number); /* bss or undefined */
698: +
699: + /* md_ri_to_chars((char *) &ri, ri); /* Last step : write md f */
700: + append (&next_object_file_charP,
701: + (char *)& ri,
702: + (unsigned long)RELSZ);
703: + }
704: + }
705: + }
706: +
707: + /* Coff file generation & utilities */
708: +
709: + /* Convert a lvalue to machine dependent data */
710: + #define MD(s,v) \
711: + md_number_to_chars((char *)&(s)->v,(s)->v, sizeof((s)->v))
712: +
713: + void
714: + c_header_append(aouthdr, filehdr, where)
715: + AOUTHDR* aouthdr;
716: + FILHDR* filehdr;
717: + char** where;
718: + {
719: + /* Eventually swap bytes for cross compilation for file header */
720: + MD(filehdr, f_magic);
721: + MD(filehdr, f_nscns);
722: + MD(filehdr, f_timdat);
723: + MD(filehdr, f_symptr);
724: + MD(filehdr, f_nsyms);
725: + MD(filehdr, f_opthdr);
726: + MD(filehdr, f_flags);
727: + append(where, (char *)filehdr, FILHSZ);
728: +
729: + /* Eventually swap bytes for cross compilation for a.out header */
730: + MD(aouthdr, magic);
731: + MD(aouthdr, vstamp);
732: + MD(aouthdr, tsize);
733: + MD(aouthdr, dsize);
734: + MD(aouthdr, bsize);
735: + MD(aouthdr, entry);
736: + MD(aouthdr, text_start);
737: + MD(aouthdr, data_start);
738: + append(where, (char *)aouthdr, sizeof(struct aouthdr));
739: + }
740: +
741: + /*
742: + * Beware ! If you cross compile to another ENDIAN machine,
743: + * the symbol table values will not be valid any more.
744: + */
745: +
746: + void
747: + c_symbol_append(symbolP, where)
748: + symbolS * symbolP;
749: + char** where;
750: + {
751: + SYMENT *syment = &symbolP->sy_symbol;
752: + char numaux = syment->n_numaux;
753: + register AUXENT* auxP = &symbolP->sy_auxent;
754: + register unsigned short type = S_GET_DATA_TYPE(symbolP);
755: +
756: + MD(syment, n_value);
757: + MD(syment, n_scnum);
758: + MD(syment, n_type);
759: + MD(syment, n_sclass);
760: + MD(syment, n_numaux);
761: + append(where, (char *)syment, SYMESZ);
762: +
763: + /* Should do the following : if(.file entry) MD(..)... else
764: + if(static entry) MD(..)
765: + */
766: + if(numaux == 1) {
767: + #if 0 /* This code has never been tested */
768: + /* The most common case, x_sym entry. */
769: + if((SF_GET(symbolP) & (SF_FILE | SF_STATICS)) == 0) {
770: + MD(auxP, x_sym.x_tagndx);
771: + if(ISFCN(type))
772: + MD(auxP, x_sym.x_misc.x_fsize);
773: + else {
774: + MD(auxP, x_sym.x_misc.x_lnno);
775: + MD(auxP, x_sym.x_misc.x_size);
776: + }
777: + if(ISARY(type)) {
778: + register int index;
779: + for(index = 0; index < DIMNUM; index++)
780: + MD(auxP, x_sym.x_fcnary.x_ary.x_dimen[index]);
781: + } else {
782: + MD(auxP, x_sym.x_fcnary.x_fcn.x_lnnoptr);
783: + MD(auxP, x_sym.x_fcnary.x_fcn.x_endndx);
784: + }
785: + MD(auxP, x_sym.x_tvndx);
786: + } else if(SF_GET_FILE(symbolP)) /* .file */
787: + ;
788: + else if(SF_GET_STATICS(symbolP)) { /* .text, .data, .bss symbols */
789: + MD(auxP, x_scn.x_scnlen);
790: + MD(auxP, x_scn.x_nreloc);
791: + MD(auxP, x_scn.x_nlinno);
792: + }
793: + #endif /* 0 */
794: + append(where, (char *)auxP, AUXESZ);
795: + } else if(numaux > 0)
796: + as_warn("more than one auxent for symbol");
797: +
798: + return;
799: + }
800: +
801: + void
802: + c_section_header_append(header, where)
803: + SCNHDR* header;
804: + char** where;
805: + {
806: + MD(header, s_paddr);
807: + MD(header, s_vaddr);
808: + MD(header, s_size);
809: + MD(header, s_scnptr);
810: + MD(header, s_relptr);
811: + MD(header, s_lnnoptr);
812: + MD(header, s_nreloc);
813: + MD(header, s_nlnno);
814: + MD(header, s_flags);
815: + append(where, (char *)header, SCNHSZ);
816: +
817: + return;
818: + }
819: +
820: +
821: + void emit_symbols(symbol_rootP, where)
822: + symbolS * symbol_rootP;
823: + char** where;
824: + {
825: + symbolS * symbolP;
826: + /*
827: + * Emit all symbols left in the symbol chain.
828: + */
829: + for(symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next) {
830: + /* Used to save the offset of the name. It is used to point
831: + to the string in memory but must be a file offset. */
832: + register char * temp;
833: +
834: + temp = S_GET_NAME(symbolP);
835: + if (SF_GET_STRING(symbolP)) {
836: + S_SET_OFFSET(symbolP, symbolP->sy_name_offset);
837: + S_SET_ZEROES(symbolP, 0);
838: + } else {
839: + memset(symbolP->sy_name, '\0', SYMNMLEN);
840: + strncpy(symbolP->sy_name, temp, SYMNMLEN);
841: + }
842: + SYMBOL_OUTPUT(symbolP, where);
843: + S_SET_NAME(symbolP,temp);
844: + }
845: + }
846: +
847: + /* Merge a debug symbol containing debug information into a normal
848: + symbol. */
849: +
850: + void
851: + c_symbol_merge(debug, normal)
852: + symbolS* debug;
853: + symbolS* normal;
854: + {
855: + S_SET_DATA_TYPE(normal, S_GET_DATA_TYPE(debug));
856: + S_SET_STORAGE_CLASS(normal, S_GET_STORAGE_CLASS(debug));
857: + S_SET_NUMBER_AUXILIARY(normal, S_GET_NUMBER_AUXILIARY(debug));
858: + /* Move all the auxiliary information */
859: + if(S_GET_NUMBER_AUXILIARY(debug))
860: + memcpy((char*)&normal->sy_auxent, (char*)&debug->sy_auxent,
861: + AUXESZ);
862: + /* Move the debug flags. */
863: + SF_SET_DEBUG_FIELD(normal, SF_GET_DEBUG_FIELD(debug));
864: + }
865: +
866: + c_dot_file_symbol(filename)
867: + char* filename;
868: + {
869: + symbolS* symbolP;
870: +
871: + symbolP = symbol_new(".file", SEG_DEBUG, 0,
872: + C_FILE, &zero_address_frag);
873: + S_SET_NUMBER_AUXILIARY(symbolP, 1);
874: + SA_SET_FILE_FNAME(symbolP, filename);
875: + SF_SET_DEBUG(symbolP);
876: +
877: + /* Make sure that the symbol is first on the symbol chain */
878: + if(symbol_rootP != symbolP) {
879: + symbol_lastP = symbol_lastP->sy_previous;
880: + DL_REMOVE(symbolP);
881: + DL_INSERT(symbolP, symbol_rootP);
882: + symbol_rootP = symbolP;
883: + }
884: + }
885: + /*
886: + * Build a 'section static' symbol.
887: + */
888: +
889: + char*
890: + c_section_symbol(name, value, length, nreloc, nlnno)
891: + char* name;
892: + long value;
893: + long length;
894: + unsigned short nreloc;
895: + unsigned short nlnno;
896: + {
897: + symbolS* symbolP;
898: +
899: + symbolP = symbol_new(name,
900: + (name[1] == 't' ? SEG_TEXT :
901: + name[1] == 'd' ? SEG_DATA :
902: + SEG_BSS),
903: + value,
904: + C_STAT,
905: + &zero_address_frag);
906: +
907: + S_SET_NUMBER_AUXILIARY(symbolP, 1);
908: +
909: + SA_SET_SCN_SCNLEN(symbolP, length);
910: + SA_SET_SCN_NRELOC(symbolP, nreloc);
911: + SA_SET_SCN_NLINNO(symbolP, nlnno);
912: +
913: + SF_SET_STATICS(symbolP);
914: +
915: + return (char*)symbolP;
916: + }
917: +
918: + void
919: + c_section_header(header, name, core_address, size,
920: + data_ptr, reloc_ptr, lineno_ptr,
921: + reloc_number, lineno_number)
922: + SCNHDR* header;
923: + char* name;
924: + long core_address;
925: + long size;
926: + long data_ptr;
927: + long reloc_ptr;
928: + long lineno_ptr;
929: + long reloc_number;
930: + long lineno_number;
931: + {
932: + strncpy(header->s_name, name, 8);
933: + header->s_paddr = header->s_vaddr = core_address;
934: + header->s_size = size;
935: + header->s_scnptr = data_ptr;
936: + header->s_relptr = reloc_ptr;
937: + header->s_lnnoptr = lineno_ptr;
938: + header->s_nreloc = reloc_number;
939: + header->s_nlnno = lineno_number;
940: + header->s_flags = STYP_REG | ( name[1] == 't' ? STYP_TEXT :
941: + name[1] == 'd' ? STYP_DATA :
942: + name[1] == 'b' ? STYP_BSS :
943: + STYP_INFO );
944: + return ;
945: + }
946: +
947: + /* Line number handling */
948: +
949: + int text_lineno_number = 0;
950: + lineno* lineno_rootP = (lineno*)0;
951: + lineno* lineno_lastP = (lineno*)0;
952: +
953: + lineno*
954: + c_line_new(paddr, line_number, frag)
955: + long paddr;
956: + unsigned short line_number;
957: + fragS* frag;
958: + {
959: + lineno* new_line = (lineno*)xmalloc(sizeof(lineno));
960: +
961: + new_line->line.l_addr.l_paddr = paddr;
962: + new_line->line.l_lnno = line_number;
963: + new_line->frag = (char*)frag;
964: + new_line->next = (lineno*)0;
965: +
966: + if(lineno_rootP == (lineno*)0)
967: + lineno_rootP = new_line;
968: + else
969: + lineno_lastP->next = new_line;
970: + lineno_lastP = new_line;
971: + }
972: +
973: + void
974: + emit_lineno(line, where)
975: + lineno* line;
976: + char** where;
977: + {
978: + register LINENO* line_entry;
979: +
980: + for(;line;line = line->next) {
981: + line_entry = &line->line;
982: + /* No matter which member of the union we process, they are
983: + both long. */
984: + MD(line_entry, l_addr.l_paddr);
985: + MD(line_entry, l_lnno);
986: + append(where, (char *)line_entry, LINESZ);
987: + }
988: + return ;
989: + }
990: *** /dev/null Wed Nov 7 08:15:02 1990
991: --- coff.h Wed Nov 7 07:33:28 1990
992: ***************
993: *** 0 ****
994: --- 1,400 ----
995: + #ifndef COFF_H
996: + #define COFF_H
997: +
998: + #include <filehdr.h>
999: + #include <aouthdr.h>
1000: + #include <scnhdr.h>
1001: + #include <storclass.h>
1002: + #include <linenum.h>
1003: + #include <syms.h>
1004: + #include <reloc.h>
1005: +
1006: + #include "machine.h"
1007: + #include "stack.h"
1008: +
1009: + /* Tag to validate coff object file format processing */
1010: + #define coff
1011: +
1012: + /* Define some processor dependent values according to the processor we are
1013: + on. */
1014: + #if defined(PROCESSOR_68000)
1015: +
1016: + #define BYTE_ORDERING F_AR32W /* See filehdr.h for more info. */
1017: + #ifndef FILE_HEADER_MAGIC
1018: + #define FILE_HEADER_MAGIC MC68MAGIC /* ... */
1019: + #endif /* FILE_HEADER_MAGIC */
1020: +
1021: + #elif defined(PROCESSOR_i386)
1022: +
1023: + #define BYTE_ORDERING F_AR32WR /* See filehdr.h for more info. */
1024: + #ifndef FILE_HEADER_MAGIC
1025: + #define FILE_HEADER_MAGIC I386MAGIC /* ... */
1026: + #endif /* FILE_HEADER_MAGIC */
1027: +
1028: + #elif
1029: + you lose
1030: + #endif
1031: +
1032: + /* Magic number of paged executable. */
1033: + #define OMAGIC 0413
1034: +
1035: + /* Add these definitions to have a consistent convention for all the
1036: + types used in COFF format. */
1037: + #define AOUTHDR struct aouthdr
1038: + #define AOUTHDRSZ sizeof(AOUTHDR)
1039: +
1040: + /* RELOCATION INFORMATION */
1041: +
1042: + #define relocation_type RELOC /* Relocation table entry */
1043: +
1044: + /* SYMBOL TABLE */
1045: +
1046: + /* Symbol table entry data type */
1047: +
1048: + #define symbol_type SYMENT /* Symbol table entry */
1049: +
1050: + /* If compiler generate leading underscores, remove them. */
1051: +
1052: + #ifndef STRIP_UNDERSCORE
1053: + #define STRIP_UNDERSCORE 0
1054: + #endif /* STRIP_UNDERSCORE */
1055: + #define DO_NOT_STRIP 0
1056: + #define DO_STRIP 1
1057: +
1058: + /* Double linked list manipulations macros. */
1059: + /* See struc-symbol.h for a definition of symbolS. */
1060: +
1061: + /* Remove the argument from the list. */
1062: + #define DL_REMOVE(p) \
1063: + (((p)->sy_next && ((p)->sy_next->sy_previous = (p)->sy_previous)),\
1064: + ((p)->sy_previous && ((p)->sy_previous->sy_next = (p)->sy_next)))
1065: +
1066: + /* Set the chain symbols to null. */
1067: + #define DL_CLEAR(p) \
1068: + ((p)->sy_next = (symbolS*)0, (p)->sy_previous = (symbolS*)0)
1069: +
1070: + /* Link symbol p after symbol w in the chain. */
1071: + #define DL_APPEND(p,w) \
1072: + (((w)->sy_next && ((w)->sy_next->sy_previous = (p))), \
1073: + ((p)->sy_next = (w)->sy_next), \
1074: + ((w)->sy_next = (p)), \
1075: + ((p)->sy_previous = (w)))
1076: +
1077: + /* Link symbol p before symbol w in the chain. */
1078: + #define DL_INSERT(p,w) \
1079: + (((w)->sy_previous && ((w)->sy_previous->sy_next = (p))), \
1080: + ((p)->sy_previous = (w)->sy_previous), \
1081: + ((w)->sy_previous = (p)), \
1082: + ((p)->sy_next = (w)))
1083: +
1084: + /* Symbol table macros and constants */
1085: +
1086: + /* Possible and usefull section number in symbol table
1087: + * The values of TEXT, DATA and BSS may not be portable.
1088: + */
1089: +
1090: + #define C_TEXT_SECTION 1
1091: + #define C_DATA_SECTION 2
1092: + #define C_BSS_SECTION 3
1093: + #define C_ABS_SECTION N_ABS
1094: + #define C_UNDEF_SECTION N_UNDEF
1095: + #define C_DEBUG_SECTION N_DEBUG
1096: + #define C_NTV_SECTION N_TV
1097: + #define C_PTV_SECTION P_TV
1098: +
1099: + /*
1100: + * Macros to extract information from a symbol table entry.
1101: + * This syntaxic indirection allows independence regarding a.out or coff.
1102: + * The argument (s) of all these macros is a pointer to a symbol table entry.
1103: + */
1104: +
1105: + /* Predicates */
1106: + /* True if in text segment */
1107: + #define S_IS_TEXT(s) ((s)->sy_scnum == C_TEXT_SECTION)
1108: + /* True if in data segment */
1109: + #define S_IS_DATA(s) ((s)->sy_scnum == C_DATA_SECTION)
1110: + /* True if in bss segment */
1111: + #define S_IS_BSS(s) ((s)->sy_scnum == C_BSS_SECTION)
1112: + /* True if in bss segment */
1113: + #define S_IS_ABS(s) ((s)->sy_scnum == C_ABS_SECTION)
1114: + /* True if the symbol is external */
1115: + #define S_IS_EXTERNAL(s) ((s)->sy_scnum == C_UNDEF_SECTION)
1116: + /* True if symbol has been defined, ie :
1117: + section > 0 (DATA, TEXT or BSS)
1118: + section == 0 and value > 0 (external bss symbol) */
1119: + #define S_IS_DEFINED(s) ((s)->sy_scnum > C_UNDEF_SECTION || \
1120: + ((s)->sy_scnum == C_UNDEF_SECTION && \
1121: + (s)->sy_value > 0))
1122: + /* True if a debug special symbol entry */
1123: + #define S_IS_DEBUG(s) ((s)->sy_scnum == C_DEGUG_SECTION)
1124: + /* True if a symbol is local symbol name */
1125: + /* A symbol name whose name begin with ^A is a gas internal pseudo symbol */
1126: + #define S_IS_LOCAL(s) (S_GET_NAME(s)[0] == '\001' || \
1127: + (S_LOCAL_NAME(s) && !flagseen['L']))
1128: + /* True if a symbol is not defined in this file */
1129: + #define S_IS_EXTERN(s) ((s)->sy_scnum == 0 && (s)->sy_value == 0)
1130: + /*
1131: + * True if a symbol can be multiply defined (bss symbols have this def
1132: + * though it is bad practice)
1133: + */
1134: + #define S_IS_COMMON(s) ((s)->sy_scnum == 0 && (s)->sy_value != 0)
1135: + /* True if a symbol name is in the string table, i.e. its length is > 8. */
1136: + #define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0)
1137: +
1138: + /* Accessors */
1139: + /* The name of the symbol */
1140: + #define S_GET_NAME(s) ((char*)(s)->sy_offset)
1141: + /* The pointer to the string table */
1142: + #define S_GET_OFFSET(s) ((s)->sy_offset)
1143: + /* The zeroes if symbol name is longer than 8 chars */
1144: + #define S_GET_ZEROES(s) ((s)->sy_zeroes)
1145: + /* The value of the symbol */
1146: + #define S_GET_VALUE(s) ((s)->sy_value)
1147: + /* The numeric value of the segment */
1148: + #define S_GET_SEGMENT(s) ((s)->sy_scnum)
1149: + /* The data type */
1150: + #define S_GET_DATA_TYPE(s) ((s)->sy_type)
1151: + /* The storage class */
1152: + #define S_GET_STORAGE_CLASS(s) ((s)->sy_sclass)
1153: + /* The number of auxiliary entries */
1154: + #define S_GET_NUMBER_AUXILIARY(s) ((s)->sy_numaux)
1155: +
1156: + /* Modifiers */
1157: + /* Set the name of the symbol */
1158: + #define S_SET_NAME(s,v) ((s)->sy_offset = (unsigned long)(v))
1159: + /* Set the offset of the symbol */
1160: + #define S_SET_OFFSET(s,v) ((s)->sy_offset = (v))
1161: + /* The zeroes if symbol name is longer than 8 chars */
1162: + #define S_SET_ZEROES(s,v) ((s)->sy_zeroes = (v))
1163: + /* Set the value of the symbol */
1164: + #define S_SET_VALUE(s,v) ((s)->sy_value = (v))
1165: + /* The numeric value of the segment */
1166: + #define S_SET_SEGMENT(s,v) ((s)->sy_scnum = (v))
1167: + /* The data type */
1168: + #define S_SET_DATA_TYPE(s,v) ((s)->sy_type = (v))
1169: + /* The storage class */
1170: + #define S_SET_STORAGE_CLASS(s,v) ((s)->sy_sclass = (v))
1171: + /* The number of auxiliary entries */
1172: + #define S_SET_NUMBER_AUXILIARY(s,v) ((s)->sy_numaux = (v))
1173: +
1174: + /* Additional modifiers */
1175: + /* Assume that a symbol cannot be simultaneously in more than on segment */
1176: + /* Set the segment to text */
1177: + #define S_SET_TEXT(s) ((s)->sy_scnum = C_TEXT_SECTION)
1178: + /* Set the segment to data */
1179: + #define S_SET_DATA(s) ((s)->sy_scnum = C_DATA_SECTION)
1180: + /* Set the segment to bss */
1181: + #define S_SET_BSS(s) ((s)->sy_scnum = C_BSS_SECTION)
1182: + /* Set the segment to abs */
1183: + #define S_SET_ABS(s) ((s)->sy_scnum = C_ABS_SECTION)
1184: + /* The symbol is external (does not mean undefined) */
1185: + #define S_SET_EXTERNAL(s) S_SET_STORAGE_CLASS(s,C_EXT)
1186: +
1187: + /* Auxiliary entry macros. SA_ stands for symbol auxiliary */
1188: + /* Omit the tv related fields */
1189: + /* Accessors */
1190: + #define SA_GET_SYM_TAGNDX(s) ((s)->sy_auxent.x_sym.x_tagndx)
1191: + #define SA_GET_SYM_LNNO(s) ((s)->sy_auxent.x_sym.x_misc.x_lnsz.x_lnno)
1192: + #define SA_GET_SYM_SIZE(s) ((s)->sy_auxent.x_sym.x_misc.x_lnsz.x_size)
1193: + #define SA_GET_SYM_FSIZE(s) ((s)->sy_auxent.x_sym.x_misc.x_fsize)
1194: + #define SA_GET_SYM_LNNOPTR(s) ((s)->sy_auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr)
1195: + #define SA_GET_SYM_ENDNDX(s) ((s)->sy_auxent.x_sym.x_fcnary.x_fcn.x_endndx)
1196: + #define SA_GET_SYM_DIMEN(s,i) ((s)->sy_auxent.x_sym.x_fcnary.x_ary.x_dimen[(i)])
1197: + #define SA_GET_FILE_FNAME(s) ((s)->sy_auxent.x_file.x_fname)
1198: + #define SA_GET_SCN_SCNLEN(s) ((s)->sy_auxent.x_scn.x_scnlen)
1199: + #define SA_GET_SCN_NRELOC(s) ((s)->sy_auxent.x_scn.x_nreloc)
1200: + #define SA_GET_SCN_NLINNO(s) ((s)->sy_auxent.x_scn.x_nlinno)
1201: +
1202: + /* Modifiers */
1203: + #define SA_SET_SYM_TAGNDX(s,v) ((s)->sy_auxent.x_sym.x_tagndx=(v))
1204: + #define SA_SET_SYM_LNNO(s,v) ((s)->sy_auxent.x_sym.x_misc.x_lnsz.x_lnno=(v))
1205: + #define SA_SET_SYM_SIZE(s,v) ((s)->sy_auxent.x_sym.x_misc.x_lnsz.x_size=(v))
1206: + #define SA_SET_SYM_FSIZE(s,v) ((s)->sy_auxent.x_sym.x_misc.x_fsize=(v))
1207: + #define SA_SET_SYM_LNNOPTR(s,v) ((s)->sy_auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr=(v))
1208: + #define SA_SET_SYM_ENDNDX(s,v) ((s)->sy_auxent.x_sym.x_fcnary.x_fcn.x_endndx=(v))
1209: + #define SA_SET_SYM_DIMEN(s,i,v) ((s)->sy_auxent.x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v))
1210: + #define SA_SET_FILE_FNAME(s,v) strncpy((s)->sy_auxent.x_file.x_fname,(v),FILNMLEN)
1211: + #define SA_SET_SCN_SCNLEN(s,v) ((s)->sy_auxent.x_scn.x_scnlen=(v))
1212: + #define SA_SET_SCN_NRELOC(s,v) ((s)->sy_auxent.x_scn.x_nreloc=(v))
1213: + #define SA_SET_SCN_NLINNO(s,v) ((s)->sy_auxent.x_scn.x_nlinno=(v))
1214: +
1215: + /* Internal use only definitions. SF_ stands for symbol flags. */
1216: +
1217: + /* These values can be assigned to sy_flags field of a symbolS */
1218: + /* The first 16 bits are general purpose. The last 16 bits are debug info */
1219: +
1220: + #define SF_STATICS 0x00000001 /* Mark the .text & all symbols */
1221: + #define SF_DEFINED 0x00000002 /* Symbol is defined in this file */
1222: + #define SF_STRING 0x00000004 /* Symbol name length > 8 */
1223: + #define SF_LOCAL 0x00000008 /* Symbol must not be emitted */
1224: +
1225: + #define SF_FUNCTION 0x00010000 /* The symbol is a function */
1226: + #define SF_PROCESS 0x00020000 /* Process symbol before write */
1227: + #define SF_TAGGED 0x00040000 /* Is associated with a tag */
1228: + #define SF_TAG 0x00080000 /* Is a tag */
1229: + #define SF_DEBUG 0x00100000 /* Is in debug or abs section */
1230: + #define SF_GET_SEGMENT 0x00200000 /* Get the section of the forward
1231: + symbol. */
1232: +
1233: + /* Masks */
1234: + #define SF_NORMAL_MASK 0x0000ffff /* Non debug information */
1235: + #define SF_DEBUG_MASK 0xffff0000 /* Debug information */
1236: +
1237: + /* Accessors */
1238: + #define SF_GET(s) ((s)->sy_flags)
1239: + #define SF_GET_NORMAL_FIELD(s) ((s)->sy_flags & SF_NORMAL_MASK)
1240: + #define SF_GET_DEBUG_FIELD(s) ((s)->sy_flags & SF_DEBUG_MASK)
1241: + #define SF_GET_FILE(s) ((s)->sy_flags & SF_FILE)
1242: + #define SF_GET_STATICS(s) ((s)->sy_flags & SF_STATICS)
1243: + #define SF_GET_DEFINED(s) ((s)->sy_flags & SF_DEFINED)
1244: + #define SF_GET_STRING(s) ((s)->sy_flags & SF_STRING)
1245: + #define SF_GET_LOCAL(s) ((s)->sy_flags & SF_LOCAL)
1246: + #define SF_GET_FUNCTION(s) ((s)->sy_flags & SF_FUNCTION)
1247: + #define SF_GET_PROCESS(s) ((s)->sy_flags & SF_PROCESS)
1248: + #define SF_GET_DEBUG(s) ((s)->sy_flags & SF_DEBUG)
1249: + #define SF_GET_TAGGED(s) ((s)->sy_flags & SF_TAGGED)
1250: + #define SF_GET_TAG(s) ((s)->sy_flags & SF_TAG)
1251: + #define SF_GET_GET_SEGMENT(s) ((s)->sy_flags & SF_GET_SEGMENT)
1252: +
1253: + /* Modifiers */
1254: + #define SF_SET(s,v) ((s)->sy_flags = (v))
1255: + #define SF_SET_NORMAL_FIELD(s,v)((s)->sy_flags |= ((v) & SF_NORMAL_MASK))
1256: + #define SF_SET_DEBUG_FIELD(s,v) ((s)->sy_flags |= ((v) & SF_DEBUG_MASK))
1257: + #define SF_SET_FILE(s) ((s)->sy_flags |= SF_FILE)
1258: + #define SF_SET_STATICS(s) ((s)->sy_flags |= SF_STATICS)
1259: + #define SF_SET_DEFINED(s) ((s)->sy_flags |= SF_DEFINED)
1260: + #define SF_SET_STRING(s) ((s)->sy_flags |= SF_STRING)
1261: + #define SF_SET_LOCAL(s) ((s)->sy_flags |= SF_LOCAL)
1262: + #define SF_SET_FUNCTION(s) ((s)->sy_flags |= SF_FUNCTION)
1263: + #define SF_SET_PROCESS(s) ((s)->sy_flags |= SF_PROCESS)
1264: + #define SF_SET_DEBUG(s) ((s)->sy_flags |= SF_DEBUG)
1265: + #define SF_SET_TAGGED(s) ((s)->sy_flags |= SF_TAGGED)
1266: + #define SF_SET_TAG(s) ((s)->sy_flags |= SF_TAG)
1267: + #define SF_SET_GET_SEGMENT(s) ((s)->sy_flags |= SF_GET_SEGMENT)
1268: +
1269: + /* File header macro and type definition */
1270: +
1271: + /*
1272: + * File position calculators. Beware to use them when all the
1273: + * appropriate fields are set in the header.
1274: + */
1275: +
1276: + #define H_GET_FILE_SIZE(h) \
1277: + (long)(FILHSZ + AOUTHDRSZ + \
1278: + H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
1279: + H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
1280: + H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h) + \
1281: + H_GET_SYMBOL_TABLE_SIZE(h) * SYMESZ + \
1282: + (h)->string_table_size)
1283: + #define H_GET_TEXT_FILE_OFFSET(h) \
1284: + (long)(FILHSZ + AOUTHDRSZ + \
1285: + H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)
1286: + #define H_GET_DATA_FILE_OFFSET(h) \
1287: + (long)(FILHSZ + AOUTHDRSZ + \
1288: + H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
1289: + H_GET_TEXT_SIZE(h))
1290: + #define H_GET_BSS_FILE_OFFSET(h) 0
1291: + #define H_GET_RELOCATION_FILE_OFFSET(h) \
1292: + (long)(FILHSZ + AOUTHDRSZ + \
1293: + H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
1294: + H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h))
1295: + #define H_GET_LINENO_FILE_OFFSET(h) \
1296: + (long)(FILHSZ + AOUTHDRSZ + \
1297: + H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
1298: + H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
1299: + H_GET_RELOCATION_SIZE(h))
1300: + #define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \
1301: + (long)(FILHSZ + AOUTHDRSZ + \
1302: + H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
1303: + H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
1304: + H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h))
1305: +
1306: + /* Accessors */
1307: + /* aouthdr */
1308: + #define H_GET_MAGIC_NUMBER(h) ((h)->aouthdr.magic)
1309: + #define H_GET_VERSION_STAMP(h) ((h)->aouthdr.vstamp)
1310: + #define H_GET_TEXT_SIZE(h) ((h)->aouthdr.tsize)
1311: + #define H_GET_DATA_SIZE(h) ((h)->aouthdr.dsize)
1312: + #define H_GET_BSS_SIZE(h) ((h)->aouthdr.bsize)
1313: + #define H_GET_ENTRY_POINT(h) ((h)->aouthdr.entry)
1314: + #define H_GET_TEXT_START(h) ((h)->aouthdr.text_start)
1315: + #define H_GET_DATA_START(h) ((h)->aouthdr.data_start)
1316: + /* filehdr */
1317: + #define H_GET_FILE_MAGIC_NUMBER(h) ((h)->filehdr.f_magic)
1318: + #define H_GET_NUMBER_OF_SECTIONS(h) ((h)->filehdr.f_nscns)
1319: + #define H_GET_TIME_STAMP(h) ((h)->filehdr.f_timdat)
1320: + #define H_GET_SYMBOL_TABLE_POINTER(h) ((h)->filehdr.f_symptr)
1321: + #define H_GET_SYMBOL_TABLE_SIZE(h) ((h)->filehdr.f_nsyms)
1322: + #define H_GET_SIZEOF_OPTIONAL_HEADER(h) ((h)->filehdr.f_opthdr)
1323: + #define H_GET_FLAGS(h) ((h)->filehdr.f_flags)
1324: + /* Extra fields to achieve bsd a.out compatibility and for convinience */
1325: + #define H_GET_RELOCATION_SIZE(h) ((h)->relocation_size)
1326: + #define H_GET_STRING_SIZE(h) ((h)->string_table_size)
1327: + #define H_GET_LINENO_SIZE(h) ((h)->lineno_size)
1328: +
1329: + /* Modifiers */
1330: + /* aouthdr */
1331: + #define H_SET_MAGIC_NUMBER(h,v) ((h)->aouthdr.magic = (v))
1332: + #define H_SET_VERSION_STAMP(h,v) ((h)->aouthdr.vstamp = (v))
1333: + #define H_SET_TEXT_SIZE(h,v) ((h)->aouthdr.tsize = (v))
1334: + #define H_SET_DATA_SIZE(h,v) ((h)->aouthdr.dsize = (v))
1335: + #define H_SET_BSS_SIZE(h,v) ((h)->aouthdr.bsize = (v))
1336: + #define H_SET_ENTRY_POINT(h,v) ((h)->aouthdr.entry = (v))
1337: + #define H_SET_TEXT_START(h,v) ((h)->aouthdr.text_start = (v))
1338: + #define H_SET_DATA_START(h,v) ((h)->aouthdr.data_start = (v))
1339: + /* filehdr */
1340: + #define H_SET_FILE_MAGIC_NUMBER(h,v) ((h)->filehdr.f_magic = (v))
1341: + #define H_SET_NUMBER_OF_SECTIONS(h,v) ((h)->filehdr.f_nscns = (v))
1342: + #define H_SET_TIME_STAMP(h,v) ((h)->filehdr.f_timdat = (v))
1343: + #define H_SET_SYMBOL_TABLE_POINTER(h,v) ((h)->filehdr.f_symptr = (v))
1344: + #define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->filehdr.f_nsyms = (v))
1345: + #define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v))
1346: + #define H_SET_FLAGS(h,v) ((h)->filehdr.f_flags = (v))
1347: + /* Extra fields to achieve bsd a.out compatibility and for convinience */
1348: + #define H_SET_RELOCATION_SIZE(h,t,d) ((h)->relocation_size = (t)+(d))
1349: + #define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v))
1350: + #define H_SET_LINENO_SIZE(h,v) ((h)->lineno_size = (v))
1351: +
1352: + /* Output the file(s) header(s) in a character array */
1353: + #define H_OUTPUT(h,where) c_header_append(&(h)->aouthdr, &(h)->filehdr,(where))
1354: +
1355: + /* Output a symbol entry */
1356: + #define SYMBOL_OUTPUT(s,w) c_symbol_append((s), (w))
1357: +
1358: + typedef struct {
1359: + AOUTHDR aouthdr; /* a.out header */
1360: + FILHDR filehdr; /* File header, not machine dep. */
1361: + long int string_table_size; /* names + '\0' + sizeof(int) */
1362: + long int relocation_size; /* Cumulated size of relocation
1363: + information for all sections in
1364: + bytes. */
1365: + long int lineno_size; /* Size of the line number information
1366: + table in bytes */
1367: + } object_headers;
1368: +
1369: + /* Format independent interface functions */
1370: + extern void emit_relocations();
1371: + extern void emit_symbols();
1372: + extern void c_symbol_merge();
1373: + extern void c_header_append();
1374: + extern void c_symbol_append();
1375: + extern void c_section_header_append();
1376: + extern char* c_section_symbol();
1377: + extern void c_section_header();
1378: +
1379: + /* -------------- Line number handling ------- */
1380: + extern int text_lineno_number;
1381: +
1382: + typedef struct internal_lineno {
1383: + LINENO line; /* The lineno structure itself */
1384: + char* frag; /* Frag the line number is related to*/
1385: + struct internal_lineno* next; /* Forward chain pointer */
1386: + } lineno;
1387: +
1388: + extern lineno* c_new_file();
1389: + extern void emit_lineno();
1390: + extern lineno* lineno_rootP;
1391: + extern lineno* lineno_lastP;
1392: + #endif /* COFF_H */
1393: +
1394: +
1395: *** /dev/null Wed Nov 7 08:15:02 1990
1396: --- config.gas Wed Nov 7 07:33:29 1990
1397: ***************
1398: *** 0 ****
1399: --- 1,70 ----
1400: + # Set the appropriate links for machine dependent files
1401: +
1402: + # Chose one of
1403: + #
1404: + # i386 for 386 box running SCO unix (ODT),
1405: + # Esix rev C
1406: + # Ix 2.02
1407: + # CTIX 3.2
1408: + #
1409: + # sun-3 for sun3 running SunOs 3.5
1410: + # SunOs 4.0.3
1411: + #
1412: + # motorola-3600-unisoft-1.3 for Motorola 3600 running Unisoft 1.3 (V.3.2)
1413: + # microlec-2030-lectra-1 for Microlec 2030 running Lectra 1.1
1414: +
1415: + case $1 in
1416: + default)
1417: + cp /dev/null dependencies
1418: + ln aout.h oformat.h
1419: + exit
1420: + ;;
1421: + sun-3)
1422: + [ -f m68k.h ] && rm -f m68k.h
1423: + ln m-sun3.h m68k.h
1424: + machine_file=m68k.c
1425: + atof_file=atof-ieee.c
1426: + machine_header=m-sun3.h
1427: + opcode_header=m68k-opcode.h
1428: + object_format=aout
1429: + ;;
1430: + motorola-3600-unisoft-1.3|microlec-2030-lectra-1.1)
1431: + [ -f m68k.h ] && rm -f m68k.h
1432: + ln m-sun3.h m68k.h
1433: + machine_file=m68k.c
1434: + atof_file=atof-ieee.c
1435: + machine_header=m-motor.h
1436: + opcode_header=m68k-opcode.h
1437: + object_format=coff
1438: + ;;
1439: + dpx2)
1440: + [ -f m68k.h ] && rm -f m68k.h
1441: + ln m-sun3.h m68k.h
1442: + machine_file=m68k.c
1443: + atof_file=atof-ieee.c
1444: + machine_header=m-dpx2.h
1445: + opcode_header=m68k-opcode.h
1446: + object_format=coff
1447: + ;;
1448: + i386)
1449: + [ -f m68k.h ] && rm -f m68k.h
1450: + machine_file=i386.c
1451: + atof_file=atof-ieee.c
1452: + machine_header=m-i386.h
1453: + opcode_header=i386-opcode.h
1454: + object_format=coff
1455: + ;;
1456: + *)
1457: + echo $1 not a known configuration
1458: + exit 1
1459: + ;;
1460: + esac
1461: +
1462: + rm -f machine.c atof.c machine.h oformat.h oformat.c opcode.h
1463: + set -x
1464: + ln $machine_file machine.c
1465: + ln $atof_file atof.c
1466: + ln $machine_header machine.h
1467: + ln ${object_format}.c oformat.c
1468: + ln ${object_format}.h oformat.h
1469: + ln ${opcode_header} opcode.h
1470: *** /dev/null Wed Nov 7 08:15:02 1990
1471: --- m-dpx2.h Wed Nov 7 07:33:29 1990
1472: ***************
1473: *** 0 ****
1474: --- 1,14 ----
1475: + /* Machine specific defines for the dpx2 machine */
1476: + #define dpx2
1477: + #define PROCESSOR_68000
1478: +
1479: + /* Return true if s (a non null string pointer), points to a local variable
1480: + name. */
1481: + #define S_LOCAL_NAME(s) (S_GET_NAME(s)[0] == 'L')
1482: +
1483: + /* Preserve leading underscore in symbol names. */
1484: + #define STRIP_UNDERSCORE 0
1485: +
1486: + /* The magic number is not the usual MC68MAGIC. */
1487: + #define FILE_HEADER_MAGIC MC68KBCSMAGIC
1488: +
1489: *** /dev/null Wed Nov 7 08:15:02 1990
1490: --- m-i386.h Wed Nov 7 07:33:30 1990
1491: ***************
1492: *** 0 ****
1493: --- 1,10 ----
1494: + /* Machine specific defines for the SCO Unix V.3.2 ODT */
1495: + #define scounix
1496: + #define PROCESSOR_i386
1497: +
1498: + /* Return true if s (a non null string pointer), points to a local variable
1499: + name. */
1500: + #define S_LOCAL_NAME(s) (S_GET_NAME(s)[0] == '.' && S_GET_NAME(s)[1] == 'L')
1501: +
1502: + /* Compiler does not generate symbol names with a leading underscore. */
1503: + #define STRIP_UNDERSCORE 0
1504: *** /dev/null Wed Nov 7 08:15:02 1990
1505: --- m-motor.h Wed Nov 7 07:33:30 1990
1506: ***************
1507: *** 0 ****
1508: --- 1,10 ----
1509: + /* Machine specific defines for the unisoft 680x0 V.3.2 version 1.3 */
1510: + #define unisoft
1511: + #define PROCESSOR_68000
1512: +
1513: + /* Return true if s (a non null string pointer), points to a local variable
1514: + name. */
1515: + #define S_LOCAL_NAME(s) (S_GET_NAME(s)[0] == 'L')
1516: +
1517: + /* Remove leading underscore from the gcc generated symbol names */
1518: + #define STRIP_UNDERSCORE 1
1519: *** /dev/null Wed Nov 7 08:15:02 1990
1520: --- stack.c Wed Nov 7 07:33:31 1990
1521: ***************
1522: *** 0 ****
1523: --- 1,59 ----
1524: + #include "stack.h"
1525: +
1526: + extern char* malloc();
1527: + extern char* realloc();
1528: +
1529: + stack* stack_init(chunk_size, element_size)
1530: + unsigned long chunk_size;
1531: + unsigned long element_size;
1532: + {
1533: + stack* st;
1534: + if((st = (stack*)malloc(sizeof(stack))) == (stack*)0)
1535: + return (stack*)0;
1536: + if((st->data = malloc(chunk_size)) == (char*)0) {
1537: + free(st);
1538: + return (stack*)0;
1539: + }
1540: + st->pointer = 0;
1541: + st->size = chunk_size;
1542: + st->chunk_size = chunk_size;
1543: + st->element_size = element_size;
1544: + return st;
1545: + }
1546: +
1547: + void stack_delete(st)
1548: + stack* st;
1549: + {
1550: + free(st->data);
1551: + free(st);
1552: + }
1553: +
1554: + char* stack_push(st, element)
1555: + stack* st;
1556: + char* element;
1557: + {
1558: + if(st->pointer + st->element_size >= st->size) {
1559: + st->size += st->chunk_size;
1560: + if((st->data = realloc(st->data, st->size)) == (char*)0)
1561: + return (char*)0;
1562: + }
1563: + memcpy(st->data + st->pointer, element, st->element_size);
1564: + st->pointer += st->element_size;
1565: + return st->data + st->pointer;
1566: + }
1567: +
1568: + char* stack_pop(st)
1569: + stack* st;
1570: + {
1571: + if((st->pointer -= st->element_size) < 0) {
1572: + st->pointer = 0;
1573: + return (char*)0;
1574: + }
1575: + return st->data + st->pointer;
1576: + }
1577: +
1578: + char* stack_top(st)
1579: + stack* st;
1580: + {
1581: + return st->data + st->pointer - st->element_size;
1582: + }
1583: *** /dev/null Wed Nov 7 08:15:02 1990
1584: --- stack.h Wed Nov 7 07:33:31 1990
1585: ***************
1586: *** 0 ****
1587: --- 1,13 ----
1588: + typedef struct {
1589: + unsigned long chunk_size;
1590: + unsigned long element_size;
1591: + unsigned long size;
1592: + char* data;
1593: + unsigned long pointer;
1594: + } stack;
1595: +
1596: + extern stack* stack_init();
1597: + extern void stack_delete();
1598: + extern char* stack_push();
1599: + extern char* stack_pop();
1600: + extern char* stack_top();
1601: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./as.c Thu Oct 11 18:26:17 1990
1602: --- ./as.c Wed Nov 7 07:33:32 1990
1603: ***************
1604: *** 38,43 ****
1605: --- 38,44 ----
1606: #include <signal.h>
1607:
1608: #define COMMON
1609: + #include "oformat.h"
1610: #include "as.h"
1611: #include "struc-symbol.h"
1612: #include "write.h"
1613: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./as.h Thu Oct 11 18:26:18 1990
1614: --- ./as.h Wed Nov 7 07:33:33 1990
1615: ***************
1616: *** 162,170 ****
1617: /* Invented so we don't crash printing */
1618: /* error message involving weird segment. */
1619: SEG_BIG, /* Bigger than 32 bits constant. */
1620: ! SEG_DIFFERENCE /* Mythical Segment: absolute difference. */
1621: } segT;
1622: #define SEG_MAXIMUM_ORDINAL (SEG_DIFFERENCE)
1623:
1624: typedef unsigned char subsegT;
1625:
1626: --- 162,179 ----
1627: /* Invented so we don't crash printing */
1628: /* error message involving weird segment. */
1629: SEG_BIG, /* Bigger than 32 bits constant. */
1630: ! SEG_DIFFERENCE, /* Mythical Segment: absolute difference. */
1631: ! #ifdef coff
1632: ! SEG_DEBUG, /* Debug segment */
1633: ! SEG_NTV, /* Transfert vector preload segment */
1634: ! SEG_PTV, /* Transfert vector postload segment */
1635: ! #endif /* coff */
1636: } segT;
1637: + #ifdef coff
1638: + #define SEG_MAXIMUM_ORDINAL (SEG_PTV)
1639: + #else /* coff */
1640: #define SEG_MAXIMUM_ORDINAL (SEG_DIFFERENCE)
1641: + #endif /* coff */
1642:
1643: typedef unsigned char subsegT;
1644:
1645: ***************
1646: *** 180,185 ****
1647: --- 189,211 ----
1648: extern char *const seg_name[];
1649: extern const int seg_N_TYPE[];
1650: extern const segT N_TYPE_seg[];
1651: + #ifdef coff
1652: + #define segment_name(v) (seg_name[(v)])
1653: + /* Machine independent -> machine dependent */
1654: + #define seg_SEG(v) (seg_N_TYPE[(v)])
1655: + /*
1656: + * +4 shift the value of the mnemonics from -4, -3, -2, -1, 0, 1, 2, 3
1657: + * to 0, 1, 2, 3, 4, 5, 6, 7
1658: + */
1659: + /* Machine dependent -> machine independent */
1660: + #define SEG_seg(v) (N_TYPE_seg[(v) + 4])
1661: + #else /* coff */
1662: + #define segment_name(v) (seg_name[(v)])
1663: + /* Machine independent -> machine dependent */
1664: + #define seg_SEG(v) (seg_N_TYPE[(v)])
1665: + /* Machine dependent -> machine independent */
1666: + #define SEG_seg(v) (N_TYPE_seg[(v)])
1667: + #endif /* coff */
1668: void subsegs_begin();
1669: void subseg_change();
1670: void subseg_new();
1671: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./expr.c Thu Oct 11 18:26:21 1990
1672: --- ./expr.c Wed Nov 7 07:33:36 1990
1673: ***************
1674: *** 25,30 ****
1675: --- 25,31 ----
1676: */
1677:
1678: #include <ctype.h>
1679: + #include "oformat.h"
1680: #include "as.h"
1681: #include "flonum.h"
1682: #include "read.h"
1683: ***************
1684: *** 84,90 ****
1685: {
1686: register char c;
1687: register char *name; /* points to name of symbol */
1688: ! register struct symbol * symbolP; /* Points to symbol */
1689:
1690: extern char hex_value[]; /* In hex_value.c */
1691: char *local_label_name();
1692: --- 85,91 ----
1693: {
1694: register char c;
1695: register char *name; /* points to name of symbol */
1696: ! register symbolS * symbolP; /* Points to symbol */
1697:
1698: extern char hex_value[]; /* In hex_value.c */
1699: char *local_label_name();
1700: ***************
1701: *** 250,264 ****
1702: */
1703: name = local_label_name ((int)number, 0);
1704: if ( (symbolP = symbol_table_lookup(name)) /* seen before */
1705: ! && (symbolP -> sy_type & N_TYPE) != N_UNDF /* symbol is defined: OK */
1706: ! )
1707: { /* Expected path: symbol defined. */
1708: /* Local labels are never absolute. Don't waste time checking absoluteness. */
1709: ! know( (symbolP -> sy_type & N_TYPE) == N_DATA
1710: ! || (symbolP -> sy_type & N_TYPE) == N_TEXT );
1711: expressionP -> X_add_symbol = symbolP;
1712: expressionP -> X_add_number = 0;
1713: ! expressionP -> X_seg = N_TYPE_seg [symbolP -> sy_type];
1714: }
1715: else
1716: { /* Either not seen or not defined. */
1717: --- 251,263 ----
1718: */
1719: name = local_label_name ((int)number, 0);
1720: if ( (symbolP = symbol_table_lookup(name)) /* seen before */
1721: ! && (S_IS_DEFINED(symbolP)))
1722: { /* Expected path: symbol defined. */
1723: /* Local labels are never absolute. Don't waste time checking absoluteness. */
1724: ! know((S_IS_DATA(symbolP)) || S_IS_TEXT(symbolP));
1725: expressionP -> X_add_symbol = symbolP;
1726: expressionP -> X_add_number = 0;
1727: ! expressionP -> X_seg = SEG_seg(S_GET_SEGMENT(symbolP));
1728: }
1729: else
1730: { /* Either not seen or not defined. */
1731: ***************
1732: *** 289,301 ****
1733: if ( symbolP = symbol_table_lookup( name ))
1734: {
1735: /* We have no need to check symbol properties. */
1736: ! know( (symbolP -> sy_type & N_TYPE) == N_UNDF
1737: ! || (symbolP -> sy_type & N_TYPE) == N_DATA
1738: ! || (symbolP -> sy_type & N_TYPE) == N_TEXT);
1739: }
1740: else
1741: {
1742: ! symbolP = symbol_new (name, N_UNDF, 0,0,0, & zero_address_frag);
1743: symbol_table_insert (symbolP);
1744: }
1745: expressionP -> X_add_symbol = symbolP;
1746: --- 288,306 ----
1747: if ( symbolP = symbol_table_lookup( name ))
1748: {
1749: /* We have no need to check symbol properties. */
1750: ! know(!S_IS_DEFINED(symbolP) ||
1751: ! S_IS_DATA(symbolP) || S_IS_TEXT(symbolP));
1752: }
1753: else
1754: {
1755: ! #ifdef coff
1756: ! symbolP = symbol_new(name, SEG_UNKNOWN,
1757: ! 0, 0,
1758: ! &zero_address_frag);
1759: ! #else /* coff */
1760: ! symbolP = symbol_new (name, N_UNDF, 0,0,0,
1761: ! & zero_address_frag);
1762: ! #endif /* coff */
1763: symbol_table_insert (symbolP);
1764: }
1765: expressionP -> X_add_symbol = symbolP;
1766: ***************
1767: *** 358,369 ****
1768: JF: '.' is pseudo symbol with value of current location in current
1769: segment. . .
1770: */
1771: symbolP = symbol_new("L0\001",
1772: ! (unsigned char)(seg_N_TYPE[(int)now_seg]),
1773: 0,
1774: 0,
1775: (valueT)(obstack_next_free(&frags)-frag_now->fr_literal),
1776: frag_now);
1777: expressionP->X_add_number=0;
1778: expressionP->X_add_symbol=symbolP;
1779: expressionP->X_seg = now_seg;
1780: --- 363,379 ----
1781: JF: '.' is pseudo symbol with value of current location in current
1782: segment. . .
1783: */
1784: + #ifdef coff
1785: + symbolP = symbol_new("L0\001", now_seg, (valueT)(obstack_next_free(&frags)-
1786: + frag_now->fr_literal), 0, frag_now);
1787: + #else /* coff */
1788: symbolP = symbol_new("L0\001",
1789: ! (unsigned char)(seg_SEG((int)now_seg)),
1790: 0,
1791: 0,
1792: (valueT)(obstack_next_free(&frags)-frag_now->fr_literal),
1793: frag_now);
1794: + #endif /* coff */
1795: expressionP->X_add_number=0;
1796: expressionP->X_add_symbol=symbolP;
1797: expressionP->X_seg = now_seg;
1798: ***************
1799: *** 384,390 ****
1800: */
1801: register segT seg;
1802:
1803: ! seg = N_TYPE_seg [(int) symbolP -> sy_type & N_TYPE];
1804: if ((expressionP -> X_seg = seg) == SEG_ABSOLUTE )
1805: {
1806: expressionP -> X_add_number = symbolP -> sy_value;
1807: --- 394,400 ----
1808: */
1809: register segT seg;
1810:
1811: ! seg = SEG_seg((int)S_GET_SEGMENT(symbolP));
1812: if ((expressionP -> X_seg = seg) == SEG_ABSOLUTE )
1813: {
1814: expressionP -> X_add_number = symbolP -> sy_value;
1815: ***************
1816: *** 399,405 ****
1817: --- 409,419 ----
1818: {
1819: expressionP -> X_add_symbol
1820: = symbolP
1821: + #ifdef coff
1822: + = symbol_new (name, SEG_UNKNOWN, 0, 0, &zero_address_frag);
1823: + #else /* coff */
1824: = symbol_new (name, N_UNDF, 0,0,0, & zero_address_frag);
1825: + #endif /* coff */
1826:
1827: expressionP -> X_add_number = 0;
1828: expressionP -> X_seg = SEG_UNKNOWN;
1829: ***************
1830: *** 554,579 ****
1831:
1832: static segT
1833: expr_part (symbol_1_PP, symbol_2_P)
1834: ! struct symbol ** symbol_1_PP;
1835: ! struct symbol * symbol_2_P;
1836: {
1837: segT return_value;
1838:
1839: know( (* symbol_1_PP) == NULL
1840: ! || ((* symbol_1_PP) -> sy_type & N_TYPE) == N_TEXT
1841: ! || ((* symbol_1_PP) -> sy_type & N_TYPE) == N_DATA
1842: ! || ((* symbol_1_PP) -> sy_type & N_TYPE) == N_BSS
1843: ! || ((* symbol_1_PP) -> sy_type & N_TYPE) == N_UNDF
1844: );
1845: know( symbol_2_P == NULL
1846: ! || (symbol_2_P -> sy_type & N_TYPE) == N_TEXT
1847: ! || (symbol_2_P -> sy_type & N_TYPE) == N_DATA
1848: ! || (symbol_2_P -> sy_type & N_TYPE) == N_BSS
1849: ! || (symbol_2_P -> sy_type & N_TYPE) == N_UNDF
1850: );
1851: if (* symbol_1_PP)
1852: {
1853: ! if (((* symbol_1_PP) -> sy_type & N_TYPE) == N_UNDF)
1854: {
1855: if (symbol_2_P)
1856: {
1857: --- 568,593 ----
1858:
1859: static segT
1860: expr_part (symbol_1_PP, symbol_2_P)
1861: ! symbolS ** symbol_1_PP;
1862: ! symbolS * symbol_2_P;
1863: {
1864: segT return_value;
1865:
1866: know( (* symbol_1_PP) == NULL
1867: ! || (S_IS_TEXT(* symbol_1_PP))
1868: ! || (S_IS_DATA(* symbol_1_PP))
1869: ! || (S_IS_BSS(* symbol_1_PP))
1870: ! || (!S_IS_DEFINED(* symbol_1_PP))
1871: );
1872: know( symbol_2_P == NULL
1873: ! || (S_IS_TEXT(symbol_2_P))
1874: ! || (S_IS_DATA(symbol_2_P))
1875: ! || (S_IS_BSS(symbol_2_P))
1876: ! || (!S_IS_DEFINED(symbol_2_P))
1877: );
1878: if (* symbol_1_PP)
1879: {
1880: ! if (!S_IS_DEFINED(* symbol_1_PP))
1881: {
1882: if (symbol_2_P)
1883: {
1884: ***************
1885: *** 582,588 ****
1886: }
1887: else
1888: {
1889: ! know( ((* symbol_1_PP) -> sy_type & N_TYPE) == N_UNDF)
1890: return_value = SEG_UNKNOWN;
1891: }
1892: }
1893: --- 596,602 ----
1894: }
1895: else
1896: {
1897: ! know(!S_IS_DEFINED(* symbol_1_PP));
1898: return_value = SEG_UNKNOWN;
1899: }
1900: }
1901: ***************
1902: *** 590,596 ****
1903: {
1904: if (symbol_2_P)
1905: {
1906: ! if ((symbol_2_P -> sy_type & N_TYPE) == N_UNDF)
1907: {
1908: * symbol_1_PP = NULL;
1909: return_value = SEG_PASS1;
1910: --- 604,610 ----
1911: {
1912: if (symbol_2_P)
1913: {
1914: ! if (!S_IS_DEFINED(symbol_2_P))
1915: {
1916: * symbol_1_PP = NULL;
1917: return_value = SEG_PASS1;
1918: ***************
1919: *** 599,605 ****
1920: {
1921: /* {seg1} - {seg2} */
1922: as_warn( "Expression too complex, 2 symbols forgotten: \"%s\" \"%s\"",
1923: ! (* symbol_1_PP) -> sy_name, symbol_2_P -> sy_name );
1924: * symbol_1_PP = NULL;
1925: return_value = SEG_ABSOLUTE;
1926: }
1927: --- 613,619 ----
1928: {
1929: /* {seg1} - {seg2} */
1930: as_warn( "Expression too complex, 2 symbols forgotten: \"%s\" \"%s\"",
1931: ! S_GET_NAME(* symbol_1_PP), S_GET_NAME(symbol_2_P));
1932: * symbol_1_PP = NULL;
1933: return_value = SEG_ABSOLUTE;
1934: }
1935: ***************
1936: *** 606,612 ****
1937: }
1938: else
1939: {
1940: ! return_value = N_TYPE_seg [(* symbol_1_PP) -> sy_type & N_TYPE];
1941: }
1942: }
1943: }
1944: --- 620,626 ----
1945: }
1946: else
1947: {
1948: ! return_value = SEG_seg(S_GET_SEGMENT(* symbol_1_PP));
1949: }
1950: }
1951: }
1952: ***************
1953: *** 615,621 ****
1954: if (symbol_2_P)
1955: {
1956: * symbol_1_PP = symbol_2_P;
1957: ! return_value = N_TYPE_seg [(symbol_2_P) -> sy_type & N_TYPE];
1958: }
1959: else
1960: {
1961: --- 629,635 ----
1962: if (symbol_2_P)
1963: {
1964: * symbol_1_PP = symbol_2_P;
1965: ! return_value = SEG_seg(S_GET_SEGMENT(symbol_2_P));
1966: }
1967: else
1968: {
1969: ***************
1970: *** 631,637 ****
1971: || return_value == SEG_PASS1
1972: );
1973: know( (* symbol_1_PP) == NULL
1974: ! || ((* symbol_1_PP) -> sy_type & N_TYPE) == seg_N_TYPE [(int) return_value] );
1975: return (return_value);
1976: } /* expr_part() */
1977:
1978: --- 645,651 ----
1979: || return_value == SEG_PASS1
1980: );
1981: know( (* symbol_1_PP) == NULL
1982: ! || (S_GET_SEGMENT(* symbol_1_PP) == seg_SEG((int) return_value) ));
1983: return (return_value);
1984: } /* expr_part() */
1985:
1986: ***************
1987: *** 793,799 ****
1988: * does not cause any further inaccuracy.
1989: */
1990:
1991: ! register struct symbol * symbolP;
1992:
1993: right . X_add_number = - right . X_add_number;
1994: symbolP = right . X_add_symbol;
1995: --- 807,813 ----
1996: * does not cause any further inaccuracy.
1997: */
1998:
1999: ! register symbolS * symbolP;
2000:
2001: right . X_add_number = - right . X_add_number;
2002: symbolP = right . X_add_symbol;
2003: ***************
2004: *** 859,866 ****
2005: know( resultP -> X_add_symbol );
2006: know( resultP -> X_subtract_symbol );
2007: as_warn("Expression too complex: forgetting %s - %s",
2008: ! resultP -> X_add_symbol -> sy_name,
2009: ! resultP -> X_subtract_symbol -> sy_name);
2010: resultP -> X_seg = SEG_ABSOLUTE;
2011: /* Clean_up_expression() will do the rest. */
2012: }
2013: --- 873,880 ----
2014: know( resultP -> X_add_symbol );
2015: know( resultP -> X_subtract_symbol );
2016: as_warn("Expression too complex: forgetting %s - %s",
2017: ! S_GET_NAME(resultP -> X_add_symbol),
2018: ! S_GET_NAME(resultP -> X_subtract_symbol));
2019: resultP -> X_seg = SEG_ABSOLUTE;
2020: /* Clean_up_expression() will do the rest. */
2021: }
2022: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./flonum-const.c Thu Oct 11 18:26:21 1990
2023: --- ./flonum-const.c Wed Nov 7 07:33:37 1990
2024: ***************
2025: *** 134,140 ****
2026: {X minus_11, X minus_11+29, X minus_11 + 29,-242, '+'},
2027: };
2028:
2029: ! FLONUM_TYPE flonum_positive_powers_of_ten [] = {
2030: {X zero, X zero, X zero, 0, '+'},
2031: {X plus_1, X plus_1 + 0, X plus_1 + 0, 0, '+'},
2032: {X plus_2, X plus_2 + 0, X plus_2 + 0, 0, '+'},
2033: --- 134,140 ----
2034: {X minus_11, X minus_11+29, X minus_11 + 29,-242, '+'},
2035: };
2036:
2037: ! const FLONUM_TYPE flonum_positive_powers_of_ten [] = {
2038: {X zero, X zero, X zero, 0, '+'},
2039: {X plus_1, X plus_1 + 0, X plus_1 + 0, 0, '+'},
2040: {X plus_2, X plus_2 + 0, X plus_2 + 0, 0, '+'},
2041: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./frags.c Thu Aug 17 21:53:21 1989
2042: --- ./frags.c Wed Nov 7 07:33:37 1990
2043: ***************
2044: *** 17,22 ****
2045: --- 17,23 ----
2046: along with GAS; see the file COPYING. If not, write to
2047: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
2048:
2049: + #include "oformat.h"
2050: #include "as.h"
2051: #include "subsegs.h"
2052: #include "obstack.h"
2053: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./hash.c Thu Oct 18 18:43:36 1990
2054: --- ./hash.c Wed Nov 7 07:33:39 1990
2055: ***************
2056: *** 129,134 ****
2057: --- 129,137 ----
2058: #define min(a, b) ((a) < (b) ? (a) : (b))
2059:
2060: #include "hash.h"
2061: +
2062: + #define error as_fatal
2063: +
2064: char *xmalloc();
2065:
2066: #define DELETED ((char *)1) /* guarenteed invalid address */
2067: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./i386.c Mon Jul 9 20:49:54 1990
2068: --- ./i386.c Wed Nov 7 07:33:42 1990
2069: ***************
2070: *** 37,42 ****
2071: --- 37,43 ----
2072: #define index strchr
2073: #endif
2074:
2075: + #include "oformat.h"
2076: #include "as.h"
2077: #include "read.h"
2078: #include "flonum.h"
2079: ***************
2080: *** 117,123 ****
2081: #define SIZE_FROM_RELAX_STATE(s) \
2082: ( (((s) & 0x3) == BYTE ? 1 : (((s) & 0x3) == WORD ? 2 : 4)) )
2083:
2084: ! relax_typeS md_relax_table[] = {
2085: /*
2086: The fields are:
2087: 1) most positive reach of this state,
2088: --- 118,124 ----
2089: #define SIZE_FROM_RELAX_STATE(s) \
2090: ( (((s) & 0x3) == BYTE ? 1 : (((s) & 0x3) == WORD ? 2 : 4)) )
2091:
2092: ! const relax_typeS md_relax_table[] = {
2093: /*
2094: The fields are:
2095: 1) most positive reach of this state,
2096: ***************
2097: *** 162,177 ****
2098: input_line_pointer++;
2099: }
2100:
2101: ! pseudo_typeS md_pseudo_table[] = {
2102: { "ffloat", float_cons, 'f' },
2103: { "dfloat", float_cons, 'd' },
2104: { "tfloat", float_cons, 'x' },
2105: { "value", cons, 2 },
2106: { "ident", dummy, 0 }, /* ignore these directives */
2107: { "def", dummy, 0 },
2108: { "optim", dummy, 0 }, /* For sun386i cc */
2109: { "version", dummy, 0 },
2110: { "ln", dummy, 0 },
2111: { 0, 0, 0 }
2112: };
2113:
2114: --- 163,182 ----
2115: input_line_pointer++;
2116: }
2117:
2118: ! const pseudo_typeS md_pseudo_table[] = {
2119: { "ffloat", float_cons, 'f' },
2120: { "dfloat", float_cons, 'd' },
2121: { "tfloat", float_cons, 'x' },
2122: { "value", cons, 2 },
2123: { "ident", dummy, 0 }, /* ignore these directives */
2124: + #ifdef aout
2125: { "def", dummy, 0 },
2126: + #endif /* aout */
2127: { "optim", dummy, 0 }, /* For sun386i cc */
2128: { "version", dummy, 0 },
2129: + #ifdef aout
2130: { "ln", dummy, 0 },
2131: + #endif /* aout */
2132: { 0, 0, 0 }
2133: };
2134:
2135: ***************
2136: *** 373,392 ****
2137: }
2138: }
2139:
2140: ! #define SYMBOL_TYPE(t) \
2141: ! (((t&N_TYPE) == N_UNDF) ? "UNDEFINED" : \
2142: ! (((t&N_TYPE) == N_ABS) ? "ABSOLUTE" : \
2143: ! (((t&N_TYPE) == N_TEXT) ? "TEXT" : \
2144: ! (((t&N_TYPE) == N_DATA) ? "DATA" : \
2145: ! (((t&N_TYPE) == N_BSS) ? "BSS" : "Bad n_type!")))))
2146:
2147: static void ps (s)
2148: symbolS *s;
2149: {
2150: fprintf (stdout, "%s type %s%s",
2151: ! s->sy_nlist.n_un.n_name,
2152: ! (s->sy_nlist.n_type&N_EXT) ? "EXTERNAL " : "",
2153: ! SYMBOL_TYPE (s->sy_nlist.n_type));
2154: }
2155:
2156: struct type_name {
2157: --- 378,392 ----
2158: }
2159: }
2160:
2161: ! #define SYMBOL_TYPE(t) segment_name(SEG_seg(t))
2162:
2163: static void ps (s)
2164: symbolS *s;
2165: {
2166: fprintf (stdout, "%s type %s%s",
2167: ! S_GET_NAME(s),
2168: ! S_IS_EXTERNAL(s) ? "EXTERNAL " : "",
2169: ! SYMBOL_TYPE(S_GET_SEGMENT(s))
2170: }
2171:
2172: struct type_name {
2173: ***************
2174: *** 1546,1552 ****
2175: int
2176: md_estimate_size_before_relax (fragP, segment_type)
2177: register fragS * fragP;
2178: ! register int segment_type; /* N_DATA or N_TEXT. */
2179: {
2180: register uchar * opcode;
2181: register int old_fr_fix;
2182: --- 1546,1552 ----
2183: int
2184: md_estimate_size_before_relax (fragP, segment_type)
2185: register fragS * fragP;
2186: ! register int segment_type; /* DATA or TEXT. */
2187: {
2188: register uchar * opcode;
2189: register int old_fr_fix;
2190: ***************
2191: *** 1555,1561 ****
2192: opcode = (uchar *) fragP -> fr_opcode;
2193: /* We've already got fragP->fr_subtype right; all we have to do is check
2194: for un-relaxable symbols. */
2195: ! if ((fragP -> fr_symbol -> sy_type & N_TYPE) != segment_type) {
2196: /* symbol is undefined in this segment */
2197: switch (opcode[0]) {
2198: case JUMP_PC_RELATIVE: /* make jmp (0xeb) a dword displacement jump */
2199: --- 1555,1561 ----
2200: opcode = (uchar *) fragP -> fr_opcode;
2201: /* We've already got fragP->fr_subtype right; all we have to do is check
2202: for un-relaxable symbols. */
2203: ! if (S_GET_SEGMENT(fragP->fr_symbol) != segment_type) {
2204: /* symbol is undefined in this segment */
2205: switch (opcode[0]) {
2206: case JUMP_PC_RELATIVE: /* make jmp (0xeb) a dword displacement jump */
2207: ***************
2208: *** 1608,1614 ****
2209: opcode = (uchar *) fragP -> fr_opcode;
2210:
2211: /* Address we want to reach in file space. */
2212: ! target_address = fragP->fr_symbol->sy_value + fragP->fr_offset;
2213:
2214: /* Address opcode resides at in file space. */
2215: opcode_address = fragP->fr_address + fragP->fr_fix;
2216: --- 1608,1614 ----
2217: opcode = (uchar *) fragP -> fr_opcode;
2218:
2219: /* Address we want to reach in file space. */
2220: ! target_address = S_GET_VALUE(fragP->fr_symbol) + fragP->fr_offset;
2221:
2222: /* Address opcode resides at in file space. */
2223: opcode_address = fragP->fr_address + fragP->fr_fix;
2224: ***************
2225: *** 1687,1693 ****
2226: long offset;
2227:
2228: if (flagseen['m']) {
2229: ! offset = to_addr - to_symbol->sy_value;
2230: md_number_to_chars (ptr, 0xe9, 1); /* opcode for long jmp */
2231: md_number_to_chars (ptr + 1, offset, 4);
2232: fix_new (frag, (ptr+1) - frag->fr_literal, 4,
2233: --- 1687,1693 ----
2234: long offset;
2235:
2236: if (flagseen['m']) {
2237: ! offset = to_addr - S_GET_VALUE(to_symbol);
2238: md_number_to_chars (ptr, 0xe9, 1); /* opcode for long jmp */
2239: md_number_to_chars (ptr + 1, offset, 4);
2240: fix_new (frag, (ptr+1) - frag->fr_literal, 4,
2241: ***************
2242: *** 1836,1841 ****
2243: --- 1836,1844 ----
2244: return retval;
2245: }
2246:
2247: + /* Not needed for coff since relocation structure does not
2248: + contain bitfields. */
2249: + #ifdef aout
2250: void md_ri_to_chars(ri_p, ri)
2251: struct relocation_info *ri_p, ri;
2252: {
2253: ***************
2254: *** 1852,1857 ****
2255: --- 1855,1861 ----
2256: /* now put it back where you found it */
2257: bcopy (the_bytes, (char *)ri_p, sizeof(struct relocation_info));
2258: }
2259: + #endif /* aout */
2260:
2261:
2262: #define MAX_LITTLENUMS 6
2263: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./m-sun3.h Wed Mar 1 23:49:04 1989
2264: --- ./m-sun3.h Wed Nov 7 07:33:43 1990
2265: ***************
2266: *** 29,31 ****
2267: --- 29,41 ----
2268:
2269: #define M_SUN 1
2270: #define SUN_ASM_SYNTAX
2271: +
2272: + /* Return true if s (a non null string pointer), points to a local variable
2273: + name. */
2274: + #define S_LOCAL_NAME(s) (S_GET_NAME(s)[0] == 'L')
2275: +
2276: + /* Could also be :
2277: + #define S_LOCAL_NAME(s) (S_GET_NAME(s)[0] == '.' &&
2278: + S_GET_NAME(s)[1] == 'L' ||
2279: + S_GET_NAME(s)[1] == '.')
2280: + */
2281: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./m68k.c Tue Oct 16 16:38:51 1990
2282: --- ./m68k.c Wed Nov 7 07:33:46 1990
2283: ***************
2284: *** 21,26 ****
2285: --- 21,27 ----
2286: #include <ctype.h>
2287:
2288: #include "m68k-opcode.h"
2289: + #include "oformat.h"
2290: #include "as.h"
2291: #include "obstack.h"
2292: #include "frags.h"
2293: ***************
2294: *** 2738,2744 ****
2295: know(fragP->fr_symbol);
2296:
2297: /* The displacement of the address, from current location. */
2298: ! disp = (fragP->fr_symbol->sy_value + fragP->fr_offset) - object_address;
2299:
2300: switch(fragP->fr_subtype) {
2301: case TAB(BCC68000,BYTE):
2302: --- 2739,2745 ----
2303: know(fragP->fr_symbol);
2304:
2305: /* The displacement of the address, from current location. */
2306: ! disp = (S_GET_VALUE(fragP->fr_symbol) + fragP->fr_offset) - object_address;
2307:
2308: switch(fragP->fr_subtype) {
2309: case TAB(BCC68000,BYTE):
2310: ***************
2311: *** 2887,2893 ****
2312: /* handle SZ_UNDEF first, it can be changed to BYTE or SHORT */
2313: switch(fragP->fr_subtype) {
2314: case TAB(BRANCH,SZ_UNDEF):
2315: ! if((fragP->fr_symbol->sy_type&N_TYPE)==segtype) {
2316: fragP->fr_subtype=TAB(TABTYPE(fragP->fr_subtype),BYTE);
2317: break;
2318: } else if(flagseen['m']) {
2319: --- 2888,2894 ----
2320: /* handle SZ_UNDEF first, it can be changed to BYTE or SHORT */
2321: switch(fragP->fr_subtype) {
2322: case TAB(BRANCH,SZ_UNDEF):
2323: ! if(S_GET_SEGMENT(fragP->fr_symbol)==segtype) {
2324: fragP->fr_subtype=TAB(TABTYPE(fragP->fr_subtype),BYTE);
2325: break;
2326: } else if(flagseen['m']) {
2327: ***************
2328: *** 2945,2951 ****
2329: break;
2330:
2331: case TAB(FBRANCH,SZ_UNDEF):
2332: ! if((fragP->fr_symbol->sy_type&N_TYPE)==segtype || flagseen['l']) {
2333: fragP->fr_subtype=TAB(FBRANCH,SHORT);
2334: fragP->fr_var+=2;
2335: } else {
2336: --- 2946,2952 ----
2337: break;
2338:
2339: case TAB(FBRANCH,SZ_UNDEF):
2340: ! if(S_GET_SEGMENT(fragP->fr_symbol)==segtype || flagseen['l']) {
2341: fragP->fr_subtype=TAB(FBRANCH,SHORT);
2342: fragP->fr_var+=2;
2343: } else {
2344: ***************
2345: *** 2955,2961 ****
2346: break;
2347:
2348: case TAB(PCREL,SZ_UNDEF):
2349: ! if((fragP->fr_symbol->sy_type&N_TYPE)==segtype || flagseen['l']) {
2350: fragP->fr_subtype=TAB(PCREL,SHORT);
2351: fragP->fr_var+=2;
2352: } else {
2353: --- 2956,2962 ----
2354: break;
2355:
2356: case TAB(PCREL,SZ_UNDEF):
2357: ! if(S_GET_SEGMENT(fragP->fr_symbol)==segtype || flagseen['l']) {
2358: fragP->fr_subtype=TAB(PCREL,SHORT);
2359: fragP->fr_var+=2;
2360: } else {
2361: ***************
2362: *** 2965,2971 ****
2363: break;
2364:
2365: case TAB(BCC68000,SZ_UNDEF):
2366: ! if((fragP->fr_symbol->sy_type&N_TYPE)==segtype) {
2367: fragP->fr_subtype=TAB(BCC68000,BYTE);
2368: break;
2369: }
2370: --- 2966,2972 ----
2371: break;
2372:
2373: case TAB(BCC68000,SZ_UNDEF):
2374: ! if(S_GET_SEGMENT(fragP->fr_symbol)==segtype) {
2375: fragP->fr_subtype=TAB(BCC68000,BYTE);
2376: break;
2377: }
2378: ***************
2379: *** 2997,3003 ****
2380: break;
2381:
2382: case TAB(DBCC,SZ_UNDEF):
2383: ! if((fragP->fr_symbol->sy_type&N_TYPE)==segtype) {
2384: fragP->fr_subtype=TAB(DBCC,SHORT);
2385: fragP->fr_var+=2;
2386: break;
2387: --- 2998,3004 ----
2388: break;
2389:
2390: case TAB(DBCC,SZ_UNDEF):
2391: ! if(S_GET_SEGMENT(fragP->fr_symbol)==segtype) {
2392: fragP->fr_subtype=TAB(DBCC,SHORT);
2393: fragP->fr_var+=2;
2394: break;
2395: ***************
2396: *** 3033,3039 ****
2397: break;
2398:
2399: case TAB(PCLEA,SZ_UNDEF):
2400: ! if((fragP->fr_symbol->sy_type&N_TYPE)==segtype || flagseen['l']) {
2401: fragP->fr_subtype=TAB(PCLEA,SHORT);
2402: fragP->fr_var+=2;
2403: } else {
2404: --- 3034,3040 ----
2405: break;
2406:
2407: case TAB(PCLEA,SZ_UNDEF):
2408: ! if(S_GET_SEGMENT(fragP->fr_symbol)==segtype || flagseen['l']) {
2409: fragP->fr_subtype=TAB(PCLEA,SHORT);
2410: fragP->fr_var+=2;
2411: } else {
2412: ***************
2413: *** 3052,3058 ****
2414: case TAB(BRANCH,BYTE):
2415: /* We can't do a short jump to the next instruction,
2416: so we force word mode. */
2417: ! if(fragP->fr_symbol && fragP->fr_symbol->sy_value==0 &&
2418: fragP->fr_symbol->sy_frag==fragP->fr_next) {
2419: fragP->fr_subtype=TAB(TABTYPE(fragP->fr_subtype),SHORT);
2420: fragP->fr_var+=2;
2421: --- 3053,3059 ----
2422: case TAB(BRANCH,BYTE):
2423: /* We can't do a short jump to the next instruction,
2424: so we force word mode. */
2425: ! if(fragP->fr_symbol && S_GET_VALUE(fragP->fr_symbol)==0 &&
2426: fragP->fr_symbol->sy_frag==fragP->fr_next) {
2427: fragP->fr_subtype=TAB(TABTYPE(fragP->fr_subtype),SHORT);
2428: fragP->fr_var+=2;
2429: ***************
2430: *** 3064,3069 ****
2431: --- 3065,3071 ----
2432: return fragP->fr_var + fragP->fr_fix - old_fix;
2433: }
2434:
2435: + #ifdef aout
2436: /* the bit-field entries in the relocation_info struct plays hell
2437: with the byte-order problems of cross-assembly. So as a hack,
2438: I added this mach. dependent ri twiddler. Ugly, but it gets
2439: ***************
2440: *** 3089,3094 ****
2441: --- 3091,3097 ----
2442: /* now put it back where you found it */
2443: bcopy (the_bytes, (char *)ri_p, sizeof(struct relocation_info));
2444: }
2445: + #endif /* aout */
2446:
2447: #ifndef WORKING_DOT_WORD
2448: const int md_short_jump_size = 4;
2449: ***************
2450: *** 3121,3127 ****
2451: long offset;
2452:
2453: if(flagseen['m']) {
2454: ! offset=to_addr-to_symbol->sy_value;
2455: md_number_to_chars(ptr ,(long)0x4EF9,2);
2456: md_number_to_chars(ptr+2,(long)offset,4);
2457: fix_new(frag,(ptr+2)-frag->fr_literal,4,to_symbol,(symbolS *)0,(long int)0,0);
2458: --- 3124,3130 ----
2459: long offset;
2460:
2461: if(flagseen['m']) {
2462: ! offset=to_addr-S_GET_VALUE(to_symbol);
2463: md_number_to_chars(ptr ,(long)0x4EF9,2);
2464: md_number_to_chars(ptr+2,(long)offset,4);
2465: fix_new(frag,(ptr+2)-frag->fr_literal,4,to_symbol,(symbolS *)0,(long int)0,0);
2466: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./read.c Thu Oct 18 22:01:12 1990
2467: --- ./read.c Wed Nov 7 07:33:51 1990
2468: ***************
2469: *** 35,40 ****
2470: --- 35,41 ----
2471: #include <ctype.h>
2472: #include <sys/types.h>
2473: #include <sys/stat.h>
2474: + #include "oformat.h"
2475: #include "as.h"
2476: #include "read.h"
2477: #include "md.h"
2478: ***************
2479: *** 119,125 ****
2480: --- 120,131 ----
2481: static int is_it_end_of_statement();
2482: static void pobegin();
2483: static void pseudo_set();
2484: + #ifdef coff
2485: + static void def();
2486: + static void line();
2487: + #else /* coff */
2488: static void stab();
2489: + #endif /* coff */
2490: static void stringer();
2491:
2492: extern char line_comment_chars[];
2493: ***************
2494: *** 135,140 ****
2495: --- 141,153 ----
2496: static char *old_input;
2497: static char *old_limit;
2498:
2499: + #ifdef coff
2500: + static struct hash_control* tag_hash;
2501: + static void tag_init();
2502: + static void tag_insert();
2503: + static symbolS* tag_find();
2504: + #endif /* coff */
2505: +
2506: #ifndef WORKING_DOT_WORD
2507: struct broken_word *broken_words;
2508: int new_broken_words = 0;
2509: ***************
2510: *** 147,152 ****
2511: --- 160,168 ----
2512: read_begin()
2513: {
2514: pobegin();
2515: + #ifdef coff
2516: + tag_init();
2517: + #endif /* coff */
2518: obstack_begin( ¬es, 5000 );
2519: #define BIGNUM_BEGIN_SIZE (16)
2520: bignum_low = xmalloc((long)BIGNUM_BEGIN_SIZE);
2521: ***************
2522: *** 159,166 ****
2523: po_hash = NULL; /* use before set up: NULL-> address error */
2524:
2525:
2526: void s_abort(), s_align(), s_comm(), s_data();
2527: ! void s_desc(), s_even(), s_file(), s_fill();
2528: void s_globl(), s_lcomm(), s_line(), s_lsym();
2529: void s_org(), s_set(), s_space(), s_text();
2530: #ifdef VMS
2531: --- 175,185 ----
2532: po_hash = NULL; /* use before set up: NULL-> address error */
2533:
2534:
2535: + #ifdef aout
2536: + void s_desc();
2537: + #endif /* aout */
2538: void s_abort(), s_align(), s_comm(), s_data();
2539: ! void s_even(), s_file(), s_fill();
2540: void s_globl(), s_lcomm(), s_line(), s_lsym();
2541: void s_org(), s_set(), s_space(), s_text();
2542: #ifdef VMS
2543: ***************
2544: *** 192,198 ****
2545: --- 211,219 ----
2546: { "const", s_const, 0 },
2547: #endif
2548: { "data", s_data, 0 },
2549: + #ifdef aout
2550: { "desc", s_desc, 0 },
2551: + #endif /* aout */
2552: { "double", float_cons, 'd' },
2553: { "file", s_file, 0 },
2554: { "fill", s_fill, 0 },
2555: ***************
2556: *** 218,226 ****
2557: --- 239,252 ----
2558: { "short", cons, 2 },
2559: { "single", float_cons, 'f' },
2560: { "space", s_space, 0 },
2561: + #ifdef coff
2562: + { "def", def, 0 },
2563: + { "ln", line, 0 },
2564: + #else /* coff */
2565: { "stabd", stab, 'd' },
2566: { "stabn", stab, 'n' },
2567: { "stabs", stab, 's' },
2568: + #endif /* coff */
2569: { "text", s_text, 0 },
2570: #ifndef SPARC
2571: { "word", cons, 2 },
2572: ***************
2573: *** 622,640 ****
2574: *p = 0;
2575: symbolP = symbol_find_or_make (name);
2576: *p = c;
2577: ! if ( (symbolP -> sy_type & N_TYPE) != N_UNDF ||
2578: ! symbolP -> sy_other != 0 || symbolP -> sy_desc != 0) {
2579: as_warn( "Ignoring attempt to re-define symbol");
2580: ignore_rest_of_line();
2581: return;
2582: }
2583: ! if (symbolP -> sy_value) {
2584: ! if (symbolP -> sy_value != temp)
2585: as_warn( "Length of .comm \"%s\" is already %d. Not changed to %d.",
2586: ! symbolP -> sy_name, symbolP -> sy_value, temp);
2587: } else {
2588: ! symbolP -> sy_value = temp;
2589: ! symbolP -> sy_type |= N_EXT;
2590: }
2591: #ifdef VMS
2592: if(!temp)
2593: --- 648,671 ----
2594: *p = 0;
2595: symbolP = symbol_find_or_make (name);
2596: *p = c;
2597: ! if (S_IS_DEFINED(symbolP)
2598: ! #ifdef aout
2599: ! || S_GET_OTHER(symbolP) != 0 || S_GET_DESC(symbolP) != 0
2600: ! #endif /* aout */
2601: ! ) {
2602: as_warn( "Ignoring attempt to re-define symbol");
2603: ignore_rest_of_line();
2604: return;
2605: }
2606: ! if (S_GET_VALUE(symbolP)) {
2607: ! if (S_GET_VALUE(symbolP) != temp)
2608: as_warn( "Length of .comm \"%s\" is already %d. Not changed to %d.",
2609: ! S_GET_NAME(symbolP),
2610: ! S_GET_VALUE(symbolP),
2611: ! temp);
2612: } else {
2613: ! S_SET_VALUE(symbolP, temp);
2614: ! S_SET_EXTERNAL(symbolP);
2615: }
2616: #ifdef VMS
2617: if(!temp)
2618: ***************
2619: *** 670,675 ****
2620: --- 701,707 ----
2621: demand_empty_rest_of_line();
2622: }
2623:
2624: + #ifdef aout
2625: void
2626: s_desc()
2627: {
2628: ***************
2629: *** 699,720 ****
2630: *p = 0;
2631: symbolP = symbol_find_or_make (name);
2632: *p = c;
2633: ! symbolP -> sy_desc = temp;
2634: }
2635: demand_empty_rest_of_line();
2636: }
2637:
2638: void
2639: s_file()
2640: {
2641: ! register char *s;
2642: ! int length;
2643: !
2644: ! /* Some assemblers tolerate immediately following '"' */
2645: ! if ( s = demand_copy_string( & length ) ) {
2646: ! new_logical_line (s, -1);
2647: ! demand_empty_rest_of_line();
2648: ! }
2649: }
2650:
2651: void
2652: --- 731,756 ----
2653: *p = 0;
2654: symbolP = symbol_find_or_make (name);
2655: *p = c;
2656: ! S_SET_DESC(symbolP,temp);
2657: }
2658: demand_empty_rest_of_line();
2659: }
2660: + #endif /* aout */
2661:
2662: void
2663: s_file()
2664: {
2665: ! register char *s;
2666: ! int length;
2667: !
2668: ! /* Some assemblers tolerate immediately following '"' */
2669: ! if ( s = demand_copy_string( & length ) ) {
2670: ! new_logical_line (s, -1);
2671: ! demand_empty_rest_of_line();
2672: ! }
2673: ! #ifdef coff
2674: ! c_dot_file_symbol(s);
2675: ! #endif /* coff */
2676: }
2677:
2678: void
2679: ***************
2680: *** 897,903 ****
2681: symbolP = symbol_find_or_make (name);
2682: * input_line_pointer = c;
2683: SKIP_WHITESPACE();
2684: ! symbolP -> sy_type |= N_EXT;
2685: if(c==',') {
2686: input_line_pointer++;
2687: SKIP_WHITESPACE();
2688: --- 933,939 ----
2689: symbolP = symbol_find_or_make (name);
2690: * input_line_pointer = c;
2691: SKIP_WHITESPACE();
2692: ! S_SET_EXTERNAL(symbolP);
2693: if(c==',') {
2694: input_line_pointer++;
2695: SKIP_WHITESPACE();
2696: ***************
2697: *** 936,954 ****
2698: *p = 0;
2699: symbolP = symbol_find_or_make (name);
2700: *p = c;
2701: ! if ( symbolP -> sy_other == 0
2702: ! && symbolP -> sy_desc == 0
2703: ! && ( ( symbolP -> sy_type == N_BSS
2704: ! && symbolP -> sy_value == local_bss_counter)
2705: ! || ( (symbolP -> sy_type & N_TYPE) == N_UNDF
2706: ! && symbolP -> sy_value == 0))) {
2707: ! symbolP -> sy_value = local_bss_counter;
2708: ! symbolP -> sy_type = N_BSS;
2709: symbolP -> sy_frag = & bss_address_frag;
2710: local_bss_counter += temp;
2711: } else
2712: as_warn( "Ignoring attempt to re-define symbol from %d. to %d.",
2713: ! symbolP -> sy_value, local_bss_counter );
2714: demand_empty_rest_of_line();
2715: }
2716:
2717: --- 972,998 ----
2718: *p = 0;
2719: symbolP = symbol_find_or_make (name);
2720: *p = c;
2721: ! if (
2722: ! #ifdef aout
2723: ! S_GET_OTHER(symbolP) == 0 &&
2724: ! S_GET_DESC(symbolP) == 0 &&
2725: ! #endif /* aout */
2726: ! (S_IS_BSS(symbolP) && S_GET_VALUE(symbolP) == local_bss_counter)
2727: ! /* What S_GET_VALUE(symbolP) == 0 is supposed to mean (in aout case) ?
2728: ! In the coff case it clearly does not mean anything (the only case
2729: ! where a symbol is not defined is from an external declaration (extern a)
2730: ! and this kind of symbol have a 0 value. */
2731: ! || (!S_IS_DEFINED(symbolP) && S_GET_VALUE(symbolP) == 0)) {
2732: ! S_SET_VALUE(symbolP,local_bss_counter);
2733: ! S_SET_BSS(symbolP);
2734: ! #ifdef coff
2735: ! S_SET_STORAGE_CLASS(symbolP, C_STAT);
2736: ! #endif /* coff */
2737: symbolP -> sy_frag = & bss_address_frag;
2738: local_bss_counter += temp;
2739: } else
2740: as_warn( "Ignoring attempt to re-define symbol from %d. to %d.",
2741: ! S_GET_VALUE(symbolP), local_bss_counter );
2742: demand_empty_rest_of_line();
2743: }
2744:
2745: ***************
2746: *** 1001,1014 ****
2747: segment = expression (& exp);
2748: if ( segment != SEG_ABSOLUTE && segment != SEG_DATA &&
2749: segment != SEG_TEXT && segment != SEG_BSS) {
2750: ! as_warn("Bad expression: %s", seg_name [(int)segment]);
2751: ignore_rest_of_line();
2752: return;
2753: }
2754: know( segment == SEG_ABSOLUTE || segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS );
2755: *p = 0;
2756: ! symbolP = symbol_new (name,(unsigned char)(seg_N_TYPE [(int) segment]),
2757: 0, 0, (valueT)(exp . X_add_number), & zero_address_frag);
2758: *p = c;
2759: demand_empty_rest_of_line();
2760: }
2761: --- 1045,1063 ----
2762: segment = expression (& exp);
2763: if ( segment != SEG_ABSOLUTE && segment != SEG_DATA &&
2764: segment != SEG_TEXT && segment != SEG_BSS) {
2765: ! as_warn("Bad expression: %s", segment_name((int)segment));
2766: ignore_rest_of_line();
2767: return;
2768: }
2769: know( segment == SEG_ABSOLUTE || segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS );
2770: *p = 0;
2771: ! #ifdef coff
2772: ! symbolP = symbol_new(name, segment, (valueT)(exp . X_add_number),
2773: ! 0, &zero_address_frag);
2774: ! #else /* coff */
2775: ! symbolP = symbol_new (name,(unsigned char)(seg_SEG((int) segment)),
2776: 0, 0, (valueT)(exp . X_add_number), & zero_address_frag);
2777: + #endif /* coff */
2778: *p = c;
2779: demand_empty_rest_of_line();
2780: }
2781: ***************
2782: *** 1044,1050 ****
2783: if ( ! need_pass_2 ) {
2784: if (segment != now_seg && segment != SEG_ABSOLUTE)
2785: as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.",
2786: ! seg_name [(int) segment], seg_name [(int) now_seg]);
2787: p = frag_var (rs_org, 1, 1, (relax_substateT)0, exp . X_add_symbol,
2788: exp . X_add_number, (char *)0);
2789: * p = temp_fill;
2790: --- 1093,1099 ----
2791: if ( ! need_pass_2 ) {
2792: if (segment != now_seg && segment != SEG_ABSOLUTE)
2793: as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.",
2794: ! segment_name((int) segment), segment_name((int) now_seg));
2795: p = frag_var (rs_org, 1, 1, (relax_substateT)0, exp . X_add_symbol,
2796: exp . X_add_number, (char *)0);
2797: * p = temp_fill;
2798: ***************
2799: *** 1089,1095 ****
2800: if ( ! need_pass_2 ) {
2801: if (segment != now_seg && segment != SEG_ABSOLUTE)
2802: as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.",
2803: ! seg_name [(int) segment], seg_name [(int) now_seg]);
2804: ptr = frag_var (rs_org, 1, 1, (relax_substateT)0, exp.X_add_symbol,
2805: exp.X_add_number, (char *)0);
2806: *ptr= 0;
2807: --- 1138,1145 ----
2808: if ( ! need_pass_2 ) {
2809: if (segment != now_seg && segment != SEG_ABSOLUTE)
2810: as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.",
2811: ! segment_name((int) segment),
2812: ! segment_name((int) now_seg));
2813: ptr = frag_var (rs_org, 1, 1, (relax_substateT)0, exp.X_add_symbol,
2814: exp.X_add_number, (char *)0);
2815: *ptr= 0;
2816: ***************
2817: *** 1176,1181 ****
2818: --- 1226,1546 ----
2819: know( is_end_of_line [input_line_pointer [-1]] );
2820: }
2821:
2822: + #ifdef coff
2823: + /*
2824: + * Handle .ln directives.
2825: + */
2826: +
2827: + static void
2828: + line(what)
2829: + int what;
2830: + {
2831: + c_line_new(obstack_next_free(&frags) - frag_now->fr_literal,
2832: + get_absolute_expression(),
2833: + frag_now);
2834: + demand_empty_rest_of_line();
2835: +
2836: + return;
2837: + }
2838: + /*
2839: + * def()
2840: + *
2841: + * Handle .def directives.
2842: + *
2843: + * One would say : why can't we symbol_new if the symbol does not
2844: + * allready exists and fill it with debug information. Because of
2845: + * the C_EFCN special symbol. It would clobber the value of the
2846: + * function symbol before we have a chance to notice that it is
2847: + * a C_EFCN. And a second reason is that the code is more clear this
2848: + * way. (at least I think it is:-).
2849: + *
2850: + */
2851: +
2852: + #define SKIP_SEMI_COLON() while(*input_line_pointer++ != ';')
2853: + #define SKIP_WHITESPACES() while(*input_line_pointer == ' ' || \
2854: + *input_line_pointer == '\t') \
2855: + input_line_pointer++;
2856: +
2857: + #define NEXT_DEF_DIRECTIVE() SKIP_SEMI_COLON(); SKIP_WHITESPACES()
2858: + #define equal !strcmp
2859: + #define MAX_DIRECTIVE 20
2860: +
2861: + static void
2862: + def(what)
2863: + int what;
2864: + {
2865: + char name_end; /* Char after the end of name */
2866: + symbolS* symbolP; /* Debug symbol just created */
2867: + symbolS symbol; /* Temporary symbol to hold .def */
2868: + char* symbol_name; /* Name of the debug symbol */
2869: + char* symbol_name_copy; /* Temporary copy of the name */
2870: + unsigned int symbol_name_length; /* */
2871: + char* directiveP; /* Name of the pseudo opcode */
2872: + char directive[MAX_DIRECTIVE]; /* Backup of the directive */
2873: + char end = 0; /* If 1, stop parsing */
2874: +
2875: + SKIP_WHITESPACES();
2876: +
2877: + symbolP = &symbol;
2878: + memset((char*)symbolP, '\0', sizeof(symbolS));
2879: +
2880: + symbol_name = input_line_pointer;
2881: + name_end = get_symbol_end();
2882: + symbol_name_length = strlen(symbol_name);
2883: + symbol_name_copy = xmalloc(symbol_name_length + 1);
2884: + strcpy(symbol_name_copy, symbol_name);
2885: +
2886: + /* Initialize the new symbol */
2887: + #if STRIP_UNDERSCORE
2888: + S_SET_NAME(symbolP, *symbol_name_copy == '_' ? symbol_name_copy + 1 :
2889: + symbol_name_copy);
2890: + #else /* STRIP_UNDERSCORE */
2891: + S_SET_NAME(symbolP, symbol_name_copy);
2892: + #endif /* STRIP_UNDERSCORE */
2893: + symbolP->sy_name_offset = ~0;
2894: + symbolP->sy_number = ~0;
2895: + symbolP->sy_frag = &zero_address_frag;
2896: + if(S_IS_STRING(symbolP))
2897: + SF_SET_STRING(symbolP);
2898: +
2899: + *input_line_pointer = name_end;
2900: +
2901: + while(!end) {
2902: + NEXT_DEF_DIRECTIVE();
2903: + directiveP = input_line_pointer;
2904: + name_end = get_symbol_end();
2905: + strncpy(directive, directiveP, MAX_DIRECTIVE);
2906: + *input_line_pointer = name_end;
2907: + SKIP_WHITESPACES();
2908: + switch(directive[1]) {
2909: + case 'd':
2910: + if(equal(directive, ".dim")) {
2911: + register int dim_index;
2912: + register int dimension;
2913: +
2914: + S_SET_NUMBER_AUXILIARY(symbolP, 1);
2915: + for(dim_index = 0; dim_index < DIMNUM; dim_index++) {
2916: + SKIP_WHITESPACES();
2917: + SA_SET_SYM_DIMEN(symbolP, dim_index,
2918: + get_absolute_expression());
2919: + switch(*input_line_pointer) {
2920: + case ',':
2921: + input_line_pointer++;
2922: + break;
2923: + default:
2924: + as_warn("badly formed .dim directive");
2925: + case ';':
2926: + dim_index = DIMNUM;
2927: + break;
2928: + }
2929: + }
2930: + } else
2931: + as_warn("unknown debug directive : %s", directive);
2932: + break;
2933: + case 'e':
2934: + if(equal(directive, ".endef"))
2935: + end = 1;
2936: + else
2937: + as_warn("unknown debug directive : %s", directive);
2938: + break;
2939: + case 'l':
2940: + if(equal(directive, ".line")) {
2941: + S_SET_NUMBER_AUXILIARY(symbolP, 1);
2942: + SA_SET_SYM_LNNO(symbolP, get_absolute_expression());
2943: + } else
2944: + as_warn("unknown debug directive : %s", directive);
2945: + break;
2946: + case 's':
2947: + if(equal(directive, ".size")) {
2948: + S_SET_NUMBER_AUXILIARY(symbolP, 1);
2949: + SA_SET_SYM_SIZE(symbolP, get_absolute_expression());
2950: + } else if(equal(directive, ".scl"))
2951: + S_SET_STORAGE_CLASS(symbolP, get_absolute_expression());
2952: + else
2953: + as_warn("unknown debug directive : %s", directive);
2954: + break;
2955: + case 't':
2956: + if(equal(directive, ".tag")) {
2957: + symbolS * tag_symbolP;
2958: +
2959: + S_SET_NUMBER_AUXILIARY(symbolP, 1);
2960: + symbol_name = input_line_pointer;
2961: + name_end = get_symbol_end();
2962: + /* Assume that the symbol referred to by .tag is
2963: + always defined. */
2964: + SA_SET_SYM_TAGNDX(symbolP, (long)tag_find(symbol_name));
2965: + if(SA_GET_SYM_TAGNDX(symbolP) == 0L)
2966: + as_warn("tag not found for .tag %s", symbol_name);
2967: + SF_SET_TAGGED(symbolP);
2968: + *input_line_pointer = name_end;
2969: + } else if(equal(directive, ".type")) {
2970: + S_SET_DATA_TYPE(symbolP, get_absolute_expression());
2971: + if(ISFCN(S_GET_DATA_TYPE(symbolP)) &&
2972: + S_GET_STORAGE_CLASS(symbolP) != C_TPDEF)
2973: + SF_SET_FUNCTION(symbolP);
2974: + } else
2975: + as_warn("unknown debug directive : %s", directive);
2976: + break;
2977: + case 'v':
2978: + if(equal(directive, ".val")) {
2979: + if(is_name_beginner(*input_line_pointer)) {
2980: + symbol_name = input_line_pointer;
2981: + name_end = get_symbol_end();
2982: + if(equal(symbol_name, ".")) {
2983: + symbolP->sy_frag = frag_now;
2984: + S_SET_VALUE(symbolP, obstack_next_free(&frags) -
2985: + frag_now->fr_literal);
2986: + /* If the .val is != from the .def (i.e. statics) */
2987: + } else if(!equal(symbol_name_copy, symbol_name)) {
2988: + register symbolS* forwardP;
2989: + if(forwardP = symbol_find(symbol_name))
2990: + symbolP->sy_forward = forwardP;
2991: + else {
2992: + /* Create a new undefined symbol. */
2993: + symbolP->sy_forward =
2994: + symbol_new (symbol_name, SEG_UNKNOWN,
2995: + 0, 0, &zero_address_frag);
2996: + }
2997: + /* If the segment is undefined when the forward
2998: + reference is solved, then copy the segment id
2999: + from the forward symbol. */
3000: + SF_SET_GET_SEGMENT(symbolP);
3001: + }
3002: + /* Otherwise, it is the name of a non debug symbol and its
3003: + value will be calculated later. */
3004: + *input_line_pointer = name_end;
3005: + } else
3006: + S_SET_VALUE(symbolP, get_absolute_expression());
3007: + } else
3008: + as_warn("unknown debug directive : %s", directive);
3009: + break;
3010: + default:
3011: + as_warn("unknown debug directive : %s", directive);
3012: + break;
3013: + }
3014: + }
3015: + demand_empty_rest_of_line();
3016: +
3017: + /* Set the section number according to storage class. */
3018: + switch(S_GET_STORAGE_CLASS(symbolP)) {
3019: + case C_STRTAG: case C_ENTAG: case C_UNTAG:
3020: + SF_SET_TAG(symbolP);
3021: + case C_FILE:
3022: + case C_TPDEF:
3023: + SF_SET_DEBUG(symbolP);
3024: + S_SET_SEGMENT(symbolP, C_DEBUG_SECTION);
3025: + break;
3026: + case C_EFCN:
3027: + SF_SET_LOCAL(symbolP); /* Do not emit this symbol. */
3028: + case C_BLOCK:
3029: + SF_SET_PROCESS(symbolP); /* Will need processing before writing */
3030: + case C_FCN:
3031: + S_SET_SEGMENT(symbolP, C_TEXT_SECTION);
3032: + break;
3033: + case C_AUTO:
3034: + case C_REG:
3035: + case C_MOS: case C_MOE: case C_MOU:
3036: + case C_ARG:
3037: + case C_REGPARM:
3038: + case C_FIELD:
3039: + case C_EOS:
3040: + SF_SET_DEBUG(symbolP);
3041: + S_SET_SEGMENT(symbolP, C_ABS_SECTION);
3042: + break;
3043: + case C_EXT:
3044: + case C_STAT:
3045: + /* Valid but set somewhere else (s_comm, s_lcomm, colon) */
3046: + break;
3047: + case C_USTATIC:
3048: + case C_EXTDEF:
3049: + case C_LABEL:
3050: + case C_ULABEL:
3051: + as_warn("unexpected storage class %d", S_GET_STORAGE_CLASS(symbolP));
3052: + break;
3053: + }
3054: + /* Now that we have build up a debug symbol, try to find if we should
3055: + merge with an existing symbol or not. */
3056: + /* If symbol does not exist, or symbol is a end function mark,
3057: + or symbol is in debug or abs section,
3058: + insert it in the list of symbols. */
3059: + if(S_GET_STORAGE_CLASS(symbolP) == C_EFCN ||
3060: + S_GET_SEGMENT(symbolP) == C_DEBUG_SECTION ||
3061: + S_GET_SEGMENT(symbolP) == C_ABS_SECTION ||
3062: + (symbolP = symbol_find_base(S_GET_NAME(symbolP), DO_NOT_STRIP)) ==
3063: + (symbolS*)0) {
3064: +
3065: + symbolP = (symbolS *)obstack_alloc(¬es, sizeof(symbolS));
3066: + memcpy((char*)symbolP, &symbol, sizeof(symbolS));
3067: +
3068: + DL_APPEND(symbolP, symbol_lastP);
3069: + symbol_lastP = symbolP;
3070: +
3071: + } else {
3072: + /* This symbol allready exists, merge the newly created symbol into
3073: + the old one. This is not mandatory. The linker can handle
3074: + duplicate symbols correctly. But I guess that it save a *lot*
3075: + of space if the assembly file defines a lot of symbols. */
3076: + /* The debug entry (symbol) is merged into symbolP. */
3077: + c_symbol_merge(&symbol, symbolP);
3078: + /* For the function, the symbol *must* be were the debug symbol
3079: + appear. Move the existing symbol to the current place. */
3080: + if(SF_GET_FUNCTION(symbolP)) {
3081: + /* If it already is at the end of the symbol list, do nothing */
3082: + if(symbolP != symbol_lastP) {
3083: + DL_REMOVE(symbolP);
3084: + DL_APPEND(symbolP, symbol_lastP);
3085: + symbol_lastP = symbolP;
3086: + }
3087: + } else
3088: + free(symbol_name_copy);
3089: + }
3090: +
3091: + /* If symbol is a {structure,union} tag, associate symbol to its name. */
3092: + if(SF_GET_TAG(symbolP))
3093: + tag_insert(S_GET_NAME(symbolP), symbolP);
3094: +
3095: + /* Create the line number entry pointing on the function being defined */
3096: + if(SF_GET_FUNCTION(symbolP)) {
3097: + c_line_new((long)S_GET_NAME(symbolP), 0, &zero_address_frag);
3098: + SF_SET_PROCESS(symbolP);
3099: + }
3100: + }
3101: +
3102: + /*
3103: + * Maintain a list of the tagnames of the structres.
3104: + */
3105: +
3106: + static void
3107: + tag_init()
3108: + {
3109: + tag_hash = hash_new();
3110: + return ;
3111: + }
3112: +
3113: + static void
3114: + tag_insert(name, symbolP)
3115: + char* name;
3116: + symbolS* symbolP;
3117: + {
3118: + register char * error_string;
3119: +
3120: + if(*(error_string = hash_jam (tag_hash, name, (char *)symbolP))) {
3121: + as_fatal("Inserting \"%s\" into structure table failed: %s",
3122: + name, error_string);
3123: + }
3124: + return ;
3125: + }
3126: +
3127: + static symbolS*
3128: + tag_find(name)
3129: + char* name;
3130: + {
3131: + #if STRIP_UNDERSCORE
3132: + if(*name == '_') name++;
3133: + #endif /* STRIP_UNDERSCORE */
3134: + return((symbolS*)hash_find(tag_hash, name));
3135: + }
3136: + #else /* coff */
3137: /*
3138: * stab()
3139: *
3140: ***************
3141: *** 1230,1237 ****
3142: symbolP = symbol_new (string, 0,0,0,0,(struct frag *)0);
3143: switch (what) {
3144: case 'd':
3145: ! symbolP->sy_name = NULL; /* .stabd feature. */
3146: ! symbolP->sy_value = obstack_next_free(& frags) - frag_now->fr_literal;
3147: symbolP->sy_frag = frag_now;
3148: break;
3149:
3150: --- 1595,1603 ----
3151: symbolP = symbol_new (string, 0,0,0,0,(struct frag *)0);
3152: switch (what) {
3153: case 'd':
3154: ! S_SET_NAME(symbolP,NULL); /* .stabd feature. */
3155: ! S_SET_VALUE(symbolP,obstack_next_free(&frags) -
3156: ! frag_now->fr_literal);
3157: symbolP->sy_frag = frag_now;
3158: break;
3159:
3160: ***************
3161: *** 1257,1263 ****
3162: }
3163: if (! goof) {
3164: if (get_absolute_expression_and_terminator (& longint) == ',')
3165: ! symbolP->sy_other = longint;
3166: else {
3167: as_warn( "I want a comma after the n_other expression" );
3168: goof = TRUE;
3169: --- 1623,1629 ----
3170: }
3171: if (! goof) {
3172: if (get_absolute_expression_and_terminator (& longint) == ',')
3173: ! S_SET_OTHER(symbolP,longint);
3174: else {
3175: as_warn( "I want a comma after the n_other expression" );
3176: goof = TRUE;
3177: ***************
3178: *** 1265,1271 ****
3179: }
3180: }
3181: if (! goof) {
3182: ! symbolP->sy_desc = get_absolute_expression ();
3183: if (what == 's' || what == 'n') {
3184: if (* input_line_pointer != ',') {
3185: as_warn( "I want a comma after the n_desc expression" );
3186: --- 1631,1637 ----
3187: }
3188: }
3189: if (! goof) {
3190: ! S_SET_DESC(symbolP, get_absolute_expression ());
3191: if (what == 's' || what == 'n') {
3192: if (* input_line_pointer != ',') {
3193: as_warn( "I want a comma after the n_desc expression" );
3194: ***************
3195: *** 1284,1289 ****
3196: --- 1650,1656 ----
3197: else
3198: demand_empty_rest_of_line ();
3199: }
3200: + #endif /* coff */
3201:
3202: /*
3203: * pseudo_set()
3204: ***************
3205: *** 1302,1311 ****
3206: {
3207: expressionS exp;
3208: register segT segment;
3209: int ext;
3210:
3211: know( symbolP ); /* NULL pointer is logic error. */
3212: ! ext=(symbolP->sy_type&N_EXT);
3213: if ((segment = expression( & exp )) == SEG_NONE)
3214: {
3215: as_warn( "Missing expression: absolute 0 assumed" );
3216: --- 1669,1682 ----
3217: {
3218: expressionS exp;
3219: register segT segment;
3220: + #ifdef aout
3221: int ext;
3222: + #endif /* aout */
3223:
3224: know( symbolP ); /* NULL pointer is logic error. */
3225: ! #ifdef aout
3226: ! ext=S_IS_EXTERNAL(symbolP);
3227: ! #endif /* aout */
3228: if ((segment = expression( & exp )) == SEG_NONE)
3229: {
3230: as_warn( "Missing expression: absolute 0 assumed" );
3231: ***************
3232: *** 1317,1348 ****
3233: case SEG_BIG:
3234: as_warn( "%s number illegal. Absolute 0 assumed.",
3235: exp . X_add_number > 0 ? "Bignum" : "Floating-Point" );
3236: ! symbolP -> sy_type = N_ABS | ext;
3237: ! symbolP -> sy_value = 0;
3238: symbolP -> sy_frag = & zero_address_frag;
3239: break;
3240:
3241: case SEG_NONE:
3242: as_warn("No expression: Using absolute 0");
3243: ! symbolP -> sy_type = N_ABS | ext;
3244: ! symbolP -> sy_value = 0;
3245: symbolP -> sy_frag = & zero_address_frag;
3246: break;
3247:
3248: case SEG_DIFFERENCE:
3249: if (exp.X_add_symbol && exp.X_subtract_symbol
3250: ! && (exp.X_add_symbol->sy_type & N_TYPE)
3251: ! == (exp.X_subtract_symbol->sy_type & N_TYPE)) {
3252: if(exp.X_add_symbol->sy_frag != exp.X_subtract_symbol->sy_frag) {
3253: ! as_bad("Unknown expression: symbols %s and %s are in different frags.",exp.X_add_symbol->sy_name, exp.X_subtract_symbol->sy_name);
3254: need_pass_2++;
3255: }
3256: ! exp.X_add_number+=exp.X_add_symbol->sy_value - exp.X_subtract_symbol->sy_value;
3257: } else
3258: as_warn( "Complex expression. Absolute segment assumed." );
3259: case SEG_ABSOLUTE:
3260: ! symbolP -> sy_type = N_ABS | ext;
3261: ! symbolP -> sy_value = exp . X_add_number;
3262: symbolP -> sy_frag = & zero_address_frag;
3263: break;
3264:
3265: --- 1688,1732 ----
3266: case SEG_BIG:
3267: as_warn( "%s number illegal. Absolute 0 assumed.",
3268: exp . X_add_number > 0 ? "Bignum" : "Floating-Point" );
3269: ! S_SET_ABS(symbolP);
3270: ! #ifdef aout
3271: ! ext ? S_SET_EXTERNAL(symbolP) :
3272: ! S_CLEAR_EXTERNAL(symbolP);
3273: ! #endif /* aout */
3274: ! S_SET_VALUE(symbolP, 0);
3275: symbolP -> sy_frag = & zero_address_frag;
3276: break;
3277:
3278: case SEG_NONE:
3279: as_warn("No expression: Using absolute 0");
3280: ! S_SET_ABS(symbolP);
3281: ! #ifdef aout
3282: ! ext ? S_SET_EXTERNAL(symbolP) :
3283: ! S_CLEAR_EXTERNAL(symbolP);
3284: ! #endif /* aout */
3285: ! S_SET_VALUE(symbolP, 0);
3286: symbolP -> sy_frag = & zero_address_frag;
3287: break;
3288:
3289: case SEG_DIFFERENCE:
3290: if (exp.X_add_symbol && exp.X_subtract_symbol
3291: ! && (S_GET_SEGMENT(exp.X_add_symbol) ==
3292: ! S_GET_SEGMENT(exp.X_subtract_symbol))) {
3293: if(exp.X_add_symbol->sy_frag != exp.X_subtract_symbol->sy_frag) {
3294: ! as_bad("Unknown expression: symbols %s and %s are in different frags.",S_GET_NAME(exp.X_add_symbol), S_GET_NAME(exp.X_subtract_symbol));
3295: need_pass_2++;
3296: }
3297: ! exp.X_add_number+=S_GET_VALUE(exp.X_add_symbol) -
3298: ! S_GET_VALUE(exp.X_subtract_symbol);
3299: } else
3300: as_warn( "Complex expression. Absolute segment assumed." );
3301: case SEG_ABSOLUTE:
3302: ! S_SET_ABS(symbolP);
3303: ! #ifdef aout
3304: ! ext ? S_SET_EXTERNAL(symbolP) :
3305: ! S_CLEAR_EXTERNAL(symbolP);
3306: ! #endif /* aout */
3307: ! S_SET_VALUE(symbolP, exp.X_add_number);
3308: symbolP -> sy_frag = & zero_address_frag;
3309: break;
3310:
3311: ***************
3312: *** 1349,1356 ****
3313: case SEG_DATA:
3314: case SEG_TEXT:
3315: case SEG_BSS:
3316: ! symbolP -> sy_type = seg_N_TYPE [(int) segment] | ext;
3317: ! symbolP -> sy_value= exp . X_add_number + exp . X_add_symbol -> sy_value;
3318: symbolP -> sy_frag = exp . X_add_symbol -> sy_frag;
3319: break;
3320:
3321: --- 1733,1748 ----
3322: case SEG_DATA:
3323: case SEG_TEXT:
3324: case SEG_BSS:
3325: ! switch(segment) {
3326: ! case SEG_DATA: S_SET_DATA(symbolP); break;
3327: ! case SEG_TEXT: S_SET_TEXT(symbolP); break;
3328: ! case SEG_BSS: S_SET_BSS(symbolP); break;
3329: ! }
3330: ! #ifdef aout
3331: ! ext ? S_SET_EXTERNAL(symbolP) :
3332: ! S_CLEAR_EXTERNAL(symbolP);
3333: ! #endif /* aout */
3334: ! S_SET_VALUE(symbolP, exp.X_add_number + S_GET_VALUE(exp.X_add_symbol));
3335: symbolP -> sy_frag = exp . X_add_symbol -> sy_frag;
3336: break;
3337:
3338: ***************
3339: *** 1447,1454 ****
3340: if ( segment == SEG_DIFFERENCE && exp . X_add_symbol == NULL )
3341: {
3342: as_warn( "Subtracting symbol \"%s\"(segment\"%s\") is too hard. Absolute segment assumed.",
3343: ! exp . X_subtract_symbol -> sy_name,
3344: ! seg_name [(int) N_TYPE_seg [exp . X_subtract_symbol -> sy_type & N_TYPE]]);
3345: segment = SEG_ABSOLUTE;
3346: /* Leave exp . X_add_number alone. */
3347: }
3348: --- 1839,1846 ----
3349: if ( segment == SEG_DIFFERENCE && exp . X_add_symbol == NULL )
3350: {
3351: as_warn( "Subtracting symbol \"%s\"(segment\"%s\") is too hard. Absolute segment assumed.",
3352: ! S_GET_NAME(exp.X_subtract_symbol),
3353: ! segment_name((int)SEG_seg(S_GET_SEGMENT(exp.X_subtract_symbol))));
3354: segment = SEG_ABSOLUTE;
3355: /* Leave exp . X_add_number alone. */
3356: }
3357: ***************
3358: *** 1929,1936 ****
3359: if ( (retval = get_segmented_expression (expP)) == SEG_UNKNOWN
3360: )
3361: {
3362: ! name1 = expP -> X_add_symbol ? expP -> X_add_symbol -> sy_name : "";
3363: ! name2 = expP -> X_subtract_symbol ? expP -> X_subtract_symbol -> sy_name : "";
3364: if ( name1 && name2 )
3365: {
3366: as_warn("Symbols \"%s\" \"%s\" are undefined: absolute 0 assumed.",
3367: --- 2321,2330 ----
3368: if ( (retval = get_segmented_expression (expP)) == SEG_UNKNOWN
3369: )
3370: {
3371: ! name1 = expP->X_add_symbol ? S_GET_NAME(expP->X_add_symbol) : "";
3372: ! name2 = expP->X_subtract_symbol ?
3373: ! S_GET_NAME(expP->X_subtract_symbol) :
3374: ! "";
3375: if ( name1 && name2 )
3376: {
3377: as_warn("Symbols \"%s\" \"%s\" are undefined: absolute 0 assumed.",
3378: ***************
3379: *** 2064,2070 ****
3380: equals(sym_name)
3381: char *sym_name;
3382: {
3383: ! register struct symbol * symbolP; /* symbol we are working with */
3384:
3385: if(sym_name[0]=='.' && sym_name[1]=='\0') {
3386: /* Turn '. = mumble' into a .org mumble */
3387: --- 2458,2464 ----
3388: equals(sym_name)
3389: char *sym_name;
3390: {
3391: ! register symbolS * symbolP; /* symbol we are working with */
3392:
3393: if(sym_name[0]=='.' && sym_name[1]=='\0') {
3394: /* Turn '. = mumble' into a .org mumble */
3395: ***************
3396: *** 2082,2088 ****
3397: if ( ! need_pass_2 ) {
3398: if (segment != now_seg && segment != SEG_ABSOLUTE)
3399: as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.",
3400: ! seg_name [(int) segment], seg_name [(int) now_seg]);
3401: p = frag_var (rs_org, 1, 1, (relax_substateT)0, exp.X_add_symbol,
3402: exp.X_add_number, (char *)0);
3403: * p = 0;
3404: --- 2476,2483 ----
3405: if ( ! need_pass_2 ) {
3406: if (segment != now_seg && segment != SEG_ABSOLUTE)
3407: as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.",
3408: ! segment_name((int) segment),
3409: ! segment_name((int) now_seg));
3410: p = frag_var (rs_org, 1, 1, (relax_substateT)0, exp.X_add_symbol,
3411: exp.X_add_number, (char *)0);
3412: * p = 0;
3413: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./struc-symbol.h Fri Jul 6 20:43:12 1990
3414: --- ./struc-symbol.h Wed Nov 7 07:33:52 1990
3415: ***************
3416: *** 17,31 ****
3417: along with GAS; see the file COPYING. If not, write to
3418: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
3419:
3420: - #ifndef VMS
3421: - #include "a.out.gnu.h" /* Needed to define struct nlist. Sigh. */
3422: - #else
3423: - #include "a_out.h"
3424: - #endif
3425: -
3426: struct symbol /* our version of an nlist node */
3427: {
3428: ! struct nlist sy_nlist; /* what we write in .o file (if permitted) */
3429: long unsigned sy_name_offset; /* 4-origin position of sy_name in symbols */
3430: /* part of object file. */
3431: /* 0 for (nameless) .stabd symbols. */
3432: --- 17,25 ----
3433: along with GAS; see the file COPYING. If not, write to
3434: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
3435:
3436: struct symbol /* our version of an nlist node */
3437: {
3438: ! symbol_type sy_symbol; /* what we write in .o file (if permitted) */
3439: long unsigned sy_name_offset; /* 4-origin position of sy_name in symbols */
3440: /* part of object file. */
3441: /* 0 for (nameless) .stabd symbols. */
3442: ***************
3443: *** 34,54 ****
3444: /* Symbol numbers start at 0 and are */
3445: /* unsigned. */
3446: struct symbol * sy_next; /* forward chain, or NULL */
3447: struct frag * sy_frag; /* NULL or -> frag this symbol attaches to. */
3448: struct symbol *sy_forward; /* value is really that of this other symbol */
3449: };
3450:
3451: typedef struct symbol symbolS;
3452:
3453: ! #define sy_name sy_nlist .n_un. n_name
3454: /* Name field always points to a string. */
3455: /* 0 means .stabd-like anonymous symbol. */
3456: ! #define sy_type sy_nlist. n_type
3457: ! #define sy_other sy_nlist. n_other
3458: ! #define sy_desc sy_nlist. n_desc
3459: ! #define sy_value sy_nlist. n_value
3460: /* Value of symbol is this value + object */
3461: /* file address of sy_frag. */
3462:
3463: typedef unsigned valueT; /* The type of n_value. Helps casting. */
3464:
3465: --- 28,71 ----
3466: /* Symbol numbers start at 0 and are */
3467: /* unsigned. */
3468: struct symbol * sy_next; /* forward chain, or NULL */
3469: + #ifdef coff
3470: + struct symbol * sy_previous; /* backward chain, or NULL */
3471: + #endif /* coff */
3472: struct frag * sy_frag; /* NULL or -> frag this symbol attaches to. */
3473: struct symbol *sy_forward; /* value is really that of this other symbol */
3474: + #ifdef coff
3475: + unsigned int sy_flags; /* Internal use only flags (see coff.h) */
3476: + AUXENT sy_auxent; /* Auxiliary entry. */
3477: + #endif /* coff */
3478: };
3479:
3480: typedef struct symbol symbolS;
3481:
3482: ! #ifdef coff
3483: !
3484: ! #define sy_name sy_symbol.n_name /* Symbol name */
3485: ! #define sy_zeroes sy_symbol.n_zeroes /* All 0 if pointer to str. */
3486: ! #define sy_offset sy_symbol.n_offset /* Offset in string table */
3487: ! #define sy_value sy_symbol.n_value /* Symbol 0 or ptr in file */
3488: ! #define sy_scnum sy_symbol.n_scnum /* Section number */
3489: ! #define sy_type sy_symbol.n_type /* Type and derived type */
3490: ! #define sy_sclass sy_symbol.n_sclass /* Storage class */
3491: ! #define sy_numaux sy_symbol.n_numaux /* Number of aux. entries */
3492: !
3493: ! #else /* coff */
3494: !
3495: ! #define sy_name sy_symbol.n_un.n_name
3496: /* Name field always points to a string. */
3497: /* 0 means .stabd-like anonymous symbol. */
3498: ! #define sy_strx sy_symbol.n_un.n_strx
3499: ! #define sy_type sy_symbol.n_type
3500: ! #define sy_other sy_symbol.n_other
3501: ! #define sy_desc sy_symbol.n_desc
3502: ! #define sy_value sy_symbol.n_value
3503: /* Value of symbol is this value + object */
3504: /* file address of sy_frag. */
3505: +
3506: + #endif /* coff */
3507:
3508: typedef unsigned valueT; /* The type of n_value. Helps casting. */
3509:
3510: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./subsegs.c Thu Oct 11 18:26:23 1990
3511: --- ./subsegs.c Wed Nov 7 07:33:53 1990
3512: ***************
3513: *** 21,26 ****
3514: --- 21,27 ----
3515: * Segments & sub-segments.
3516: */
3517:
3518: + #include "oformat.h"
3519: #include "as.h"
3520: #include "subsegs.h"
3521: #include "obstack.h"
3522: ***************
3523: *** 33,38 ****
3524: --- 34,93 ----
3525: * data0_frchainP;
3526:
3527:
3528: + #ifdef coff
3529: + const int /* in: segT out: N_TYPE bits */
3530: + seg_N_TYPE[] = {
3531: + C_ABS_SECTION,
3532: + C_TEXT_SECTION,
3533: + C_DATA_SECTION,
3534: + C_BSS_SECTION,
3535: + C_UNDEF_SECTION, /* SEG_UNKNOWN */
3536: + C_UNDEF_SECTION, /* SEG_NONE */
3537: + C_UNDEF_SECTION, /* SEG_PASS1 */
3538: + C_UNDEF_SECTION, /* SEG_GOOF */
3539: + C_UNDEF_SECTION, /* SEG_BIG */
3540: + C_UNDEF_SECTION, /* SEG_DIFFERENCE */
3541: + C_DEBUG_SECTION, /* SEG_DEBUG */
3542: + C_NTV_SECTION, /* SEG_NTV */
3543: + C_PTV_SECTION, /* SEG_PTV */
3544: + };
3545: +
3546: +
3547: + char * const /* in: segT out: char* */
3548: + seg_name[] = {
3549: + "absolute",
3550: + "text",
3551: + "data",
3552: + "bss",
3553: + "unknown",
3554: + "absent",
3555: + "pass1",
3556: + "ASSEMBLER-INTERNAL-LOGIC-ERROR!",
3557: + "bignum/flonum",
3558: + "difference",
3559: + "debug",
3560: + "transfert vector preload",
3561: + "transfert vector postload",
3562: + ""
3563: + }; /* Used by error reporters, dumpers etc. */
3564: +
3565: + /* Add 4 to the real value to get the index and compensate the negatives */
3566: +
3567: + const segT N_TYPE_seg [32] =
3568: + {
3569: + SEG_PTV, /* C_PTV_SECTION == -4 */
3570: + SEG_NTV, /* C_NTV_SECTION == -3 */
3571: + SEG_DEBUG, /* C_DEBUG_SECTION == -2 */
3572: + SEG_ABSOLUTE, /* C_ABS_SECTION == -1 */
3573: + SEG_UNKNOWN, /* C_UNDEF_SECTION == 0 */
3574: + SEG_TEXT, /* C_TEXT_SECTION == 1 */
3575: + SEG_DATA, /* C_DATA_SECTION == 2 */
3576: + SEG_BSS, /* C_BSS_SECTION == 3 */
3577: + SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,
3578: + SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,
3579: + SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF,SEG_GOOF
3580: + };
3581: + #else /* coff */
3582: const int /* in: segT out: N_TYPE bits */
3583: seg_N_TYPE[] = {
3584: N_ABS,
3585: ***************
3586: *** 78,83 ****
3587: --- 133,139 ----
3588: SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF,
3589: SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF
3590: };
3591: + #endif /* coff */
3592:
3593: void
3594: subsegs_begin()
3595: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./symbols.c Thu Oct 18 22:01:13 1990
3596: --- ./symbols.c Wed Nov 7 07:33:55 1990
3597: ***************
3598: *** 18,23 ****
3599: --- 18,24 ----
3600: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
3601:
3602:
3603: + #include "oformat.h"
3604: #include "as.h"
3605: #include "hash.h"
3606: #include "obstack.h" /* For "symbols.h" */
3607: ***************
3608: *** 41,46 ****
3609: --- 42,52 ----
3610: symbolS * symbol_rootP;
3611: symbolS * symbol_lastP;
3612: symbolS abs_symbol;
3613: +
3614: + symbolS* dot_text_symbol;
3615: + symbolS* dot_data_symbol;
3616: + symbolS* dot_bss_symbol;
3617: +
3618: struct obstack notes;
3619:
3620:
3621: ***************
3622: *** 87,93 ****
3623: symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
3624: sy_hash = hash_new();
3625: bzero ((char *)(& abs_symbol), sizeof(abs_symbol));
3626: ! abs_symbol . sy_type = N_ABS; /* Can't initialise a union. Sigh. */
3627: bzero ((char *)(local_label_counter), sizeof(local_label_counter) );
3628: local_bss_counter = 0;
3629: }
3630: --- 93,99 ----
3631: symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
3632: sy_hash = hash_new();
3633: bzero ((char *)(& abs_symbol), sizeof(abs_symbol));
3634: ! S_SET_ABS(&abs_symbol); /* Can't initialise a union. Sigh. */
3635: bzero ((char *)(local_label_counter), sizeof(local_label_counter) );
3636: local_bss_counter = 0;
3637: }
3638: ***************
3639: *** 160,165 ****
3640: --- 166,239 ----
3641: * Changes since 1985: Symbol names may not contain '\0'. Sigh.
3642: */
3643:
3644: + #ifdef coff
3645: +
3646: + symbolS *
3647: + symbol_new (name, segment, value, sclass, frag)
3648: + char* name; /* It is copied, the caller can destroy/modify */
3649: + segT segment;/* Segment identifier (SEG_<something>) */
3650: + long value; /* Symbol value */
3651: + short sclass; /* Symbol storage class */
3652: + fragS* frag; /* Associated fragment */
3653: + {
3654: + register unsigned int name_length;
3655: + register char* name_copy;
3656: + register symbolS* symbolP;
3657: + register char underscore = 0; /* Symbol has leading _ */
3658: +
3659: + #if STRIP_UNDERSCORE
3660: + /* Remove leading underscore at the beginning of the symbol.
3661: + * This is to be compatible with the standard librairies.
3662: + */
3663: + if(*name == '_') {
3664: + underscore = 1;
3665: + name++;
3666: + } else
3667: + underscore = 0;
3668: + #endif /* STRIP_UNDERSCORE */
3669: + name_length = strlen(name) + 1; /* +1 for \0 */
3670: + obstack_grow(¬es, name, name_length);
3671: + name_copy = obstack_finish(¬es);
3672: + symbolP = (symbolS *)obstack_alloc(¬es, sizeof(symbolS));
3673: +
3674: + /* Effective symbol */
3675: + /* Store the pointer in the offset. */
3676: + symbolP->sy_offset = (long unsigned)name_copy;
3677: + symbolP->sy_zeroes = 0L;
3678: + symbolP->sy_value = value;
3679: + symbolP->sy_scnum = seg_SEG(segment);
3680: + symbolP->sy_type = T_NULL;
3681: + symbolP->sy_sclass = sclass;
3682: + symbolP->sy_numaux = 0;
3683: + /* Additional information */
3684: + symbolP->sy_next = NULL;
3685: + symbolP->sy_frag = frag;
3686: + symbolP->sy_forward = NULL;
3687: + symbolP->sy_name_offset = ~0;
3688: + symbolP->sy_number = ~0;
3689: + symbolP->sy_flags = 0;
3690: + /* Auxiliary entries */
3691: + memset((char*)&symbolP->sy_auxent, '\0', AUXESZ);
3692: +
3693: + if(S_IS_STRING(symbolP))
3694: + SF_SET_STRING(symbolP);
3695: + if(!underscore && S_IS_LOCAL(symbolP))
3696: + SF_SET_LOCAL(symbolP);
3697: + /*
3698: + * Link to end of symbol chain .
3699: + */
3700: + if (symbol_lastP) {
3701: + DL_APPEND(symbolP, symbol_lastP);
3702: + } else {
3703: + symbol_rootP = symbolP;
3704: + }
3705: + symbol_lastP = symbolP;
3706: +
3707: + return (symbolP);
3708: + }
3709: +
3710: + #else /* coff */
3711: +
3712: symbolS *
3713: symbol_new (name, type, other, desc, value, frag)
3714: char * name; /* We copy this: OK to alter your copy. */
3715: ***************
3716: *** 168,174 ****
3717: short int desc; /* As in <a.out.h>. */
3718: valueT value; /* As in <a.out.h>, often an address. */
3719: /* Often used as offset from frag address. */
3720: ! struct frag * frag; /* For sy_frag. */
3721: {
3722: register symbolS * symbolP;
3723: register char * preserved_copy_of_name;
3724: --- 242,248 ----
3725: short int desc; /* As in <a.out.h>. */
3726: valueT value; /* As in <a.out.h>, often an address. */
3727: /* Often used as offset from frag address. */
3728: ! fragS* frag; /* For sy_frag. */
3729: {
3730: register symbolS * symbolP;
3731: register char * preserved_copy_of_name;
3732: ***************
3733: *** 180,187 ****
3734: p=obstack_finish(¬es);
3735: /* obstack_1done( ¬es, name, name_length, &p ); */
3736: preserved_copy_of_name = p;
3737: ! p=obstack_alloc(¬es,sizeof(struct symbol));
3738: ! /* obstack_1blank( ¬es, sizeof(struct symbol), &p ); */
3739: symbolP = (symbolS *) p;
3740: symbolP -> sy_name = preserved_copy_of_name;
3741: symbolP -> sy_type = type;
3742: --- 254,261 ----
3743: p=obstack_finish(¬es);
3744: /* obstack_1done( ¬es, name, name_length, &p ); */
3745: preserved_copy_of_name = p;
3746: ! p=obstack_alloc(¬es,sizeof(symbolS));
3747: ! /* obstack_1blank( ¬es, sizeof(symbolS), &p ); */
3748: symbolP = (symbolS *) p;
3749: symbolP -> sy_name = preserved_copy_of_name;
3750: symbolP -> sy_type = type;
3751: ***************
3752: *** 210,215 ****
3753: --- 284,291 ----
3754:
3755: return (symbolP);
3756: }
3757: +
3758: + #endif /* coff */
3759:
3760: /*
3761: * colon()
3762: ***************
3763: *** 225,231 ****
3764: register char * sym_name; /* symbol name, as a cannonical string */
3765: /* We copy this string: OK to alter later. */
3766: {
3767: ! register struct symbol * symbolP; /* symbol we are working with */
3768:
3769: #ifdef SUN_ASM_SYNTAX
3770: /* Sun local labes go out of scope whenever a non-local symbol is
3771: --- 301,307 ----
3772: register char * sym_name; /* symbol name, as a cannonical string */
3773: /* We copy this string: OK to alter later. */
3774: {
3775: ! register symbolS * symbolP; /* symbol we are working with */
3776:
3777: #ifdef SUN_ASM_SYNTAX
3778: /* Sun local labes go out of scope whenever a non-local symbol is
3779: ***************
3780: *** 267,273 ****
3781: * If the new symbol is .comm AND it has a size of zero,
3782: * we ignore it (i.e. the old symbol overrides it)
3783: */
3784: ! if ((seg_N_TYPE [(int) now_seg] == (N_UNDF | N_EXT)) &&
3785: ((obstack_next_free(& frags) - frag_now -> fr_literal) == 0))
3786: return;
3787: /*
3788: --- 343,349 ----
3789: * If the new symbol is .comm AND it has a size of zero,
3790: * we ignore it (i.e. the old symbol overrides it)
3791: */
3792: ! if ((seg_SEG((int) now_seg) == (N_UNDF | N_EXT)) &&
3793: ((obstack_next_free(& frags) - frag_now -> fr_literal) == 0))
3794: return;
3795: /*
3796: ***************
3797: *** 279,285 ****
3798: symbolP -> sy_frag = frag_now;
3799: symbolP -> sy_other = const_flag;
3800: symbolP -> sy_value = obstack_next_free(& frags) - frag_now -> fr_literal;
3801: ! symbolP -> sy_type |= seg_N_TYPE [(int) now_seg]; /* keep N_EXT bit */
3802: return;
3803: }
3804: #endif /* VMS */
3805: --- 355,361 ----
3806: symbolP -> sy_frag = frag_now;
3807: symbolP -> sy_other = const_flag;
3808: symbolP -> sy_value = obstack_next_free(& frags) - frag_now -> fr_literal;
3809: ! symbolP -> sy_type |= seg_SEG((int) now_seg); /* keep N_EXT bit */
3810: return;
3811: }
3812: #endif /* VMS */
3813: ***************
3814: *** 286,304 ****
3815: /*
3816: * Now check for undefined symbols
3817: */
3818: ! if ((symbolP -> sy_type & N_TYPE) == N_UNDF)
3819: {
3820: ! if( symbolP -> sy_other == 0
3821: ! && symbolP -> sy_desc == 0
3822: ! && symbolP -> sy_value == 0)
3823: {
3824: symbolP -> sy_frag = frag_now;
3825: #ifdef VMS
3826: symbolP -> sy_other = const_flag;
3827: #endif
3828: ! symbolP -> sy_value = obstack_next_free(& frags) - frag_now -> fr_literal;
3829: ! know( N_UNDF == 0 );
3830: ! symbolP -> sy_type |= seg_N_TYPE [(int) now_seg]; /* keep N_EXT bit */
3831: }
3832: else
3833: {
3834: --- 362,388 ----
3835: /*
3836: * Now check for undefined symbols
3837: */
3838: ! if (!S_IS_DEFINED(symbolP))
3839: {
3840: ! if(
3841: ! #ifdef aout
3842: ! S_GET_OTHER(symbolP) == 0 &&
3843: ! S_GET_DESC(symbolP) == 0 &&
3844: ! #endif /* aout */
3845: ! S_GET_VALUE(symbolP) == 0)
3846: {
3847: symbolP -> sy_frag = frag_now;
3848: #ifdef VMS
3849: symbolP -> sy_other = const_flag;
3850: #endif
3851: ! S_SET_VALUE(symbolP, obstack_next_free(& frags) -
3852: ! frag_now -> fr_literal);
3853: ! switch(now_seg) {
3854: ! case SEG_TEXT: S_SET_TEXT(symbolP); break;
3855: ! case SEG_DATA: S_SET_DATA(symbolP); break;
3856: ! case SEG_BSS: S_SET_BSS(symbolP); break;
3857: ! case SEG_ABSOLUTE: S_SET_ABS(symbolP); break;
3858: ! }
3859: }
3860: else
3861: {
3862: ***************
3863: *** 310,316 ****
3864: * A .comm/.lcomm symbol being redefined with
3865: * a larger size is also OK
3866: */
3867: ! char New_Type = seg_N_TYPE [(int) now_seg];
3868: if (((symbolP->sy_type == (N_UNDF | N_EXT)) ||
3869: (symbolP->sy_type == N_BSS)) &&
3870: (((New_Type & ~N_EXT) == N_DATA) ||
3871: --- 394,400 ----
3872: * A .comm/.lcomm symbol being redefined with
3873: * a larger size is also OK
3874: */
3875: ! char New_Type = seg_SEG((int) now_seg);
3876: if (((symbolP->sy_type == (N_UNDF | N_EXT)) ||
3877: (symbolP->sy_type == N_BSS)) &&
3878: (((New_Type & ~N_EXT) == N_DATA) ||
3879: ***************
3880: *** 339,353 ****
3881: symbolP -> sy_frag = frag_now;
3882: symbolP -> sy_other = const_flag;
3883: symbolP -> sy_value = obstack_next_free(& frags) - frag_now -> fr_literal;
3884: ! symbolP -> sy_type |= seg_N_TYPE [(int) now_seg]; /* keep N_EXT bit */
3885: }
3886: } else {
3887: #endif /* VMS */
3888: as_fatal( "Symbol \"%s\" is already defined as \"%s\"/%d.%d.%d.",
3889: sym_name,
3890: ! seg_name [(int) N_TYPE_seg [symbolP -> sy_type & N_TYPE]],
3891: ! symbolP -> sy_other, symbolP -> sy_desc,
3892: ! symbolP -> sy_value);
3893: #ifdef VMS
3894: }
3895: #endif /* VMS */
3896: --- 423,444 ----
3897: symbolP -> sy_frag = frag_now;
3898: symbolP -> sy_other = const_flag;
3899: symbolP -> sy_value = obstack_next_free(& frags) - frag_now -> fr_literal;
3900: ! symbolP -> sy_type |= seg_SEG((int) now_seg); /* keep N_EXT bit */
3901: }
3902: } else {
3903: #endif /* VMS */
3904: + #ifdef coff
3905: + as_fatal( "Symbol \"%s\" is already defined as \"%s\"/%d.",
3906: + sym_name,
3907: + segment_name((int)SEG_seg(S_GET_SEGMENT(symbolP))),
3908: + S_GET_VALUE(symbolP));
3909: + #else /* coff */
3910: as_fatal( "Symbol \"%s\" is already defined as \"%s\"/%d.%d.%d.",
3911: sym_name,
3912: ! segment_name((int)SEG_seg(S_GET_SEGMENT(symbolP))),
3913: ! S_GET_OTHER(symbolP), S_GET_DESC(symbolP),
3914: ! S_GET_VALUE(symbolP));
3915: ! #endif /* coff */
3916: #ifdef VMS
3917: }
3918: #endif /* VMS */
3919: ***************
3920: *** 360,367 ****
3921: }
3922: else
3923: {
3924: symbolP = symbol_new (sym_name,
3925: ! (unsigned char)(seg_N_TYPE [(int) now_seg]),
3926: #ifdef VMS
3927: const_flag,
3928: #else
3929: --- 451,463 ----
3930: }
3931: else
3932: {
3933: + #ifdef coff
3934: + symbolP = symbol_new (sym_name, now_seg,
3935: + (valueT)(obstack_next_free(&frags)-frag_now->fr_literal),
3936: + 0, frag_now);
3937: + #else /* coff */
3938: symbolP = symbol_new (sym_name,
3939: ! (unsigned char)(seg_SEG((int) now_seg)),
3940: #ifdef VMS
3941: const_flag,
3942: #else
3943: ***************
3944: *** 370,375 ****
3945: --- 466,472 ----
3946: 0,
3947: (valueT)(obstack_next_free(&frags)-frag_now->fr_literal),
3948: frag_now);
3949: + #endif /* coff */
3950: symbol_table_insert (symbolP);
3951: }
3952: }
3953: ***************
3954: *** 384,399 ****
3955:
3956: void
3957: symbol_table_insert (symbolP)
3958: ! struct symbol * symbolP;
3959: {
3960: register char * error_string;
3961:
3962: ! know( symbolP );
3963: ! know( symbolP -> sy_name );
3964: ! if ( * (error_string = hash_jam (sy_hash, symbolP -> sy_name, (char *)symbolP)))
3965: {
3966: as_fatal( "Inserting \"%s\" into symbol table failed: %s",
3967: ! symbolP -> sy_name, error_string);
3968: }
3969: }
3970:
3971: --- 481,498 ----
3972:
3973: void
3974: symbol_table_insert (symbolP)
3975: ! symbolS * symbolP;
3976: {
3977: register char * error_string;
3978:
3979: ! know(symbolP);
3980: ! know(S_GET_NAME(symbolP));
3981: !
3982: ! if ( * (error_string = hash_jam (sy_hash, S_GET_NAME(symbolP),
3983: ! (char *)symbolP)))
3984: {
3985: as_fatal( "Inserting \"%s\" into symbol table failed: %s",
3986: ! S_GET_NAME(symbolP), error_string);
3987: }
3988: }
3989:
3990: ***************
3991: *** 404,421 ****
3992: * it into the symbol table. Return a pointer to it.
3993: */
3994: symbolS *
3995: ! symbol_find_or_make (name)
3996: ! char * name;
3997: {
3998: ! register symbolS * symbolP;
3999:
4000: ! symbolP = symbol_table_lookup (name);
4001: ! if (symbolP == NULL)
4002: ! {
4003: ! symbolP = symbol_new (name, N_UNDF, 0, 0, 0, & zero_address_frag);
4004: ! symbol_table_insert (symbolP);
4005: ! }
4006: ! return (symbolP);
4007: }
4008:
4009: /*
4010: --- 503,525 ----
4011: * it into the symbol table. Return a pointer to it.
4012: */
4013: symbolS *
4014: ! symbol_find_or_make (name)
4015: ! char * name;
4016: {
4017: ! register symbolS * symbolP;
4018:
4019: ! symbolP = symbol_table_lookup (name);
4020: !
4021: ! if (symbolP == NULL)
4022: ! {
4023: ! #ifdef coff
4024: ! symbolP = symbol_new (name, SEG_UNKNOWN, 0, 0, &zero_address_frag);
4025: ! #else /* coff */
4026: ! symbolP = symbol_new (name, N_UNDF, 0, 0, 0, & zero_address_frag);
4027: ! #endif /* coff */
4028: ! symbol_table_insert (symbolP);
4029: ! }
4030: ! return (symbolP);
4031: }
4032:
4033: /*
4034: ***************
4035: *** 429,438 ****
4036:
4037: symbolS *
4038: symbol_find (name)
4039: ! char * name;
4040: {
4041: ! return ( (symbolS *) hash_find( sy_hash, name ));
4042: }
4043:
4044:
4045: /* end: symbols.c */
4046: --- 533,550 ----
4047:
4048: symbolS *
4049: symbol_find (name)
4050: ! char* name;
4051: {
4052: ! return symbol_find_base(name, STRIP_UNDERSCORE);
4053: }
4054:
4055: + symbolS *
4056: + symbol_find_base (name, strip_underscore)
4057: + char * name;
4058: + int strip_underscore;
4059: + {
4060: + if(strip_underscore && *name == '_') name++;
4061: + return ( (symbolS *) hash_find( sy_hash, name ));
4062: + }
4063:
4064: /* end: symbols.c */
4065: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./symbols.h Wed Mar 1 23:48:43 1989
4066: --- ./symbols.h Wed Nov 7 07:33:56 1990
4067: ***************
4068: *** 30,36 ****
4069: --- 30,41 ----
4070:
4071: extern symbolS abs_symbol;
4072:
4073: + extern symbolS* dot_text_symbol;
4074: + extern symbolS* dot_data_symbol;
4075: + extern symbolS* dot_bss_symbol;
4076: +
4077: symbolS * symbol_find();
4078: + symbolS * symbol_find_base();
4079: void symbol_begin();
4080: char * local_label_name();
4081: void local_colon();
4082: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./write.c Thu Oct 11 18:26:15 1990
4083: --- ./write.c Wed Nov 7 07:41:02 1990
4084: ***************
4085: *** 30,35 ****
4086: --- 30,36 ----
4087: trouble.
4088: */
4089:
4090: + #include "oformat.h"
4091: #include "as.h"
4092: #include "md.h"
4093: #include "subsegs.h"
4094: ***************
4095: *** 37,42 ****
4096: --- 38,47 ----
4097: #include "struc-symbol.h"
4098: #include "write.h"
4099: #include "symbols.h"
4100: + #include "append.h"
4101: + #ifdef coff
4102: + #include <sys/types.h>
4103: + #endif /* coff */
4104:
4105: #ifdef SPARC
4106: #include "sparc.h"
4107: ***************
4108: *** 45,74 ****
4109: #include "i860.h"
4110: #endif
4111:
4112: - void append();
4113: -
4114: #ifdef hpux
4115: #define EXEC_MACHINE_TYPE HP9000S200_ID
4116: #endif
4117:
4118: ! #ifdef DOT_LABEL_PREFIX
4119: ! #define LOCAL_LABEL(name) (name[0] =='.' \
4120: ! && ( name [1] == 'L' || name [1] == '.' ))
4121: ! #else /* not defined DOT_LABEL_PREFIX */
4122: ! #define LOCAL_LABEL(name) (name [0] == 'L' )
4123: ! #endif /* not defined DOT_LABEL_PREFIX */
4124: !
4125: ! /*
4126: ! * In: length of relocation (or of address) in chars: 1, 2 or 4.
4127: ! * Out: GNU LD relocation length code: 0, 1, or 2.
4128: ! */
4129: !
4130: ! static unsigned char
4131: !
4132: ! nbytes_r_length [] = {
4133: ! 42, 0, 1, 42, 2
4134: ! };
4135: !
4136:
4137: static struct frag * text_frag_root;
4138: static struct frag * data_frag_root;
4139: --- 50,62 ----
4140: #include "i860.h"
4141: #endif
4142:
4143: #ifdef hpux
4144: #define EXEC_MACHINE_TYPE HP9000S200_ID
4145: #endif
4146:
4147: ! #ifdef coff
4148: ! extern time_t time();
4149: ! #endif /* coff */
4150:
4151: static struct frag * text_frag_root;
4152: static struct frag * data_frag_root;
4153: ***************
4154: *** 76,94 ****
4155: static struct frag * text_last_frag; /* Last frag in segment. */
4156: static struct frag * data_last_frag; /* Last frag in segment. */
4157:
4158: ! static struct exec the_exec;
4159:
4160: static long int string_byte_count;
4161:
4162: static char * the_object_file;
4163:
4164: - #if !defined(SPARC) && !defined(I860)
4165: - static
4166: - #endif
4167: char * next_object_file_charP; /* Tracks object file bytes. */
4168:
4169: - static long int size_of_the_object_file; /* # bytes in object file. */
4170: -
4171: /* static long int length; JF unused */ /* String length, including trailing '\0'. */
4172:
4173: static void relax_segment();
4174: --- 64,77 ----
4175: static struct frag * text_last_frag; /* Last frag in segment. */
4176: static struct frag * data_last_frag; /* Last frag in segment. */
4177:
4178: ! static object_headers headers;
4179:
4180: static long int string_byte_count;
4181:
4182: static char * the_object_file;
4183:
4184: char * next_object_file_charP; /* Tracks object file bytes. */
4185:
4186: /* static long int length; JF unused */ /* String length, including trailing '\0'. */
4187:
4188: static void relax_segment();
4189: ***************
4190: *** 95,103 ****
4191: void emit_segment();
4192: static relax_addressT relax_align();
4193: static long int fixup_segment();
4194: - #if !defined(SPARC) && !defined(I860)
4195: - static void emit_relocations();
4196: - #endif
4197: /*
4198: * fix_new()
4199: *
4200: --- 78,83 ----
4201: ***************
4202: *** 154,160 ****
4203: register struct frchain * next_frchainP;
4204: register fragS * * prev_fragPP;
4205: register char * name;
4206: ! register symbolS * symbolP;
4207: register symbolS ** symbolPP;
4208: /* register fixS * fixP; JF unused */
4209: unsigned
4210: --- 134,140 ----
4211: register struct frchain * next_frchainP;
4212: register fragS * * prev_fragPP;
4213: register char * name;
4214: ! symbolS * symbolP;
4215: register symbolS ** symbolPP;
4216: /* register fixS * fixP; JF unused */
4217: unsigned
4218: ***************
4219: *** 163,168 ****
4220: --- 143,155 ----
4221: syms_siz,
4222: tr_siz,
4223: dr_siz;
4224: + #ifdef coff
4225: + SCNHDR text_section_header;
4226: + SCNHDR data_section_header;
4227: + SCNHDR bss_section_header;
4228: + symbolS* last_functionP = (symbolS*)0;
4229: + symbolS* last_tagP;
4230: + #endif /* coff */
4231: void output_file_create();
4232: void output_file_append();
4233: void output_file_close();
4234: ***************
4235: *** 170,178 ****
4236: --- 157,171 ----
4237: void gdb_emit();
4238: void gdb_end();
4239: #endif
4240: + long int object_file_size;
4241: extern long omagic; /* JF magic # to write out. Is different for
4242: Suns and Vaxen and other boxes */
4243:
4244: + #ifdef coff
4245: + /* Initialize the stack used to keep track of the matching .bb .be */
4246: + stack* block_stack = stack_init(512, sizeof(symbolS*));
4247: + #endif /* coff */
4248: +
4249: #ifdef VMS
4250: /*
4251: * Under VMS we try to be compatible with VAX-11 "C". Thus, we
4252: ***************
4253: *** 271,283 ****
4254: */
4255:
4256: know( text_last_frag -> fr_type == rs_fill && text_last_frag -> fr_offset == 0 );
4257: ! text_siz=text_last_frag->fr_address;
4258: #ifdef SPARC
4259: ! text_siz= (text_siz+7)&(~7);
4260: ! text_last_frag->fr_address=text_siz;
4261: #endif
4262: - md_number_to_chars((char *)&the_exec.a_text,text_siz, sizeof(the_exec.a_text));
4263: - /* the_exec . a_text = text_last_frag -> fr_address; */
4264:
4265: /*
4266: * Join the 2 segments into 1 huge segment.
4267: --- 264,275 ----
4268: */
4269:
4270: know( text_last_frag -> fr_type == rs_fill && text_last_frag -> fr_offset == 0 );
4271: ! H_SET_TEXT_SIZE(&headers,text_last_frag->fr_address);
4272: #ifdef SPARC
4273: ! H_SET_TEXT_SIZE(&headers,H_GET_TEXT_SIZE(&headers) +
4274: ! (H_GET_TEXT_SIZE(&headers)+7)&(~7));
4275: ! text_last_frag->fr_address=H_GET_TEXT_SIZE(&headers);
4276: #endif
4277:
4278: /*
4279: * Join the 2 segments into 1 huge segment.
4280: ***************
4281: *** 291,304 ****
4282: register relax_addressT slide;
4283:
4284: know( text_last_frag -> fr_type == rs_fill && text_last_frag -> fr_offset == 0 );
4285: ! data_siz=data_last_frag->fr_address;
4286: #ifdef SPARC
4287: ! data_siz += (8 - (data_siz % 8)) % 8;
4288: ! data_last_frag->fr_address = data_siz;
4289: #endif
4290: ! md_number_to_chars((char *)&the_exec.a_data,data_siz,sizeof(the_exec.a_data));
4291: ! /* the_exec . a_data = data_last_frag -> fr_address; */
4292: ! slide = text_siz; /* Address in file of the data segment. */
4293: for (fragP = data_frag_root;
4294: fragP;
4295: fragP = fragP -> fr_next)
4296: --- 283,295 ----
4297: register relax_addressT slide;
4298:
4299: know( text_last_frag -> fr_type == rs_fill && text_last_frag -> fr_offset == 0 );
4300: ! H_SET_DATA_SIZE(&headers,data_last_frag->fr_address);
4301: #ifdef SPARC
4302: ! H_SET_DATA_SIZE(&headers,(H_GET_DATA_SIZE(&headers) +
4303: ! (8 - (H_GET_DATA_SIZE(&headers) % 8)) % 8));
4304: ! data_last_frag->fr_address = H_GET_DATA_SIZE(&headers);
4305: #endif
4306: ! slide = H_GET_TEXT_SIZE(&headers); /* & in file of the data segment. */
4307: for (fragP = data_frag_root;
4308: fragP;
4309: fragP = fragP -> fr_next)
4310: ***************
4311: *** 308,324 ****
4312: know( text_last_frag );
4313: text_last_frag -> fr_next = data_frag_root;
4314: }
4315: ! else {
4316: ! md_number_to_chars((char *)&the_exec.a_data,0,sizeof(the_exec.a_data));
4317: ! data_siz = 0;
4318: ! }
4319:
4320: ! bss_address_frag . fr_address = text_siz + data_siz;
4321: #ifdef SPARC
4322: local_bss_counter=(local_bss_counter+7)&(~7);
4323: #endif
4324: ! md_number_to_chars((char *)&the_exec.a_bss,local_bss_counter,sizeof(the_exec.a_bss));
4325: !
4326:
4327: /*
4328: *
4329: --- 299,313 ----
4330: know( text_last_frag );
4331: text_last_frag -> fr_next = data_frag_root;
4332: }
4333: ! else
4334: ! H_SET_DATA_SIZE(&headers,0);
4335:
4336: ! bss_address_frag . fr_address = H_GET_TEXT_SIZE(&headers) +
4337: ! H_GET_DATA_SIZE(&headers);
4338: #ifdef SPARC
4339: local_bss_counter=(local_bss_counter+7)&(~7);
4340: #endif
4341: ! H_SET_BSS_SIZE(&headers,local_bss_counter);
4342:
4343: /*
4344: *
4345: ***************
4346: *** 347,390 ****
4347: for(symbolP=symbol_rootP;symbolP;symbolP=symbolP->sy_next) {
4348: if(symbolP->sy_forward) {
4349: symbolP->sy_value+=symbolP->sy_forward->sy_value+symbolP->sy_forward->sy_frag->fr_address;
4350: symbolP->sy_forward=0;
4351: }
4352: }
4353: ! symbolPP = & symbol_rootP; /* -> last symbol chain link. */
4354: {
4355: ! register long int symbol_number;
4356:
4357: ! symbol_number = 0;
4358: while (symbolP = * symbolPP)
4359: {
4360: ! name = symbolP -> sy_name;
4361: ! if(flagseen['R'] && (symbolP->sy_nlist.n_type&N_DATA)) {
4362: ! symbolP->sy_nlist.n_type&= ~N_DATA;
4363: ! symbolP->sy_nlist.n_type|= N_TEXT;
4364: ! }
4365: ! /* if(symbolP->sy_forward) {
4366: ! symbolP->sy_value += symbolP->sy_forward->sy_value + symbolP->sy_forward->sy_frag->fr_address;
4367: ! } */
4368:
4369: symbolP -> sy_value += symbolP -> sy_frag -> fr_address;
4370: - /* JF the 128 bit is a hack so stabs like
4371: - "LET_STMT:23. . ." don't go away */
4372: - /* CPH: 128 bit hack is moby loser. N_SO for file "Lower.c"
4373: - fell through the cracks. I think that N_STAB should be
4374: - used instead of 128. */
4375: /* JF the \001 bit is to make sure that local labels
4376: ( 1: - 9: don't make it into the symtable either */
4377: #ifndef VMS /* Under VMS we need to keep local symbols */
4378: ! if ( !name || (symbolP->sy_nlist.n_type&N_STAB)
4379: ! || (name[2]!='\001' && (flagseen ['L'] || ! LOCAL_LABEL(name) )))
4380: #endif /* not VMS */
4381: {
4382: - symbolP -> sy_number = symbol_number ++;
4383: #ifndef VMS
4384: ! if (name)
4385: { /* Ordinary case. */
4386: symbolP -> sy_name_offset = string_byte_count;
4387: ! string_byte_count += strlen (symbolP -> sy_name) + 1;
4388: }
4389: else /* .Stabd case. */
4390: #endif /* not VMS */
4391: --- 336,582 ----
4392: for(symbolP=symbol_rootP;symbolP;symbolP=symbolP->sy_next) {
4393: if(symbolP->sy_forward) {
4394: symbolP->sy_value+=symbolP->sy_forward->sy_value+symbolP->sy_forward->sy_frag->fr_address;
4395: + #ifdef coff
4396: + if(SF_GET_GET_SEGMENT(symbolP) &&
4397: + S_GET_SEGMENT(symbolP) == seg_SEG(SEG_UNKNOWN))
4398: + S_SET_SEGMENT(symbolP, S_GET_SEGMENT(symbolP->sy_forward));
4399: + #endif /* coff */
4400: symbolP->sy_forward=0;
4401: }
4402: }
4403: !
4404: {
4405: ! register int symbol_number = 0;
4406: ! #if defined(coff)
4407: ! symbolS* symbol_externP = (symbolS*)0;
4408: ! symbolS* symbol_extern_lastP = (symbolS*)0;
4409: !
4410: ! /* The symbol list should be ordered according to the following sequence
4411: ! * order :
4412: ! * . .file symbol
4413: ! * . debug entries for functions
4414: ! * . fake symbols for .text .data and .bss
4415: ! * . defined symbols
4416: ! * . undefined symbols
4417: ! * But this is not mandatory. The only important point is to put the
4418: ! * undefined symbols at the end of the list.
4419: ! */
4420: !
4421: ! {
4422: ! /* Is there a .file symbol ? If not insert one at the beginning. */
4423: ! if(symbol_rootP == NULL ||
4424: ! S_GET_STORAGE_CLASS(symbol_rootP) != C_FILE)
4425: ! c_dot_file_symbol("fake");
4426: !
4427: ! /*
4428: ! * Build up static symbols for .text, .data and .bss
4429: ! */
4430: ! dot_text_symbol = (symbolS*)
4431: ! c_section_symbol(".text", 0, H_GET_TEXT_SIZE(&headers),
4432: ! 0/*text_relocation_number*/, 0/*text_lineno_number*/);
4433: ! dot_data_symbol = (symbolS*)
4434: ! c_section_symbol(".data", H_GET_TEXT_SIZE(&headers),
4435: ! H_GET_DATA_SIZE(&headers),
4436: ! 0/*data_relocation_number*/,
4437: ! 0); /* There is no data lineno entries */
4438: ! dot_bss_symbol = (symbolS*)
4439: ! c_section_symbol(".bss", H_GET_TEXT_SIZE(&headers) +
4440: ! H_GET_DATA_SIZE(&headers),
4441: ! H_GET_BSS_SIZE(&headers),
4442: ! 0, /* No relocation for a bss section. */
4443: ! 0); /* There is no bss lineno entries */
4444: ! }
4445: !
4446: ! symbolP = symbol_rootP;
4447: ! if(symbolP) {
4448: ! while(symbolP) {
4449: ! /* If the symbol has a tagndx entry, resolve it */
4450: ! if(SF_GET_TAGGED(symbolP)) {
4451: ! SA_SET_SYM_TAGNDX(symbolP,
4452: ! ((symbolS*)SA_GET_SYM_TAGNDX(symbolP))->sy_number);
4453: ! }
4454: ! /* Debug symbol do not need all this rubbish */
4455: ! if(!SF_GET_DEBUG(symbolP)) {
4456: ! symbolS* real_symbolP;
4457: ! /* L* and C_EFCN symbols never merge. */
4458: ! if(!SF_GET_LOCAL(symbolP) &&
4459: ! (real_symbolP =
4460: ! symbol_find_base(S_GET_NAME(symbolP), DO_NOT_STRIP)) &&
4461: ! real_symbolP != symbolP) {
4462: ! /* Move the debug data from the debug symbol to the
4463: ! real symbol. Do NOT do the oposite (i.e. move from
4464: ! real symbol to symbol and remove real symbol from the
4465: ! list.) Because some pointers refer to the real symbol
4466: ! whereas no pointers refer to the symbol. */
4467: ! c_symbol_merge(symbolP, real_symbolP);
4468: ! /* Replace the current symbol by the real one */
4469: ! /* The symbols will never be the last or the first
4470: ! because : 1st symbol is .file and 3 last symbols are
4471: ! .text, .data, .bss */
4472: ! DL_REMOVE(real_symbolP);
4473: ! DL_INSERT(real_symbolP, symbolP);
4474: ! DL_REMOVE(symbolP);
4475: ! symbolP = real_symbolP;
4476: ! }
4477: ! if(flagseen['R'] && S_IS_DATA(symbolP))
4478: ! S_SET_TEXT(symbolP);
4479: !
4480: ! symbolP->sy_value += symbolP->sy_frag->fr_address;
4481: !
4482: ! if(!S_IS_DEFINED(symbolP))
4483: ! S_SET_EXTERNAL(symbolP);
4484: ! else if(S_GET_STORAGE_CLASS(symbolP) == C_NULL)
4485: ! S_SET_STORAGE_CLASS(symbolP, C_STAT);
4486: !
4487: ! /* Mainly to speed up if not -g */
4488: ! if(SF_GET_PROCESS(symbolP)) {
4489: ! /* Handle the nested blocks auxiliary info. */
4490: ! if(S_GET_STORAGE_CLASS(symbolP) == C_BLOCK) {
4491: ! if(!strcmp(S_GET_NAME(symbolP), ".bb"))
4492: ! stack_push(block_stack, &symbolP);
4493: ! else { /* .eb */
4494: ! register symbolS* begin_symbolP;
4495: ! begin_symbolP = *(symbolS**)stack_pop(block_stack);
4496: ! if(begin_symbolP == (symbolS*)0)
4497: ! as_warn("mismatched .eb");
4498: ! else
4499: ! SA_SET_SYM_ENDNDX(begin_symbolP, symbol_number);
4500: ! }
4501: ! }
4502: ! /* If we are able to identify the type of a function, and we
4503: ! are out of a function (last_functionP == 0) then, the
4504: ! function symbol will be associated with an auxiliary
4505: ! entry. */
4506: ! if(last_functionP == (symbolS*)0 &&
4507: ! SF_GET_FUNCTION(symbolP)) {
4508: ! last_functionP = symbolP;
4509: ! S_SET_NUMBER_AUXILIARY(symbolP, 1);
4510: ! /* Clobber possible stale .dim information. */
4511: ! memset(&symbolP->sy_auxent, '\0', sizeof(union auxent));
4512: ! }
4513: ! /* The C_FCN do not need any additional information.
4514: ! I don't even know if this is needed for sdb. But the
4515: ! standard assembler generate it, so...
4516: ! */
4517: ! if(S_GET_STORAGE_CLASS(symbolP) == C_EFCN) {
4518: ! if(last_functionP == (symbolS*)0)
4519: ! as_fatal("C_EFCN symbol out of scope");
4520: ! SA_SET_SYM_FSIZE(last_functionP,
4521: ! (long)(symbolP->sy_value -
4522: ! last_functionP->sy_value));
4523: ! SA_SET_SYM_ENDNDX(last_functionP, symbol_number);
4524: ! last_functionP = (symbolS*)0;
4525: ! }
4526: ! }
4527: ! } else {
4528: ! /* First descriptor of a structure must point to the next
4529: ! slot outside the structure description. */
4530: ! if(SF_GET_TAG(symbolP))
4531: ! last_tagP = symbolP;
4532: ! else if(S_GET_STORAGE_CLASS(symbolP) == C_EOS)
4533: ! /* +2 take in account the current symbol */
4534: ! SA_SET_SYM_ENDNDX(last_tagP, symbol_number+2);
4535: ! }
4536: !
4537: ! /* We must put the external symbols appart. The loader
4538: ! does not bomb if we do not. But the references in
4539: ! the endndx field for a .bb symbol are not corrected
4540: ! if an external symbol is removed between .bb and .be.
4541: ! I.e int the following case :
4542: ! [20] .bb endndx = 22
4543: ! [21] foo external
4544: ! [22] .be
4545: ! ld will move the symbol 21 to the end of the list but
4546: ! endndx will still be 22 instead of 21. */
4547: ! {
4548: ! register symbolS* thisP = symbolP;
4549:
4550: ! symbolP = thisP->sy_next;
4551: ! /* remove C_EFCN and LOCAL (L...) symbols */
4552: ! if(SF_GET_LOCAL(thisP))
4553: ! DL_REMOVE(thisP);
4554: ! else {
4555: ! if(S_GET_STORAGE_CLASS(thisP) == C_EXT &&
4556: ! !SF_GET_FUNCTION(thisP)) {
4557: ! /* Remove from the list */
4558: ! DL_REMOVE(thisP);
4559: ! DL_CLEAR(thisP);
4560: ! /* Move at the end of the list */
4561: ! if (symbol_extern_lastP == (symbolS*)0)
4562: ! symbol_externP = thisP;
4563: ! else
4564: ! DL_APPEND(thisP, symbol_extern_lastP);
4565: ! symbol_extern_lastP = thisP;
4566: ! } else {
4567: ! if(SF_GET_STRING(thisP)) {
4568: ! thisP->sy_name_offset = string_byte_count;
4569: ! string_byte_count += strlen(S_GET_NAME(thisP)) + 1;
4570: ! } else
4571: ! thisP->sy_name_offset = 0;
4572: ! thisP->sy_number = symbol_number;
4573: ! symbol_number += 1 + S_GET_NUMBER_AUXILIARY(thisP);
4574: ! }
4575: ! }
4576: ! }
4577: ! }
4578: !
4579: ! symbol_lastP->sy_next = symbol_externP;
4580: ! symbolP = symbol_externP;
4581: ! while(symbolP) {
4582: ! if(SF_GET_STRING(symbolP)) {
4583: ! symbolP->sy_name_offset = string_byte_count;
4584: ! string_byte_count += strlen(S_GET_NAME(symbolP)) + 1;
4585: ! } else
4586: ! symbolP->sy_name_offset = 0;
4587: ! symbolP->sy_number = symbol_number;
4588: ! symbol_number += 1 + S_GET_NUMBER_AUXILIARY(symbolP);
4589: ! symbolP = symbolP->sy_next;
4590: ! }
4591: ! }
4592: ! {
4593: ! lineno* lineP;
4594: ! for(lineP = lineno_rootP; lineP; lineP = lineP->next) {
4595: ! if(lineP->line.l_lnno)
4596: ! lineP->line.l_addr.l_paddr +=
4597: ! ((fragS*)lineP->frag)->fr_address;
4598: ! else {
4599: ! /* There is a good chance that the symbol pointed to
4600: ! is not the one that will be emitted and that the
4601: ! sy_number is not accurate. */
4602: ! char* name;
4603: ! name = (char*)lineP->line.l_addr.l_symndx;
4604: ! if((symbolP = symbol_find_base(name, DO_NOT_STRIP)) ==
4605: ! (symbolS*)0)
4606: ! as_warn("line number lost symbol %s", name);
4607: ! else
4608: ! lineP->line.l_addr.l_symndx = symbolP->sy_number;
4609: ! }
4610: ! text_lineno_number++;
4611: ! }
4612: ! }
4613: ! #elif defined(aout)
4614: ! symbolPP = & symbol_rootP; /* -> last symbol chain link. */
4615: while (symbolP = * symbolPP)
4616: {
4617: ! name = S_GET_NAME(symbolP);
4618: ! if(flagseen['R'] && S_IS_DATA(symbolP))
4619: ! S_SET_TEXT(symbolP);
4620:
4621: symbolP -> sy_value += symbolP -> sy_frag -> fr_address;
4622: /* JF the \001 bit is to make sure that local labels
4623: ( 1: - 9: don't make it into the symtable either */
4624: #ifndef VMS /* Under VMS we need to keep local symbols */
4625: ! if (!S_IS_LOCAL(symbolP))
4626: #endif /* not VMS */
4627: {
4628: #ifndef VMS
4629: ! /* The + 1 after strlen account for the \0 at the end of each string */
4630: ! symbolP -> sy_number = symbol_number ++;
4631: ! if(!S_IS_STABD(symbolP))
4632: { /* Ordinary case. */
4633: symbolP -> sy_name_offset = string_byte_count;
4634: ! string_byte_count +=
4635: ! strlen (S_GET_NAME(symbolP)) + 1;
4636: }
4637: else /* .Stabd case. */
4638: #endif /* not VMS */
4639: ***************
4640: *** 392,407 ****
4641: symbolPP = & (symbolP -> sy_next);
4642: }
4643: #ifndef VMS
4644: ! else
4645: * symbolPP = symbolP -> sy_next;
4646: #endif /* not VMS */
4647: } /* for each symbol */
4648:
4649: ! syms_siz = sizeof( struct nlist) * symbol_number;
4650: ! md_number_to_chars((char *)&the_exec.a_syms,syms_siz,sizeof(the_exec.a_syms));
4651: ! /* the_exec . a_syms = sizeof( struct nlist) * symbol_number; */
4652: }
4653: -
4654: /*
4655: * Addresses of frags now reflect addresses we use in the object file.
4656: * Symbol values are correct.
4657: --- 584,602 ----
4658: symbolPP = & (symbolP -> sy_next);
4659: }
4660: #ifndef VMS
4661: ! else /* skip the symbol */
4662: * symbolPP = symbolP -> sy_next;
4663: #endif /* not VMS */
4664: } /* for each symbol */
4665:
4666: ! #elif defined(elf)
4667: ! do it yourself !
4668: ! #else
4669: ! you lose
4670: ! #endif
4671: ! H_SET_STRING_SIZE(&headers,string_byte_count);
4672: ! H_SET_SYMBOL_TABLE_SIZE(&headers, symbol_number);
4673: }
4674: /*
4675: * Addresses of frags now reflect addresses we use in the object file.
4676: * Symbol values are correct.
4677: ***************
4678: *** 563,605 ****
4679: * Scan every FixS performing fixups. We had to wait until now to do
4680: * this because md_convert_frag() may have made some fixSs.
4681: */
4682: ! /* the_exec . a_trsize
4683: ! = sizeof(struct relocation_info) * fixup_segment (text_fix_root, N_TEXT);
4684: ! the_exec . a_drsize
4685: ! = sizeof(struct relocation_info) * fixup_segment (data_fix_root, N_DATA); */
4686: !
4687: ! tr_siz=sizeof(struct relocation_info) * fixup_segment (text_fix_root, N_TEXT);
4688: ! md_number_to_chars((char *)&the_exec.a_trsize, tr_siz ,sizeof(the_exec.a_trsize));
4689: ! dr_siz=sizeof(struct relocation_info) * fixup_segment (data_fix_root, N_DATA);
4690: ! md_number_to_chars((char *)&the_exec.a_drsize, dr_siz, sizeof(the_exec.a_drsize));
4691: ! md_number_to_chars((char *)&the_exec.a_info,omagic,sizeof(the_exec.a_info));
4692: ! md_number_to_chars((char *)&the_exec.a_entry,0,sizeof(the_exec.a_entry));
4693:
4694: #ifdef EXEC_MACHINE_TYPE
4695: ! md_number_to_chars((char *)&the_exec.a_machtype, EXEC_MACHINE_TYPE, sizeof(the_exec.a_machtype));
4696: #endif
4697: #ifdef EXEC_VERSION
4698: ! md_number_to_chars((char *)&the_exec.a_version,EXEC_VERSION,sizeof(the_exec.a_version));
4699: #endif
4700: -
4701: - /* the_exec . a_entry = 0; */
4702:
4703: ! size_of_the_object_file =
4704: ! sizeof( the_exec ) +
4705: ! text_siz +
4706: ! data_siz +
4707: ! syms_siz +
4708: ! tr_siz +
4709: ! dr_siz +
4710: ! string_byte_count;
4711: !
4712: ! next_object_file_charP
4713: ! = the_object_file
4714: ! = xmalloc ( size_of_the_object_file );
4715:
4716: output_file_create (out_file_name);
4717:
4718: ! append (& next_object_file_charP, (char *)(&the_exec), (unsigned long)sizeof(the_exec));
4719:
4720: /*
4721: * Emit code.
4722: --- 758,877 ----
4723: * Scan every FixS performing fixups. We had to wait until now to do
4724: * this because md_convert_frag() may have made some fixSs.
4725: */
4726: !
4727: ! H_SET_RELOCATION_SIZE(&headers,
4728: ! RELSZ*fixup_segment (text_fix_root, SEG_TEXT),
4729: ! RELSZ*fixup_segment (data_fix_root, SEG_DATA));
4730: ! H_SET_MAGIC_NUMBER(&headers,omagic);
4731: ! H_SET_ENTRY_POINT(&headers,0);
4732:
4733: #ifdef EXEC_MACHINE_TYPE
4734: ! H_SET_MACHINE_TYPE(&headers,EXEC_MACHINE_TYPE);
4735: #endif
4736: #ifdef EXEC_VERSION
4737: ! H_SET_VERSION(&headers,EXEC_VERSION);
4738: #endif
4739:
4740: ! #ifdef coff
4741: ! {
4742: ! register int text_relocation_number = 0;
4743: ! register int data_relocation_number = 0;
4744: ! register fixS* fixP;
4745: !
4746: ! /* Count the number of relocation entries for text and data */
4747: ! for(fixP = text_fix_root; fixP; fixP = fixP->fx_next)
4748: ! if(fixP->fx_addsy)
4749: ! text_relocation_number++;
4750: ! SA_SET_SCN_NRELOC(dot_text_symbol, text_relocation_number);
4751: ! /* Assign the number of line number entries for the text section */
4752: ! SA_SET_SCN_NLINNO(dot_text_symbol, text_lineno_number);
4753: ! /* Assign the size of the section */
4754: ! SA_SET_SCN_SCNLEN(dot_text_symbol, H_GET_TEXT_SIZE(&headers));
4755: !
4756: ! for(fixP = data_fix_root; fixP; fixP = fixP->fx_next)
4757: ! if(fixP->fx_addsy)
4758: ! data_relocation_number++;
4759: ! SA_SET_SCN_NRELOC(dot_data_symbol, data_relocation_number);
4760: ! /* Assign the size of the section */
4761: ! SA_SET_SCN_SCNLEN(dot_data_symbol, H_GET_DATA_SIZE(&headers));
4762: !
4763: ! /* Assign the size of the section */
4764: ! SA_SET_SCN_SCNLEN(dot_bss_symbol, H_GET_BSS_SIZE(&headers));
4765: ! }
4766: !
4767: ! /* Fill in extra coff fields */
4768: !
4769: ! /* Initialize general line number information. */
4770: ! H_SET_LINENO_SIZE(&headers, text_lineno_number * LINESZ);
4771: !
4772: ! /* filehdr */
4773: ! H_SET_FILE_MAGIC_NUMBER(&headers, FILE_HEADER_MAGIC);
4774: ! H_SET_NUMBER_OF_SECTIONS(&headers, 3); /* text+data+bss */
4775: ! H_SET_TIME_STAMP(&headers, (long)time((long*)0));
4776: ! H_SET_SYMBOL_TABLE_POINTER(&headers,
4777: ! H_GET_SYMBOL_TABLE_FILE_OFFSET(&headers));
4778: ! /* symbol table size allready set */
4779: ! H_SET_SIZEOF_OPTIONAL_HEADER(&headers, AOUTHDRSZ);
4780: ! H_SET_FLAGS(&headers, (text_lineno_number == 0 ? F_LNNO : 0 ) |
4781: ! BYTE_ORDERING);
4782: !
4783: ! /* aouthdr */
4784: ! /* magic number allready set */
4785: ! H_SET_VERSION_STAMP(&headers, 0);
4786: ! /* Text, data, bss size; entry point; text_start and data_start
4787: ! are already set */
4788: !
4789: ! /* Build section headers */
4790: !
4791: ! c_section_header(&text_section_header,
4792: ! ".text",
4793: ! 0,
4794: ! H_GET_TEXT_SIZE(&headers),
4795: ! H_GET_TEXT_FILE_OFFSET(&headers),
4796: ! SA_GET_SCN_NRELOC(dot_text_symbol) ?
4797: ! H_GET_RELOCATION_FILE_OFFSET(&headers) : 0,
4798: ! text_lineno_number ? H_GET_LINENO_FILE_OFFSET(&headers) : 0,
4799: ! SA_GET_SCN_NRELOC(dot_text_symbol),
4800: ! text_lineno_number);
4801: ! c_section_header(&data_section_header,
4802: ! ".data",
4803: ! H_GET_TEXT_SIZE(&headers),
4804: ! H_GET_DATA_SIZE(&headers),
4805: ! H_GET_DATA_SIZE(&headers) ?
4806: ! H_GET_DATA_FILE_OFFSET(&headers) : 0,
4807: ! SA_GET_SCN_NRELOC(dot_data_symbol) ?
4808: ! H_GET_RELOCATION_FILE_OFFSET(&headers) +
4809: ! text_section_header.s_nreloc * RELSZ : 0,
4810: ! 0, /* No line number information */
4811: ! SA_GET_SCN_NRELOC(dot_data_symbol),
4812: ! 0); /* No line number information */
4813: ! c_section_header(&bss_section_header,
4814: ! ".bss",
4815: ! H_GET_TEXT_SIZE(&headers) + H_GET_DATA_SIZE(&headers),
4816: ! H_GET_BSS_SIZE(&headers),
4817: ! 0, /* No file offset */
4818: ! 0, /* No relocation information */
4819: ! 0, /* No line number information */
4820: ! 0, /* No relocation information */
4821: ! 0); /* No line number information */
4822: !
4823: ! #endif /* coff */
4824: !
4825: ! object_file_size = H_GET_FILE_SIZE(&headers);
4826: ! next_object_file_charP = the_object_file = xmalloc ( object_file_size );
4827:
4828: output_file_create (out_file_name);
4829:
4830: !
4831: ! H_OUTPUT(&headers, &next_object_file_charP);
4832: !
4833: ! #ifdef coff
4834: ! /* Output the section headers */
4835: ! c_section_header_append(&text_section_header, &next_object_file_charP);
4836: ! c_section_header_append(&data_section_header, &next_object_file_charP);
4837: ! c_section_header_append(&bss_section_header, &next_object_file_charP);
4838: ! #endif /* coff */
4839: !
4840:
4841: /*
4842: * Emit code.
4843: ***************
4844: *** 624,652 ****
4845: */
4846: emit_relocations (text_fix_root, (relax_addressT)0);
4847: emit_relocations (data_fix_root, text_last_frag -> fr_address);
4848: /*
4849: ! * Emit all symbols left in the symbol chain.
4850: ! * Any symbol still undefined is made N_EXT.
4851: */
4852: ! for ( symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next )
4853: ! {
4854: ! register char * temp;
4855: !
4856: ! temp = symbolP -> sy_nlist . n_un . n_name;
4857: ! /* JF fix the numbers up. Call by value RULES! */
4858: ! md_number_to_chars((char *)&(symbolP -> sy_nlist . n_un . n_strx ),symbolP -> sy_name_offset,sizeof(symbolP -> sy_nlist . n_un . n_strx ));
4859: ! md_number_to_chars((char *)&(symbolP->sy_nlist.n_desc),symbolP->sy_nlist.n_desc,sizeof(symbolP -> sy_nlist . n_desc));
4860: ! md_number_to_chars((char *)&(symbolP->sy_nlist.n_value),symbolP->sy_nlist.n_value,sizeof(symbolP->sy_nlist.n_value));
4861: ! /* symbolP -> sy_nlist . n_un . n_strx = symbolP -> sy_name_offset; JF replaced by md above */
4862: ! if (symbolP -> sy_type == N_UNDF)
4863: ! symbolP -> sy_type |= N_EXT; /* Any undefined symbols become N_EXT. */
4864: ! append (& next_object_file_charP, (char *)(& symbolP -> sy_nlist),
4865: ! (unsigned long)sizeof(struct nlist));
4866: ! symbolP -> sy_nlist . n_un . n_name = temp;
4867: ! } /* for each symbol */
4868:
4869: /*
4870: - * next_object_file_charP -> slot for next object byte.
4871: * Emit strings.
4872: * Find strings by crawling along symbol table chain.
4873: */
4874: --- 896,915 ----
4875: */
4876: emit_relocations (text_fix_root, (relax_addressT)0);
4877: emit_relocations (data_fix_root, text_last_frag -> fr_address);
4878: +
4879: + #ifdef coff
4880: /*
4881: ! * Emit line number entries.
4882: */
4883: ! emit_lineno(lineno_rootP, &next_object_file_charP);
4884: ! #endif /* coff */
4885: !
4886: ! /*
4887: ! * Emit symbols.
4888: ! */
4889: ! emit_symbols (symbol_rootP,&next_object_file_charP);
4890:
4891: /*
4892: * Emit strings.
4893: * Find strings by crawling along symbol table chain.
4894: */
4895: ***************
4896: *** 654,671 ****
4897: md_number_to_chars((char *)&string_byte_count, string_byte_count, sizeof(string_byte_count));
4898:
4899: append (& next_object_file_charP, (char *)&string_byte_count, (unsigned long)sizeof(string_byte_count));
4900: ! for ( symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next )
4901: ! {
4902: ! if (symbolP -> sy_name)
4903: ! { /* Ordinary case: not .stabd. */
4904: ! append (& next_object_file_charP, symbolP -> sy_name,
4905: ! (unsigned long)(strlen (symbolP -> sy_name) + 1));
4906: ! }
4907: ! } /* for each symbol */
4908: !
4909: ! know( next_object_file_charP == the_object_file + size_of_the_object_file );
4910:
4911: ! output_file_append (the_object_file, size_of_the_object_file, out_file_name);
4912:
4913: #ifdef DONTDEF
4914: if (flagseen['G']) /* GDB symbol file to be appended? */
4915: --- 917,935 ----
4916: md_number_to_chars((char *)&string_byte_count, string_byte_count, sizeof(string_byte_count));
4917:
4918: append (& next_object_file_charP, (char *)&string_byte_count, (unsigned long)sizeof(string_byte_count));
4919: ! for(symbolP = symbol_rootP; symbolP; symbolP = symbolP->sy_next) {
4920: ! #ifdef coff
4921: ! if(SF_GET_STRING(symbolP))
4922: ! #else /* coff */
4923: ! if(S_GET_NAME(symbolP))
4924: ! #endif /* coff */
4925: ! append(&next_object_file_charP, S_GET_NAME(symbolP),
4926: ! (unsigned long)(strlen (S_GET_NAME(symbolP)) + 1));
4927: ! }
4928:
4929: ! know( next_object_file_charP == the_object_file + object_file_size);
4930: ! /* Write the data to the file */
4931: ! output_file_append (the_object_file,object_file_size,out_file_name);
4932:
4933: #ifdef DONTDEF
4934: if (flagseen['G']) /* GDB symbol file to be appended? */
4935: ***************
4936: *** 702,708 ****
4937: void
4938: relax_segment (segment_frag_root, segment_type)
4939: struct frag * segment_frag_root;
4940: ! segT segment_type; /* N_DATA or N_TEXT */
4941: {
4942: register struct frag * fragP;
4943: register relax_addressT address;
4944: --- 966,972 ----
4945: void
4946: relax_segment (segment_frag_root, segment_type)
4947: struct frag * segment_frag_root;
4948: ! segT segment_type; /* SEG_DATA or SEG_TEXT */
4949: {
4950: register struct frag * fragP;
4951: register relax_addressT address;
4952: ***************
4953: *** 740,746 ****
4954:
4955: case rs_machine_dependent:
4956: address += md_estimate_size_before_relax
4957: ! (fragP, seg_N_TYPE [(int) segment_type]);
4958: break;
4959:
4960: #ifndef WORKING_DOT_WORD
4961: --- 1004,1010 ----
4962:
4963: case rs_machine_dependent:
4964: address += md_estimate_size_before_relax
4965: ! (fragP, seg_SEG((int) segment_type));
4966: break;
4967:
4968: #ifndef WORKING_DOT_WORD
4969: ***************
4970: *** 847,855 ****
4971: target = offset;
4972: if (symbolP)
4973: {
4974: ! know( ((symbolP -> sy_type & N_TYPE) == N_ABS) || ((symbolP -> sy_type & N_TYPE) == N_DATA) || ((symbolP -> sy_type & N_TYPE) == N_TEXT));
4975: ! know( symbolP -> sy_frag );
4976: ! know( (symbolP->sy_type&N_TYPE)!=N_ABS || symbolP->sy_frag==&zero_address_frag );
4977: target +=
4978: symbolP -> sy_value
4979: + symbolP -> sy_frag -> fr_address;
4980: --- 1111,1122 ----
4981: target = offset;
4982: if (symbolP)
4983: {
4984: ! know(S_IS_ABS(symbolP) ||
4985: ! S_IS_DATA(symbolP) ||
4986: ! S_IS_TEXT(symbolP))
4987: ! know(symbolP -> sy_frag);
4988: ! know(!S_IS_ABS(symbolP) ||
4989: ! symbolP->sy_frag==&zero_address_frag );
4990: target +=
4991: symbolP -> sy_value
4992: + symbolP -> sy_frag -> fr_address;
4993: ***************
4994: *** 876,885 ****
4995: target = offset;
4996: if (symbolP)
4997: {
4998: ! know( ((symbolP -> sy_type & N_TYPE) == N_ABS) || ((symbolP -> sy_type &
4999: ! N_TYPE) == N_DATA) || ((symbolP -> sy_type & N_TYPE) == N_TEXT));
5000: ! know( symbolP -> sy_frag );
5001: ! know( (symbolP->sy_type&N_TYPE)!=N_ABS || symbolP->sy_frag==&zero_address_frag );
5002: target +=
5003: symbolP -> sy_value
5004: + symbolP -> sy_frag -> fr_address;
5005: --- 1143,1154 ----
5006: target = offset;
5007: if (symbolP)
5008: {
5009: ! know(S_IS_ABS(symbolP) ||
5010: ! S_IS_DATA(symbolP) ||
5011: ! S_IS_TEXT(symbolP))
5012: ! know(symbolP -> sy_frag);
5013: ! know(!S_IS_ABS(symbolP) ||
5014: ! symbolP->sy_frag==&zero_address_frag );
5015: target +=
5016: symbolP -> sy_value
5017: + symbolP -> sy_frag -> fr_address;
5018: ***************
5019: *** 1041,1065 ****
5020: add_number = fixP -> fx_offset;
5021: pcrel = fixP -> fx_pcrel;
5022: if(add_symbolP)
5023: ! add_symbol_N_TYPE = add_symbolP -> sy_type & N_TYPE;
5024: if (sub_symbolP)
5025: {
5026: if(!add_symbolP) /* Its just -sym */
5027: {
5028: ! if(sub_symbolP->sy_type!=N_ABS)
5029: ! as_warn("Negative of non-absolute symbol %s", sub_symbolP->sy_name);
5030: ! add_number-=sub_symbolP->sy_value;
5031: }
5032: ! else if ( ((sub_symbolP -> sy_type ^ add_symbol_N_TYPE) & N_TYPE) == 0
5033: ! && ( add_symbol_N_TYPE == N_DATA
5034: ! || add_symbol_N_TYPE == N_TEXT
5035: ! || add_symbol_N_TYPE == N_BSS
5036: ! || add_symbol_N_TYPE == N_ABS))
5037: {
5038: /* Difference of 2 symbols from same segment. */
5039: /* Can't make difference of 2 undefineds: 'value' means */
5040: /* something different for N_UNDF. */
5041: ! add_number += add_symbolP -> sy_value - sub_symbolP -> sy_value;
5042: add_symbolP = NULL;
5043: fixP -> fx_addsy = NULL;
5044: }
5045: --- 1310,1339 ----
5046: add_number = fixP -> fx_offset;
5047: pcrel = fixP -> fx_pcrel;
5048: if(add_symbolP)
5049: ! add_symbol_N_TYPE = SEG_seg(S_GET_SEGMENT(add_symbolP));
5050: if (sub_symbolP)
5051: {
5052: if(!add_symbolP) /* Its just -sym */
5053: {
5054: ! if(SEG_seg(sub_symbolP->sy_type)!=SEG_ABSOLUTE)
5055: ! as_warn("Negative of non-absolute symbol %s",
5056: ! S_GET_NAME(sub_symbolP));
5057: ! add_number-=S_GET_VALUE(sub_symbolP);
5058: }
5059: ! /* if sub_symbol is in the same segment that add_symbol
5060: ! and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE */
5061: ! else if((SEG_seg(S_GET_SEGMENT(sub_symbolP)) ==
5062: ! add_symbol_N_TYPE) &&
5063: ! ((add_symbol_N_TYPE == SEG_DATA) ||
5064: ! (add_symbol_N_TYPE == SEG_TEXT) ||
5065: ! (add_symbol_N_TYPE == SEG_BSS) ||
5066: ! (add_symbol_N_TYPE == SEG_ABSOLUTE)))
5067: {
5068: /* Difference of 2 symbols from same segment. */
5069: /* Can't make difference of 2 undefineds: 'value' means */
5070: /* something different for N_UNDF. */
5071: ! add_number += S_GET_VALUE(add_symbolP) -
5072: ! S_GET_VALUE(sub_symbolP);
5073: add_symbolP = NULL;
5074: fixP -> fx_addsy = NULL;
5075: }
5076: ***************
5077: *** 1066,1079 ****
5078: else
5079: {
5080: /* Different segments in subtraction. */
5081: ! know( sub_symbolP -> sy_type != (N_ABS | N_EXT))
5082: ! if (sub_symbolP -> sy_type == N_ABS)
5083: ! add_number -= sub_symbolP -> sy_value;
5084: else
5085: {
5086: ! as_warn("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %d.",
5087: ! seg_name[(int)N_TYPE_seg[sub_symbolP->sy_type&N_TYPE]],
5088: ! sub_symbolP -> sy_name, fragP -> fr_address + where);
5089: }
5090: }
5091: }
5092: --- 1340,1353 ----
5093: else
5094: {
5095: /* Different segments in subtraction. */
5096: ! know(!(S_IS_EXTERNAL(sub_symbolP) && S_IS_ABS(sub_symbolP)));
5097: ! if (S_IS_ABS(sub_symbolP))
5098: ! add_number -= S_GET_VALUE(sub_symbolP);
5099: else
5100: {
5101: ! as_warn("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %d.",
5102: ! segment_name((int)SEG_seg(S_GET_SEGMENT(sub_symbolP))),
5103: ! S_GET_NAME(sub_symbolP), fragP -> fr_address + where);
5104: }
5105: }
5106: }
5107: ***************
5108: *** 1086,1092 ****
5109: * SEG_UNKNOWN, but it is now in the local segment.
5110: * So we know how to do the address without relocation.
5111: */
5112: ! add_number += add_symbolP -> sy_value;
5113: add_number -=
5114: #ifndef NS32K
5115: size +
5116: --- 1360,1366 ----
5117: * SEG_UNKNOWN, but it is now in the local segment.
5118: * So we know how to do the address without relocation.
5119: */
5120: ! add_number += S_GET_VALUE(add_symbolP);
5121: add_number -=
5122: #ifndef NS32K
5123: size +
5124: ***************
5125: *** 1112,1131 ****
5126: {
5127: switch (add_symbol_N_TYPE)
5128: {
5129: ! case N_ABS:
5130: ! add_number += add_symbolP -> sy_value;
5131: fixP -> fx_addsy = NULL;
5132: add_symbolP = NULL;
5133: break;
5134:
5135: ! case N_BSS:
5136: ! case N_DATA:
5137: ! case N_TEXT:
5138: seg_reloc_count ++;
5139: ! add_number += add_symbolP -> sy_value;
5140: break;
5141:
5142: ! case N_UNDF:
5143: seg_reloc_count ++;
5144: break;
5145:
5146: --- 1386,1409 ----
5147: {
5148: switch (add_symbol_N_TYPE)
5149: {
5150: ! case SEG_ABSOLUTE:
5151: ! add_number += S_GET_VALUE(add_symbolP);
5152: fixP -> fx_addsy = NULL;
5153: add_symbolP = NULL;
5154: break;
5155:
5156: ! case SEG_BSS:
5157: ! case SEG_DATA:
5158: ! case SEG_TEXT:
5159: seg_reloc_count ++;
5160: ! add_number += S_GET_VALUE(add_symbolP);
5161: break;
5162:
5163: ! case SEG_UNKNOWN:
5164: ! #ifdef coff
5165: ! if(S_IS_COMMON(add_symbolP))
5166: ! add_number += S_GET_VALUE(add_symbolP);
5167: ! #endif /* coff */
5168: seg_reloc_count ++;
5169: break;
5170:
5171: ***************
5172: *** 1159,1165 ****
5173: case 0:
5174: #if defined(SPARC) || defined(I860)
5175: fixP->fx_addnumber = add_number;
5176: ! md_number_to_imm(place, add_number, size, fixP, this_segment_type);
5177: #else
5178: md_number_to_imm (place, add_number, size);
5179: /* OVE: the immediates, like disps, have lsb at lowest address */
5180: --- 1437,1444 ----
5181: case 0:
5182: #if defined(SPARC) || defined(I860)
5183: fixP->fx_addnumber = add_number;
5184: ! md_number_to_imm(place, add_number, size, fixP,
5185: ! seg_SEG(this_segment_type));
5186: #else
5187: md_number_to_imm (place, add_number, size);
5188: /* OVE: the immediates, like disps, have lsb at lowest address */
5189: ***************
5190: *** 1183,1249 ****
5191: return (seg_reloc_count);
5192: } /* fixup_segment() */
5193:
5194: -
5195: - /* The sparc needs its own emit_relocations() */
5196: - #if !defined(SPARC) && !defined(I860)
5197: - /*
5198: - * emit_relocations()
5199: - *
5200: - * Crawl along a fixS chain. Emit the segment's relocations.
5201: - */
5202: - static void
5203: - emit_relocations (fixP, segment_address_in_file)
5204: - register fixS * fixP; /* Fixup chain for this segment. */
5205: - relax_addressT segment_address_in_file;
5206: - {
5207: - struct relocation_info ri;
5208: - register symbolS * symbolP;
5209: -
5210: - /* JF this is for paranoia */
5211: - bzero((char *)&ri,sizeof(ri));
5212: - for ( ; fixP; fixP = fixP -> fx_next)
5213: - {
5214: - if (symbolP = fixP -> fx_addsy)
5215: - {
5216: -
5217: - #ifdef NS32K
5218: - /* These two 'cuz of NS32K */
5219: - ri . r_bsr = fixP -> fx_bsr;
5220: - ri . r_disp = fixP -> fx_im_disp;
5221: - #endif
5222: -
5223: - ri . r_length = nbytes_r_length [fixP -> fx_size];
5224: - ri . r_pcrel = fixP -> fx_pcrel;
5225: - ri . r_address = fixP -> fx_frag -> fr_address
5226: - + fixP -> fx_where
5227: - - segment_address_in_file;
5228: - if ((symbolP -> sy_type & N_TYPE) == N_UNDF)
5229: - {
5230: - ri . r_extern = 1;
5231: - ri . r_symbolnum = symbolP -> sy_number;
5232: - }
5233: - else
5234: - {
5235: - ri . r_extern = 0;
5236: - ri . r_symbolnum = symbolP -> sy_type & N_TYPE;
5237: - }
5238: -
5239: - /*
5240: - The 68k machines assign bit-fields from higher bits to
5241: - lower bits ("left-to-right") within the int. VAXen assign
5242: - bit-fields from lower bits to higher bits ("right-to-left").
5243: - Both handle multi-byte numbers in their usual fashion
5244: - (Big-endian and little-endian stuff).
5245: - Thus we need a machine dependent routine to make
5246: - sure the structure is written out correctly. FUN!
5247: - */
5248: - md_ri_to_chars((char *) &ri, ri);
5249: - append (&next_object_file_charP, (char *)& ri, (unsigned long)sizeof(ri));
5250: - }
5251: - }
5252: -
5253: - }
5254: - #endif
5255:
5256: int
5257: is_dnrange(f1,f2)
5258: --- 1462,1467 ----
5259: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./write.h Thu Oct 11 18:45:31 1990
5260: --- ./write.h Wed Nov 7 07:34:00 1990
5261: ***************
5262: *** 72,77 ****
5263: --- 72,79 ----
5264: COMMON fixS * data_fix_root; /* Chains fixSs. */
5265: COMMON fixS ** seg_fix_rootP; /* -> one of above. */
5266:
5267: + COMMON char * next_object_file_charP;
5268: +
5269: bit_fixS *bit_fix_new();
5270: /* end: write.h */
5271:
5272: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./xmalloc.c Wed Mar 1 23:48:34 1989
5273: --- ./xmalloc.c Wed Nov 7 07:34:01 1990
5274: ***************
5275: *** 43,48 ****
5276: --- 43,50 ----
5277: #include <malloc.h>
5278: #endif
5279:
5280: + #define error as_fatal
5281: +
5282: char * xmalloc(n)
5283: long n;
5284: {
5285: *** /lasvegas/spare/usenet/work/gas-1.37.genuine/./xrealloc.c Wed Mar 1 23:48:33 1989
5286: --- ./xrealloc.c Wed Nov 7 07:34:02 1990
5287: ***************
5288: *** 45,50 ****
5289: --- 45,52 ----
5290: #include <malloc.h>
5291: #endif
5292:
5293: + #define error as_fatal
5294: +
5295: char *
5296: xrealloc (ptr, n)
5297: register char *ptr;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.