More Lynx support, plus better stabs-in-coff generation.
authorStan Shebs <shebs@codesourcery.com>
Tue, 28 Sep 1993 19:22:08 +0000 (19:22 +0000)
committerStan Shebs <shebs@codesourcery.com>
Tue, 28 Sep 1993 19:22:08 +0000 (19:22 +0000)
gas/ChangeLog
gas/config/obj-coffbfd.c
gas/config/obj-coffbfd.h
gas/config/te-lynx.h [new file with mode: 0644]

index 10659f023ad73ab40cf325370a8b6d30e2ffbea2..adbeaef032cd2f7e865d8646e45762fab21161e7 100644 (file)
@@ -1,3 +1,23 @@
+Tue Sep 28 12:02:04 1993  Stan Shebs  (shebs@rtl.cygnus.com)
+
+       * configure.in: Split i386 LynxOS out from other coff targets,
+       add a specific Lynx emulation.
+       Add m68k LynxOS target.
+       * config/tc-i386.c: Define specific Lynx target format.
+       * config/tc-m68k.c: Define specific Lynx target format.
+       * config/te-lynx.h: New file.
+
+       * config/obj-coffbfd.h: Don't set TARGET_FORMAT to be
+       "coff-{i386,m68k}" if TARGET_FORMAT already defined.
+       (INIT_STAB_SECTION): Define.
+       * config/obj-coffbfd.c: Include <time.h>.
+       (write_object_file): Look for .stab sections and call
+       adjust_stab_section.
+       (adjust_stab_section): New function, fills in the first symbol
+       of a stab section with number of symbols and string table size.
+       (obj_coff_init_stab_section): New function, creates the initial
+       symbol for a stab section.
+
 Mon Sep 27 15:21:55 1993  Ken Raeburn  (raeburn@cambridge.cygnus.com)
 
        * config/atof-vax.c (md_atof): Return null on success instead of
index dd5e1e730fbe035e33bf55e9f3defd2d36726d7e..b73dbff6d62698ff367f77d6ff7d87ec751a80bb 100644 (file)
@@ -40,6 +40,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "obstack.h"
 #include "subsegs.h"
 #include "frags.h"
+/* This is needed because we include internal bfd things. */
+#include <time.h>
 #include "../bfd/libbfd.h"
 #include "../bfd/libcoff.h"
 
@@ -76,7 +78,6 @@ const short seg_N_TYPE[] =
   C_REGISTER_SECTION,          /* SEG_REGISTER */
 };
 
-
 int function_lineoff = -1;     /* Offset in line#s where the last function
                                   started (the odd entry for line #0) */
 
@@ -1811,6 +1812,7 @@ extern void
 DEFUN_VOID (write_object_file)
 {
   int i;
+  char *name;
   struct frchain *frchain_ptr;
 
   object_headers headers;
@@ -1902,6 +1904,18 @@ DEFUN_VOID (write_object_file)
     }
 #endif
 
+  /* Look for ".stab" segments and fill in their initial symbols
+     correctly. */
+  for (i = SEG_E0; i < SEG_UNKNOWN; i++)
+    {
+      name = segment_info[i].scnhdr.s_name;
+
+      if (name != NULL
+         && strncmp (".stab", name, 5) == 0
+         && strncmp (".stabstr", name, 8) != 0)
+       adjust_stab_section (abfd, i);
+    }
+
   file_cursor = H_GET_TEXT_FILE_OFFSET (&headers);
 
   bfd_seek (abfd, (file_ptr) file_cursor, 0);
@@ -1943,7 +1957,7 @@ DEFUN_VOID (write_object_file)
   }
 
   coff_header_append (abfd, &headers);
-
+  
   if (bfd_close_all_done (abfd) == false)
     as_fatal ("Can't close %s: %s", out_file_name,
              bfd_errmsg (bfd_error));
@@ -2628,3 +2642,76 @@ DEFUN (fixup_segment, (segP, this_segment_type),
 }                              /* fixup_segment() */
 
 #endif
+
+/* The first entry in a .stab section is special.  */
+
+void
+obj_coff_init_stab_section (seg)
+     segT seg;
+{
+  extern char *logical_input_file, *physical_input_file;
+  char *p;
+  const char *file;
+  unsigned int stroff;
+
+  /* Make space for this first symbol. */
+  p = frag_more (12);
+  file = logical_input_file;
+  if (file == NULL)
+    file = physical_input_file;
+  if (file == NULL)
+    file = "UNKNOWN";
+  stroff = get_stab_string_offset (file, segment_info[seg].scnhdr.s_name);
+  know (stroff == 1);
+  md_number_to_chars (p, stroff, 4);
+}
+
+/* Fill in the counts in the first entry in a .stab section.  */
+
+adjust_stab_section(abfd, seg)
+     bfd *abfd;
+     segT seg;
+{
+  segT stabstrseg = -1;
+  char *secname, *name, *name2;
+  asection *stabsec, *stabstrsec;
+  char *p = NULL;
+  int i, strsz = 0, nsyms;
+  fragS *frag = segment_info[seg].frchainP->frch_root;
+
+  /* Look for the associated string table section. */
+
+  secname = segment_info[seg].scnhdr.s_name;
+  name = (char *) alloca (strlen (secname) + 4);
+  strcpy (name, secname);
+  strcat (name, "str");
+
+  for (i = SEG_E0; i < SEG_UNKNOWN; i++)
+    {
+      name2 = segment_info[i].scnhdr.s_name;
+      if (name2 != NULL && strncmp(name2, name, 8) == 0)
+       {
+         stabstrseg = i;
+         break;
+       }
+    }
+
+  /* If we found the section, get its size. */
+  if (stabstrseg >= 0)
+    strsz = size_section (abfd, stabstrseg);
+
+  nsyms = size_section (abfd, seg) / 12 - 1;
+
+  /* Look for the first frag of sufficient size for the initial stab
+     symbol, and collect a pointer to it. */
+  while (frag && frag->fr_fix < 12)
+    frag = frag->fr_next;
+  assert (frag != 0);
+  p = frag->fr_literal;
+  assert (p != 0);
+
+  /* Write in the number of stab symbols and the size of the string
+     table. */
+  bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6);
+  bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
+}
index 659c709c7c3ca633dbe2bb57734158f98e9f02b3..59a28dfd46c1d87b78b86025d5249fbcf2c81f21 100644 (file)
 
 #ifdef TC_M68K
 #include "coff/m68k.h"
+#ifndef TARGET_FORMAT
 #define TARGET_FORMAT "coff-m68k"
 #endif
+#endif
 
 #ifdef TC_M88K
 #include "coff/m88k.h"
 
 #ifdef TC_I386
 #include "coff/i386.h"
+#ifndef TARGET_FORMAT
 #define TARGET_FORMAT "coff-i386"
 #endif
+#endif
 
 #ifdef TC_A29K
 #include "coff/a29k.h"
@@ -522,7 +526,6 @@ extern struct internal_scnhdr text_section_header;
 extern SCNHDR data_section_header;
 extern SCNHDR text_section_header;
 #endif
-#endif
 
 /* Forward the segment of a forwarded symbol.  */
 #define obj_frob_forward_symbol(symp) \
@@ -530,6 +533,15 @@ extern SCNHDR text_section_header;
    ? (S_SET_SEGMENT (symp, S_GET_SEGMENT (symp->sy_value.X_add_symbol)), 0) \
    : 0)
 
+/* Stabs in a coff file go into their own section. */
+
 #define SEPARATE_STAB_SECTIONS
 
-/* end of obj-coffbfd.h */
+/* We need 12 bytes at the start of the section to hold some initial
+   information.  */
+
+extern void obj_coff_init_stab_section PARAMS ((segT));
+
+#define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg)
+
+#endif /* OBJ_FORMAT_H */
diff --git a/gas/config/te-lynx.h b/gas/config/te-lynx.h
new file mode 100644 (file)
index 0000000..eaca2e6
--- /dev/null
@@ -0,0 +1,3 @@
+#define TE_LYNX
+
+#include "obj-format.h"