home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gcc-2.7.2.1-src.tgz / tar.out / fsf / gcc / config / m68k / xm-amigaos.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  9KB  |  252 lines

  1. /* Configuration for GNU C-compiler for Commodore Amiga, running AmigaOS.
  2.    Copyright (C) 1992 Free Software Foundation, Inc.
  3.    Contributed by Markus M. Wild (wild@amiga.physik.unizh.ch).
  4.  
  5. This file is part of GNU CC.
  6.  
  7. GNU CC is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2, or (at your option)
  10. any later version.
  11.  
  12. GNU CC is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with GNU CC; see the file COPYING.  If not, write to
  19. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. /* first include the generic header, then modify some parts.. */
  22.  
  23. #include "m68k/xm-m68k.h"
  24.  
  25. #ifndef _FCNTL_H_
  26. #include <fcntl.h>
  27. #endif
  28.  
  29. /* Define various things that the Amiga host has. */
  30.  
  31. #define HAVE_VPRINTF
  32. #define HAVE_PUTENV
  33. #define HAVE_STRERROR
  34. #define HAVE_ATEXIT
  35. #define HAVE_RENAME
  36.  
  37. /* The Amiga has case independent filesystems.  A good example of where this
  38.    causes problems is the conflict between the C include file <string.h> and
  39.    the C++ include file <String.h>, where the C++ include file dir is
  40.    searched first and thus causes includes of <string.h> to include
  41.    <String.h> instead.  There is an undocumented feature of gcc which uses a
  42.    file called header.gcc in the first directory to redirect includes to a
  43.    different directory, but it has the disadvantages in that it requires an
  44.    absolute pathname to the file being redirected to, and also needs to be
  45.    maintained and updated for each new file conflict.  An alternate method
  46.    to solve this problem is to define the macro OPEN_CASE_SENSITIVE as the
  47.    name of the function that takes the same args as open() and does case
  48.    dependent opens. */
  49.  
  50. #ifdef O_CASE    /* ixemul feature to be implemented */
  51. #define OPEN_CASE_SENSITIVE(fn,flags,mode) open((fn),(flags)|O_CASE,(mode))
  52. #else
  53. #define OPEN_CASE_SENSITIVE amiga_open_case_sensitive
  54. #endif
  55.  
  56. extern int amiga_open_case_sensitive ();
  57.  
  58. /* Define routines that parse a --priority option, set a default priority,
  59.    and actually change the priority. */
  60.  
  61. #define GET_DEFAULT_PRIORITY amiga_get_default_priority
  62. extern void amiga_get_default_priority ();
  63.  
  64. #define PARSE_PRIORITY amiga_parse_priority
  65. extern int amiga_parse_priority ();
  66.  
  67. #define SET_PRIORITY amiga_set_priority
  68. extern void amiga_set_priority ();
  69.  
  70. /* This macro returns whether a pathname is absolute */
  71.  
  72. #define ABSOLUTE_FILENAME(begin,length) amiga_abs_filename((begin),(length))
  73. extern int amiga_abs_filename ();
  74.  
  75. /* On the Amiga, there are two pathname separators, '/' (DIR_SEPARATOR)
  76.    and ':' (VOL_SEPARATOR).  DIR_SEPARATOR defaults to the correct
  77.    character, so we don't have to explicitly set it. */
  78.  
  79. #define VOL_SEPARATOR ':'
  80.  
  81. /* Amiga specific headers, such as from the Native Developer Update kits,
  82.    go in SYSTEM_INCLUDE_DIR.  STANDARD_INCLUDE_DIR is the equivalent of
  83.    Unix "/usr/include".  All other include paths are set in Makefile. */
  84.  
  85. #define SYSTEM_INCLUDE_DIR    "/ade/os-include"
  86. #define STANDARD_INCLUDE_DIR    "/ade/include"
  87.  
  88. /* Fork one piped subcommand.  SEARCH_FLAG is the system call to use
  89.    (either execv or execvp).  ARGV is the arg vector to use.
  90.    NOT_LAST is nonzero if this is not the last subcommand
  91.    (i.e. its output should be piped to the next one.)  */
  92.  
  93. #define PEXECUTE(SEARCH_FLAG,PROGRAM,ARGV,NOT_LAST) \
  94. ({int (*_func)() = (SEARCH_FLAG ? execv : execvp);            \
  95.   int _pid;                                \
  96.   int _pdes[2];                                \
  97.   int _input_desc = last_pipe_input;                    \
  98.   int _output_desc = STDOUT_FILE_NO;                    \
  99.   int _retries, _sleep_interval, _result;                \
  100.                                     \
  101.   /* If this isn't the last process, make a pipe for its output,    \
  102.      and record it as waiting to be the input to the next process.  */    \
  103.                                     \
  104.   if (NOT_LAST)                                \
  105.     {                                    \
  106.       if (pipe (_pdes) < 0)                        \
  107.     pfatal_with_name ("pipe");                    \
  108.       _output_desc = _pdes[WRITE_PORT];                    \
  109.       last_pipe_input = _pdes[READ_PORT];                \
  110.     }                                    \
  111.   else                                    \
  112.     last_pipe_input = STDIN_FILE_NO;                    \
  113.                                     \
  114.   /* Fork a subprocess; wait and retry if it fails.  */            \
  115.   _sleep_interval = 1;                            \
  116.   for (_retries = 0; _retries < 4; _retries++)                \
  117.     {                                    \
  118.       _pid = vfork ();                            \
  119.       if (_pid >= 0)                            \
  120.     break;                                \
  121.       sleep (_sleep_interval);                        \
  122.       _sleep_interval *= 2;                        \
  123.     }                                    \
  124.                                     \
  125.   switch (_pid)                                \
  126.     {                                    \
  127.     case -1:                                \
  128.       pfatal_with_name ("vfork");                    \
  129.       /* NOTREACHED */                            \
  130.       _result = 0;                            \
  131.       break;                                \
  132.                                     \
  133.     case 0: /* child */                            \
  134.       /* Move the input and output pipes into place, if nec.  */    \
  135.       if (_input_desc != STDIN_FILE_NO)                    \
  136.     {                                \
  137.       close (STDIN_FILE_NO);                    \
  138.       dup (_input_desc);                        \
  139.       close (_input_desc);                        \
  140.     }                                \
  141.       if (_output_desc != STDOUT_FILE_NO)                \
  142.     {                                \
  143.       close (STDOUT_FILE_NO);                    \
  144.       dup (_output_desc);                        \
  145.       close (_output_desc);                        \
  146.     }                                \
  147.                                     \
  148.       /* Close the parent's descs that aren't wanted here.  */        \
  149.       if (last_pipe_input != STDIN_FILE_NO)                \
  150.     close (last_pipe_input);                    \
  151.                                     \
  152.       /* Exec the program.  */                        \
  153.       (*_func) (PROGRAM, ARGV);                        \
  154.       perror_exec (PROGRAM);                        \
  155.       exit (-1);                            \
  156.       /* NOTREACHED */                            \
  157.       _result = 0;                            \
  158.       break;                                \
  159.                                     \
  160.     default:                                \
  161.       /* In the parent, after forking.                    \
  162.      Close the descriptors that we made for this child.  */        \
  163.       if (_input_desc != STDIN_FILE_NO)                    \
  164.     close (_input_desc);                        \
  165.       if (_output_desc != STDOUT_FILE_NO)                \
  166.     close (_output_desc);                        \
  167.                                     \
  168.       /* Return child's process number.  */                \
  169.       _result = _pid;                            \
  170.       break;                                \
  171.     }                                     \
  172. _result; })                                \
  173.  
  174. #define PEXECUTE_RESULT(STATUS, COMMAND) \
  175.   ({ wait (& STATUS); })
  176.  
  177. /* the following macros are stolen more or less from xm-vms.h ... */
  178.  
  179. /* This macro is used to help compare filenames in cp-lex.c.  */
  180.  
  181. #define FILE_NAME_NONDIRECTORY(C)                \
  182. ({                                \
  183.    extern char *rindex();                    \
  184.    char * pnt_ = (C), * pnt1_;                    \
  185.    pnt1_ = rindex (pnt_, '/');                     \
  186.    pnt1_ = (pnt1_ == 0 ? rindex (pnt_, ':') : pnt1_);        \
  187.    (pnt1_ == 0 ? pnt_ : pnt1_ + 1);                \
  188.  })
  189.  
  190. /* Macro to generate the name of the cross reference file.  The standard
  191.    one does not work, since it was written assuming that the conventions
  192.    of a unix style filesystem will work on the host system.
  193.  
  194.    Contrary to VMS, I'm using the original unix filename, there's no reason
  195.    not to use this under AmigaOS. */
  196.  
  197. #define XREF_FILE_NAME(BUFF, NAME)    \
  198.   s = FILE_NAME_NONDIRECTORY (NAME);            \
  199.   if (s == NAME) sprintf(BUFF, ".%s.gxref", NAME);    \
  200.   else {                        \
  201.     unsigned char ch = *s; /* could be Latin1 char.. */    \
  202.     /* temporary: cut the filename from the directory */\
  203.     *s = 0;                        \
  204.     sprintf (BUFF, "%s.%c%s.gxref", NAME, ch, s+1);    \
  205.     /* and restore the filename */            \
  206.     *s = ch;                        \
  207.   }                            \
  208.  
  209. /* Macro that is used in cp-xref.c to determine whether a file name is
  210.    absolute or not.
  211.  
  212.    This checks for both, '/' as first character, since we're running under
  213.    ixemul.library which provides for this unix'ism, and for the usual 
  214.    logical-terminator, ':', somewhere in the filename. */
  215.  
  216. #define FILE_NAME_ABSOLUTE_P(NAME) (NAME[0] == '/' || index(NAME, ':'))
  217.  
  218. /* the colon conflicts with the name space of logicals */
  219.  
  220. #define PATH_SEPARATOR ','
  221.  
  222. /* Phil.B 17-Apr-95 Added stack checking code submitted by Kriton Kyrimis
  223.    (kyrimis@theseas.ntua.gr) on 10-Feb-95, modified for inclusion into gcc
  224.  
  225.    What stackcheck does is to add the following code at the beginning of
  226.    each function:
  227.     cmpl __StackBottom,sp
  228.     bccs .+8
  229.     jmp __StackOverflow
  230.  
  231.    _StackBottom and _StackOverflow() are defined in stackchecksetup.c.
  232.    _StackBottom is set to the bottom of the stack plus some leeway for
  233.    subroutine arguments (128 bytes).  _StackOverflow() sets the stack
  234.    pointer to a sane value, prints an error message and exits.
  235.  
  236.    Even with stack checking, you cannot be completely safe, as overflows
  237.    are detected on function entry, rather than during function execution.
  238.    E.g.,
  239.     crash(){
  240.       char scribble[100000];
  241.       int i;
  242.       for (i=0; i<100000; i++) scribble[i]=0;
  243.       check(scribble);
  244.     }
  245.     check(char *x){}
  246.    In the above example, stack overflow and its side-effects will occur in
  247.    crash(), but it will be detected in check(), when it is too late. (The
  248.    same thing happens with SAS/C's stack checking, BTW.)
  249. */
  250.  
  251. /* #defined AMIGA_STACK_CHECKING */
  252.