Include facility for .md files - altivec patches

Alan Matsuoka alanm@cygnus.com
Mon Nov 5 18:41:00 GMT 2001


On Mon, 05 Nov 2001, Alan Matsuoka wrote:

> On Mon, 05 Nov 2001, Aldy Hernandez wrote:
> 
> > >>>>> "Alan" == Alan Matsuoka <alanm@cygnus.com> writes:
> > 
> >  >> Do you really need this?  It looks just like the way a normal memory
> >  >> operand is printed (for the cases that are allowed for altivec).
> >  >> 
> >  >> > Index: rs6000.md
> >  >> 
> >  >> Can you put the altivec insns in their own .md file and use the include
> >  >> mechanism?  I believe this is what it was intended for.
> > 
> > Last i heard, alan matsuoka's include mechanism hadn't been approved.
> > Alan, perhaps you should send them again.  We definitely need them
> > now.
> 
> OK.
> 

The following patch is for the an internal project. This is 
implements a (include "filestuff") mechanism for splitting up 
.md files.

(include "filestuff") expects the include file to be in gcc/config/{target}/filestuff
(include "BOGUS/filestuff") expects the include file to be in gcc/config/{target}/BOGUS/filestuff
(include "/u2/BOGUS/filestuff") expects the include file to be in /u2/BOGUS/filestuff

You can also run things like genrecog -I/p1/abc/proc1 -I/p2/abcd/pro2 target.md

This is used only at build time.

This has been tested for i686-pc-linux-gnu by bootstrapping and testing without 
any regressions.

The DOS pathname style stuff may still be required.


2001-11-05  Alan Matsuoka  <alanm@redhat.com>

        * rtl.def (INCLUDE) : Define.
	* gensupport.c (init_include_reader, process_include, save_string) :  New functions to
	  implement an include facility in .md files.
	* gensupport.h : Add prototype for init_md_reader_args.
	* genattr.c genattrtab.c gencodes.c genconfig.c genemit.c
	  genextract.c genflags.c genopinit.c genoutput.c genpeep.c
	  genrecog.c: Change call to init_md_reader to init_md_reader_args.
	* md.texi: Document (include "path") and -I directives for RTL generation tools.

Index: genattr.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genattr.c,v
retrieving revision 1.45
diff -3 -c -p -r1.45 genattr.c
*** genattr.c	2001/10/07 16:50:51	1.45
--- genattr.c	2001/11/06 02:32:32
*************** main (argc, argv)
*** 210,216 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    puts ("/* Generated automatically by the program `genattr'");
--- 210,216 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    puts ("/* Generated automatically by the program `genattr'");
Index: genattrtab.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genattrtab.c,v
retrieving revision 1.103
diff -3 -c -p -r1.103 genattrtab.c
*** genattrtab.c	2001/10/21 21:32:00	1.103
--- genattrtab.c	2001/11/06 02:32:58
*************** main (argc, argv)
*** 6075,6081 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    obstack_init (hash_obstack);
--- 6075,6081 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    obstack_init (hash_obstack);
Index: gencodes.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gencodes.c,v
retrieving revision 1.42
diff -3 -c -p -r1.42 gencodes.c
*** gencodes.c	2001/08/22 14:35:16	1.42
--- gencodes.c	2001/11/06 02:32:58
*************** main (argc, argv)
*** 56,62 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    puts ("\
--- 56,62 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    puts ("\
Index: genconfig.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genconfig.c,v
retrieving revision 1.43
diff -3 -c -p -r1.43 genconfig.c
*** genconfig.c	2001/10/11 07:07:26	1.43
--- genconfig.c	2001/11/06 02:33:00
*************** main (argc, argv)
*** 277,283 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    puts ("/* Generated automatically by the program `genconfig'");
--- 277,283 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    puts ("/* Generated automatically by the program `genconfig'");
Index: genemit.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genemit.c,v
retrieving revision 1.67
diff -3 -c -p -r1.67 genemit.c
*** genemit.c	2001/10/19 19:37:08	1.67
--- genemit.c	2001/11/06 02:33:05
*************** main (argc, argv)
*** 789,795 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    /* Assign sequential codes to all entries in the machine description
--- 789,795 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    /* Assign sequential codes to all entries in the machine description
Index: genextract.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genextract.c,v
retrieving revision 1.46
diff -3 -c -p -r1.46 genextract.c
*** genextract.c	2001/10/11 03:15:42	1.46
--- genextract.c	2001/11/06 02:33:07
*************** main (argc, argv)
*** 362,368 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    /* Assign sequential codes to all entries in the machine description
--- 362,368 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    /* Assign sequential codes to all entries in the machine description
Index: genflags.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genflags.c,v
retrieving revision 1.39
diff -3 -c -p -r1.39 genflags.c
*** genflags.c	2001/10/11 03:15:42	1.39
--- genflags.c	2001/11/06 02:33:07
*************** main (argc, argv)
*** 230,236 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
    
    puts ("/* Generated automatically by the program `genflags'");
--- 230,236 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
    
    puts ("/* Generated automatically by the program `genflags'");
Index: genopinit.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genopinit.c,v
retrieving revision 1.48
diff -3 -c -p -r1.48 genopinit.c
*** genopinit.c	2001/09/13 14:37:11	1.48
--- genopinit.c	2001/11/06 02:33:07
*************** main (argc, argv)
*** 316,322 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    printf ("/* Generated automatically by the program `genopinit'\n\
--- 316,322 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    printf ("/* Generated automatically by the program `genopinit'\n\
Index: genoutput.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genoutput.c,v
retrieving revision 1.65
diff -3 -c -p -r1.65 genoutput.c
*** genoutput.c	2001/10/11 03:15:42	1.65
--- genoutput.c	2001/11/06 02:33:10
*************** main (argc, argv)
*** 953,959 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    output_prologue ();
--- 953,959 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    output_prologue ();
Index: genpeep.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genpeep.c,v
retrieving revision 1.49
diff -3 -c -p -r1.49 genpeep.c
*** genpeep.c	2001/10/11 03:15:43	1.49
--- genpeep.c	2001/11/06 02:33:14
*************** main (argc, argv)
*** 385,391 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    printf ("/* Generated automatically by the program `genpeep'\n\
--- 385,391 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    printf ("/* Generated automatically by the program `genpeep'\n\
Index: genrecog.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/genrecog.c,v
retrieving revision 1.111
diff -3 -c -p -r1.111 genrecog.c
*** genrecog.c	2001/10/28 20:09:14	1.111
--- genrecog.c	2001/11/06 02:33:19
*************** main (argc, argv)
*** 2689,2695 ****
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    next_insn_code = 0;
--- 2689,2695 ----
    if (argc <= 1)
      fatal ("No input file name.");
  
!   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
      return (FATAL_EXIT_CODE);
  
    next_insn_code = 0;
Index: gensupport.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gensupport.c,v
retrieving revision 1.23
diff -3 -c -p -r1.23 gensupport.c
*** gensupport.c	2001/10/25 12:55:16	1.23
--- gensupport.c	2001/11/06 02:33:20
*************** static int predicable_default;
*** 42,47 ****
--- 42,49 ----
  static const char *predicable_true;
  static const char *predicable_false;
  
+ static char *base_dir = NULL;
+ 
  /* We initially queue all patterns, process the define_insn and
     define_cond_exec patterns, then return them one at a time.  */
  
*************** static struct queue_elem *other_queue;
*** 62,67 ****
--- 64,86 ----
  static struct queue_elem **other_tail = &other_queue;
  
  static void queue_pattern PARAMS ((rtx, struct queue_elem ***, int));
+ 
+ /* Current maximum length of directory names in the search path
+    for include files.  (Altered as we get more of them.)  */
+ 
+ size_t max_include_len;
+ 
+ struct file_name_list
+   {
+     struct file_name_list *next;
+     const char *fname;
+   };
+ 
+ struct file_name_list *include = 0;     /* First dir to search */
+         /* First dir to search for <file> */
+ struct file_name_list *first_bracket_include = 0;
+ struct file_name_list *last_include = 0;        /* Last in chain */
+ 
  static void remove_constraints PARAMS ((rtx));
  static void process_rtx PARAMS ((rtx, int));
  
*************** static const char *alter_output_for_insn
*** 78,83 ****
--- 97,105 ----
  						  int, int));
  static void process_one_cond_exec PARAMS ((struct queue_elem *));
  static void process_define_cond_exec PARAMS ((void));
+ static int process_include PARAMS ((rtx, int));
+ static char *save_string PARAMS ((const char *, int));
+ static int init_include_reader PARAMS ((FILE  *));
  
  void
  message_with_line VPARAMS ((int lineno, const char *msg, ...))
*************** remove_constraints (part)
*** 157,162 ****
--- 179,320 ----
        }
  }
  
+ /* The entry point for initializing the reader.  */
+ 
+ static int
+ init_include_reader (inf)
+      FILE *inf;
+ {
+   int c;
+ 
+   errors = 0;
+ 
+   /* Read the entire file.  */
+   while (1)
+     {
+       rtx desc;
+       int lineno;
+ 
+       c = read_skip_spaces (inf);
+       if (c == EOF)
+ 	break;
+ 
+       ungetc (c, inf);
+       lineno = read_rtx_lineno;
+       desc = read_rtx (inf);
+       process_rtx (desc, lineno);
+     }
+   fclose (inf);
+ 
+   /* Process define_cond_exec patterns.  */
+   if (define_cond_exec_queue != NULL)
+     process_define_cond_exec ();
+ 
+   return errors ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;
+ }
+ 
+ /* Process an include file assuming that it lives in gcc/config/{target}/ 
+    if the include looks line (include "file" )  */
+ static int
+ process_include (desc, lineno)
+      rtx desc;
+      int lineno;
+ {
+   const char *filename = XSTR (desc, 0);
+   char *pathname = NULL;
+   FILE *input_file;
+   char *fname;
+   struct file_name_list *stackp;
+   int flen;
+ 
+   stackp = include;
+ 
+   /* If specified file name is absolute, just open it.  */
+   if (IS_ABSOLUTE_PATHNAME (filename) || !stackp)
+     {
+       if (base_dir)
+         {
+           pathname = xmalloc (strlen (base_dir) + strlen (filename) + 1);
+           pathname = strcpy (pathname, base_dir);
+           strcat (pathname, filename);
+           strcat (pathname, "\0");
+ 	}
+       else
+         {
+ 	  pathname = xstrdup (filename);
+         }
+       read_rtx_filename = pathname;
+       input_file = fopen (pathname, "r");
+ 
+       if (input_file == 0)
+ 	{
+ 	  perror (pathname);
+ 	  return FATAL_EXIT_CODE;
+ 	}
+     }
+   else if (stackp)
+     {
+ 
+       flen = strlen (filename);
+ 
+       fname = (char *) alloca (max_include_len + flen + 2);
+ 
+       /* + 2 above for slash and terminating null.  */
+ 
+       /* Search directory path, trying to open the file.
+          Copy each filename tried into FNAME.  */
+ 
+       for (; stackp; stackp = stackp->next)
+ 	{
+ 	  if (stackp->fname)
+ 	    {
+ 	      strcpy (fname, stackp->fname);
+ 	      strcat (fname, "/");
+ 	      fname[strlen (fname) + flen] = 0;
+ 	    }
+ 	  else
+ 	    {
+ 	      fname[0] = 0;
+ 	    }
+ 	  strncat (fname, (const char *) filename, flen);
+ 	  read_rtx_filename = fname;
+ 	  input_file = fopen (fname, "r");
+ 	  if (input_file != NULL) 
+ 	    break;
+ 	}
+       if (stackp == NULL)
+ 	{
+ 	  if (strchr (fname, '/') == NULL || strchr (fname, '\\' ) || base_dir)
+ 	    {
+ 	      if (base_dir)
+ 		{
+ 		  pathname =
+ 		    xmalloc (strlen (base_dir) + strlen (filename) + 1);
+ 		  pathname = strcpy (pathname, base_dir);
+ 		  strcat (pathname, filename);
+ 		  strcat (pathname, "\0");
+ 		}
+ 	      else
+ 		pathname = xstrdup (filename);
+ 	    }
+ 	  read_rtx_filename = pathname;
+ 	  input_file = fopen (pathname, "r");
+ 
+ 	  if (input_file == 0)
+ 	    {
+ 	      perror (filename);
+ 	      return FATAL_EXIT_CODE;
+ 	    }
+ 	}
+ 
+     }
+ 
+   if (init_include_reader (input_file) == FATAL_EXIT_CODE)
+     message_with_line (lineno, "read errors found in include file  %s\n", pathname);
+ 
+   return SUCCESS_EXIT_CODE;
+ }
+ 
  /* Process a top level rtx in some way, queueing as appropriate.  */
  
  static void
*************** process_rtx (desc, lineno)
*** 164,169 ****
--- 322,329 ----
       rtx desc;
       int lineno;
  {
+   const char *filename = XSTR (desc, 0);
+ 
    switch (GET_CODE (desc))
      {
      case DEFINE_INSN:
*************** process_rtx (desc, lineno)
*** 178,183 ****
--- 338,348 ----
        queue_pattern (desc, &define_attr_tail, lineno);
        break;
  
+     case INCLUDE:
+       if (process_include (desc, lineno) == FATAL_EXIT_CODE)
+         message_with_line (lineno, "include file at  %s not found\n", filename);
+       break;
+ 
      case DEFINE_INSN_AND_SPLIT:
        {
  	const char *split_cond;
*************** process_define_cond_exec ()
*** 767,781 ****
--- 932,1022 ----
    for (elem = define_cond_exec_queue; elem ; elem = elem->next)
      process_one_cond_exec (elem);
  }
+ 
+ static char *
+ save_string (s, len)
+      const char *s;
+      int len;
+ {
+   register char *result = xmalloc (len + 1);
+ 
+   memcpy (result, s, len);
+   result[len] = 0;
+   return result;
+ }
+ 
  
  /* The entry point for initializing the reader.  */
  
  int
+ init_md_reader_args (argc, argv)
+      int argc;
+      char **argv;
+ {
+   int i;
+   const char *in_fname;
+ 
+   max_include_len = 0;
+   in_fname = NULL;
+   for (i = 1; i < argc; i++)
+     {
+       if (argv[i][0] != '-')
+ 	{
+ 	  if (in_fname == NULL)
+ 	    in_fname = argv[i];
+ 	}
+       else
+ 	{
+ 	  int c = argv[i][1];
+ 	  switch (c)
+ 	    {
+ 	    case 'I':		/* Add directory to path for includes.  */
+ 	      {
+ 		struct file_name_list *dirtmp;
+ 
+ 		dirtmp = (struct file_name_list *)
+ 		  xmalloc (sizeof (struct file_name_list));
+ 		dirtmp->next = 0;	/* New one goes on the end */
+ 		if (include == 0)
+ 		  include = dirtmp;
+ 		else
+ 		  last_include->next = dirtmp;
+ 		last_include = dirtmp;	/* Tail follows the last one */
+ 		if (argv[i][1] == 'I' && argv[i][2] != 0)
+ 		  dirtmp->fname = argv[i] + 2;
+ 		else if (i + 1 == argc)
+ 		  fatal ("Directory name missing after -I option");
+ 		else
+ 		  dirtmp->fname = argv[++i];
+ 		if (strlen (dirtmp->fname) > max_include_len)
+ 		  max_include_len = strlen (dirtmp->fname);
+ 	      }
+ 	      break;
+ 	    default:
+ 	      fatal ("Invalid option `%s'", argv[i]);
+ 
+ 	    }
+ 	}
+     }
+     return init_md_reader (in_fname);
+ }
+ 
+ /* The entry point for initializing the reader.  */
+ 
+ int
  init_md_reader (filename)
       const char *filename;
  {
    FILE *input_file;
    int c;
+   char *lastsl;
+ 
+   if (!IS_ABSOLUTE_PATHNAME (filename))
+     {
+       lastsl = strrchr (filename, '/');
+       if (lastsl != NULL) 
+ 	base_dir = save_string (filename, lastsl - filename + 1 );
+     }
  
    read_rtx_filename = filename;
    input_file = fopen (filename, "r");
*************** init_md_reader (filename)
*** 797,803 ****
  
        c = read_skip_spaces (input_file);
        if (c == EOF)
! 	break;
  
        ungetc (c, input_file);
        lineno = read_rtx_lineno;
--- 1038,1044 ----
  
        c = read_skip_spaces (input_file);
        if (c == EOF)
!         break;
  
        ungetc (c, input_file);
        lineno = read_rtx_lineno;
Index: gensupport.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gensupport.h,v
retrieving revision 1.3
diff -3 -c -p -r1.3 gensupport.h
*** gensupport.h	2001/08/22 14:35:17	1.3
--- gensupport.h	2001/11/06 02:33:20
*************** Software Foundation, 59 Temple Place - S
*** 21,26 ****
--- 21,27 ----
  struct obstack;
  extern struct obstack *rtl_obstack;
  
+ extern int init_md_reader_args	PARAMS ((int, char **));
  extern int init_md_reader	PARAMS ((const char *));
  extern rtx read_md_rtx		PARAMS ((int *, int *));
  
Index: rtl.def
===================================================================
RCS file: /cvs/gcc/gcc/gcc/rtl.def,v
retrieving revision 1.50
diff -3 -c -p -r1.50 rtl.def
*** rtl.def	2001/11/03 16:28:33	1.50
--- rtl.def	2001/11/06 02:33:22
*************** DEF_RTL_EXPR(UNKNOWN, "UnKnown", "*", 'x
*** 73,78 ****
--- 73,83 ----
  
  DEF_RTL_EXPR(NIL, "nil", "*", 'x')
  
+ 
+ /* include a file */
+ 
+ DEF_RTL_EXPR(INCLUDE, "include", "s", 'x')
+ 
  /* ---------------------------------------------------------------------
     Expressions used in constructing lists.
     --------------------------------------------------------------------- */
Index: gcc/gcc/doc/md.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/md.texi,v
retrieving revision 1.23
diff -c -3 -p -r1.23 md.texi
*** md.texi	2001/08/30 20:44:51	1.23
--- md.texi	2001/09/28 20:02:04
*************** See the next chapter for information on 
*** 38,43 ****
--- 38,44 ----
  * Expander Definitions::Generating a sequence of several RTL insns
                            for a standard operation.
  * Insn Splitting::      Splitting Instructions into Multiple Instructions.
+ * Including Patterns::      Including Patterns in Machine Descriptions.
  * Peephole Definitions::Defining machine-specific peephole optimizations.
  * Insn Attributes::     Specifying the value of attributes for generated insns.
  * Conditional Execution::Generating @code{define_insn} patterns for
*************** The @code{define_insn_and_split} constru
*** 3900,3905 ****
--- 3901,3986 ----
  functionality as two separate @code{define_insn} and @code{define_split}
  patterns.  It exists for compactness, and as a maintenance tool to prevent
  having to ensure the two patterns' templates match.
+ 
+ @node Including Patterns
+ @section Including Patterns in Machine Descriptions.
+ @cindex insn includes
+ 
+ @findex include
+ The @code{include} pattern tells the compiler tools where to
+ look for patterns that are in files other than in the file
+ @file{.md}. This is used only at build time and there is no preprocessing allowed.
+ 
+ It looks like:
+ 
+ @smallexample
+ 
+ (include
+   @var{pathname})
+ @end smallexample
+ 
+ For example:
+ 
+ @smallexample
+ 
+ (include "filestuff") 
+ 
+ @end smallexample
+ 
+ Where @var{pathname} is a string that specifies the the location of the file,
+ specifies the include file to be in gcc/config/{target}/filestuff. The
+ directory @file{ gcc/config/{target}} is regarded as the default directory.
+ 
+ 
+ Machine descriptions may be split up into smaller more manageable subsections 
+ and placed into subdirectories. 
+ 
+ By specifying:
+ 
+ @smallexample
+ 
+ (include "BOGUS/filestuff") 
+ 
+ @end smallexample
+ 
+ the include file is specified to be in @file{gcc/config/{target}/BOGUS/filestuff}.
+ 
+ Specifying an absolute path for the include file such as;
+ @smallexample
+ 
+ (include "/u2/BOGUS/filestuff") 
+ 
+ @end smallexample
+ is permitted but is not encouraged. 
+ 
+ @node .md Directory Options
+ @subsection RTL Generation Tool Options for Directory Search
+ @cindex directory options .md
+ @cindex options, directory search
+ @cindex search path
+ 
+ The -I@var{dir} option specifies directories to search for machine descriptions.
+ For example:
+ 
+ @smallexample
+ 
+ genrecog -I/p1/abc/proc1 -I/p2/abcd/pro2 target.md
+ 
+ @end smallexample
+ 
+ 
+ @table @gcctabopt
+ @item -I@var{dir}
+ @opindex I
+ Add the directory @var{dir} to the head of the list of directories to be
+ searched for header files.  This can be used to override a system machine definition
+ file, substituting your own version, since these directories are
+ searched before the default machine description file directories.  If you use more than
+ one @option{-I} option, the directories are scanned in left-to-right
+ order; the standard default directory come after.
+ 
+ @end table
+ 
  
  @node Peephole Definitions
  @section Machine-Specific Peephole Optimizers

Alan Matsuoka
GCC Engineering
Red Hat Canada, Ltd
mailto:alanm@redhat.com Tel: (416) 482-2661 x250 / Fax: (416) 482-6299



More information about the Gcc-patches mailing list