This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch]: support of VMS module include files
- From: Tristan Gingold <gingold at adacore dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Mon, 7 Nov 2011 15:25:06 +0100
- Subject: [patch]: support of VMS module include files
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.
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. */