-fnonansi-builtins |
参见flag_no_nonansi_builtin |
CL_CXX | CL_ObjCXX |
-fnonnull-objects |
已过时,不支持 |
CL_CXX | CL_ObjCXX |
-fold-unroll-all-loops |
参见flag_old_unroll_all_loops |
CL_COMMON |
-fold-unroll-loops |
参见flag_old_unroll_loops |
CL_COMMON |
-fomit-frame-pointer |
参见flag_omit_frame_pointer |
CL_COMMON |
-foperator-names |
识别C++的关键字如and,bitand,bitor,compl,not,or及xor,分别对应操作符&&,&,|,~,!,||及^。这可以防止这些名字被它用而导致老的代码出错。 |
CL_CXX | CL_ObjCXX |
-foptimize-register-move |
执行完整的寄存器移动优化遍 |
CL_COMMON |
-foptimize-sibling-calls |
参见flag_optimize_sibling_calls |
CL_COMMON |
-foptional-diags |
启用可选的诊断信息 |
CL_CXX | CL_ObjCXX |
-fpack-struct |
参见flag_pack_struct |
CL_COMMON |
-fpcc-struct-return |
参见flag_pcc_struct_return |
CL_COMMON |
-fpch-deps |
使用预编译头文件时,这个选项会设置依赖-输出(dependency-output)标识,根据预编译头文件的依赖信息列出文件。否则只有这个预编译头文件被列出,不包括那些创建它的文件,因为使用预处理头文件时,这些文件不会被参考(consulted)。 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fpeel-loops |
参见flag_peel_loops |
CL_COMMON |
-fpeephole |
参见flag_no_peephole |
CL_COMMON |
-fpeephole2 |
参见flag_peephole2 |
CL_COMMON |
-fpermissive |
参见flag_permissive |
CL_CXX | CL_ObjCXX |
-fpic |
参见flag_pic |
CL_COMMON |
-fpie |
参见flag_pie |
CL_COMMON |
-fprefetch-loop-arrays |
参见flag_prefetch_loop_arrays |
CL_COMMON |
-fpreprocessed |
参见flag_preprocess_only |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fprofile |
启动基本的程序分析(profiling)代码 |
CL_COMMON |
-fprofile-arcs |
插入基于弧(arc-based)的程序分析代码 |
CL_COMMON |
-fprofile-generate |
使能为分析回馈导向优化(profile feedback directed optimization)产生分析信息的普通(common)选项 |
CL_COMMON |
-fprofile-use |
使能分析回馈导向优化(profile feedback directed optimization)的普通(common)选项 |
CL_COMMON |
-fprofile-values |
插入分析(profile)表达式值的代码 |
CL_COMMON |
-frandom-seed |
参见flag_random_seed |
CL_COMMON |
-frandom-seed=<string> |
CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE |
|
-freduce-all-givs |
参见flag_reduce_all_givs |
CL_COMMON |
-freg-struct-return |
在寄存器中返回小的聚集类 |
CL_COMMON |
-fregmove |
启动寄存器移动优化(register move optimization) |
CL_COMMON |
-frename-registers |
执行寄存器重命名优化遍(register renaming optimization pass) |
CL_COMMON |
-freorder-blocks |
参见flag_reorder_blocks |
CL_COMMON |
-freorder-functions |
参见flag_reorder_functions |
CL_COMMON |
-frepo |
使能模板自动具现(automatic template instantiation) |
CL_CXX | CL_ObjCXX |
-frerun-cse-after-loop |
在循环优化后增加一次公共子表达式消除遍 |
CL_COMMON |
-frerun-loop-opt |
运行2次循环优化 |
CL_COMMON |
-frounding-math |
禁止基于FP默认取整行为的优化 |
CL_COMMON |
-frtti |
产生运行时类型描述符信息(run time type descriptor information) |
CL_CXX | CL_ObjCXX |
-fsched-interblock |
启动基本块间的调度(scheduling across basic blocks) |
CL_COMMON |
-fsched-spec |
参见flag_schedule_speculative |
CL_COMMON |
-fsched-spec-load |
参见flag_schedule_speculative_load |
CL_COMMON |
-fsched-spec-load-dangerous |
参见flag_schedule_speculative_load_dangerous |
CL_COMMON |
-fsched-stalled-insns |
参见flag_sched_stalled_insns |
CL_COMMON |
-fsched-stalled-insns=<number> |
CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE | CL_UINTEGER |
|
-fsched-stalled-insns-dep |
参见flag_sched_stalled_insns_deps |
CL_COMMON |
-fsched-stalled-insns-dep=<number> |
CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE | CL_UINTEGER |
|
-fsched-verbose=<number> |
设置调度器的冗余程度(verbosity level of the scheduler) |
CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE |
-fsched2-use-superblocks |
参见flag_sched2_use_superblocks |
CL_COMMON |
-fsched2-use-traces |
参见flag_sched2_use_traces |
CL_COMMON |
-fschedule-insns |
参见flag_schedule_insns |
CL_COMMON |
-fschedule-insns2 |
参见flag_schedule_insns_after_reload |
CL_COMMON |
-fshared-data |
参见flag_shared_data |
CL_COMMON |
-fshort-double |
参见flag_short_double |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fshort-enums |
参见flag_short_enums |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fshort-wchar |
参见flag_short_wchar |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fshow-column |
!!! This switch lacks documentation |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fsignaling-nans |
参见flag_signaling_nans |
CL_COMMON |
-fsigned-bitfields |
默认位域为有符号 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fsigned-char |
默认char有符号 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fsingle-precision-constant |
转换浮点常量为单精度常量 |
CL_COMMON |
-fsquangle |
已过时,不支持 |
CL_CXX | CL_ObjCXX |
-fstack-check |
在程序中插入栈检查代码 |
CL_COMMON |
-fstack-limit |
参见stack_limit_rtx |
CL_COMMON |
-fstack-limit-register=<register> |
CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE |
|
-fstack-limit-symbol=<name> |
||
-fstats |
显示编译期的统计信息 |
CL_CXX | CL_ObjCXX |
-fstrength-reduce |
执行强度折减(strength reduction)优化 |
CL_COMMON |
-fstrict-aliasing |
应用严格别名(strict aliasing rule) |
CL_COMMON |
-fstrict-prototype |
已过时,不支持 |
CL_CXX | CL_ObjCXX |
-fsyntax-only |
只检查语法错误 |
CL_COMMON |
-ftabstop=<number> |
Tab的大小 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_REJECT_NEGATIVE | CL_UINTEGER |
-ftemplate-depth-<number> |
指定最大模板具现深度 |
CL_CXX | CL_ObjCXX | CL_JOINED | CL_REJECT_NEGATIVE | CL_UINTEGER |
-ftest-coverage |
创建gcov需要的数据文件 |
CL_COMMON |
-fthis-is-variable |
已过时,不支持 |
CL_CXX | CL_ObjCXX |
-fthread-jumps |
参见flag_thread_jumps |
CL_COMMON |
-ftime-report |
报告每个编译遍的用时 |
CL_COMMON |
-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec] |
设置默认的线程局部储存代码的产生模式(default thread-local storage code generation model) |
CL_COMMON | CL_JOINED | CL_REJECT_NEGATIVE |
-ftracer |
参见flag_tracer |
CL_COMMON |
-ftrapping-math |
假定浮点操作会导致trap |
CL_COMMON |
-ftrapv |
在加,减及乘时发生溢出,即导致trap |
CL_COMMON |
-funit-at-a-time |
一次编译一个编译单元 |
CL_COMMON |
-funroll-all-loops |
参见flag_unroll_all_loops |
CL_COMMON |
-funroll-loops |
参见flag_unroll_loops |
CL_COMMON |
-funsafe-math-optimizations |
允许可能违反IEEE或ISO标准的算是优化 |
CL_COMMON |
-funsigned-bitfields |
默认位域为无符号 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-funsigned-char |
默认char无符号 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-funswitch-loops |
参见flag_unswitch_loops |
CL_COMMON |
-funwind-tables |
参见flag_unwind_tables |
CL_COMMON |
-fuse-cxa-atexit |
使用__cxa_atexit来注册析构函数 |
CL_CXX | CL_ObjCXX |
-fverbose-asm |
在汇编输出中添加注释 |
CL_COMMON |
-fvpt |
在优化中使用表达式值分析(expression value profile) |
CL_COMMON |
-fvtable-gc |
丢弃未使用的虚函数 |
CL_CXX | CL_ObjCXX |
-fvtable-thunks |
使用thunk实行虚函数表 |
CL_CXX | CL_ObjCXX |
-fweak |
参见flag_weak |
CL_CXX | CL_ObjCXX |
-fweb |
参见flag_web |
CL_COMMON |
-fwide-exec-charset=<cset> |
把宽字符串及字符常量转换为字符集<cset> |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_REJECT_NEGATIVE |
-fworking-directory |
产生指向当前工作目录的#line指示 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-fwrapv |
使有符号数学计算的溢出回绕(wraps around) |
CL_COMMON |
-fwritable-strings |
把字符串存入数据段 |
CL_COMMON |
-fxref |
产生相互引用的信息(cross referencing information) |
CL_CXX | CL_ObjCXX |
-fzero-initialized-in-bss |
把0值初始化数据放入bss段 |
CL_COMMON |
-g |
在默认格式中产生调试信息 |
CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gcoff |
在COFF格式中产生调试信息 |
CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gdwarf-2 |
在DWARF2格式中产生调试信息 |
CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gen-decls |
转储声明至.decl文件 |
CL_ObjC | CL_ObjCXX |
-ggdb |
在默认的扩展格式中产生调试信息 |
CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gstabs |
在STABS格式中产生调试信息 |
CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gstabs+ |
在扩展STABS格式中产生调试信息 |
CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gvms |
在VMS格式中产生调试信息 |
CL_COMMON|CL_JOINED | CL_MISSING_OK |
-gxcoff |
在XCOFF格式中产生调试信息 |
CL_COMMON | CL_JOINED | CL_MISSING_OK |
-gxcoff+ |
在扩展XCOFF格式中产生调试信息 |
CL_COMMON | CL_JOINED | CL_MISSING_OK |
-idirafter<dir> |
在系统包含路径(the system include path)后,加入<dir> |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-imacros<file> |
在<file>中接受宏定义,但丢弃其它由扫描文件产生的内容 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-include<file> |
在其他文件前包含<file>的内容 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-iprefix<path> |
参见iprefix |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-isysroot<dir> |
把<dir>设为系统根目录(the system root directory) |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-isystem<dir> |
把<dir>加到系统包含路径(the system include path)开头 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-iwithprefix <dir> |
参见add_prefixed_path |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_JOINED | CL_SEPARATE |
-iwithprefixbefore<dir> |
||
-lang-asm |
!!! This switch lacks documentation |
CL_C | CL_UNDOCUMENTED |
-lang-objc |
编译objC代码 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_UNDOCUMENTED |
-m |
与目标机器相关选项的前缀 |
CL_COMMON | CL_JOINED |
-nostdinc |
不要在标准系统包含目录下查找(那些由-isystem指定的目录仍会被使用) |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-nostdinc++ |
不要在C++的标准系统包含目录下查找 |
CL_CXX | CL_ObjCXX |
-o <file> |
产生输出文件<file> |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_COMMON | CL_JOINED | CL_SEPARATE |
-p |
启动函数分析 |
CL_COMMON |
-pedantic |
产生为严格遵循标准而需要的警告 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_COMMON |
-pedantic-errors |
类似-pedantic但产生错误而不是警告 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_COMMON |
-quiet |
不要显示函数名及用时 |
CL_COMMON |
-remap |
使能特殊的代码来避开那些只允许短文件名的文件系统,如MS-DOS |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-std=c++98 |
符合ISO 1998 C++标准 |
CL_CXX | CL_ObjCXX |
-std=c89 |
符合ISO 1990 C标准 |
CL_C | CL_ObjC |
-std=c99 |
符合ISO 1999 C标准 |
CL_C | CL_ObjC |
-std=c9x |
已过时,应使用-std=c99 |
CL_C | CL_ObjC |
-std=gnu++98 |
符合ISO 1998 C++标准,连同GNU 扩展 |
CL_CXX | CL_ObjCXX |
-std=gnu89 |
符合ISO 1990 C标准,连同GNU 扩展 |
CL_C | CL_ObjC |
-std=gnu99 |
符合ISO 1999 C标准,连同GNU 扩展 |
CL_C | CL_ObjC |
-std=gnu9x |
已过时,应使用-std=gnu99 |
CL_C | CL_ObjC |
-std=iso9899:1990 |
符合ISO 1990 C标准 |
CL_C | CL_ObjC |
-std=iso9899:199409 |
符合1994年修改的ISO 1990 C标准 |
CL_C | CL_ObjC |
-std=iso9899:1999 |
符合ISO 1999 C标准 |
CL_C | CL_ObjC |
-std=iso9899:199x |
已过时,应使用-std=iso9899:1999 |
CL_C | CL_ObjC |
-traditional-cpp |
启动传统预处理 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-trigraphs |
支持ISO C的三字符词 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-undef |
不要预定义特定于系统及GCC的宏 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-v |
启动详细输出 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX |
-version |
显示编译器的版本 |
CL_COMMON |
-w |
压制警告 |
CL_C | CL_CXX | CL_ObjC | CL_ObjCXX | CL_COMMON |
表 11: C++可用选项
在上表中,选项被赋予不同的标记集,其中的标记可分为2组。其一表示选项所适用的语言。这些选项如下。
3 #define CL_C (1 << 0) in options.h
4 #define CL_CXX (1 << 1)
5 #define CL_ObjC (1 << 2)
6 #define CL_ObjCXX (1 << 3)
另一组表明选项的特性,其中CL_COMMON其实应该属于前一组。
40 #define CL_JOINED (1 << 24) /* If takes joined argument. */ in opts.h
41 #define CL_SEPARATE (1 << 25) /* If takes a separate argument. */
42 #define CL_REJECT_NEGATIVE (1 << 26) /* Reject no- form. */
43 #define CL_MISSING_OK (1 << 27) /* Missing argument OK (joined). */
44 #define CL_UINTEGER (1 << 28) /* Argument is an integer >=0. */
45 #define CL_COMMON (1 << 29) /* Language-independent. */
46 #define CL_UNDOCUMENTED (1 << 30) /* Do not output with --help. */
走到到这里,表明确实有这样的选项,要检查该选项是否正确有效。下面397行的检查实际已由find_opt执行了,但find_opt对不适用于该语言的选项并不拒绝,因此,这里再一次把它们找出来,给出警告并丢弃之。
handle_option (continue)
364 /* We've recognized this switch. */
365 result = 1;
366
367 /* Sort out any argument the switch takes. */
368 if (option->flags & CL_JOINED)
369 {
370 /* Have arg point to the original switch. This is because
371 some code, such as disable_builtin_function, expects its
372 argument to be persistent until the program exits. */
373 arg = argv[0] + cl_options[opt_index].opt_len + 1;
374 if (!value)
375 arg += strlen ("no-");
376
377 if (*arg == '/0' && !(option->flags & CL_MISSING_OK))
378 {
379 if (option->flags & CL_SEPARATE)
380 {
381 arg = argv[1];
382 result = 2;
383 }
384 else
385 /* Missing argument. */
386 arg = NULL;
387 }
388 }
389 else if (option->flags & CL_SEPARATE)
390 {
391 arg = argv[1];
392 result = 2;
393 }
394
395 /* Now we've swallowed any potential argument, complain if this
396 is a switch for a different front end. */
397 if (!(option->flags & (lang_mask | CL_COMMON)))
398 {
399 complain_wrong_lang (argv[0], option, lang_mask);
400 goto done;
401 }
402
403 if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
404 {
405 if (!(*lang_hooks.missing_argument) (opt, opt_index))
406 error ("missing argument to /"%s/"", opt);
407 goto done;
408 }
409
410 /* If the switch takes an integer, convert it. */
411 if (arg && (option->flags & CL_UINTEGER))
412 {
413 value = integral_argument (arg);
414 if (value == -1)
415 {
416 error ("argument to /"%s/" should be a non-negative integer",
417 option->opt_text);
418 goto done;
419 }
420 }
对于CL_JOINED属性的选项,它类似-A=value或者-Avalue。而CL_SEPARATE属性的选项,则类似-A= value或者-A value。因此,上述代码片段获取选项的参数。
handle_option (continue)
422 if (option->flags & lang_mask)
423 if ((*lang_hooks.handle_option) (opt_index, arg, value) == 0)
424 result = 0;
425
426 if (result && (option->flags & CL_COMMON))
427 if (c_common_handle_option (opt_index, arg, value) == 0)
428 result = 0;
429
430 done:
431 if (dup)
432 free (dup);
433 return result;
434 }
在合格的选项中,422行挑出专用于语言的部分,由前端钩子提供处理函数。