1/* Specific flags and argument handling of the C++ front end. 2 Copyright (C) 1996-2015 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify 7it under the terms of the GNU General Public License as published by 8the Free Software Foundation; either version 3, or (at your option) 9any later version. 10 11GCC is distributed in the hope that it will be useful, 12but WITHOUT ANY WARRANTY; without even the implied warranty of 13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14GNU General Public License for more details. 15 16You should have received a copy of the GNU General Public License 17along with GCC; see the file COPYING3. If not see 18<http://www.gnu.org/licenses/>. */ 19 20#include "config.h" 21#include "system.h" 22#include "coretypes.h" 23#include "tm.h" 24#include "gcc.h" 25#include "opts.h" 26 27/* This bit is set if we saw a `-xfoo' language specification. */ 28#define LANGSPEC (1<<1) 29/* This bit is set if they did `-lm' or `-lmath'. */ 30#define MATHLIB (1<<2) 31/* This bit is set if they did `-lrt' or equivalent. */ 32#define TIMELIB (1<<3) 33/* This bit is set if they did `-lc'. */ 34#define WITHLIBC (1<<4) 35/* Skip this option. */ 36#define SKIPOPT (1<<5) 37 38#ifndef MATH_LIBRARY 39#define MATH_LIBRARY "m" 40#endif 41#ifndef MATH_LIBRARY_PROFILE 42#define MATH_LIBRARY_PROFILE MATH_LIBRARY 43#endif 44 45#ifndef TIME_LIBRARY 46#define TIME_LIBRARY "" 47#endif 48 49#ifndef LIBSTDCXX 50#define LIBSTDCXX "stdc++" 51#endif 52#ifndef LIBSTDCXX_PROFILE 53#define LIBSTDCXX_PROFILE LIBSTDCXX 54#endif 55#ifndef LIBSTDCXX_STATIC 56#define LIBSTDCXX_STATIC NULL 57#endif 58 59void 60lang_specific_driver (struct cl_decoded_option **in_decoded_options, 61 unsigned int *in_decoded_options_count, 62 int *in_added_libraries) 63{ 64 unsigned int i, j; 65 66 /* If nonzero, the user gave us the `-p' or `-pg' flag. */ 67 int saw_profile_flag = 0; 68 69 /* What do with libstdc++: 70 -1 means we should not link in libstdc++ 71 0 means we should link in libstdc++ if it is needed 72 1 means libstdc++ is needed and should be linked in. 73 2 means libstdc++ is needed and should be linked statically. */ 74 int library = 0; 75 76 /* The number of arguments being added to what's in argv, other than 77 libraries. We use this to track the number of times we've inserted 78 -xc++/-xnone. */ 79 int added = 0; 80 81 /* The new argument list will be contained in this. */ 82 struct cl_decoded_option *new_decoded_options; 83 84 /* Nonzero if we saw a `-xfoo' language specification on the 85 command line. Used to avoid adding our own -xc++ if the user 86 already gave a language for the file. */ 87 int saw_speclang = 0; 88 89 /* "-lm" or "-lmath" if it appears on the command line. */ 90 const struct cl_decoded_option *saw_math = NULL; 91 92 /* "-lrt" or eqivalent if it appears on the command line. */ 93 const struct cl_decoded_option *saw_time = NULL; 94 95 /* "-lc" if it appears on the command line. */ 96 const struct cl_decoded_option *saw_libc = NULL; 97 98 /* An array used to flag each argument that needs a bit set for 99 LANGSPEC, MATHLIB, TIMELIB, or WITHLIBC. */ 100 int *args; 101 102 /* By default, we throw on the math library if we have one. */ 103 int need_math = (MATH_LIBRARY[0] != '\0'); 104 105 /* By default, we throw on the time library if we have one. */ 106 int need_time = (TIME_LIBRARY[0] != '\0'); 107 108 /* True if we saw -static. */ 109 int static_link = 0; 110 111 /* True if we should add -shared-libgcc to the command-line. */ 112 int shared_libgcc = 1; 113 114 /* The total number of arguments with the new stuff. */ 115 unsigned int argc; 116 117 /* The argument list. */ 118 struct cl_decoded_option *decoded_options; 119 120 /* The number of libraries added in. */ 121 int added_libraries; 122 123 /* The total number of arguments with the new stuff. */ 124 unsigned int num_args = 1; 125 126 argc = *in_decoded_options_count; 127 decoded_options = *in_decoded_options; 128 added_libraries = *in_added_libraries; 129 130 args = XCNEWVEC (int, argc); 131 132 for (i = 1; i < argc; i++) 133 { 134 const char *arg = decoded_options[i].arg; 135 if (decoded_options[i].errors & CL_ERR_MISSING_ARG) 136 continue; /* Avoid examining arguments of options missing them. */ 137 138 switch (decoded_options[i].opt_index) 139 { 140 case OPT_nostdlib: 141 case OPT_nodefaultlibs: 142 library = -1; 143 break; 144 145 case OPT_l: 146 if (strcmp (arg, MATH_LIBRARY) == 0) 147 { 148 args[i] |= MATHLIB; 149 need_math = 0; 150 } 151 else if (strcmp (arg, TIME_LIBRARY) == 0) 152 { 153 args[i] |= TIMELIB; 154 need_time = 0; 155 } 156 else if (strcmp (arg, "c") == 0) 157 args[i] |= WITHLIBC; 158 else 159 /* Unrecognized libraries (e.g. -lfoo) may require libstdc++. */ 160 library = (library == 0) ? 1 : library; 161 break; 162 163 case OPT_pg: 164 case OPT_p: 165 saw_profile_flag++; 166 break; 167 168 case OPT_x: 169 if (library == 0 170 && (strcmp (arg, "c++") == 0 171 || strcmp (arg, "c++-cpp-output") == 0 172 || strcmp (arg, "objective-c++") == 0 173 || strcmp (arg, "objective-c++-cpp-output") == 0)) 174 library = 1; 175 176 saw_speclang = 1; 177 break; 178 179 case OPT_Xlinker: 180 case OPT_Wl_: 181 /* Arguments that go directly to the linker might be .o files, 182 or something, and so might cause libstdc++ to be needed. */ 183 if (library == 0) 184 library = 1; 185 break; 186 187 case OPT_c: 188 case OPT_S: 189 case OPT_E: 190 case OPT_M: 191 case OPT_MM: 192 case OPT_fsyntax_only: 193 /* Don't specify libraries if we won't link, since that would 194 cause a warning. */ 195 library = -1; 196 break; 197 198 case OPT_static: 199 static_link = 1; 200 break; 201 202 case OPT_static_libgcc: 203 shared_libgcc = 0; 204 break; 205 206 case OPT_static_libstdc__: 207 library = library >= 0 ? 2 : library; 208 args[i] |= SKIPOPT; 209 break; 210 211 case OPT_SPECIAL_input_file: 212 { 213 int len; 214 215 /* We don't do this anymore, since we don't get them with minus 216 signs on them. */ 217 if (arg[0] == '\0' || arg[1] == '\0') 218 continue; 219 220 if (saw_speclang) 221 { 222 saw_speclang = 0; 223 continue; 224 } 225 226 /* If the filename ends in .[chi], put options around it. 227 But not if a specified -x option is currently active. */ 228 len = strlen (arg); 229 if (len > 2 230 && (arg[len - 1] == 'c' 231 || arg[len - 1] == 'i' 232 || arg[len - 1] == 'h') 233 && arg[len - 2] == '.') 234 { 235 args[i] |= LANGSPEC; 236 added += 2; 237 } 238 239 /* If we don't know that this is a header file, we might 240 need to be linking in the libraries. */ 241 if (library == 0) 242 { 243 if ((len <= 2 || strcmp (arg + (len - 2), ".H") != 0) 244 && (len <= 2 || strcmp (arg + (len - 2), ".h") != 0) 245 && (len <= 4 || strcmp (arg + (len - 4), ".hpp") != 0) 246 && (len <= 3 || strcmp (arg + (len - 3), ".hp") != 0) 247 && (len <= 4 || strcmp (arg + (len - 4), ".hxx") != 0) 248 && (len <= 4 || strcmp (arg + (len - 4), ".h++") != 0) 249 && (len <= 4 || strcmp (arg + (len - 4), ".HPP") != 0) 250 && (len <= 4 || strcmp (arg + (len - 4), ".tcc") != 0) 251 && (len <= 3 || strcmp (arg + (len - 3), ".hh") != 0)) 252 library = 1; 253 } 254 } 255 break; 256 } 257 } 258 259 /* There's no point adding -shared-libgcc if we don't have a shared 260 libgcc. */ 261#ifndef ENABLE_SHARED_LIBGCC 262 shared_libgcc = 0; 263#endif 264 265 /* Add one for shared_libgcc or extra static library. */ 266 num_args = argc + added + need_math + (library > 0) * 4 + 1; 267 new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args); 268 269 i = 0; 270 j = 0; 271 272 /* Copy the 0th argument, i.e., the name of the program itself. */ 273 new_decoded_options[j++] = decoded_options[i++]; 274 275 /* NOTE: We start at 1 now, not 0. */ 276 while (i < argc) 277 { 278 new_decoded_options[j] = decoded_options[i]; 279 280 /* Make sure -lstdc++ is before the math library, since libstdc++ 281 itself uses those math routines. */ 282 if (!saw_math && (args[i] & MATHLIB) && library > 0) 283 { 284 --j; 285 saw_math = &decoded_options[i]; 286 } 287 288 if (!saw_time && (args[i] & TIMELIB) && library > 0) 289 { 290 --j; 291 saw_time = &decoded_options[i]; 292 } 293 294 if (!saw_libc && (args[i] & WITHLIBC) && library > 0) 295 { 296 --j; 297 saw_libc = &decoded_options[i]; 298 } 299 300 /* Wrap foo.[chi] files in a language specification to 301 force the gcc compiler driver to run cc1plus on them. */ 302 if (args[i] & LANGSPEC) 303 { 304 const char *arg = decoded_options[i].arg; 305 int len = strlen (arg); 306 switch (arg[len - 1]) 307 { 308 case 'c': 309 generate_option (OPT_x, "c++", 1, CL_DRIVER, 310 &new_decoded_options[j++]); 311 break; 312 case 'i': 313 generate_option (OPT_x, "c++-cpp-output", 1, CL_DRIVER, 314 &new_decoded_options[j++]); 315 break; 316 case 'h': 317 generate_option (OPT_x, "c++-header", 1, CL_DRIVER, 318 &new_decoded_options[j++]); 319 break; 320 default: 321 gcc_unreachable (); 322 } 323 new_decoded_options[j++] = decoded_options[i]; 324 generate_option (OPT_x, "none", 1, CL_DRIVER, 325 &new_decoded_options[j]); 326 } 327 328 if ((args[i] & SKIPOPT) != 0) 329 --j; 330 331 i++; 332 j++; 333 } 334 335 /* Add `-lstdc++' if we haven't already done so. */ 336 if (library > 0) 337 { 338#ifdef HAVE_LD_STATIC_DYNAMIC 339 if (library > 1 && !static_link) 340 { 341 generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER, 342 &new_decoded_options[j]); 343 j++; 344 } 345#endif 346 generate_option (OPT_l, 347 saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX, 1, 348 CL_DRIVER, &new_decoded_options[j]); 349 added_libraries++; 350 j++; 351 /* Add target-dependent static library, if necessary. */ 352 if ((static_link || library > 1) && LIBSTDCXX_STATIC != NULL) 353 { 354 generate_option (OPT_l, LIBSTDCXX_STATIC, 1, 355 CL_DRIVER, &new_decoded_options[j]); 356 added_libraries++; 357 j++; 358 } 359#ifdef HAVE_LD_STATIC_DYNAMIC 360 if (library > 1 && !static_link) 361 { 362 generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER, 363 &new_decoded_options[j]); 364 j++; 365 } 366#endif 367 } 368 if (saw_math) 369 new_decoded_options[j++] = *saw_math; 370 else if (library > 0 && need_math) 371 { 372 generate_option (OPT_l, 373 saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY, 374 1, CL_DRIVER, &new_decoded_options[j]); 375 added_libraries++; 376 j++; 377 } 378 if (saw_time) 379 new_decoded_options[j++] = *saw_time; 380 else if (library > 0 && need_time) 381 { 382 generate_option (OPT_l, TIME_LIBRARY, 1, CL_DRIVER, 383 &new_decoded_options[j]); 384 added_libraries++; 385 j++; 386 } 387 if (saw_libc) 388 new_decoded_options[j++] = *saw_libc; 389 if (shared_libgcc && !static_link) 390 generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER, 391 &new_decoded_options[j++]); 392 393 *in_decoded_options_count = j; 394 *in_decoded_options = new_decoded_options; 395 *in_added_libraries = added_libraries; 396} 397 398/* Called before linking. Returns 0 on success and -1 on failure. */ 399int lang_specific_pre_link (void) /* Not used for C++. */ 400{ 401 return 0; 402} 403 404/* Number of extra output files that lang_specific_pre_link may generate. */ 405int lang_specific_extra_outfiles = 0; /* Not used for C++. */ 406