1 /* Language-dependent hooks for Objective-C++. 2 Copyright 2005 Free Software Foundation, Inc. 3 Contributed by Ziemowit Laski <zlaski@apple.com> 4 5 This file is part of GCC. 6 7 GCC 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 GCC 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 GCC; see the file COPYING. If not, write to 19 the Free Software Foundation, 51 Franklin Street, Fifth Floor, 20 Boston, MA 02110-1301, USA. */ 21 22 #include "config.h" 23 #include "system.h" 24 #include "coretypes.h" 25 #include "tm.h" 26 #include "tree.h" 27 #include "cp-tree.h" 28 #include "c-common.h" 29 #include "toplev.h" 30 #include "objc-act.h" 31 #include "langhooks.h" 32 #include "langhooks-def.h" 33 #include "diagnostic.h" 34 #include "debug.h" 35 #include "cp-objcp-common.h" 36 37 enum c_language_kind c_language = clk_objcxx; 38 static void objcxx_init_ts (void); 39 40 /* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h; 41 consequently, there should be very few hooks below. */ 42 43 #undef LANG_HOOKS_NAME 44 #define LANG_HOOKS_NAME "GNU Objective-C++" 45 #undef LANG_HOOKS_INIT 46 #define LANG_HOOKS_INIT objc_init 47 #undef LANG_HOOKS_DECL_PRINTABLE_NAME 48 #define LANG_HOOKS_DECL_PRINTABLE_NAME objc_printable_name 49 #undef LANG_HOOKS_GIMPLIFY_EXPR 50 #define LANG_HOOKS_GIMPLIFY_EXPR objc_gimplify_expr 51 #undef LANG_HOOKS_GET_CALLEE_FNDECL 52 #define LANG_HOOKS_GET_CALLEE_FNDECL objc_get_callee_fndecl 53 #undef LANG_HOOKS_INIT_TS 54 #define LANG_HOOKS_INIT_TS objcxx_init_ts 55 56 /* Each front end provides its own lang hook initializer. */ 57 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; 58 59 /* Tree code classes. */ 60 61 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, 62 63 const enum tree_code_class tree_code_type[] = { 64 #include "tree.def" 65 tcc_exceptional, 66 #include "c-common.def" 67 tcc_exceptional, 68 #include "cp-tree.def" 69 tcc_exceptional, 70 #include "objc-tree.def" 71 }; 72 #undef DEFTREECODE 73 74 /* Table indexed by tree code giving number of expression 75 operands beyond the fixed part of the node structure. 76 Not used for types or decls. */ 77 78 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, 79 80 const unsigned char tree_code_length[] = { 81 #include "tree.def" 82 0, 83 #include "c-common.def" 84 0, 85 #include "cp-tree.def" 86 0, 87 #include "objc-tree.def" 88 }; 89 #undef DEFTREECODE 90 91 /* Names of tree components. 92 Used for printing out the tree and error messages. */ 93 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, 94 95 const char *const tree_code_name[] = { 96 #include "tree.def" 97 "@@dummy", 98 #include "c-common.def" 99 "@@dummy", 100 #include "cp-tree.def" 101 "@@dummy", 102 #include "objc-tree.def" 103 }; 104 #undef DEFTREECODE 105 106 /* Lang hook routines common to C++ and ObjC++ appear in cp/cp-objcp-common.c; 107 there should be very few (if any) routines below. */ 108 109 tree 110 objcp_tsubst_copy_and_build (tree t, tree args, tsubst_flags_t complain, 111 tree in_decl, bool function_p ATTRIBUTE_UNUSED) 112 { 113 #define RECURSE(NODE) \ 114 tsubst_copy_and_build (NODE, args, complain, in_decl, \ 115 /*function_p=*/false, \ 116 /*integral_constant_expression_p=*/false) 117 118 /* The following two can only occur in Objective-C++. */ 119 120 switch ((int) TREE_CODE (t)) 121 { 122 case MESSAGE_SEND_EXPR: 123 return objc_finish_message_expr 124 (RECURSE (TREE_OPERAND (t, 0)), 125 TREE_OPERAND (t, 1), /* No need to expand the selector. */ 126 RECURSE (TREE_OPERAND (t, 2))); 127 128 case CLASS_REFERENCE_EXPR: 129 return objc_get_class_reference 130 (RECURSE (TREE_OPERAND (t, 0))); 131 132 default: 133 break; 134 } 135 136 /* Fall back to C++ processing. */ 137 return NULL_TREE; 138 139 #undef RECURSE 140 } 141 142 static void 143 objcxx_init_ts (void) 144 { 145 /* objc decls */ 146 tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_NON_COMMON] = 1; 147 tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_NON_COMMON] = 1; 148 tree_contains_struct[KEYWORD_DECL][TS_DECL_NON_COMMON] = 1; 149 150 tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_WITH_VIS] = 1; 151 tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_WITH_VIS] = 1; 152 tree_contains_struct[KEYWORD_DECL][TS_DECL_WITH_VIS] = 1; 153 154 tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_WRTL] = 1; 155 tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_WRTL] = 1; 156 tree_contains_struct[KEYWORD_DECL][TS_DECL_WRTL] = 1; 157 158 tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_MINIMAL] = 1; 159 tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_MINIMAL] = 1; 160 tree_contains_struct[KEYWORD_DECL][TS_DECL_MINIMAL] = 1; 161 162 tree_contains_struct[CLASS_METHOD_DECL][TS_DECL_COMMON] = 1; 163 tree_contains_struct[INSTANCE_METHOD_DECL][TS_DECL_COMMON] = 1; 164 tree_contains_struct[KEYWORD_DECL][TS_DECL_COMMON] = 1; 165 166 /* C++ decls */ 167 tree_contains_struct[NAMESPACE_DECL][TS_DECL_NON_COMMON] = 1; 168 tree_contains_struct[USING_DECL][TS_DECL_NON_COMMON] = 1; 169 tree_contains_struct[TEMPLATE_DECL][TS_DECL_NON_COMMON] = 1; 170 171 tree_contains_struct[NAMESPACE_DECL][TS_DECL_WITH_VIS] = 1; 172 tree_contains_struct[USING_DECL][TS_DECL_WITH_VIS] = 1; 173 tree_contains_struct[TEMPLATE_DECL][TS_DECL_WITH_VIS] = 1; 174 175 tree_contains_struct[NAMESPACE_DECL][TS_DECL_WRTL] = 1; 176 tree_contains_struct[USING_DECL][TS_DECL_WRTL] = 1; 177 tree_contains_struct[TEMPLATE_DECL][TS_DECL_WRTL] = 1; 178 179 tree_contains_struct[NAMESPACE_DECL][TS_DECL_COMMON] = 1; 180 tree_contains_struct[USING_DECL][TS_DECL_COMMON] = 1; 181 tree_contains_struct[TEMPLATE_DECL][TS_DECL_COMMON] = 1; 182 183 tree_contains_struct[NAMESPACE_DECL][TS_DECL_MINIMAL] = 1; 184 tree_contains_struct[USING_DECL][TS_DECL_MINIMAL] = 1; 185 tree_contains_struct[TEMPLATE_DECL][TS_DECL_MINIMAL] = 1; 186 187 init_shadowed_var_for_decl (); 188 } 189 190 191 void 192 finish_file (void) 193 { 194 objc_finish_file (); 195 } 196 197 #include "gtype-objcp.h" 198