aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2004-09-16 06:49:59 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2004-09-15 23:49:59 -0700
commit3dd53121bd70fdcc8eb33cb4639eb9272c2b930f (patch)
treeeea8e6b301cfcc78ad08dad2ffb1c0dc3348acdd
parent511bbc8f91882da77dfb2026bbed3ee94df4f731 (diff)
downloadgcc-3dd53121bd70fdcc8eb33cb4639eb9272c2b930f.zip
gcc-3dd53121bd70fdcc8eb33cb4639eb9272c2b930f.tar.gz
gcc-3dd53121bd70fdcc8eb33cb4639eb9272c2b930f.tar.bz2
re PR libobjc/11572 (GNU libobjc no longer compiled on Darwin)
2004-09-15 Andrew Pinski <pinskia@physics.uc.edu> PR target/11572 * c-incpath.h (target_c_incpath_s): Add extra_pre_includes. Add two parameters to extra_includes. (C_INCPATH_INIT): Remove. * c-incpath.c (register_include_chains): Call extra_pre_includes before adding the standard include directory. Update call to extra_includes. (!defined TARGET_EXTRA_INCLUDES): Update hook_void_charptr_charptr_int and add !define TARGET_EXTRA_PRE_INCLUDES. (!define TARGET_EXTRA_INCLUDES): Define as hook_void_charptr_charptr_int. (!define TARGET_EXTRA_PRE_INCLUDES): Likewise. (target_c_incpath): Always declare. * fixinclude.c (defined TARGET_EXTRA_INCLUDES): Declare a empty function. (define TARGET_EXTRA_PRE_INCLUDES): Likewise. * config/darwin.h: (darwin_register_frameworks): Update for the two new parameters. (darwin_register_objc_includes): Add prototype. (TARGET_EXTRA_PRE_INCLUDES): Define. * config/darwin-c.c (darwin_register_objc_includes): New function. (darwin_register_frameworks): Update for the two new parameters. (target_c_incpath): Remove. * config/t-darwin (darwin-c.o): Add $(PREPROCESSOR_DEFINES) to the compile line. * doc/tm.texi (TARGET_EXTRA_INCLUDES): Document the two new parameters. (TARGET_EXTRA_PRE_INCLUDES): Document. * gcc.c (spec_function): Add replace-outfile. (replace_outfile_spec_function): New function. * config/darwin.h (LINK_SPEC): Add replace -lobjc with -lobjc-gnu if -fgnu-runtime is supplied. * invoke.texi (replace-outfile): Document. From-SVN: r87588
-rw-r--r--gcc/ChangeLog39
-rw-r--r--gcc/c-incpath.c21
-rw-r--r--gcc/c-incpath.h5
-rw-r--r--gcc/config/darwin-c.c48
-rw-r--r--gcc/config/darwin.h5
-rw-r--r--gcc/config/t-darwin2
-rw-r--r--gcc/doc/invoke.texi10
-rw-r--r--gcc/doc/tm.texi13
-rw-r--r--gcc/fix-header.c14
-rw-r--r--gcc/gcc.c23
10 files changed, 164 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8649f2e..34f011a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,42 @@
+2004-09-15 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR target/11572
+ * c-incpath.h (target_c_incpath_s): Add extra_pre_includes.
+ Add two parameters to extra_includes.
+ (C_INCPATH_INIT): Remove.
+ * c-incpath.c (register_include_chains): Call extra_pre_includes
+ before adding the standard include directory.
+ Update call to extra_includes.
+ (!defined TARGET_EXTRA_INCLUDES): Update
+ hook_void_charptr_charptr_int and add !define
+ TARGET_EXTRA_PRE_INCLUDES.
+ (!define TARGET_EXTRA_INCLUDES): Define as
+ hook_void_charptr_charptr_int.
+ (!define TARGET_EXTRA_PRE_INCLUDES): Likewise.
+ (target_c_incpath): Always declare.
+ * fixinclude.c (defined TARGET_EXTRA_INCLUDES): Declare a
+ empty function.
+ (define TARGET_EXTRA_PRE_INCLUDES): Likewise.
+ * config/darwin.h: (darwin_register_frameworks): Update for
+ the two new parameters.
+ (darwin_register_objc_includes): Add prototype.
+ (TARGET_EXTRA_PRE_INCLUDES): Define.
+ * config/darwin-c.c (darwin_register_objc_includes): New function.
+ (darwin_register_frameworks): Update for the two new parameters.
+ (target_c_incpath): Remove.
+ * config/t-darwin (darwin-c.o): Add $(PREPROCESSOR_DEFINES) to
+ the compile line.
+ * doc/tm.texi (TARGET_EXTRA_INCLUDES): Document the two new
+ parameters.
+ (TARGET_EXTRA_PRE_INCLUDES): Document.
+
+ * gcc.c (spec_function): Add replace-outfile.
+ (replace_outfile_spec_function): New function.
+ * config/darwin.h (LINK_SPEC): Add replace
+ -lobjc with -lobjc-gnu if -fgnu-runtime is
+ supplied.
+ * invoke.texi (replace-outfile): Document.
+
2004-09-13 Jan Hubicka <jh@suse.cz>
* predict.c (expr_expected_value, strip_builtin_expect): New function.
diff --git a/gcc/c-incpath.c b/gcc/c-incpath.c
index 1a985f9..4fd1b13 100644
--- a/gcc/c-incpath.c
+++ b/gcc/c-incpath.c
@@ -372,21 +372,34 @@ register_include_chains (cpp_reader *pfile, const char *sysroot,
include chain. */
add_env_var_paths ("CPATH", BRACKET);
add_env_var_paths (lang_env_vars[idx], SYSTEM);
+
+ target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc);
/* Finally chain on the standard directories. */
if (stdinc)
add_standard_paths (sysroot, iprefix, cxx_stdinc);
- target_c_incpath.extra_includes (stdinc);
+ target_c_incpath.extra_includes (sysroot, iprefix, stdinc);
merge_include_chains (pfile, verbose);
cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET],
quote_ignores_source_dir);
}
+#if !(defined TARGET_EXTRA_INCLUDES) || !(defined TARGET_EXTRA_PRE_INCLUDES)
+static void hook_void_charptr_charptr_int (const char *sysroot ATTRIBUTE_UNUSED,
+ const char *iprefix ATTRIBUTE_UNUSED,
+ int stdinc ATTRIBUTE_UNUSED)
+{
+}
+#endif
#ifndef TARGET_EXTRA_INCLUDES
-static void hook_void_int(int u ATTRIBUTE_UNUSED) { }
-
-struct target_c_incpath_s target_c_incpath = { hook_void_int };
+#define TARGET_EXTRA_INCLUDES hook_void_charptr_charptr_int
#endif
+#ifndef TARGET_EXTRA_PRE_INCLUDES
+#define TARGET_EXTRA_PRE_INCLUDES hook_void_charptr_charptr_int
+#endif
+
+struct target_c_incpath_s target_c_incpath = { TARGET_EXTRA_PRE_INCLUDES, TARGET_EXTRA_INCLUDES };
+
diff --git a/gcc/c-incpath.h b/gcc/c-incpath.h
index 1096016..cc261a6 100644
--- a/gcc/c-incpath.h
+++ b/gcc/c-incpath.h
@@ -23,11 +23,10 @@ extern void add_cpp_dir_path (struct cpp_dir *, int);
struct target_c_incpath_s {
/* Do extra includes processing. STDINC is false iff -nostdinc was given. */
- void (*extra_includes) (int);
+ void (*extra_pre_includes) (const char *, const char *, int);
+ void (*extra_includes) (const char *, const char *, int);
};
extern struct target_c_incpath_s target_c_incpath;
-#define C_INCPATH_INIT { TARGET_EXTRA_INCLUDES }
-
enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
diff --git a/gcc/config/darwin-c.c b/gcc/config/darwin-c.c
index 9adf249..d7f3e01 100644
--- a/gcc/config/darwin-c.c
+++ b/gcc/config/darwin-c.c
@@ -30,6 +30,8 @@ Boston, MA 02111-1307, USA. */
#include "c-incpath.h"
#include "toplev.h"
#include "tm_p.h"
+#include "cppdefault.h"
+#include "prefix.h"
/* Pragmas. */
@@ -419,13 +421,55 @@ static const char *framework_defaults [] =
"/Library/Frameworks",
};
+/* Register the GNU objective-C runtime include path if STDINC. */
+
+void
+darwin_register_objc_includes (const char *sysroot, const char *iprefix,
+ int stdinc)
+{
+ const char *fname;
+ size_t len;
+ /* We do not do anything if we do not want the standard includes. */
+ if (!stdinc)
+ return;
+
+ fname = GCC_INCLUDE_DIR "-gnu-runtime";
+
+ /* Register the GNU OBJC runtime include path if we are compiling OBJC
+ with GNU-runtime. */
+
+ if (c_dialect_objc () && !flag_next_runtime)
+ {
+ char *str;
+ /* See if our directory starts with the standard prefix.
+ "Translate" them, ie. replace /usr/local/lib/gcc... with
+ IPREFIX and search them first. */
+ if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0 && !sysroot
+ && !strncmp (fname, cpp_GCC_INCLUDE_DIR, len))
+ {
+ str = concat (iprefix, fname + len, NULL);
+ /* FIXME: wrap the headers for C++awareness. */
+ add_path (str, SYSTEM, /*c++aware=*/false, false);
+ }
+
+ /* Should this directory start with the sysroot? */
+ if (sysroot)
+ str = concat (sysroot, fname, NULL);
+ else
+ str = update_path (fname, "");
+
+ add_path (str, SYSTEM, /*c++aware=*/false, false);
+ }
+}
+
/* Register all the system framework paths if STDINC is true and setup
the missing_header callback for subframework searching if any
frameworks had been registered. */
void
-darwin_register_frameworks (int stdinc)
+darwin_register_frameworks (const char *sysroot ATTRIBUTE_UNUSED,
+ const char *iprefix ATTRIBUTE_UNUSED, int stdinc)
{
if (stdinc)
{
@@ -476,5 +520,3 @@ find_subframework_header (cpp_reader *pfile, const char *header, cpp_dir **dirp)
return 0;
}
-
-struct target_c_incpath_s target_c_incpath = C_INCPATH_INIT;
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index a89976e..0fd8473 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -238,6 +238,7 @@ extern const char *darwin_fix_and_continue_switch;
their names so all of them get passed. */
#define LINK_SPEC \
"%{static}%{!static:-dynamic} \
+ %{fgnu-runtime:%:replace-outfile(-lobjc -lobjc-gnu)}\
%{!Zdynamiclib: \
%{Zbundle:-bundle} \
%{Zbundle_loader*:-bundle_loader %*} \
@@ -962,7 +963,9 @@ enum machopic_addr_class {
#undef ASM_APP_OFF
#define ASM_APP_OFF ""
-void darwin_register_frameworks (int);
+void darwin_register_frameworks (const char *, const char *, int);
+void darwin_register_objc_includes (const char *, const char *, int);
+#define TARGET_EXTRA_PRE_INCLUDES darwin_register_objc_includes
#define TARGET_EXTRA_INCLUDES darwin_register_frameworks
void add_framework_path (char *);
diff --git a/gcc/config/t-darwin b/gcc/config/t-darwin
index fcc81ed..ab2e6ae 100644
--- a/gcc/config/t-darwin
+++ b/gcc/config/t-darwin
@@ -7,7 +7,7 @@ darwin.o: $(srcdir)/config/darwin.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
darwin-c.o: $(srcdir)/config/darwin-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(CPPLIB_H) tree.h c-pragma.h $(C_TREE_H) toplev.h $(TM_P_H) \
c-incpath.h
- $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/darwin-c.c
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/config/darwin-c.c $(PREPROCESSOR_DEFINES)
gt-darwin.h : s-gtype ; @true
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 7d473f6..b172cd3 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -6361,6 +6361,16 @@ based on the existence of the first. Here is a small example of its usage:
crt0%O%s %:if-exists(crti%O%s) \
%:if-exists-else(crtbeginT%O%s crtbegin%O%s)
@end smallexample
+
+@item @code{replace-outfile}
+The @code{replace-outfile} spec function takes two arguments. It looks for the
+first argument in the outfiles array and replaces it with the second argument. Here
+is a small example of its usage:
+
+@smallexample
+%@{fgnu-runtime:%:replace-outfile(-lobjc -lobjc-gnu)@}
+@end smallexample
+
@end table
@item %@{@code{S}@}
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 1b3d466..f0132e0 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -9370,10 +9370,19 @@ system library's @code{pow}, @code{powf} or @code{powl} routines.
The default value places no upper bound on the multiplication count.
@end defmac
-@deftypefn Macro void TARGET_EXTRA_INCLUDES (int @var{stdinc})
+@deftypefn Macro void TARGET_EXTRA_INCLUDES (const char *@var{sysroot}, const char *@var{iprefix}, int @var{stdinc})
This target hook should register any extra include files for the
target. The parameter @var{stdinc} indicates if normal include files
-are present.
+are present. The parameter @var{sysroot} is the system root directory.
+The parameter @var{iprefix} is the prefix for the gcc directory.
+@end deftypefn
+
+@deftypefn Macro void TARGET_EXTRA_PRE_INCLUDES (const char *@var{sysroot}, const char *@var{iprefix}, int @var{stdinc})
+This target hook should register any extra include files for the
+target before any standard headers. The parameter @var{stdinc}
+indicates if normal include files are present. The parameter
+@var{sysroot} is the system root directory. The parameter
+@var{iprefix} is the prefix for the gcc directory.
@end deftypefn
@deftypefn Macro void TARGET_OPTF (char *@var{path})
diff --git a/gcc/fix-header.c b/gcc/fix-header.c
index 9bd79d4..4e4c8dc 100644
--- a/gcc/fix-header.c
+++ b/gcc/fix-header.c
@@ -82,9 +82,19 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "errors.h"
#ifdef TARGET_EXTRA_INCLUDES
-static void hook_void_int(int u ATTRIBUTE_UNUSED) { }
+void TARGET_EXTRA_INCLUDES (const char *sysroot ATTRIBUTE_UNUSED,
+ const char *iprefix ATTRIBUTE_UNUSED,
+ int stdinc ATTRIBUTE_UNUSED)
+{
+}
+#endif
-struct target_c_incpath_s target_c_incpath = { hook_void_int };
+#ifdef TARGET_EXTRA_PRE_INCLUDES
+void TARGET_EXTRA_PRE_INCLUDES (const char *sysroot ATTRIBUTE_UNUSED,
+ const char *iprefix ATTRIBUTE_UNUSED,
+ int stdinc ATTRIBUTE_UNUSED)
+{
+}
#endif
struct line_maps line_table;
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 45a9ab4..6e7dec9 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -361,6 +361,7 @@ static const char *convert_filename (const char *, int, int);
static const char *if_exists_spec_function (int, const char **);
static const char *if_exists_else_spec_function (int, const char **);
+static const char *replace_outfile_spec_function (int, const char **);
/* The Specs Language
@@ -1572,6 +1573,7 @@ static const struct spec_function static_spec_functions[] =
{
{ "if-exists", if_exists_spec_function },
{ "if-exists-else", if_exists_else_spec_function },
+ { "replace-outfile", replace_outfile_spec_function },
{ 0, 0 }
};
@@ -7582,3 +7584,24 @@ if_exists_else_spec_function (int argc, const char **argv)
return argv[1];
}
+
+/* replace-outfile built-in spec function.
+ This looks for the first argument in the outfiles array's name and replaces it
+ with the second argument. */
+
+static const char *
+replace_outfile_spec_function (int argc, const char **argv)
+{
+ int i;
+ /* Must have exactly two arguments. */
+ if (argc != 2)
+ abort ();
+
+ for (i = 0; i < n_infiles; i++)
+ {
+ if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
+ outfiles[i] = xstrdup (argv[1]);
+ }
+ return NULL;
+}
+