Patchwork : support of VMS module include files

login
register
mail settings
Submitter Tristan Gingold
Date Nov. 7, 2011, 2:25 p.m.
Message ID <A17422A4-12A8-4C9E-AC5F-3EABF76A5C72@adacore.com>
Download mbox | patch
Permalink /patch/124089/
State New
Headers show

Comments

Tristan Gingold - Nov. 7, 2011, 2:25 p.m.
Hi,

on VMS systems, the header files are in fact members of text library files.  Obviously, we don't want to support such a weirdness in GCC, and we require that the user unpack the header libraries.

However, it is still a good idea to keep each header library in a subdirectory.

There are 2 system header libraries that are added by default on VMS: rtldef (the ANSI headers), and starlet_c (the OS headers).

With this patch, these two directories are search in the include path and added if found.  This is mostly a VMS specific patch, except I needed to add a function to get include pathes.

Tested by cross compiling for alpha-vms and ia64-vms.

Ok for trunk ?

Tristan.

2011-11-07  Tristan Gingold  <gingold@adacore.com>

        * incpath.c (get_added_cpp_dirs): New function.
        * incpath.h (get_added_cpp_dirs): Declare.
        * config/vms/vms-c.c (vms_c_register_includes): New function.
        (vms_std_modules): New variable.
        * config/vms/vms.h (TARGET_EXTRA_INCLUDES): Define.
        (vms_c_register_includes): Declare.
Joseph S. Myers - Nov. 9, 2011, 8:07 p.m.
On Mon, 7 Nov 2011, Tristan Gingold wrote:

> With this patch, these two directories are search in the include path 
> and added if found.  This is mostly a VMS specific patch, except I 
> needed to add a function to get include pathes.
> 
> Tested by cross compiling for alpha-vms and ia64-vms.
> 
> Ok for trunk ?

The incpath.[ch] changes are OK.

Patch

diff --git a/gcc/config/vms/vms-c.c b/gcc/config/vms/vms-c.c
index 19291b6..b3e0d95 100644
--- a/gcc/config/vms/vms-c.c
+++ b/gcc/config/vms/vms-c.c
@@ -283,3 +283,50 @@  vms_c_register_pragma (void)
   c_register_pragma (NULL, "__message", vms_pragma_message);
   c_register_pragma (NULL, "__extern_prefix", vms_pragma_extern_prefix);
 }
+
+/* Standard modules list.  */
+static const char * const vms_std_modules[] = { "rtldef", "starlet_c", NULL };
+
+/* Find include modules in the include path.  */
+
+void
+vms_c_register_includes (const char *sysroot,
+                         const char *iprefix ATTRIBUTE_UNUSED, int stdinc)
+{
+  static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
+  struct cpp_dir *dir;
+
+  /* Add on standard include pathes.  */
+  if (!stdinc)
+    return;
+
+  for (dir = get_added_cpp_dirs (SYSTEM); dir != NULL; dir = dir->next)
+    {
+      const char * const *lib;
+      for (lib = vms_std_modules; *lib != NULL; lib++)
+        {
+          char *path;
+          struct stat st;
+
+          if (sysroot != NULL)
+            path = concat (sysroot, dir->name, dir_separator_str, *lib, NULL);
+          else
+            path = concat (dir->name, dir_separator_str, *lib, NULL);
+
+          if (stat (path, &st) == 0 && S_ISDIR (st.st_mode))
+            {
+              cpp_dir *p;
+
+              p = XNEW (cpp_dir);
+              p->next = NULL;
+              p->name = path;
+              p->sysp = 1;
+              p->construct = 0;
+              p->user_supplied_p = 0;
+              add_cpp_dir_path (p, SYSTEM);
+            }
+          else
+            free (path);
+        }
+    }
+}
diff --git a/gcc/config/vms/vms.h b/gcc/config/vms/vms.h
index 0da9d85..62e8636 100644
--- a/gcc/config/vms/vms.h
+++ b/gcc/config/vms/vms.h
@@ -34,6 +34,9 @@  along with GCC; see the file COPYING3.  If not see
       }                                              \
   } while (0)
 
+extern void vms_c_register_includes (const char *, const char *, int);
+#define TARGET_EXTRA_INCLUDES vms_c_register_includes
+
 /* Tell compiler we want to support VMS pragmas */
 #define REGISTER_TARGET_PRAGMAS() vms_c_register_pragma ()
 
diff --git a/gcc/incpath.c b/gcc/incpath.c
index aab6e15..bd9999d 100644
--- a/gcc/incpath.c
+++ b/gcc/incpath.c
@@ -458,6 +458,15 @@  register_include_chains (cpp_reader *pfile, const char *sysroot,
   cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET],
 			  quote_ignores_source_dir);
 }
+
+/* Return the current chain of cpp dirs.  */
+
+struct cpp_dir *
+get_added_cpp_dirs (int chain)
+{
+  return heads[chain];
+}
+
 #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,
diff --git a/gcc/incpath.h b/gcc/incpath.h
index df5b6b1..4c647a3 100644
--- a/gcc/incpath.h
+++ b/gcc/incpath.h
@@ -22,6 +22,7 @@  extern void register_include_chains (cpp_reader *, const char *,
 				     const char *, const char *,
 				     int, int, int);
 extern void add_cpp_dir_path (struct cpp_dir *, int);
+extern struct cpp_dir *get_added_cpp_dirs (int);
 
 struct target_c_incpath_s {
   /* Do extra includes processing.  STDINC is false iff -nostdinc was given.  */