summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authorrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>1992-03-21 22:50:43 +0000
committerrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>1992-03-21 22:50:43 +0000
commit8894538ae78dcf17dc8c2478d013cde1547daa99 (patch)
tree5e4ddc2c059c1280b2c4257b1b3715080b87d646 /gcc
parent7e59e4796765c849493a73392ae64b5592b95ebd (diff)
downloadppe42-gcc-8894538ae78dcf17dc8c2478d013cde1547daa99.tar.gz
ppe42-gcc-8894538ae78dcf17dc8c2478d013cde1547daa99.zip
*** empty log message ***
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@551 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/m68k/sun3.h20
-rw-r--r--gcc/config/svr4.h35
-rw-r--r--gcc/gcc.c178
3 files changed, 199 insertions, 34 deletions
diff --git a/gcc/config/m68k/sun3.h b/gcc/config/m68k/sun3.h
index a12354a9bae..844b32fdd55 100644
--- a/gcc/config/m68k/sun3.h
+++ b/gcc/config/m68k/sun3.h
@@ -43,14 +43,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* -m68881 is the default */
#define CPP_SPEC \
"%{!msoft-float:%{mfpa:-D__HAVE_FPA__ }%{!mfpa:-D__HAVE_68881__ }}\
-%{!ansi:%{m68000:-Dmc68010}%{mc68000:-Dmc68010}%{!mc68000:%{!m68000:-Dmc68020}}}"
-
-#else
-#if TARGET_DEFAULT & 0100
-
-/* -mfpa is the default */
-#define CPP_SPEC \
-"%{!msoft-float:%{m68881:-D__HAVE_68881__ }%{!m68881:-D__HAVE_FPA__ }}\
+%{m68000:-D__mc68010__}%{mc68000:-D__mc68010__}%{!mc68000:%{!m68000:-D__mc68020__}}} \
%{!ansi:%{m68000:-Dmc68010}%{mc68000:-Dmc68010}%{!mc68000:%{!m68000:-Dmc68020}}}"
#else
@@ -58,10 +51,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* -msoft-float is the default */
#define CPP_SPEC \
"%{m68881:-D__HAVE_68881__ }%{mfpa:-D__HAVE_FPA__ }\
+%{m68000:-D__mc68010__}%{mc68000:-D__mc68010__}%{!mc68000:%{!m68000:-D__mc68020__}}} \
%{!ansi:%{m68000:-Dmc68010}%{mc68000:-Dmc68010}%{!mc68000:%{!m68000:-Dmc68020}}}"
#endif
-#endif
/* Prevent error on `-sun3' and `-target sun3' options. */
@@ -81,7 +74,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define WORD_SWITCH_TAKES_ARG(STR) \
(!strcmp (STR, "Tdata") || !strcmp (STR, "include") \
|| !strcmp (STR, "imacros") || !strcmp (STR, "target") \
- || !strcmp (STR, "assert"))
+ || !strcmp (STR, "assert") || !strcmp (STR, "aux-info"))
/* -m68000 requires special flags to the assembler. */
@@ -167,6 +160,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Allow folding division by zero. */
#define REAL_INFINITY
+/* Generate calls to memcpy, memcmp and memset. */
+#define TARGET_MEM_FUNCTIONS
+
/* This is how to output an assembler line defining a `double' constant. */
#undef ASM_OUTPUT_DOUBLE
@@ -174,7 +170,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
{ \
if (REAL_VALUE_ISINF (VALUE)) \
fprintf (FILE, "\t.double 0r%s99e999\n", (VALUE) > 0 ? "" : "-"); \
- else if (isnan (VALUE)) \
+ else if (REAL_VALUE_ISNAN (VALUE)) \
{ \
union { double d; long l[2];} t; \
t.d = (VALUE); \
@@ -191,7 +187,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
{ \
if (REAL_VALUE_ISINF (VALUE)) \
fprintf (FILE, "\t.single 0r%s99e999\n", (VALUE) > 0 ? "" : "-"); \
- else if (isnan (VALUE)) \
+ else if (REAL_VALUE_ISNAN (VALUE)) \
{ \
union { float f; long l;} t; \
t.f = (VALUE); \
diff --git a/gcc/config/svr4.h b/gcc/config/svr4.h
index f49fa69f03a..77328f13ab6 100644
--- a/gcc/config/svr4.h
+++ b/gcc/config/svr4.h
@@ -72,7 +72,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
there are no such switches except those implemented by GCC itself. */
#define WORD_SWITCH_TAKES_ARG(STR) \
- (!strcmp (STR, "include") || !strcmp (STR, "imacros"))
+ (!strcmp (STR, "include") || !strcmp (STR, "imacros") \
+ || !strcmp (STR, "aux-info"))
/* You should redefine CPP_PREDEFINES in any file which includes this one.
The definition should be appropriate for the type of target system
@@ -249,6 +250,8 @@ do { \
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE BITS_PER_WORD
+#define MULTIBYTE_CHARS
+
#undef ASM_BYTE_OP
#define ASM_BYTE_OP "\t.byte"
@@ -303,12 +306,12 @@ do { \
the linker seems to want the alignment of data objects
to depend on their types. We do exactly that here. */
-#define BSS_ASM_OP "\t.bss"
+#define BSS_ASM_OP ".bss"
#undef ASM_OUTPUT_ALIGNED_LOCAL
#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
do { \
- fprintf ((FILE), "%s\t%s,%u,%u\n", \
+ fprintf ((FILE), "\t%s\t%s,%u,%u\n", \
BSS_ASM_OP, (NAME), (SIZE), (ALIGN) / BITS_PER_UNIT); \
} while (0)
@@ -316,7 +319,7 @@ do { \
specific value in some section. This is the same for all known svr4
assemblers. */
-#define INT_ASM_OP "\t.long\t"
+#define INT_ASM_OP ".long"
/* This is the pseudo-op used to generate a contiguous sequence of byte
values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
@@ -335,9 +338,9 @@ do { \
#define USE_CONST_SECTION 1
-#define CONST_SECTION_ASM_OP "\t.section\t.rodata"
-#define CTORS_SECTION_ASM_OP "\t.section\t.ctors,\"a\",@progbits\n"
-#define DTORS_SECTION_ASM_OP "\t.section\t.dtors,\"a\",@progbits\n"
+#define CONST_SECTION_ASM_OP ".section\t.rodata"
+#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"a\",@progbits"
+#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"a\",@progbits"
/* On svr4, we *do* have support for the .init section, and we can put
stuff in there to be executed before `main'. We let crtstuff.c and
@@ -345,7 +348,7 @@ do { \
says how to change sections to the .init section. This is the same
for all know svr4 assemblers. */
-#define INIT_SECTION_ASM_OP "\t.section\t.init"
+#define INIT_SECTION_ASM_OP ".section\t.init"
/* A default list of other sections which we might be "in" at any given
time. For targets that use additional sections (e.g. .tdesc) you
@@ -409,7 +412,7 @@ dtors_section () \
#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
do { \
ctors_section (); \
- fprintf (FILE, "%s\t ", INT_ASM_OP); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
assemble_name (FILE, NAME); \
fprintf (FILE, "\n"); \
} while (0)
@@ -419,7 +422,7 @@ dtors_section () \
#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
do { \
dtors_section (); \
- fprintf (FILE, "%s\t ", INT_ASM_OP); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
assemble_name (FILE, NAME); \
fprintf (FILE, "\n"); \
} while (0)
@@ -465,8 +468,8 @@ dtors_section () \
different pseudo-op names for these, they may be overridden in the
file which includes this one. */
-#define TYPE_ASM_OP "\t.type"
-#define SIZE_ASM_OP "\t.size"
+#define TYPE_ASM_OP ".type"
+#define SIZE_ASM_OP ".size"
/* The following macro defines the format used to output the second
operand of the .type assembler directive. Different svr4 assemblers
@@ -484,7 +487,7 @@ dtors_section () \
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
do { \
- fprintf (FILE, "%s\t ", TYPE_ASM_OP); \
+ fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
assemble_name (FILE, NAME); \
putc (',', FILE); \
fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
@@ -496,14 +499,14 @@ dtors_section () \
#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
do { \
- fprintf (FILE, "%s\t ", TYPE_ASM_OP); \
+ fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
assemble_name (FILE, NAME); \
putc (',', FILE); \
fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
putc ('\n', FILE); \
if (!flag_inhibit_size_directive) \
{ \
- fprintf (FILE, "%s\t ", SIZE_ASM_OP); \
+ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
assemble_name (FILE, NAME); \
fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (decl))); \
} \
@@ -521,7 +524,7 @@ dtors_section () \
labelno++; \
ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
- fprintf (FILE, "%s\t ", SIZE_ASM_OP); \
+ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
assemble_name (FILE, (FNAME)); \
fprintf (FILE, ","); \
assemble_name (FILE, label); \
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 433c67826de..16eda227e47 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -124,6 +124,13 @@ static int cross_compile = 0;
static struct obstack obstack;
+/* This is the obstack to build an environment variable to pass to
+ collect2 that describes all of the relavant switches of what to
+ pass the compiler in building the list of pointers to constructors
+ and destructors. */
+
+static struct obstack collect_obstack;
+
extern char *version_string;
static void set_spec ();
@@ -237,6 +244,8 @@ or with constant text in a single argument.
%{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
%{.S:X} substitutes X, but only if processing a file with suffix S.
%{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
+ %(Spec) processes a specification defined in a specs file as *Spec:
+ %[Spec] as above, but put __ around -D arguments
The conditional text X in a %{S:X} or %{!S:X} construct may contain
other nested % constructs or spaces, or even newlines. They are
@@ -352,7 +361,7 @@ static char *switches_need_spaces = SWITCHES_NEED_SPACES;
#ifndef WORD_SWITCH_TAKES_ARG
#define WORD_SWITCH_TAKES_ARG(STR) \
(!strcmp (STR, "Tdata") || !strcmp (STR, "include") \
- || !strcmp (STR, "imacros"))
+ || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info"))
#endif
/* Record the mapping from file suffixes for compilation specs. */
@@ -399,6 +408,7 @@ static struct compiler default_compilers[] =
%{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a}\
%{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
%{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
+ %{aux-info*}\
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
@@ -431,6 +441,7 @@ static struct compiler default_compilers[] =
%{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
%{traditional} %{v:-version} %{pg:-p} %{p} %{f*} \
-lang-objc %{gen-decls} \
+ %{aux-info*}\
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
@@ -465,6 +476,7 @@ static struct compiler default_compilers[] =
%{!Q:-quiet} -dumpbase %b.cc %{d*} %{m*} %{a}\
%{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} %{traditional}\
%{v:-version} %{pg:-p} %{p} %{f*}\
+ %{aux-info*}\
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
@@ -475,6 +487,7 @@ static struct compiler default_compilers[] =
"cc1 %i %1 %{!Q:-quiet} %{d*} %{m*} %{a}\
%{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} %{traditional}\
%{v:-version} %{pg:-p} %{p} %{f*}\
+ %{aux-info*}\
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
@@ -484,6 +497,7 @@ static struct compiler default_compilers[] =
"cc1plus %i %1 %2 %{!Q:-quiet} %{d*} %{m*} %{a}\
%{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} %{traditional}\
%{v:-version} %{pg:-p} %{p} %{f*}\
+ %{aux-info*}\
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
@@ -528,7 +542,7 @@ static char *link_command_spec = "\
/* Use -l and have the linker do the search. */
static char *link_command_spec = "\
%{!c:%{!M:%{!MM:%{!E:%{!S:ld %X %l %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
- %{r} %{T*} %{t} %{x} %{z}\
+ %{r} %{s} %{T*} %{t} %{x} %{z}\
%{!A:%{!nostdlib:%S}} \
%{L*} %D %o %{!nostdlib:-lgcc %L -lgcc %{!A:%E}}\n }}}}}";
#endif
@@ -620,7 +634,6 @@ read_specs (filename)
else if (in[0] == '#')
{
while (*in && *in != '\n') in++;
- if (*in) in++;
}
else
*out++ = *in++;
@@ -678,7 +691,7 @@ skip_whitespace (p)
}
/* Structure to keep track of the specs that have been defined so far. These
- are accessed using %Sspecname in a compiler or link spec. */
+ are accessed using %(specname) or %[specname] in a compiler or link spec. */
struct spec_list
{
@@ -1046,6 +1059,103 @@ choose_temp_base ()
temp_filename_length = strlen (temp_filename);
}
+
+/* Routine to add variables to the environment. We do this to pass
+ the pathname of the gcc driver, and the directories search to the
+ collect2 program, which is being run as ld. This way, we can be
+ sure of executing the right compiler when collect2 wants to build
+ constructors and destructors. Since the environment variables we
+ use come from an obstack, we don't have to worry about allocating
+ space for them. */
+
+#ifndef HAVE_PUTENV
+
+putenv (str)
+ char *str;
+{
+#ifndef __MSDOS__ /* not sure about MS/DOS */
+#ifndef VMS /* nor about VMS */
+
+ extern char **environ;
+ char **old_environ = environ;
+ char **envp;
+ int num_envs = 0;
+ int name_len = 1;
+ int str_len = strlen (str);
+ char *p = str;
+ int ch;
+
+ while ((ch = *p++) != '\0' && ch != '=')
+ name_len++;
+
+ if (!ch)
+ abort ();
+
+ /* Search for replacing an existing environment variable, and
+ count the number of total environment variables. */
+ for (envp = old_environ; *envp; envp++)
+ {
+ num_envs++;
+ if (!strncmp (str, *envp, name_len))
+ {
+ *envp = str;
+ return;
+ }
+ }
+
+ /* Add a new environment variable */
+ environ = (char **) xmalloc (sizeof (char *) * (num_envs+2));
+ *environ = str;
+ bcopy (old_environ, environ+1, sizeof (char *) * (num_envs+1));
+
+#endif /* VMS */
+#endif /* __MSDOS__ */
+}
+
+#endif /* HAVE_PUTENV */
+
+
+/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables for collect. */
+
+static void
+putenv_from_prefixes (paths, env_var)
+ struct path_prefix *paths;
+ char *env_var;
+{
+ int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
+ int first_time = TRUE;
+ struct prefix_list *pprefix;
+
+ obstack_grow (&collect_obstack, env_var, strlen (env_var));
+
+ for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
+ {
+ int len = strlen (pprefix->prefix);
+
+ if (machine_suffix)
+ {
+ if (!first_time)
+ obstack_grow (&collect_obstack, ":", 1);
+
+ first_time = FALSE;
+ obstack_grow (&collect_obstack, pprefix->prefix, len);
+ obstack_grow (&collect_obstack, machine_suffix, suffix_len);
+ }
+
+ if (!pprefix->require_machine_suffix)
+ {
+ if (!first_time)
+ obstack_grow (&collect_obstack, ":", 1);
+
+ first_time = FALSE;
+ obstack_grow (&collect_obstack, pprefix->prefix, len);
+ }
+ }
+ obstack_grow (&collect_obstack, "\0", 1);
+ putenv (obstack_finish (&collect_obstack));
+}
+
+
/* Search for NAME using the prefix list PREFIXES. MODE is passed to
access to check permissions.
Return 0 if not found, otherwise return its name, allocated with malloc. */
@@ -1427,7 +1537,7 @@ execute ()
/* If -v, print what we are about to do, and maybe query. */
- if (verbose_flag || save_temps_flag)
+ if (verbose_flag)
{
/* Print each piped command as a separate line. */
for (i = 0; i < n_commands ; i++)
@@ -2508,6 +2618,10 @@ do_spec_1 (spec, inswitch, soft_matched_part)
do_spec_1 (buf, 0, NULL);
}
}
+
+ /* Discard the closing paren or bracket. */
+ if (*p)
+ p++;
}
break;
@@ -2622,7 +2736,7 @@ handle_braces (p)
/* First see whether we have %*. */
substitution = 0;
- while (*r && *r == '}')
+ while (r < q)
{
if (*r == '%' && r[1] == '*')
substitution = 1;
@@ -2828,6 +2942,13 @@ main (argc, argv)
obstack_init (&obstack);
+ /* Set up to remember the pathname of gcc and any options
+ needed for collect. */
+ obstack_init (&collect_obstack);
+ obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
+ obstack_grow (&collect_obstack, programname, strlen (programname)+1);
+ putenv (obstack_finish (&collect_obstack));
+
/* Choose directory for temp files. */
choose_temp_base ();
@@ -2983,6 +3104,40 @@ main (argc, argv)
if (error_count == 0)
{
int tmp = execution_count;
+ int i;
+ int first_time;
+
+ /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
+ for collect. */
+ putenv_from_prefixes (&exec_prefix, "COMPILER_PATH=");
+ putenv_from_prefixes (&startfile_prefix, "LIBRARY_PATH=");
+
+ /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
+ the compiler. */
+ obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
+ sizeof ("COLLECT_GCC_OPTIONS=")-1);
+
+ first_time = TRUE;
+ for (i = 0; i < n_switches; i++)
+ {
+ char **args;
+ if (!first_time)
+ obstack_grow (&collect_obstack, " ", 1);
+
+ first_time = FALSE;
+ obstack_grow (&collect_obstack, "-", 1);
+ obstack_grow (&collect_obstack, switches[i].part1,
+ strlen (switches[i].part1));
+
+ for (args = switches[i].args; args && *args; args++)
+ {
+ obstack_grow (&collect_obstack, " ", 1);
+ obstack_grow (&collect_obstack, *args, strlen (*args));
+ }
+ }
+ obstack_grow (&collect_obstack, "\0", 1);
+ putenv (obstack_finish (&collect_obstack));
+
value = do_spec (link_command_spec);
if (value < 0)
error_count = 1;
@@ -3236,6 +3391,7 @@ validate_all_switches ()
struct compiler *comp;
register char *p;
register char c;
+ struct spec_list *spec;
for (comp = compilers; comp->spec; comp++)
{
@@ -3246,6 +3402,16 @@ validate_all_switches ()
validate_switches (p + 1);
}
+ /* look through the linked list of extra specs read from the specs file */
+ for (spec = specs ; spec ; spec = spec->next)
+ {
+ p = spec->spec;
+ while (c = *p++)
+ if (c == '%' && *p == '{')
+ /* We have a switch spec. */
+ validate_switches (p + 1);
+ }
+
p = link_command_spec;
while (c = *p++)
if (c == '%' && *p == '{')
OpenPOWER on IntegriCloud