gcc编译器选项的实现(1):在.opt中如何定义gcc选项

首先,大概总结一下.opt中常用的定义词:

// 
// (某处理类/某特征类/某打印类)定义词==【Warning,Optimization, Driver,Common,Target, Joined,JoinedOrMissing,Separate,Undocumented】
// 
//   某打印类gcc选项gcc_flags==【CL_PARAMS,CL_WARNING,CL_OPTIMIZATION, CL_COMMON,CL_TARGET,CL_C, CL_JOINED,CL_SEPARATE,CL_UNDOCUMENTED】<-- print_specific_help() 
//   某处理类gcc选项gcc_flags==【CL_DRIVER,CL_COMMON,CL_TARGET,CL_C等】
//   某特征类gcc选项gcc_flags==【CL_JOINED,CL_SEPARATE等】
// 
//      CL_WARNING告警类gcc选项 
// CL_OPTIMIZATION优化类gcc选项 
// 
// CL_DRIVER驱动器类gcc选项 ---- 标记 gcc驱动器处理的gcc选项 
// CL_TARGET目标机类gcc选项 ---- 标记    目标机处理的gcc选项 
// CL_COMMON通用类gcc选项   ---- 标记      通用处理的gcc选项 
// 
//   CL_JOINED连体式gcc选项参数, 如 gcc选项"-DXYG=1" 
// CL_SEPARATE隔开式gcc选项参数, 如 gcc选项"-D XYG=1" 
// 
// CL_UNDOCUMENTED未文档类gcc选项: print_specific_help()-->print_filtered_help() 
// 

// 
// (选项值和类型)定义词==【Mask(置掩码)或InverseMask(清掩码), Enum(选项参数枚举型),Var(选项值名,正值),Init(选项初值), 通用延缓选项指针Defer】
// 
// 定义词==【MissingArgError(丢参数的错误串%qs)  Negative(之后互斥选项)  Args(隔开式选项参数个数)】
// 
// 定义词==【Alias(其正名选项名,其正名选项参数串,否定串)】,如【Alias(fstack-check=, specific, no)  Alias(Wformat=, 1, 0)】
// 
// (选项特征)定义词==【SeparateAlias,NegativeAlias, 拒gcc驱动器处理RejectDriver, 使能时可打印Report】
// 
// (选项值特征)定义词==【驱动器类gcc选项时无参数串NoDriverArg,拒假值RejectNegative,可缺省JoinedOrMissing, 整值UInteger,宽整值Host_Wide_Int,变小写字母ToLower】
// 
// (某语言告警子类gcc选项的)定义词==【LangEnabledBy(某语言类,总告警类选项,正值,假值)】
// 
// (某通用告警子类gcc选项的)定义词==【EnabledBy(总告警类选项)】
// 

gcc编译器选项的实现(1):在.opt中定义gcc选项

// 
// mips: gcc选项定义【语言选集/lang.opt  c.opt  common.opt  g.opt  mips-tables.opt  mips.opt  gnu-user.opt  linux.opt  linux-android.opt】
//  i86: gcc选项定义【语言选集/lang.opt  c.opt  common.opt  fused-madd.opt          i386.opt  gnu-user.opt  linux.opt  linux-android.opt】
//  arm: gcc选项定义【语言选集/lang.opt  c.opt  common.opt  arm-tables.opt          arm.opt】
// 

请参考 c.opt中的一些定义

;; 
;; 定义 某语言类Language 
;; 
Language
C
Language
ObjC
Language
C++

;; 
;; 定义 选项名 ---- gcc选项"-E"  请见 c_common_post_options() 
;; 
E
C ObjC C++ ObjC++ Undocumented Var(flag_preprocess_only)

;; 
;; 定义 选项名 ---- 关注: 标记【驱动器类gcc选项时无参数串NoDriverArg】
;; 
MD
C ObjC C++ ObjC++ NoDriverArg Separate MissingArgError(missing filename after %qs)

;; 
;; 定义 选项名 ---- 关注: 标记【某语言告警子类gcc选项C/Warning  LangEnabledBy(某语言类,总告警类选项,正值,假值), 请见 C_handle_option_auto():OPT_Wall:warn_main 
;; 
Wmain
C ObjC C++ ObjC++ Var(warn_main) Init(-1) Warning LangEnabledBy(C ObjC,Wall, 2, 0)
Warn about suspicious declarations of \"main\"

请参考 common.opt中的一些定义——隔开式、连体式、别名选项、选项值变量

;; 
;; 定义 目标机选项标志target_flags==TARGET_DEFAULT_TARGET_FLAGS 
;; 
Variable
int target_flags

;; 
;; 定义 选项变量和类型Variable 
;; 
Variable
bool warn_larger_than
;; 
;; 定义 选项变量和类型Variable ---- 关注: 宽整值Host_Wide_Int 来自【选项宽整型HOST_WIDE_INT】
;; 
Variable
HOST_WIDE_INT larger_than_size

;; 
;; 别名采用【隔开式gcc选项参数Separate】
;; 
;; 定义 选项名 ---- 关注: 标记【Alias(其正名选项名,其正名选项参数串,否定串)  MissingArgError(丢参数的错误串%qs);; 
-output
Common Driver Separate Alias(o) MissingArgError(missing filename after %qs)
;; 
;; 别名采用【连体式gcc选项参数Joined】
;; 
-output=
Common Driver Joined Alias(o) MissingArgError(missing filename after %qs)

;; 
;; 正常采用【隔开式gcc选项参数Separate  连体式gcc选项参数Joined】
;; 
;; 定义 选项名 ---- 关注: 标记【驱动器类gcc选项Driver,通用类gcc选项Common】,对应【Alias(其正名选项名,其正名选项参数串,否定串), 请见 driver_handle_option(),common_handle_option():OPT_o 
;; 
o
Common Driver Joined Separate Var(asm_file_name) MissingArgError(missing filename after %qs)
-o <file>	Place output into <file>


;; 
;; 别名采用【隔开式gcc选项参数Separate】
;; 
-sysroot
Driver Separate Alias(-sysroot=)
;; 
;; 正式采用【连体式gcc选项参数或可缺省JoinedOrMissing】
;; 
;; 定义 选项名 ---- 关注: 标记【驱动器类gcc选项Driver】, 且没有【Var(选项值名,正值), 请见 driver_handle_option():OPT__sysroot_ 
;; 
-sysroot=
Driver JoinedOrMissing


请参考 linux.opt中的一些定义——互斥选项

;; 
;; 定义 选项名 ---- 关注: 标记【Var(选项值名,正值)  Init(选项初值)  Negative(之后互斥选项), 直接设置 handle_option()-->set_option() 
;; 
mbionic
Target Report RejectNegative Var(linux_libc,LIBC_BIONIC) Init(DEFAULT_LIBC) Negative(mglibc)
Use Bionic C library
;; 
mglibc
Target Report RejectNegative Var(linux_libc,LIBC_GLIBC) Negative(muclibc)
Use GNU C library
;; 
muclibc
Target Report RejectNegative Var(linux_libc,LIBC_UCLIBC) Negative(mbionic)
Use uClibc C library

请参考 i386.opt中的一些定义——互斥选项

;; 
;; 定义 目标机特定的gcc选项头文件HeaderInclude 
;; 
HeaderInclude
config/i386/i386-opts.h

;; 
;; 定义 选项变量和类型Variable ---- 关注: 宽整值Host_Wide_Int 来自【选项宽整型HOST_WIDE_INT】, 以及 gcc选项初始值global_options_init 
;; 
; Bit flags that specify the ISA we are compiling for.
Variable
HOST_WIDE_INT ix86_isa_flags = TARGET_64BIT_DEFAULT | TARGET_SUBTARGET_ISA_DEFAULT

;; 
;; 定义 选项名 ---- 关注: 指定变量的选项标志ix86_isa_flags==OPTION_MASK_ISA_64BIT 来自【InverseMask(清掩码);; 
m32
Target RejectNegative Negative(m64) Report InverseMask(ISA_64BIT) Var(ix86_isa_flags) Save
Generate 32bit i386 code
;; 
;; 定义 选项名 ---- 关注: 指定变量的选项标志ix86_isa_flags==OPTION_MASK_ABI_64 来自【Mask(置掩码);; 
m64
Target RejectNegative Negative(mx32) Report Mask(ABI_64) Var(ix86_isa_flags) Save
Generate 64bit x86-64 code

猜你喜欢

转载自blog.csdn.net/weixin_44285036/article/details/107768474