home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / gcc / config / next / nextstep.h < prev    next >
C/C++ Source or Header  |  1997-02-12  |  29KB  |  821 lines

  1. /* nextstep.h -- operating system specific defines to be used when
  2.    targeting GCC for NeXTSTEP.
  3.    Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
  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, 59 Temple Place - Suite 330,
  20. Boston, MA 02111-1307, USA.  */
  21.  
  22. /* Use new NeXT include file search path.
  23.    In a cross compiler with NeXT as target, don't expect
  24.    the host to use Next's directory scheme.  */
  25.  
  26. #if NeXT || !defined(CROSS_COMPILE)
  27. #undef    INCLUDE_DEFAULTS
  28. #if 0
  29. #define INCLUDE_DEFAULTS                \
  30.   {                            \
  31.     { "/NextDeveloper/Headers/g++", 1, 1},        \
  32.     { "/NextDeveloper/Headers", 0},            \
  33.     { "/NextDeveloper/Headers/ansi", 0},        \
  34.     { "/NextDeveloper/Headers/bsd", 0},            \
  35.     { "/LocalDeveloper/Headers", 0, 1},            \
  36.     { "/LocalDeveloper/Headers/ansi", 0},        \
  37.     { "/LocalDeveloper/Headers/bsd", 0},        \
  38. /*  { "/NextDeveloper/2.0CompatibleHeaders", 0}, */    \
  39.     { STANDARD_INCLUDE_DIR, 0},                \
  40.     { "/usr/include/bsd", 0},                \
  41.     { "FakeSystemHeaders", 0},                \
  42.     { 0, 0}                        \
  43.   }
  44. #endif /* 0 */
  45. #define INCLUDE_DEFAULTS                        \
  46.   {                                    \
  47.     { "/NextLibrary/Frameworks/System.framework/PrivateHeaders", 0},     \
  48.     { "/NextLibrary/Frameworks/System.framework/Headers", 0},         \
  49.     { "/NextLibrary/Frameworks/System.framework/Headers/ansi", 0},     \
  50.     { "/NextLibrary/Frameworks/System.framework/Headers/bsd", 0},     \
  51.     { "/NextDeveloper/Headers/g++", 1, 1},                \
  52.     { "/NextDeveloper/Headers", 0},                    \
  53.     { "/NextDeveloper/Headers/ansi", 0},                \
  54.     { "/NextDeveloper/Headers/bsd", 0},                    \
  55.     { "/LocalDeveloper/Headers", 0, 1},                    \
  56.     { STANDARD_INCLUDE_DIR, 0},                        \
  57.     { 0, 0}                                \
  58.   }
  59. #define REL3COMPAT_INCLUDE_DEFAULTS            \
  60.   {                            \
  61.     { "/LocalDeveloper/3.xCompatibleHeaders", 0},     \
  62.     { "/LocalDeveloper/3.xCompatibleHeaders/ansi", 0},     \
  63.     { "/LocalDeveloper/3.xCompatibleHeaders/bsd", 0},     \
  64.     { "/NextDeveloper/3.xCompatibleHeaders", 0},     \
  65.     { "/NextDeveloper/3.xCompatibleHeaders/ansi", 0},     \
  66.     { "/NextDeveloper/3.xCompatibleHeaders/bsd", 0},     \
  67.     { "/NextDeveloper/Headers/g++", 1, 1},        \
  68.     { "/LocalDeveloper/Headers", 0},             \
  69.     { "/NextDeveloper/Headers", 0},             \
  70.     { 0, 0}                        \
  71.   }
  72. #endif /* !CROSS_COMPILE */
  73.  
  74. /* Report errors to make application. */
  75.  
  76. #define REPORT_EVENT(TYPE, NAME, FILE, LINE, MSG, ARG1, ARG2, ARG3)    \
  77.   make_support (TYPE, NAME, FILE, LINE, MSG, ARG1, ARG2, ARG3)
  78. #define V_REPORT_EVENT(TYPE, NAME, FILE, LINE, MSG, AP)            \
  79.   v_make_support (TYPE, NAME, FILE, LINE, MSG, AP)
  80.   
  81. #undef    EXTRA_FORMAT_FUNCTIONS
  82. #define EXTRA_FORMAT_FUNCTIONS \
  83.       "NXPrintf",    FALSE,    2,    FALSE,    \
  84.       "NXScanf",    TRUE,    2,    FALSE,    \
  85.       "NXVPrintf",    FALSE,    2,    TRUE,    \
  86.       "NXVScanf",    TRUE,    2,    TRUE,    \
  87.       "DPSPrintf",    FALSE,    2,    FALSE,    \
  88.       "bsd_sprintf",    FALSE,    2,    FALSE,    \
  89.       "bsd_vsprintf",    FALSE,    2,    TRUE,
  90.  
  91. /* Make the compiler look here for standard stuff */
  92.  
  93. #ifdef STANDARD_EXEC_PREFIX
  94. #undef STANDARD_EXEC_PREFIX
  95. #endif
  96. #define STANDARD_EXEC_PREFIX "/lib/"
  97.  
  98. /* Make -fnext-runtime the default.  */
  99.  
  100. #define NEXT_OBJC_RUNTIME
  101.  
  102. /* Support -arch xx flags */
  103.  
  104. #define NEXT_FAT_OUTPUT
  105.  
  106. /* support the precompiled header cpp */
  107.  
  108. #define NEXT_CPP_PRECOMP
  109.  
  110. /* Don't make the compiler think it knows which headerfiles are
  111.    c++ and which are not.   */
  112. /* #define NO_IMPLICIT_EXTERN_C */
  113.  
  114. /* change semantics of things around the compiler... */
  115.  
  116. #ifndef NEXT_SEMANTICS
  117. #define NEXT_SEMANTICS
  118. #endif
  119.  
  120. /* make the library functions in libgcc have only one underbar
  121.    in front of them.  */
  122. #define NEXT_LIBGCC_NAMES
  123.  
  124. /* We have atexit.  */
  125.  
  126. #define HAVE_ATEXIT
  127.  
  128. /* Define an empty body for the function do_global_dtors() in libgcc2.c.  */
  129.  
  130. #define DO_GLOBAL_DTORS_BODY
  131.  
  132. /* Enable recent gcc to compile under the old gcc in Next release 1.0.  */
  133.  
  134. #define __inline inline
  135.  
  136. /* wchar_t is unsigned short */
  137.  
  138. #undef    WCHAR_TYPE
  139. #define WCHAR_TYPE "short unsigned int"
  140. #undef    WCHAR_TYPE_SIZE
  141. #define WCHAR_TYPE_SIZE (BITS_PER_WORD / 2)
  142.  
  143. /* Don't default to pcc-struct-return, because gcc is the only compiler, and
  144.    we want to retain compatibility with older gcc versions.  */
  145.  
  146. #undef    DEFAULT_PCC_STRUCT_RETURN
  147. #define DEFAULT_PCC_STRUCT_RETURN 0
  148.  
  149. /* These compiler options take n arguments.  */
  150.  
  151. #undef    WORD_SWITCH_TAKES_ARG
  152. #define WORD_SWITCH_TAKES_ARG(STR)         \
  153.   (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 :    \
  154.    !strcmp (STR, "read_only_relocs") ? 1 :    \
  155.    !strcmp (STR, "segalign") ? 1 :        \
  156.    !strcmp (STR, "seg1addr") ? 1 :        \
  157.    !strcmp (STR, "undefined") ? 1 :        \
  158.    !strcmp (STR, "dylib_file") ? 1 :        \
  159.    !strcmp (STR, "segaddr") ? 2 :        \
  160.    !strcmp (STR, "sectobjectsymbols") ? 2 :    \
  161.    !strcmp (STR, "segprot") ? 3 :        \
  162.    !strcmp (STR, "sectcreate") ? 3 :        \
  163.    !strcmp (STR, "sectalign") ? 3 :        \
  164.    !strcmp (STR, "segcreate") ? 3 :        \
  165.    !strcmp (STR, "sectorder") ? 3 :        \
  166.    !strcmp (STR, "siff-mask") ? 1 :        \
  167.    !strcmp (STR, "siff-filter") ? 1 :        \
  168.    !strcmp (STR, "siff-warning") ? 1 :        \
  169.    !strcmp (STR, "arch") ? 1 :            \
  170.    !strcmp (STR, "NEXTSTEP-deployment-target") ? 1 : \
  171.    !strcmp (STR, "pagezero_size") ? 1 :        \
  172.    !strcmp (STR, "dylinker_install_name") ? 1 :    \
  173.    !strcmp (STR, "framework") ? 1 :        \
  174.    !strcmp (STR, "filelist") ? 1 :        \
  175.    !strcmp (STR, "image_base") ? 1 :        \
  176.    !strcmp (STR, "install_name") ? 1 :        \
  177.    !strcmp (STR, "arch_only") ? 1 :        \
  178.    !strcmp (STR, "compatibility_version") ? 1 :    \
  179.    !strcmp (STR, "current_version") ? 1 :    \
  180.    0)
  181.  
  182. #undef    WORD_SWITCH
  183. #define WORD_SWITCH(STR)            \
  184.   (WORD_SWITCH_TAKES_ARG (STR)            \
  185.    || !strcmp (STR, "bsd")            \
  186.    || !strcmp (STR, "object")            \
  187.    || !strcmp (STR, "ObjC")            \
  188.    || !strcmp (STR, "dylinker")            \
  189.    || !strcmp (STR, "dynamic")            \
  190.    || !strcmp (STR, "static")            \
  191.    || !strcmp (STR, "rel3compat")        \
  192.    || !strcmp (STR, "threeThreeMethodEncoding") \
  193.    || !strcmp (STR, "bundle")            \
  194.    || !strcmp (STR, "dynamiclib")        \
  195.    || !strcmp (STR, "output_for_dyld")        \
  196.    || !strcmp (STR, "keep_private_externs")    \
  197.    || !strcmp (STR, "all_load"))
  198.  
  199. /* Machine dependent cpp options.  */
  200.  
  201. #define STRINGIFY(x) # x
  202. #define REALLY_STRINGIFY(x) STRINGIFY(x)
  203. #ifndef NX_RELEASE
  204. #define NX_RELEASE REALLY_STRINGIFY(NEXT_RELEASE_MAJOR) \
  205.            REALLY_STRINGIFY(NEXT_RELEASE_MINOR)
  206. #endif
  207.  
  208. #undef    CPP_SPEC
  209. #define CPP_SPEC "%{!traditional: -D__STDC__}            \
  210.                   %{posixstrict:-D_POSIX_SOURCE}         \
  211.                   %{!posixstrict:%{bsd:-D__STRICT_BSD__} \
  212.                   %{posix:-D_POSIX_SOURCE}               \
  213.                   %{!ansi:-D_NEXT_SOURCE}}               \
  214.               %{mdisable-fpregs:-D__NO_FP__}     \
  215.           %{F*}    %{ansi} %{fno-asm}             \
  216.           %{rel3compat:}              \
  217.           -DNX_COMPILER_RELEASE_3_0=300          \
  218.           -DNX_COMPILER_RELEASE_3_1=310          \
  219.           -DNX_COMPILER_RELEASE_3_2=320          \
  220.           -DNX_COMPILER_RELEASE_3_3=330          \
  221.           -DNX_CURRENT_COMPILER_RELEASE=" NX_RELEASE "0" " \
  222.           -DNS_TARGET=" NX_RELEASE "         \
  223.           -DNS_TARGET_MAJOR=" REALLY_STRINGIFY(NEXT_RELEASE_MAJOR) " \
  224.           -DNS_TARGET_MINOR=" REALLY_STRINGIFY(NEXT_RELEASE_MINOR) " \
  225.           %{traditional:-D__GNU_CPP__}         \
  226.           %{!traditional:%{traditional-cpp:-D__GNU_CPP__} \
  227.                  %{!traditional-cpp:-D__NEXT_CPP__}} \
  228.                   %{static:-D__STATIC__}%{!static:-D__DYNAMIC__} \
  229.                   %{MD:-MD %M} %{MMD:-MMD %M}"
  230.  
  231. /* Machine dependent ld options.  */
  232.  
  233. #undef    LINK_SPEC
  234. #define LINK_SPEC "%{Z} %{M} %{F*} \
  235. %{execute*} %{preload*} %{fvmlib*} \
  236. %{segalign*} %{seg1addr*} %{segaddr*} %{segprot*} \
  237. %{pagezero_size*} %{undefined*} %{dylib_file*} \
  238. %{seglinkedit*} %{noseglinkedit*} %{read_only_relocs} \
  239. %{sectcreate*} %{sectalign*} %{sectobjectsymbols}\
  240. %{segcreate*} %{Mach*} %{whyload} %{w} \
  241. %{sectorder*} %{whatsloaded} %{ObjC} %{all_load} %{object} \
  242. %{dylinker} %{dylinker_install_name*} %{output_for_dyld} \
  243. %{keep_private_externs} %{prebind} %{noprebind}"
  244.  
  245. /* Machine dependent libraries.  */
  246.  
  247. #undef    LIB_SPEC
  248. #if 0
  249. #define LIB_SPEC "%{!bundle:%{!posix*:%{!pg:-lsys_s}%{pg:-lsys_p}}%{posix*:-lposix}}"
  250. #endif
  251. #define LIB_SPEC \
  252.      "%{static:%{!dynamiclib:%{!pg:-lsys_s}%{pg:-lsys_p}}} \
  253.       %{!static:%{!pg:-framework System}%{pg:-framework System,_profile}}"
  254.  
  255. #undef LIBGCC_SPEC
  256. #define LIBGCC_SPEC "%{!shared:%{static:%{!dynamiclib:-lcc}} \
  257.                   %{!static:-lcc_dynamic}}"
  258.  
  259. /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
  260.  
  261. #undef    STARTFILE_SPEC
  262. #define STARTFILE_SPEC  \
  263. "%{!dynamiclib:%{bundle:%{!static:-lbundle1.o}} \
  264.    %{!bundle:%{pg:%{static:-lgcrt0.o} \
  265.           %{!static:%{object:-lgcrt0.o} \
  266.                 %{!object:%{preload:-lgcrt0.o} \
  267.                       %{!preload:-lgcrt1.o}}}} \
  268.         %{!pg:%{static:-lcrt0.o} \
  269.           %{!static:%{object:-lcrt0.o} \
  270.                 %{!object:%{preload:-lcrt0.o} \
  271.                       %{!preload:-lcrt1.o}}}}}}"
  272.  
  273. /* Why not? */
  274.  
  275. #undef    DOLLARS_IN_IDENTIFIERS
  276. #define DOLLARS_IN_IDENTIFIERS 2
  277.  
  278. /* Allow #sscs (but don't do anything). */
  279.  
  280. #define SCCS_DIRECTIVE
  281.  
  282. /* We use Dbx symbol format.  */
  283.  
  284. #undef    SDB_DEBUGGING_INFO
  285. #undef    XCOFF_DEBUGGING_INFO
  286. #define DBX_DEBUGGING_INFO
  287.  
  288. /* This saves a fair amount of space. */
  289.  
  290. #undef    DBX_CONTIN_LENGTH
  291. #define DBX_CONTIN_LENGTH 0
  292.  
  293. /* These screw up NeXT's gdb at the moment, so don't use them. */
  294.  
  295. #undef    DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
  296. #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE, FILENAME)
  297.  
  298. /* These come from bsd386.h, but are specific to sequent, so make sure
  299.    they don't bite us.  */
  300.  
  301. #undef    DBX_NO_XREFS
  302. #undef    DBX_CONTIN_LENGTH
  303.  
  304. /* gdb needs a null N_SO at the end of each file for scattered loading. */
  305.  
  306. #undef    DBX_OUTPUT_MAIN_SOURCE_FILE_END
  307. #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)            \
  308.   fprintf (FILE,                            \
  309.        "\t.text\n\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n",        \
  310.        "" , N_SO)
  311.  
  312. /* Don't use .gcc_compiled symbols to communicate with GDB;
  313.    They interfere with numerically sorted symbol lists. */
  314.  
  315. #undef    ASM_IDENTIFY_GCC
  316. #define ASM_IDENTIFY_GCC(asm_out_file)
  317. #undef    INIT_SECTION_ASM_OP
  318. #define INIT_SECTION_ASM_OP
  319. #undef    INVOKE__main
  320.  
  321. #define ASM_OUTPUT_ZEROFILL(FILE, NAME, SIZE, ALIGNMENT)      \
  322. do { fputs (".zerofill __DATA, __common, ", (FILE));        \
  323.         assemble_name ((FILE), (NAME));                \
  324.         fprintf ((FILE), ", %u, %u\n", (SIZE), (ALIGNMENT));     \
  325.       } while (0)
  326.  
  327. #undef    ASM_OUTPUT_CONSTRUCTOR
  328. #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                       \
  329.   do { if (flag_pic) mod_init_section ();                       \
  330.        else constructor_section ();                             \
  331.        ASM_OUTPUT_ALIGN (FILE, 1);                              \
  332.        fprintf (FILE, "\t.long ");                              \
  333.        assemble_name (FILE, NAME);                              \
  334.        fprintf (FILE, "\n");                                    \
  335.        if (!flag_pic)                                        \
  336.      fprintf (FILE, ".reference .constructors_used\n");     \
  337.       } while (0)
  338.  
  339. #undef    ASM_OUTPUT_DESTRUCTOR
  340. #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                        \
  341.   do if (!flag_pic) {                        \
  342.     destructor_section ();                    \
  343.     ASM_OUTPUT_ALIGN (FILE, 1);                    \
  344.     fprintf (FILE, "\t.long ");                    \
  345.     assemble_name (FILE, NAME);                    \
  346.     fprintf (FILE, "\n");                    \
  347.     fprintf (FILE, ".reference .destructors_used\n");        \
  348.   } while (0)
  349.  
  350. #define CALL_DESTRUCTOR_DYNAMICALLY(dfndecl) \
  351.   call_destructor_dynamically (dfndecl)
  352. #define DYNAMIC_DESTRUCTORS (flag_pic != 0)
  353.  
  354. /* Don't output a .file directive.  That is only used by the assembler for
  355.    error reporting.  */
  356. #undef    ASM_FILE_START
  357. #define ASM_FILE_START(FILE)
  358.  
  359. #undef    ASM_FILE_END
  360. #define ASM_FILE_END(FILE)                    \
  361.   do {                                \
  362.     extern char *language_string;                \
  363.     if (strcmp (language_string, "GNU C++") == 0)        \
  364.       {                                \
  365.     constructor_section ();                    \
  366.     destructor_section ();                    \
  367.     ASM_OUTPUT_ALIGN (FILE, 1);                \
  368.       }                                \
  369.   } while (0)
  370.  
  371. /* How to parse #pragma's */
  372.  
  373. #undef    HANDLE_PRAGMA
  374. #define HANDLE_PRAGMA(finput) handle_pragma (finput, &get_directive_line)
  375.  
  376. /* Give methods pretty symbol names on NeXT. */
  377.  
  378. #undef    OBJC_GEN_METHOD_LABEL
  379. #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
  380.   do { if (CAT_NAME)                            \
  381.      sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+',        \
  382.           (CLASS_NAME), (CAT_NAME), (SEL_NAME));        \
  383.        else                                \
  384.      sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+',        \
  385.           (CLASS_NAME), (SEL_NAME));                \
  386.      } while (0)
  387.  
  388. /* Wrap new method names in quotes so the assembler doesn't gag.
  389.    Make Objective-C internal symbols local.  */
  390.  
  391. #undef    ASM_OUTPUT_LABELREF
  392. #define ASM_OUTPUT_LABELREF(FILE,NAME)    \
  393.   do { if (NAME[0] == '+' || NAME[0] == '-') fprintf (FILE, "\"%s\"", NAME); \
  394.        else if (!strncmp (NAME, "_OBJC_", 6)) fprintf (FILE, "L%s", NAME);   \
  395.        else if (!strncmp (NAME, ".objc_class_name_", 17))        \
  396.      fprintf (FILE, "%s", NAME);                    \
  397.        else fprintf (FILE, "_%s", NAME); } while (0)
  398.  
  399. #undef    ALIGN_ASM_OP
  400. #define ALIGN_ASM_OP        ".align"
  401.  
  402. #undef    ASM_OUTPUT_ALIGN
  403. #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  404.   if ((LOG) != 0)            \
  405.     fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
  406.  
  407. /* Ensure correct alignment of bss data.  */
  408.  
  409. #undef    ASM_OUTPUT_ALIGNED_LOCAL
  410. #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
  411. ( fputs (".lcomm ", (FILE)),                \
  412.   assemble_name ((FILE), (NAME)),            \
  413.   fprintf ((FILE), ",%u,%u\n", (SIZE), floor_log2 ((ALIGN) / BITS_PER_UNIT)))
  414.  
  415. /* Output #ident as a .ident.  */
  416.  
  417. #undef    ASM_OUTPUT_IDENT
  418. #define ASM_OUTPUT_IDENT(FILE, NAME)
  419.  
  420. /* The maximum alignment which the object file format can support.
  421.    For NeXT's Mach-O format, this is 2^15.  */
  422.  
  423. #undef    MAX_OFILE_ALIGNMENT
  424. #define MAX_OFILE_ALIGNMENT 0x8000
  425.  
  426. /* Create new Mach-O sections. */
  427.  
  428. #undef    SECTION_FUNCTION
  429. #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, WAS_TEXT, OBJC)    \
  430. void                                    \
  431. FUNCTION ()                                \
  432. {                                    \
  433.   extern void text_section ();                         \
  434.   extern void objc_section_init ();                    \
  435.   extern int flag_no_mach_text_sections;                \
  436.                                       \
  437.   if (WAS_TEXT && flag_no_mach_text_sections)                   \
  438.     text_section ();                            \
  439.   else if (in_section != SECTION)                    \
  440.     {                                    \
  441.       if (OBJC)                                \
  442.     objc_section_init ();                        \
  443.       fprintf (asm_out_file, "%s\n", DIRECTIVE);            \
  444.       in_section = SECTION;                        \
  445.     }                                    \
  446. }                                    \
  447.  
  448. #define ALIAS_SECTION(enum_value, alias_name)         \
  449. do { if (!strcmp (alias_name, name)) \
  450.         section_alias[enum_value] = alias ? get_identifier (alias) : 0;   \
  451.    } while (0)
  452.  
  453. #undef    EXTRA_SECTIONS
  454. #define EXTRA_SECTIONS                    \
  455.   in_const, in_const_data, in_cstring, in_literal4, in_literal8,    \
  456.   in_constructor, in_destructor, in_mod_init,        \
  457.   in_objc_class, in_objc_meta_class, in_objc_category,    \
  458.   in_objc_class_vars, in_objc_instance_vars,        \
  459.   in_objc_cls_meth, in_objc_inst_meth,            \
  460.   in_objc_cat_cls_meth, in_objc_cat_inst_meth,        \
  461.   in_objc_selector_refs,                \
  462.   in_objc_selector_fixup,                \
  463.   in_objc_symbols, in_objc_module_info,            \
  464.   in_objc_protocol, in_objc_string_object,        \
  465.   in_objc_constant_string_object,            \
  466.   in_objc_class_names, in_objc_meth_var_names,        \
  467.   in_objc_meth_var_types, in_objc_cls_refs,         \
  468.   in_machopic_nl_symbol_ptr,                \
  469.   in_machopic_lazy_symbol_ptr,                \
  470.   in_machopic_symbol_stub,                \
  471.   in_machopic_picsymbol_stub
  472.  
  473. #undef    EXTRA_SECTION_FUNCTIONS
  474. #define EXTRA_SECTION_FUNCTIONS            \
  475. SECTION_FUNCTION (const_section,        \
  476.                   in_const,            \
  477.                   ".const", 1, 0)        \
  478. SECTION_FUNCTION (const_data_section,        \
  479.                   in_const_data,        \
  480.                   ".const_data", 1, 0)        \
  481. SECTION_FUNCTION (cstring_section,        \
  482.           in_cstring,            \
  483.           ".cstring", 1, 0)        \
  484. SECTION_FUNCTION (literal4_section,        \
  485.           in_literal4,            \
  486.           ".literal4", 1, 0)        \
  487. SECTION_FUNCTION (literal8_section,        \
  488.           in_literal8,            \
  489.           ".literal8", 1, 0)        \
  490. SECTION_FUNCTION (constructor_section,        \
  491.           in_constructor,        \
  492.           ".constructor", 0, 0)        \
  493. SECTION_FUNCTION (mod_init_section,        \
  494.           in_mod_init,            \
  495.           ".mod_init_func", 0, 0)    \
  496. SECTION_FUNCTION (destructor_section,        \
  497.           in_destructor,        \
  498.           ".destructor", 0, 0)        \
  499. SECTION_FUNCTION (objc_class_section,        \
  500.           in_objc_class,        \
  501.           ".objc_class", 0, 1)        \
  502. SECTION_FUNCTION (objc_meta_class_section,    \
  503.           in_objc_meta_class,        \
  504.           ".objc_meta_class", 0, 1)    \
  505. SECTION_FUNCTION (objc_category_section,    \
  506.           in_objc_category,        \
  507.         ".objc_category", 0, 1)        \
  508. SECTION_FUNCTION (objc_class_vars_section,    \
  509.           in_objc_class_vars,        \
  510.           ".objc_class_vars", 0, 1)    \
  511. SECTION_FUNCTION (objc_instance_vars_section,    \
  512.           in_objc_instance_vars,    \
  513.           ".objc_instance_vars", 0, 1)    \
  514. SECTION_FUNCTION (objc_cls_meth_section,    \
  515.           in_objc_cls_meth,        \
  516.           ".objc_cls_meth", 0, 1)    \
  517. SECTION_FUNCTION (objc_inst_meth_section,    \
  518.           in_objc_inst_meth,        \
  519.           ".objc_inst_meth", 0, 1)    \
  520. SECTION_FUNCTION (objc_cat_cls_meth_section,    \
  521.           in_objc_cat_cls_meth,        \
  522.           ".objc_cat_cls_meth", 0, 1)    \
  523. SECTION_FUNCTION (objc_cat_inst_meth_section,    \
  524.           in_objc_cat_inst_meth,    \
  525.           ".objc_cat_inst_meth", 0, 1)    \
  526. SECTION_FUNCTION (objc_selector_refs_section,    \
  527.           in_objc_selector_refs,    \
  528.           ".objc_message_refs", 0, 1)    \
  529. SECTION_FUNCTION (objc_selector_fixup_section,    \
  530.           in_objc_selector_fixup,    \
  531.           ".section __OBJC, __sel_fixup", 0, 1)    \
  532. SECTION_FUNCTION (objc_symbols_section,        \
  533.           in_objc_symbols,        \
  534.           ".objc_symbols", 0, 1)    \
  535. SECTION_FUNCTION (objc_module_info_section,    \
  536.           in_objc_module_info,        \
  537.           ".objc_module_info", 0, 1)    \
  538. SECTION_FUNCTION (objc_protocol_section,    \
  539.           in_objc_protocol,        \
  540.           ".objc_protocol", 0, 1)    \
  541. SECTION_FUNCTION (objc_string_object_section,    \
  542.           in_objc_string_object,    \
  543.           ".objc_string_object", 0, 1)    \
  544. SECTION_FUNCTION (objc_constant_string_object_section,    \
  545.           in_objc_constant_string_object,    \
  546.           ".section __OBJC, __cstring_object", 0, 1)    \
  547. SECTION_FUNCTION (objc_class_names_section,    \
  548.         in_objc_class_names,        \
  549.         ".objc_class_names", 0, 1)    \
  550. SECTION_FUNCTION (objc_meth_var_names_section,    \
  551.         in_objc_meth_var_names,        \
  552.         ".objc_meth_var_names", 0, 1)    \
  553. SECTION_FUNCTION (objc_meth_var_types_section,    \
  554.         in_objc_meth_var_types,        \
  555.         ".objc_meth_var_types", 0, 1)    \
  556. SECTION_FUNCTION (objc_cls_refs_section,    \
  557.         in_objc_cls_refs,        \
  558.         ".objc_cls_refs", 0, 1)        \
  559.                         \
  560. SECTION_FUNCTION (machopic_lazy_symbol_ptr_section,    \
  561.         in_machopic_lazy_symbol_ptr,        \
  562.         ".lazy_symbol_pointer", 0, 0)          \
  563. SECTION_FUNCTION (machopic_nl_symbol_ptr_section,    \
  564.         in_machopic_nl_symbol_ptr,        \
  565.         ".non_lazy_symbol_pointer", 0, 0)          \
  566. SECTION_FUNCTION (machopic_symbol_stub_section,        \
  567.         in_machopic_symbol_stub,        \
  568.         ".symbol_stub", 0, 0)              \
  569. SECTION_FUNCTION (machopic_picsymbol_stub_section,    \
  570.         in_machopic_picsymbol_stub,        \
  571.         ".picsymbol_stub", 0, 0)              \
  572.                             \
  573. void                        \
  574. objc_section_init ()                \
  575. {                        \
  576.   static int been_here = 0;            \
  577.                         \
  578.   if (been_here == 0)                \
  579.     {                        \
  580.       been_here = 1;                \
  581.           /* written, cold -> hot */        \
  582.       objc_cat_cls_meth_section ();        \
  583.       objc_cat_inst_meth_section ();        \
  584.       objc_string_object_section ();        \
  585.       objc_constant_string_object_section ();    \
  586.       objc_selector_refs_section ();        \
  587.       objc_selector_fixup_section ();        \
  588.       objc_cls_refs_section ();            \
  589.       objc_class_section ();            \
  590.       objc_meta_class_section ();        \
  591.           /* shared, hot -> cold */            \
  592.       objc_cls_meth_section ();            \
  593.       objc_inst_meth_section ();        \
  594.       objc_protocol_section ();            \
  595.       objc_class_names_section ();        \
  596.       objc_meth_var_types_section ();        \
  597.       objc_meth_var_names_section ();        \
  598.       objc_category_section ();            \
  599.       objc_class_vars_section ();        \
  600.       objc_instance_vars_section ();        \
  601.       objc_module_info_section ();        \
  602.       objc_symbols_section ();            \
  603.     }                        \
  604. }                         \
  605. static tree section_alias[(int)num_sections];        \
  606. void try_section_alias ()             \
  607. {                        \
  608.     if (section_alias[in_section])        \
  609.        fprintf (asm_out_file, "%s\n",        \
  610.               IDENTIFIER_POINTER (section_alias[in_section]));    \
  611. }                              \
  612. void alias_section (name, alias)            \
  613.   char *name, *alias;                    \
  614. {                            \
  615.     ALIAS_SECTION(in_data, "data");            \
  616.     ALIAS_SECTION(in_text, "text");            \
  617.     ALIAS_SECTION(in_const, "const");            \
  618.     ALIAS_SECTION(in_const_data, "const_data");        \
  619.     ALIAS_SECTION(in_cstring, "cstring");        \
  620.     ALIAS_SECTION(in_literal4, "literal4");        \
  621.     ALIAS_SECTION(in_literal8, "literal8");        \
  622. }
  623.  
  624. #undef    READONLY_DATA_SECTION
  625. #define READONLY_DATA_SECTION const_section
  626.  
  627. #undef    SELECT_SECTION
  628. #define SELECT_SECTION(exp,reloc)                \
  629.   do                                \
  630.     {                                \
  631.       if (TREE_CODE (exp) == STRING_CST)            \
  632.     {                            \
  633.       if (flag_writable_strings)                \
  634.         data_section ();                    \
  635.       else if (TREE_STRING_LENGTH (exp) !=            \
  636.            strlen (TREE_STRING_POINTER (exp)) + 1)    \
  637.         readonly_data_section ();                \
  638.       else                            \
  639.         cstring_section ();                    \
  640.     }                            \
  641.       else if (TREE_CODE (exp) == INTEGER_CST            \
  642.            || TREE_CODE (exp) == REAL_CST)            \
  643.         {                            \
  644.       tree size = TYPE_SIZE (TREE_TYPE (exp));        \
  645.                                   \
  646.       if (TREE_CODE (size) == INTEGER_CST &&        \
  647.           TREE_INT_CST_LOW (size) == 4 &&            \
  648.           TREE_INT_CST_HIGH (size) == 0)            \
  649.         literal4_section ();                \
  650.       else if (TREE_CODE (size) == INTEGER_CST &&        \
  651.           TREE_INT_CST_LOW (size) == 8 &&            \
  652.           TREE_INT_CST_HIGH (size) == 0)            \
  653.         literal8_section ();                \
  654.       else                            \
  655.         readonly_data_section ();                \
  656.     }                            \
  657.       else if (TREE_CODE (exp) == CONSTRUCTOR                \
  658.            && TREE_TYPE (exp)                    \
  659.            && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE        \
  660.            && TYPE_NAME (TREE_TYPE (exp)))                \
  661.     {                                \
  662.       tree name = TYPE_NAME (TREE_TYPE (exp));            \
  663.       if (TREE_CODE (name) == TYPE_DECL)                \
  664.         name = DECL_NAME (name);                    \
  665.       if (!strcmp (IDENTIFIER_POINTER (name), "NSConstantString"))    \
  666.         objc_constant_string_object_section ();            \
  667.       else if (!strcmp (IDENTIFIER_POINTER (name), "NXConstantString")) \
  668.         objc_string_object_section ();                \
  669.       else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp))        \
  670.         && !TREE_SIDE_EFFECTS (exp))                \
  671.                   { if (flag_pic && reloc ) const_data_section ();      \
  672.                     else readonly_data_section (); }                    \
  673.       else                                \
  674.         data_section ();                        \
  675.       }                                    \
  676.       else if (TREE_CODE (exp) == VAR_DECL &&                \
  677.            DECL_NAME (exp) &&                    \
  678.            TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE &&    \
  679.            IDENTIFIER_POINTER (DECL_NAME (exp)) &&            \
  680.            !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) \
  681.     {                                \
  682.       const char *name = IDENTIFIER_POINTER (DECL_NAME (exp));    \
  683.                                       \
  684.       if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20))        \
  685.         objc_cls_meth_section ();                    \
  686.       else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23))    \
  687.         objc_inst_meth_section ();                    \
  688.       else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) \
  689.         objc_cat_cls_meth_section ();                \
  690.       else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) \
  691.         objc_cat_inst_meth_section ();                \
  692.       else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22))    \
  693.         objc_class_vars_section ();                    \
  694.       else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25))    \
  695.         objc_instance_vars_section ();                \
  696.       else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22))    \
  697.         objc_cat_cls_meth_section ();                \
  698.       else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17))        \
  699.         objc_class_names_section ();                \
  700.       else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20))        \
  701.         objc_meth_var_names_section ();                \
  702.       else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20))        \
  703.         objc_meth_var_types_section ();                \
  704.       else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22))    \
  705.         objc_cls_refs_section ();                    \
  706.       else if (!strncmp (name, "_OBJC_CLASS_", 12))            \
  707.         objc_class_section ();                    \
  708.       else if (!strncmp (name, "_OBJC_METACLASS_", 16))        \
  709.         objc_meta_class_section ();                    \
  710.       else if (!strncmp (name, "_OBJC_CATEGORY_", 15))        \
  711.         objc_category_section ();                    \
  712.       else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25))    \
  713.         objc_selector_refs_section ();                \
  714.       else if (!strncmp (name, "_OBJC_SELECTOR_FIXUP", 20))        \
  715.         objc_selector_fixup_section ();                \
  716.       else if (!strncmp (name, "_OBJC_SYMBOLS", 13))        \
  717.         objc_symbols_section ();                    \
  718.       else if (!strncmp (name, "_OBJC_MODULES", 13))        \
  719.         objc_module_info_section ();                \
  720.       else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32)) \
  721.         objc_cat_inst_meth_section ();                              \
  722.       else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29)) \
  723.         objc_cat_cls_meth_section ();                               \
  724.       else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20))         \
  725.         objc_cat_cls_meth_section ();                               \
  726.       else if (!strncmp (name, "_OBJC_PROTOCOL_", 15))              \
  727.         objc_protocol_section ();                                   \
  728.       else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp))        \
  729.         && !TREE_SIDE_EFFECTS (exp))                 \
  730.              { if (flag_pic && reloc ) const_data_section ();             \
  731.                else readonly_data_section (); }                           \
  732.       else                                \
  733.         data_section ();                        \
  734.     }                                \
  735.       else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp))    \
  736.            && !TREE_SIDE_EFFECTS (exp))                \
  737.                  { if (flag_pic && reloc ) const_data_section ();             \
  738.                    else readonly_data_section (); }                           \
  739.       else                                \
  740.         data_section ();                        \
  741.       try_section_alias ();    \
  742.     }                                    \
  743.   while (0)
  744.  
  745. #undef    SELECT_RTX_SECTION
  746. #define SELECT_RTX_SECTION(mode, rtx)                    \
  747.   do                                    \
  748.     {                                    \
  749.       if (GET_MODE_SIZE(mode) == 8)                    \
  750.     literal8_section();                        \
  751.       else if (GET_MODE_SIZE(mode) == 4)                \
  752.     literal4_section();                        \
  753.       else                                \
  754.     const_section ();                        \
  755.     }                                    \
  756.   while (0)
  757.  
  758.  
  759. #define LINK_COMMAND_SPEC \
  760. "%{!fsyntax-only: \
  761.    %{!c:%{!M:%{!MM:%{!E:%{!precomp:%{!S: \
  762.       %{dynamiclib:/bin/libtool %{arch*:-arch_only %T} %{!all_load:-noall_load}\
  763.     %{current_version:}%{compatibility_version:} %J} \
  764.      %{!dynamiclib:%{.C:/bin/ld++}%{.M:/bin/ld++}%{.cc:/bin/ld++} \
  765.           %{!.C:%{!.M:%{!.cc:%{ObjC++:/bin/ld++}%{!ObjC++:/bin/ld}}}} \
  766.           -arch %T %{@:-arch_multiple}} \
  767.             %l %X %{force_cpusubtype_ALL}\
  768.             %{@:-o %f%g-%T.out}%{!@:%{o}} \
  769.                         %{NEXTSTEP-deployment-target} \
  770.             %{static}%{!static:-dynamic} \
  771.             %{bundle:-bundle %{!dynamiclib:%{image_base}}} \
  772.             %{A} %{d} %{e*} %{m} %{N} %{n} %{p} \
  773.             %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z} %{y*} \
  774.             %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
  775.             %{L*} %o %{!nostdlib:%G %L %{!A:%E}} \
  776.      %{!dynamiclib:\n/bin/objcunique %{prebind} %{noprebind} \
  777.            %{@:%f%g-%T.out} %{!@:%{o*:%*}}}}}}}}}}"
  778.  
  779.  
  780. #define DECLARE_UNRESOLVED_REFERENCE(NAME)                \
  781.     do { extern FILE* asm_out_file;                     \
  782.      if (flag_pic) fprintf (asm_out_file, "\t.lazy_reference ");    \
  783.      else fprintf (asm_out_file, "\t.reference ");            \
  784.      assemble_name (asm_out_file, NAME);                \
  785.      fprintf (asm_out_file, "\n");                    \
  786.        } while (0)
  787.  
  788.  
  789. #define DECLARE_CLASS_REFERENCE(NAME) \
  790.     do { extern FILE* asm_out_file; fprintf (asm_out_file, "\t");    \
  791.          assemble_name (asm_out_file, NAME);                 \
  792.      fprintf (asm_out_file, "=0\n");                \
  793.      assemble_global (NAME);                    \
  794.        } while (0)
  795.  
  796. #define GO_IF_CPLUSPLUS_INCLUDE_NAME(NAME,LABEL)        \
  797.  do { char *_p = (NAME);                    \
  798.       _next: switch (*_p) { case 0: break;            \
  799.       case 'c': case 'C': case 'G': case 'g':            \
  800.       if (_p[1] == '+' && _p[2] == '+') goto LABEL; break;    \
  801.       default: _p += 1; goto _next; }} while (0)
  802.  
  803. #undef ASM_GLOBALIZE_LABEL
  804. #define ASM_GLOBALIZE_LABEL(FILE,NAME)    \
  805.  do { const char* _x = (NAME); if (!!strncmp (_x, "_OBJC_", 6)) { \
  806.   (fputs (".globl ", FILE), assemble_name (FILE, _x), fputs ("\n", FILE)); \
  807.  }} while (0)
  808.  
  809. #define ASM_PRIVATE_EXTERNIZE_LABEL(FILE, NAME) \
  810.  do { const char* _x = (NAME); if (!!strncmp (_x, "_OBJC_", 6)) { \
  811.   fputs (".private_extern ", FILE); assemble_name (FILE, _x); \
  812.   fputs ("\n", FILE); }} while (0)
  813.  
  814. #ifdef NEXT_LIBGCC_NAMES
  815. #include "next/nextstep.def"
  816. #endif
  817.  
  818. #ifndef JUMP_TABLES_IN_TEXT_SECTION
  819. #define JUMP_TABLES_IN_TEXT_SECTION 1
  820. #endif
  821.