home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / g77-0.5.15-src.tgz / tar.out / fsf / g77 / f / com.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  12KB  |  382 lines

  1. /* com.h -- Public #include File (module.h template V1.0)
  2.    Copyright (C) 1995 Free Software Foundation, Inc.
  3.    Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
  4.  
  5. This file is part of GNU Fortran.
  6.  
  7. GNU Fortran 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 Fortran 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 Fortran; see the file COPYING.  If not, write to
  19. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.    Owning Modules:
  22.       com.c
  23.  
  24.    Modifications:
  25. */
  26.  
  27. /* Allow multiple inclusion to work. */
  28.  
  29. #ifndef _H_f_com
  30. #define _H_f_com
  31.  
  32. /* Simple definitions and enumerations. */
  33.  
  34. #define FFECOM_dimensionsMAX 7    /* Max # dimensions (quick hack). */
  35.  
  36. #define FFECOM_targetFFE 0
  37. #define FFECOM_targetGCC 1
  38.  
  39. #ifndef FFE_STANDALONE
  40. #define FFECOM_targetCURRENT FFECOM_targetGCC    /* Backend! */
  41. #define FFECOM_ONEPASS 0
  42. #else
  43. #define FFECOM_targetCURRENT FFECOM_targetFFE
  44. #define FFECOM_ONEPASS 0
  45. #endif
  46.  
  47. #if FFECOM_ONEPASS
  48. #define FFECOM_TWOPASS 0
  49. #else
  50. #define FFECOM_TWOPASS 1
  51. #endif
  52.  
  53. #define FFECOM_SIZE_UNIT "byte"    /* Singular form. */
  54. #define FFECOM_SIZE_UNITS "bytes"    /* Plural form. */
  55.  
  56. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  57. #define FFECOM_constantNULL NULL_TREE
  58. #define FFECOM_globalNULL NULL_TREE
  59. #define FFECOM_labelNULL NULL_TREE
  60. #define FFECOM_storageNULL NULL_TREE
  61. #define FFECOM_symbolNULL ffecom_symbol_null_
  62.  
  63. /* Shorthand for types used in f2c.h and that g77 perhaps allows some
  64.    flexibility regarding in the section below.  I.e. the actual numbers
  65.    below aren't important, as long as they're unique.  */
  66.  
  67. #define FFECOM_f2ccodeCHAR 1
  68. #define FFECOM_f2ccodeSHORT 2
  69. #define FFECOM_f2ccodeINT 3
  70. #define FFECOM_f2ccodeLONG 4
  71. #define FFECOM_f2ccodeLONGLONG 5
  72. #define FFECOM_f2ccodeCHARPTR 6        /* char * */
  73. #define FFECOM_f2ccodeFLOAT 7
  74. #define FFECOM_f2ccodeDOUBLE 8
  75. #define FFECOM_f2ccodeLONGDOUBLE 9
  76. #define FFECOM_f2ccodeTWOREALS 10
  77. #define FFECOM_f2ccodeTWODOUBLEREALS 11
  78.  
  79. #if FFECOM_DETERMINE_TYPES    /* only for com.c and configure */
  80.  
  81. /* Begin f2c.h information.  This must match the info in the f2c.h used
  82.    to build the libf2c with which g77-generated code is linked, or there
  83.    will probably be bugs, some of them difficult to detect or even trigger.  */
  84.  
  85. #include "config.j"
  86.  
  87. /* Do we need int (for 32-bit or 64-bit systems) or long (16-bit or
  88.    normally 32-bit) for f2c-type integers? */
  89.  
  90. #ifndef BITS_PER_WORD
  91. #define BITS_PER_WORD 32
  92. #endif
  93.  
  94. #ifndef CHAR_TYPE_SIZE
  95. #define CHAR_TYPE_SIZE BITS_PER_UNIT
  96. #endif
  97.  
  98. #ifndef SHORT_TYPE_SIZE
  99. #define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
  100. #endif
  101.  
  102. #ifndef INT_TYPE_SIZE
  103. #define INT_TYPE_SIZE BITS_PER_WORD
  104. #endif
  105.  
  106. #ifndef LONG_TYPE_SIZE
  107. #define LONG_TYPE_SIZE BITS_PER_WORD
  108. #endif
  109.  
  110. #ifndef LONG_LONG_TYPE_SIZE
  111. #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
  112. #endif
  113.  
  114. #ifndef WCHAR_UNSIGNED
  115. #define WCHAR_UNSIGNED 0
  116. #endif
  117.  
  118. #ifndef FLOAT_TYPE_SIZE
  119. #define FLOAT_TYPE_SIZE BITS_PER_WORD
  120. #endif
  121.  
  122. #ifndef DOUBLE_TYPE_SIZE
  123. #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
  124. #endif
  125.  
  126. #ifndef LONG_DOUBLE_TYPE_SIZE
  127. #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
  128. #endif
  129.  
  130. #if LONG_TYPE_SIZE == FLOAT_TYPE_SIZE
  131. #  define FFECOM_f2cINTEGER FFECOM_f2ccodeLONG
  132. #  define FFECOM_f2cLOGICAL FFECOM_f2ccodeLONG
  133. #elif INT_TYPE_SIZE == FLOAT_TYPE_SIZE
  134. #  define FFECOM_f2cINTEGER FFECOM_f2ccodeINT
  135. #  define FFECOM_f2cLOGICAL FFECOM_f2ccodeINT
  136. #else
  137. #  error Cannot find a suitable type for FFECOM_f2cINTEGER
  138. #endif
  139.  
  140. #define FFECOM_f2cADDRESS FFECOM_f2ccodeCHARPTR
  141. #define FFECOM_f2cSHORTINT FFECOM_f2ccodeSHORT
  142. #define FFECOM_f2cREAL FFECOM_f2ccodeFLOAT
  143. #define FFECOM_f2cDOUBLEREAL FFECOM_f2ccodeDOUBLE
  144. #define FFECOM_f2cCOMPLEX FFECOM_f2ccodeTWOREALS
  145. #define FFECOM_f2cDOUBLECOMPLEX FFECOM_f2ccodeTWODOUBLEREALS
  146. #define FFECOM_f2cSHORTLOGICAL FFECOM_f2ccodeSHORT
  147. #define FFECOM_f2cLOGICAL1 FFECOM_f2ccodeCHAR
  148. #define FFECOM_f2cINTEGER1 FFECOM_f2ccodeCHAR
  149. #define FFECOM_f2cLONGINT FFECOM_f2ccodeLONGLONG
  150.  
  151. /* These must be f2c's INTEGER type, to match runtime/f2c.h.in.  */
  152.  
  153. #define FFECOM_f2cFLAG FFECOM_f2cINTEGER
  154. #define FFECOM_f2cFTNINT FFECOM_f2cINTEGER
  155. #define FFECOM_f2cFTNLEN FFECOM_f2cINTEGER
  156.  
  157. #endif    /* #if FFECOM_DETERMINE_TYPES */
  158.  
  159. /* Everything else in f2c.h, specifically the structures used in
  160.    interfacing compiled code with the library, must remain exactly
  161.    as delivered, or g77 internals (mostly com.c and ste.c) must
  162.    be modified accordingly to compensate.  Or there will be...trouble.  */
  163.  
  164. typedef enum
  165.   {
  166. #define DEFGFRT(CODE,NAME,TYPE,VOLATILE,COMPLEX) CODE,
  167. #include "com-rt.def"
  168. #undef DEFGFRT
  169.     FFECOM_gfrt
  170.   } ffecomGfrt;
  171.  
  172. #endif
  173.  
  174. /* Typedefs. */
  175.  
  176. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  177. #ifndef TREE_CODE
  178. #include "tree.j"
  179. #endif
  180. typedef tree ffecomConstant;
  181. #define FFECOM_constantHOOK
  182. typedef tree ffecomLabel;
  183. #define FFECOM_globalHOOK
  184. typedef tree ffecomGlobal;
  185. #define FFECOM_labelHOOK
  186. typedef tree ffecomStorage;
  187. #define FFECOM_storageHOOK
  188. typedef struct _ffecom_symbol_ ffecomSymbol;
  189. #define FFECOM_symbolHOOK
  190.  
  191. struct _ffecom_symbol_
  192.   {
  193.     tree decl_tree;
  194.     tree length_tree;        /* For CHARACTER dummies and ASSIGN'ed vars. */
  195.     tree vardesc_tree;        /* For NAMELIST. */
  196.     bool addr;            /* Is address of item instead of item. */
  197.   };
  198. #endif
  199.  
  200. /* Include files needed by this one. */
  201.  
  202. #include "bld.h"
  203. #include "info.h"
  204. #include "lab.h"
  205. #include "storag.h"
  206. #include "symbol.h"
  207.  
  208. /* Structure definitions. */
  209.  
  210.  
  211. /* Global objects accessed by users of this module. */
  212.  
  213. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  214. extern tree long_integer_type_node;
  215. extern tree complex_double_type_node;
  216. extern tree string_type_node;
  217. extern tree ffecom_integer_type_node;
  218. extern tree ffecom_integer_zero_node;
  219. extern tree ffecom_integer_one_node;
  220. extern tree ffecom_tree_type[FFEINFO_basictype][FFEINFO_kindtype];
  221. extern ffecomSymbol ffecom_symbol_null_;
  222.  
  223. extern int ffecom_f2c_typecode_[FFEINFO_basictype][FFEINFO_kindtype];
  224. extern tree ffecom_f2c_integer_type_node;
  225. extern tree ffecom_f2c_address_type_node;
  226. extern tree ffecom_f2c_real_type_node;
  227. extern tree ffecom_f2c_doublereal_type_node;
  228. extern tree ffecom_f2c_complex_type_node;
  229. extern tree ffecom_f2c_doublecomplex_type_node;
  230. extern tree ffecom_f2c_logical_type_node;
  231. extern tree ffecom_f2c_flag_type_node;
  232. extern tree ffecom_f2c_ftnlen_type_node;
  233. extern tree ffecom_f2c_ftnlen_zero_node;
  234. extern tree ffecom_f2c_ftnlen_one_node;
  235. extern tree ffecom_f2c_ftnlen_two_node;
  236. extern tree ffecom_f2c_ptr_to_ftnlen_type_node;
  237. extern tree ffecom_f2c_ftnint_type_node;
  238. extern tree ffecom_f2c_ptr_to_ftnint_type_node;
  239. #endif
  240.  
  241. /* Declare functions with prototypes. */
  242.  
  243. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  244. tree ffecom_1 (enum tree_code code, tree type, tree node);
  245. tree ffecom_1_fn (tree node);
  246. tree ffecom_2 (enum tree_code code, tree type, tree node1, tree node2);
  247. bool ffecom_2pass_advise_entrypoint (ffesymbol entry);
  248. void ffecom_2pass_do_entrypoint (ffesymbol entry);
  249. tree ffecom_2s (enum tree_code code, tree type, tree node1, tree node2);
  250. tree ffecom_3 (enum tree_code code, tree type, tree node1, tree node2,
  251.            tree node3);
  252. tree ffecom_3s (enum tree_code code, tree type, tree node1, tree node2,
  253.         tree node3);
  254. tree ffecom_arg_expr (ffebld expr, tree *length);
  255. tree ffecom_arg_ptr_to_expr (ffebld expr, tree *length);
  256. tree ffecom_call_gfrt (ffecomGfrt ix, tree args);
  257. tree ffecom_constantunion (ffebldConstantUnion *cu, ffeinfoBasictype bt,
  258.                ffeinfoKindtype kt, tree tree_type);
  259. tree ffecom_decl_field (tree context, tree prevfield, char *name,
  260.             tree type);
  261. #endif
  262. void ffecom_close_include (FILE *f);
  263. int ffecom_decode_include_option (char *spec);
  264. void ffecom_end_transition (void);
  265. void ffecom_exec_transition (void);
  266. void ffecom_expand_let_stmt (ffebld dest, ffebld source);
  267. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  268. tree ffecom_expr (ffebld expr);
  269. tree ffecom_expr_assign (ffebld expr);
  270. tree ffecom_expr_assign_w (ffebld expr);
  271. tree ffecom_expr_rw (ffebld expr);
  272. void ffecom_finish_compile (void);
  273. void ffecom_finish_decl (tree decl, tree init, bool is_top_level);
  274. void ffecom_finish_progunit (void);
  275. tree ffecom_get_invented_identifier (char *pattern, char *text,
  276.                      int number);
  277. void ffecom_init_0 (void);
  278. void ffecom_init_2 (void);
  279. tree ffecom_list_expr (ffebld list);
  280. tree ffecom_list_ptr_to_expr (ffebld list);
  281. tree ffecom_lookup_label (ffelab label);
  282. tree ffecom_modify (tree newtype, tree lhs, tree rhs);
  283. #endif
  284. void ffecom_file (char *name);
  285. void ffecom_notify_init_storage (ffestorag st);
  286. void ffecom_notify_init_symbol (ffesymbol s);
  287. void ffecom_notify_primary_entry (ffesymbol fn);
  288. FILE *ffecom_open_include (char *name, ffewhereLine l, ffewhereColumn c);
  289. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  290. void ffecom_pop_calltemps (void);
  291. void ffecom_pop_tempvar (tree var);
  292. tree ffecom_ptr_to_expr (ffebld expr);
  293. void ffecom_push_calltemps (void);
  294. tree ffecom_push_tempvar (tree type, ffetargetCharacterSize size,
  295.               int elements, bool auto_pop);
  296. tree ffecom_return_expr (ffebld expr);
  297. tree ffecom_save_tree (tree t);
  298. tree ffecom_start_decl (tree decl, bool is_init);
  299. void ffecom_sym_commit (ffesymbol s);
  300. #endif
  301. ffesymbol ffecom_sym_end_transition (ffesymbol s);
  302. ffesymbol ffecom_sym_exec_transition (ffesymbol s);
  303. ffesymbol ffecom_sym_learned (ffesymbol s);
  304. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  305. void ffecom_sym_retract (ffesymbol s);
  306. tree ffecom_temp_label (void);
  307. tree ffecom_truth_value (tree expr);
  308. tree ffecom_truth_value_invert (tree expr);
  309. tree ffecom_which_entrypoint_decl (void);
  310. #endif
  311.  
  312. /* ~~~Eliminate these when possible, since the back end should be
  313.    declaring them in some .h file.  */
  314.  
  315. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  316. extern int flag_pedantic_errors;
  317. void emit_nop (void);
  318. void announce_function (tree decl);
  319. void assemble_variable (tree decl, int top_level, int at_end,
  320.             int dont_output_data);
  321. void assemble_zeros (int size);
  322. int count_error (int warningp);
  323. void error (char *s, ...);
  324. void expand_decl (tree decl);
  325. void expand_computed_goto (tree exp);
  326. void expand_function_end (char *filename, int line, int end_bindings);
  327. void expand_function_start (tree subr, int parms_have_cleanups);
  328. void expand_main_function (void);
  329. void fatal (char *s, ...);
  330. void init_function_start (tree subr, char *filename, int line);
  331. void make_function_rtl (tree decl);
  332. void make_decl_rtl (tree decl, char *asmspec, int top_level);
  333. void make_var_volatile (tree var);
  334. int mark_addressable (tree expr);
  335. void output_inline_function (tree fndecl);
  336. void pop_function_context (void);
  337. void pop_momentary_nofree (void);
  338. void preserve_initializer (void);
  339. void print_node (FILE *file, char *prefix, tree node, int indent);
  340. void push_function_context (void);
  341. void push_obstacks (struct obstack *current, struct obstack *saveable);
  342. void put_var_into_stack (tree decl);
  343. void remember_end_note (tree block);
  344. void rest_of_compilation (tree decl);
  345. void rest_of_decl_compilation (tree decl, char *asmspec, int top_level,
  346.                    int at_end);
  347. void resume_temporary_allocation (void);
  348. void set_identifier_size (int size);
  349. void temporary_allocation (void);
  350. tree truthvalue_conversion (tree expr);
  351. void warning_with_decl (tree decl, char *s, ...);
  352. void warning (char *s, ...);
  353. #endif
  354.  
  355. /* Define macros. */
  356.  
  357. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  358. #define ffecom_expr(e) (e)
  359. #define ffecom_init_0()
  360. #define ffecom_init_2()
  361. #define ffecom_ptr_to_expr(e) (e)
  362. #define ffecom_sym_commit(s)
  363. #define ffecom_sym_retract(s)
  364. #endif
  365.  
  366. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  367. #define ffecom_f2c_typecode(bt,kt) ffecom_f2c_typecode_[(bt)][(kt)]
  368. #endif
  369.  
  370. #define ffecom_init_1()
  371. #define ffecom_init_3()
  372. #define ffecom_init_4()
  373. #define ffecom_terminate_0()
  374. #define ffecom_terminate_1()
  375. #define ffecom_terminate_2()
  376. #define ffecom_terminate_3()
  377. #define ffecom_terminate_4()
  378.  
  379. /* End of #include file. */
  380.  
  381. #endif
  382.