diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a8abc40bab735e2b7bc59ee4d8ab2a81b9684660..62854cdae1c78abc2e318ad536370acffb1ef904 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-11-24  Devang Patel  <dpatel@apple.com>
+
+	PR/18555
+	* gcc.h (DEFAULT_WORD_SWITCH_TAKES_ARG): Add isysroot.
+	* config/darwin-c.c (darwin_register_frameworks): Use sysroot.
+
 2004-11-24  Devang Patel  <dpatel@apple.com>
 
 	* gcc.c (process_command): Supply -v to linker.
diff --git a/gcc/config/darwin-c.c b/gcc/config/darwin-c.c
index 167b7958c84d231a0cf0ead4d2917d79d3f767d2..feb26f185d297721401cb8b1f7894a4aa63963ba 100644
--- a/gcc/config/darwin-c.c
+++ b/gcc/config/darwin-c.c
@@ -468,7 +468,7 @@ darwin_register_objc_includes (const char *sysroot, const char *iprefix,
    frameworks had been registered.  */
 
 void
-darwin_register_frameworks (const char *sysroot ATTRIBUTE_UNUSED,
+darwin_register_frameworks (const char *sysroot,
 			    const char *iprefix ATTRIBUTE_UNUSED, int stdinc)
 {
   if (stdinc)
@@ -478,8 +478,13 @@ darwin_register_frameworks (const char *sysroot ATTRIBUTE_UNUSED,
       /* Setup default search path for frameworks.  */
       for (i=0; i<sizeof (framework_defaults)/sizeof(const char *); ++i)
 	{
+	  char *str;
+	  if (sysroot)
+	    str = concat (sysroot, xstrdup (framework_defaults [i]), NULL);
+	  else
+	    str = xstrdup (framework_defaults[i]);
 	  /* System Framework headers are cxx aware.  */
-	  add_system_framework_path (xstrdup (framework_defaults[i]));
+	  add_system_framework_path (str);
 	}
     }
 
diff --git a/gcc/gcc.h b/gcc/gcc.h
index d29af91001cbbdf6009ed7fb3997f1f35d1aa0c2..6c3c9829cbcee4afe15de6c15a46ad0b3ed036f1 100644
--- a/gcc/gcc.h
+++ b/gcc/gcc.h
@@ -49,6 +49,7 @@ struct spec_function
   || !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
   || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
   || !strcmp (STR, "iquote") || !strcmp (STR, "isystem") \
+  || !strcmp (STR, "isysroot") \
   || !strcmp (STR, "-param") || !strcmp (STR, "specs") \
   || !strcmp (STR, "MF") || !strcmp (STR, "MT") || !strcmp (STR, "MQ"))
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6a98976fcf6c7e3ea80af6eaf1154e5fcab94df0..cb68c281d2283567dacf44d17bf8353a30e3cb99 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2004-11-24  Devang Patel  <dpatel@apple.com>
+
+	PR/18555
+	* gcc.dg/cpp/isysroot-1.c: New test.
+	* gcc.dg/cpp/usr/include/stdio.h: New file.
+	* gcc.dg/cpp/isysroot-2.c: New test.
+	* gcc.dg/cpp/System/Library/Framework/Carbon.framework/Headers/Carbon.h:
+	New file.
+
 2004-11-24  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
 
 	PR c++/8929
diff --git a/gcc/testsuite/gcc.dg/cpp/System/Library/Frameworks/Carbon.framework/Headers/Carbon.h b/gcc/testsuite/gcc.dg/cpp/System/Library/Frameworks/Carbon.framework/Headers/Carbon.h
new file mode 100644
index 0000000000000000000000000000000000000000..4259c3718faecadbb7687b68fdfe7e12a8c33d15
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/System/Library/Frameworks/Carbon.framework/Headers/Carbon.h
@@ -0,0 +1,4 @@
+/* Used by gcc.dg/cpp/isysroot-2.c to test isysroot.  */
+void foo()
+{
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/isysroot-1.c b/gcc/testsuite/gcc.dg/cpp/isysroot-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..bfbf25565e518060d9fdd7056eef3802d3b51b6f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/isysroot-1.c
@@ -0,0 +1,10 @@
+/* { dg-options "-isysroot ${srcdir}/gcc.dg/cpp" } */
+/* { dg-do compile } */
+
+#include <stdio.h>
+int main()
+{
+  /* Special stdio.h supplies function foo.  */
+  void (*x)(void) = foo;
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/isysroot-2.c b/gcc/testsuite/gcc.dg/cpp/isysroot-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a32618c25123b98e662d715d15ac50ee0344234a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/isysroot-2.c
@@ -0,0 +1,10 @@
+/* { dg-options "-isysroot ${srcdir}/gcc.dg/cpp" { target *-*-darwin* } } */
+/* { dg-do compile } */
+
+#include <Carbon/Carbon.h>
+int main()
+{
+  /* Special Carbon.h supplies function foo.  */
+  void (*x)(void) = foo;
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/cpp/usr/include/stdio.h b/gcc/testsuite/gcc.dg/cpp/usr/include/stdio.h
new file mode 100644
index 0000000000000000000000000000000000000000..c674e89f7ef7e65f0af68efd1af6ef0f6653a512
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/usr/include/stdio.h
@@ -0,0 +1,4 @@
+/* Used by gcc.dg/cpp/isysroot-1.c to test isysroot.  */
+void foo()
+{
+}