home *** CD-ROM | disk | FTP | other *** search
/ Education Sampler 1992 [NeXTSTEP] / Education_1992_Sampler.iso / NeXT / GnuSource / cplusplus-8 / config / tm-next.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-18  |  14.1 KB  |  428 lines

  1. /* tm-next.h:  definitions for NeXT.
  2.  
  3. This file is part of GNU CC.
  4.  
  5. GNU CC is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9.  
  10. GNU CC is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with GNU CC; see the file COPYING.  If not, write to
  17. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. /* Use new NeXT include file search path.  */
  20.  
  21. #define INCLUDE_DEFAULTS                \
  22.   {                            \
  23.     { "/NextDeveloper/Headers", 0},            \
  24.     { "/NextDeveloper/Headers/ansi", 0},        \
  25.     { "/NextDeveloper/Headers/bsd", 0},            \
  26.     { "/LocalDeveloper/Headers", 0},            \
  27.     { "/LocalDeveloper/Headers/ansi", 0},        \
  28.     { "/LocalDeveloper/Headers/bsd", 0},        \
  29.     { "/NextDeveloper/2.0CompatibleHeaders", 0},    \
  30.     { 0, 0}                        \
  31.   }
  32.  
  33. /* Search for compiler tools in /lib.  */
  34.  
  35. #undef STANDARD_EXEC_PREFIX
  36. #define STANDARD_EXEC_PREFIX "/lib/"
  37.  
  38. /* Report errors to make application. */
  39.  
  40. #define REPORT_EVENT(TYPE, NAME, FILE, LINE, MSG, ARG1, ARG2, ARG3)    \
  41.   make_support (TYPE, NAME, FILE, LINE, MSG, ARG1, ARG2, ARG3)
  42.  
  43. /* wchar_t is unsigned short */
  44.  
  45. #define WCHAR_TYPE_SIZE (BITS_PER_WORD / 2)
  46.  
  47. /* These compiler options take n arguments.  */
  48.  
  49. #define WORD_SWITCH_TAKES_ARG(STR)         \
  50.   (!strcmp (STR, "Ttext") ? 1 :            \
  51.    !strcmp (STR, "Tdata") ? 1 :            \
  52.    !strcmp (STR, "segalign") ? 1 :        \
  53.    !strcmp (STR, "seg1addr") ? 1 :        \
  54.    !strcmp (STR, "segaddr") ? 2 :        \
  55.    !strcmp (STR, "sectobjectsymbols") ? 2 :    \
  56.    !strcmp (STR, "segprot") ? 3 :        \
  57.    !strcmp (STR, "sectcreate") ? 3 :        \
  58.    !strcmp (STR, "sectalign") ? 3 :        \
  59.    !strcmp (STR, "segcreate") ? 3 :        \
  60.    !strcmp (STR, "sectorder") ? 3 :        \
  61.    0)
  62.  
  63. #define WORD_SWITCH(STR)            \
  64.   (WORD_SWITCH_TAKES_ARG (STR)            \
  65.    || !strcmp (STR, "bsd")            \
  66.    || !strcmp (STR, "object")            \
  67.    || !strcmp (STR, "ObjC")            \
  68.    || !strcmp (STR, "all_load"))
  69.  
  70. /* Machine dependent ccp options.  */
  71.  
  72. #define CPP_SPEC "%{bsd:-D__STRICT_BSD__}"
  73.  
  74. /* Machine dependent ld options.  */
  75.  
  76. #define LINK_SPEC "%{Z} %{M} \
  77. %{execute*} %{preload*} %{fvmlib*} \
  78. %{segalign*} %{seg1addr*} %{segaddr*} %{segprot*} \
  79. %{seglinkedit*} %{noseglinkedit*} \
  80. %{sectcreate*} %{sectalign*} %{sectobjectsymbols}\
  81. %{segcreate*} %{Mach*} %{whyload} %{w} \
  82. %{sectorder*} %{whatsloaded} %{ObjC} %{all_load}"
  83.  
  84. /* Machine dependent libraries.  */
  85.  
  86. #define LIB_SPEC "-lsys_s"
  87.  
  88. /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
  89. #define STARTFILE_SPEC  \
  90.   "%{pg:-lgcrt0.o}%{!pg: \
  91.      %{p:%e-p profiling is no longer supported.  Use -pg instead.} \
  92.      %{!p:-lcrt0.o}}"
  93.  
  94. /* Why not? */
  95.  
  96. #undef DOLLARS_IN_IDENTIFIERS
  97. #define DOLLARS_IN_IDENTIFIERS 2
  98.  
  99. /* Allow #sscs (but don't do anything). */
  100.  
  101. #define SCCS_DIRECTIVE
  102.  
  103. /* We use dbx symbol format.  */
  104.  
  105. #define DBX_DEBUGGING_INFO
  106.  
  107. /* This saves a fair amount of space. */
  108.  
  109. #define DBX_CONTIN_LENGTH 0
  110.  
  111. /* These screw up NeXT's gdb at the moment, so don't use them. */
  112.  
  113. /* How to parse #pragma's */
  114.  
  115. #undef HANDLE_PRAGMA
  116. #define HANDLE_PRAGMA(finput) handle_pragma (finput)
  117.  
  118. #define ASM_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE, FILENAME)
  119.  
  120. /* gdb needs a null N_SO at the end of each file for scattered loading. */
  121.  
  122. #define ASM_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)            \
  123.   fprintf (FILE,                            \
  124.        "\t.text\n\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n",        \
  125.        "" , N_SO)
  126.  
  127. /* Don't use .gcc_compiled symbols to communicate with GDB;
  128.    They interfere with numerically sorted symbol lists. */
  129.  
  130. #define ASM_IDENTIFY_GCC(asm_out_file)
  131.  
  132. #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)            \
  133.   do { constructor_section ();                    \
  134.        ASM_OUTPUT_ALIGN (FILE, 1);                \
  135.        fprintf (FILE, "\t.long ");                \
  136.        assemble_name (FILE, NAME);                \
  137.        fprintf (FILE, "\n");                    \
  138.        fprintf (FILE, ".reference .constructors_used\n");    \
  139.       } while (0)
  140.  
  141. #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)            \
  142.   do { destructor_section ();                    \
  143.        ASM_OUTPUT_ALIGN (FILE, 1);                \
  144.        fprintf (FILE, "\t.long ");                \
  145.        assemble_name (FILE, NAME);                \
  146.        fprintf (FILE, "\n");                    \
  147.        fprintf (FILE, ".reference .destructors_used\n");    \
  148.       } while (0)
  149.  
  150. /* Give methods pretty symbol names on NeXT. */
  151.  
  152. #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME)    \
  153.   do { if (CAT_NAME)                            \
  154.      sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+',        \
  155.           (CLASS_NAME), (CAT_NAME), (SEL_NAME));        \
  156.        else                                \
  157.      sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+',        \
  158.           (CLASS_NAME), (SEL_NAME));                \
  159.      } while (0)
  160.  
  161. /* Wrap new method names in quotes so the assembler doesn't gag.
  162.    Make Objective-C internal symbols local. */
  163.  
  164. #undef ASM_OUTPUT_LABELREF
  165. #define ASM_OUTPUT_LABELREF(FILE,NAME)    \
  166.   do { if (NAME[0] == '+' || NAME[0] == '-') fprintf (FILE, "\"%s\"", NAME); \
  167.        else if (!strncmp (NAME, "_OBJC_", 6)) fprintf (FILE, "L%s", NAME);   \
  168.        else fprintf (FILE, "_%s", NAME); } while (0)
  169.  
  170. #undef ALIGN_ASM_OP
  171. #define ALIGN_ASM_OP        "\t.align"
  172.  
  173. #undef ASM_OUTPUT_ALIGN
  174. #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  175.   if ((LOG) != 0)            \
  176.     fprintf (FILE, "%s %d\n", ALIGN_ASM_OP, (LOG))
  177.  
  178. /* The maximum alignment which the object file format can support.
  179.    For NeXT's Mach-O format, this is 2^15.  */
  180.  
  181. #define MAX_OFILE_ALIGNMENT 0x8000
  182.  
  183. /* Create new Mach-O sections. */
  184. #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, WAS_TEXT, OBJC)    \
  185. void                                    \
  186. FUNCTION ()                                \
  187. {                                    \
  188.   extern void text_section ();                         \
  189.   extern void objc_section_init ();                     \
  190.   extern int flag_no_mach_text_sections;                       \
  191.                                       \
  192.   if (WAS_TEXT && flag_no_mach_text_sections)                   \
  193.     text_section ();                            \
  194.   else if (in_section != SECTION)                    \
  195.     {                                    \
  196.       if (OBJC)                                \
  197.     objc_section_init ();                        \
  198.       fprintf (asm_out_file, "%s\n", DIRECTIVE);            \
  199.       in_section = SECTION;                        \
  200.     }                                    \
  201. }                                    \
  202.  
  203. #undef EXTRA_SECTIONS
  204. #define EXTRA_SECTIONS                    \
  205.   in_const, in_cstring, in_literal4, in_literal8,    \
  206.   in_constructor, in_destructor,            \
  207.   in_objc_class, in_objc_meta_class, in_objc_category,    \
  208.   in_objc_class_vars, in_objc_instance_vars,        \
  209.   in_objc_cls_meth, in_objc_inst_meth,            \
  210.   in_objc_cat_cls_meth, in_objc_cat_inst_meth,        \
  211.   in_objc_selector_refs,                \
  212.   in_objc_symbols, in_objc_module_info,            \
  213.   in_objc_protocol, in_objc_string_object,        \
  214.   in_objc_class_names, in_objc_meth_var_names,        \
  215.   in_objc_meth_var_types, in_objc_cls_refs
  216.  
  217. #undef EXTRA_SECTION_FUNCTIONS
  218. #define EXTRA_SECTION_FUNCTIONS            \
  219. SECTION_FUNCTION (const_section,        \
  220.           in_const,            \
  221.           ".const", 1, 0)        \
  222. SECTION_FUNCTION (cstring_section,        \
  223.           in_cstring,            \
  224.           ".cstring", 1, 0)        \
  225. SECTION_FUNCTION (literal4_section,        \
  226.           in_literal4,            \
  227.           ".literal4", 1, 0)        \
  228. SECTION_FUNCTION (literal8_section,        \
  229.           in_literal8,            \
  230.           ".literal8", 1, 0)        \
  231. SECTION_FUNCTION (constructor_section,        \
  232.           in_constructor,        \
  233.           ".constructor", 0, 0)        \
  234. SECTION_FUNCTION (destructor_section,        \
  235.           in_destructor,        \
  236.           ".destructor", 0, 0)        \
  237. SECTION_FUNCTION (objc_class_section,        \
  238.           in_objc_class,        \
  239.           ".objc_class", 0, 1)        \
  240. SECTION_FUNCTION (objc_meta_class_section,    \
  241.           in_objc_meta_class,        \
  242.           ".objc_meta_class", 0, 1)    \
  243. SECTION_FUNCTION (objc_category_section,    \
  244.           in_objc_category,        \
  245.         ".objc_category", 0, 1)        \
  246. SECTION_FUNCTION (objc_class_vars_section,    \
  247.           in_objc_class_vars,        \
  248.           ".objc_class_vars", 0, 1)    \
  249. SECTION_FUNCTION (objc_instance_vars_section,    \
  250.           in_objc_instance_vars,    \
  251.           ".objc_instance_vars", 0, 1)    \
  252. SECTION_FUNCTION (objc_cls_meth_section,    \
  253.           in_objc_cls_meth,        \
  254.           ".objc_cls_meth", 0, 1)    \
  255. SECTION_FUNCTION (objc_inst_meth_section,    \
  256.           in_objc_inst_meth,        \
  257.           ".objc_inst_meth", 0, 1)    \
  258. SECTION_FUNCTION (objc_cat_cls_meth_section,    \
  259.           in_objc_cat_cls_meth,        \
  260.           ".objc_cat_cls_meth", 0, 1)    \
  261. SECTION_FUNCTION (objc_cat_inst_meth_section,    \
  262.           in_objc_cat_inst_meth,    \
  263.           ".objc_cat_inst_meth", 0, 1)    \
  264. SECTION_FUNCTION (objc_selector_refs_section,    \
  265.           in_objc_selector_refs,    \
  266.           ".objc_message_refs", 0, 1)    \
  267. SECTION_FUNCTION (objc_symbols_section,        \
  268.           in_objc_symbols,        \
  269.           ".objc_symbols", 0, 1)    \
  270. SECTION_FUNCTION (objc_module_info_section,    \
  271.           in_objc_module_info,        \
  272.           ".objc_module_info", 0, 1)    \
  273. SECTION_FUNCTION (objc_protocol_section,    \
  274.           in_objc_protocol,        \
  275.           ".objc_protocol", 0, 1)    \
  276. SECTION_FUNCTION (objc_string_object_section,    \
  277.           in_objc_string_object,    \
  278.           ".objc_string_object", 0, 1)    \
  279. SECTION_FUNCTION (objc_class_names_section,    \
  280.           in_objc_class_names,        \
  281.           ".objc_class_names", 0, 1)    \
  282. SECTION_FUNCTION (objc_meth_var_names_section,    \
  283.           in_objc_meth_var_names,    \
  284.           ".objc_meth_var_names", 0, 1)    \
  285. SECTION_FUNCTION (objc_meth_var_types_section,    \
  286.           in_objc_meth_var_types,    \
  287.           ".objc_meth_var_types", 0, 1)    \
  288. SECTION_FUNCTION (objc_cls_refs_section,    \
  289.           in_objc_cls_refs,        \
  290.           ".objc_cls_refs", 0, 1)    \
  291. void                        \
  292. objc_section_init ()                \
  293. {                        \
  294.   static int been_here = 0;            \
  295.                         \
  296.   if (been_here == 0)                \
  297.     {                        \
  298.       been_here = 1;                \
  299.       objc_class_section ();            \
  300.       objc_meta_class_section ();        \
  301.       objc_cat_cls_meth_section ();        \
  302.       objc_cat_inst_meth_section ();        \
  303.       objc_cls_meth_section ();            \
  304.       objc_inst_meth_section ();        \
  305.       objc_selector_refs_section ();        \
  306.       objc_symbols_section ();            \
  307.       objc_category_section ();            \
  308.       objc_protocol_section ();            \
  309.       objc_class_vars_section ();        \
  310.       objc_instance_vars_section ();        \
  311.       objc_module_info_section ();        \
  312.       objc_string_object_section ();        \
  313.       objc_class_names_section ();        \
  314.       objc_meth_var_names_section ();        \
  315.       objc_meth_var_types_section ();        \
  316.       objc_cls_refs_section ();            \
  317.     }                        \
  318. }
  319.  
  320.  
  321. #undef SELECT_SECTION
  322. #define SELECT_SECTION(exp)                    \
  323.   do                                \
  324.     {                                \
  325.       if (TREE_CODE (exp) == STRING_CST)            \
  326.     {                            \
  327.       if (flag_writable_strings)                \
  328.         data_section ();                    \
  329.       else if (TREE_STRING_LENGTH (exp) !=            \
  330.            strlen (TREE_STRING_POINTER (exp)) + 1)    \
  331.         const_section ();                    \
  332.       else                            \
  333.         cstring_section ();                    \
  334.     }                            \
  335.       else if (TREE_CODE (exp) == INTEGER_CST            \
  336.            || TREE_CODE (exp) == REAL_CST)            \
  337.         {                            \
  338.       tree size = TYPE_SIZE (TREE_TYPE (exp));        \
  339.                                   \
  340.       if (TREE_CODE (size) == INTEGER_CST &&        \
  341.           TREE_INT_CST_LOW (size) == 4 &&            \
  342.           TREE_INT_CST_HIGH (size) == 0)            \
  343.         literal4_section ();                \
  344.       else if (TREE_CODE (size) == INTEGER_CST &&        \
  345.           TREE_INT_CST_LOW (size) == 8 &&            \
  346.           TREE_INT_CST_HIGH (size) == 0)            \
  347.         literal8_section ();                \
  348.       else                            \
  349.         const_section ();                    \
  350.     }                            \
  351.       else if (TREE_CODE (exp) == CONSTRUCTOR                \
  352.            && TREE_TYPE (exp)                    \
  353.            && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE        \
  354.            && TYPE_NAME (TREE_TYPE (exp))                \
  355.            && TREE_CODE (TYPE_NAME (TREE_TYPE (exp))) == IDENTIFIER_NODE \
  356.            && IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))))    \
  357.     {                                \
  358.       if (!strcmp (IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))), \
  359.                "NXConstantString"))                \
  360.         objc_string_object_section ();                \
  361.       else if (!strcmp (IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))), \
  362.                "_objc_class_ref"))                \
  363.         objc_cls_refs_section ();                    \
  364.       else if (TREE_READONLY (exp) && !TREE_VOLATILE (exp))        \
  365.         const_section ();                        \
  366.       else                                \
  367.         data_section ();                        \
  368.     }                                \
  369.       else if (TREE_CODE (exp) == VAR_DECL &&                \
  370.            DECL_NAME (exp) &&                    \
  371.            TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE &&    \
  372.            IDENTIFIER_POINTER (DECL_NAME (exp)) &&            \
  373.            !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) \
  374.     {                                \
  375.       const char *name = IDENTIFIER_POINTER (DECL_NAME (exp));    \
  376.                                       \
  377.       if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20))        \
  378.         objc_cls_meth_section ();                    \
  379.       else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23))    \
  380.         objc_inst_meth_section ();                    \
  381.       else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) \
  382.         objc_cat_cls_meth_section ();                \
  383.       else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) \
  384.         objc_cat_inst_meth_section ();                \
  385.       else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22))    \
  386.         objc_class_vars_section ();                    \
  387.       else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25))    \
  388.         objc_instance_vars_section ();                \
  389.       else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22))    \
  390.         objc_cat_cls_meth_section ();                \
  391.       else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17))        \
  392.         objc_class_names_section ();                \
  393.       else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20))        \
  394.         objc_meth_var_names_section ();                \
  395.       else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20))        \
  396.         objc_meth_var_types_section ();                \
  397.       else if (!strncmp (name, "_OBJC_CLASS_", 12))            \
  398.         objc_class_section ();                    \
  399.       else if (!strncmp (name, "_OBJC_METACLASS_", 16))        \
  400.         objc_meta_class_section ();                    \
  401.       else if (!strncmp (name, "_OBJC_CATEGORY_", 15))        \
  402.         objc_category_section ();                    \
  403.       else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25))    \
  404.         objc_selector_refs_section ();                \
  405.       else if (!strncmp (name, "_OBJC_SYMBOLS", 13))        \
  406.         objc_symbols_section ();                    \
  407.       else if (!strncmp (name, "_OBJC_MODULES", 13))        \
  408.         objc_module_info_section ();                \
  409.       else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32)) \
  410.         objc_cat_inst_meth_section ();                \
  411.       else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29)) \
  412.         objc_cat_cls_meth_section ();                \
  413.       else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20))        \
  414.         objc_cat_cls_meth_section ();                \
  415.       else if (!strncmp (name, "_OBJC_PROTOCOL_", 15))        \
  416.         objc_protocol_section ();                    \
  417.       else if (TREE_READONLY (exp) && !TREE_VOLATILE (exp))        \
  418.         const_section ();                        \
  419.       else                                \
  420.         data_section ();                        \
  421.     }                                \
  422.       else if (TREE_READONLY (exp) && !TREE_VOLATILE (exp))        \
  423.     const_section ();                        \
  424.       else                                \
  425.         data_section ();                        \
  426.     }                                    \
  427.   while (0)
  428.