GCC-3.4.6源代码学习笔记(24续)

-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++的关键字如andbitandbitorcomplnotorxor,分别对应操作符&&&|~!||^。这可以防止这些名字被它用而导致老的代码出错。

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

允许可能违反IEEEISO标准的算是优化

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行挑出专用于语言的部分,由前端钩子提供处理函数。

你可能感兴趣的:(GCC-3.4.6源代码学习笔记(24续))