common_handle_option (continue)
1179 case OPT_fprofile:
1180 profile_flag = value;
1181 break;
1182
1183 case OPT_fprofile_arcs:
1184 profile_arc_flag_set = true;
1185 profile_arc_flag = value;
1186 break;
1187
1188 case OPT_fprofile_use:
1189 if (!flag_branch_probabilities_set)
1190 flag_branch_probabilities = value;
1191 if (!flag_profile_values_set)
1192 flag_profile_values = value;
1193 if (!flag_unroll_loops_set)
1194 flag_unroll_loops = value;
1195 if (!flag_peel_loops_set)
1196 flag_peel_loops = value;
1197 if (!flag_tracer_set)
1198 flag_tracer = value;
1199 if (!flag_value_profile_transformations_set)
1200 flag_value_profile_transformations = value;
1201 break;
1202
1203 case OPT_fprofile_generate:
1204 if (!profile_arc_flag_set)
1205 profile_arc_flag = value;
1206 if (!flag_profile_values_set)
1207 flag_profile_values = value;
1208 if (!flag_value_profile_transformations_set)
1209 flag_value_profile_transformations = value;
1210 break;
1211
1212 case OPT_fprofile_values:
1213 flag_profile_values_set = true;
1214 flag_profile_values = value;
1215 break;
1216
1217 case OPT_fvpt:
1218 flag_value_profile_transformations_set = value;
1219 flag_value_profile_transformations = value;
1220 break;
1221
1222 case OPT_frandom_seed:
1223 /* The real switch is -fno-random-seed. */
1224 if (value)
1225 return 0;
1226 flag_random_seed = NULL;
1227 break;
1228
1229 case OPT_frandom_seed_:
1230 flag_random_seed = arg;
1231 break;
1232
1233 case OPT_freduce_all_givs:
1234 flag_reduce_all_givs = value;
1235 break;
1236
1237 case OPT_freg_struct_return:
1238 flag_pcc_struct_return = !value;
1239 break;
1240
1241 case OPT_fregmove:
1242 flag_regmove = value;
1243 break;
1244
1245 case OPT_frename_registers:
1246 flag_rename_registers = value;
1247 break;
1248
1249 case OPT_freorder_blocks:
1250 flag_reorder_blocks = value;
1251 break;
1252
1253 case OPT_freorder_functions:
1254 flag_reorder_functions = value;
1255 break;
1256
1257 case OPT_frerun_cse_after_loop:
1258 flag_rerun_cse_after_loop = value;
1259 break;
1260
1261 case OPT_frerun_loop_opt:
1262 flag_rerun_loop_opt = value;
1263 break;
1264
1265 case OPT_frounding_math:
1266 flag_rounding_math = value;
1267 break;
1268
1269 case OPT_fsched_interblock:
1270 flag_schedule_interblock = value;
1271 break;
1272
1273 case OPT_fsched_spec:
1274 flag_schedule_speculative = value;
1275 break;
1276
1277 case OPT_fsched_spec_load:
1278 flag_schedule_speculative_load = value;
1279 break;
1280
1281 case OPT_fsched_spec_load_dangerous:
1282 flag_schedule_speculative_load_dangerous = value;
1283 break;
1284
1285 case OPT_fsched_verbose_:
1286 #ifdef INSN_SCHEDULING
1287 fix_sched_param ("verbose", arg);
1288 break;
1289 #else
1290 return 0;
1291 #endif
1292
1293 case OPT_fsched2_use_superblocks:
1294 flag_sched2_use_superblocks = value;
1295 break;
1296
1297 case OPT_fsched2_use_traces:
1298 flag_sched2_use_traces = value;
1299 break;
1300
1301 case OPT_fschedule_insns:
1302 flag_schedule_insns = value;
1303 break;
1304
1305 case OPT_fschedule_insns2:
1306 flag_schedule_insns_after_reload = value;
1307 break;
1308
1309 case OPT_fsched_stalled_insns:
1310 flag_sched_stalled_insns = value;
1311 break;
1312
1313 case OPT_fsched_stalled_insns_:
1314 flag_sched_stalled_insns = value;
1315 if (flag_sched_stalled_insns == 0)
1316 flag_sched_stalled_insns = -1;
1317 break;
1318
1319 case OPT_fsched_stalled_insns_dep:
1320 flag_sched_stalled_insns_dep = 1;
1321 break;
1322
1323 case OPT_fsched_stalled_insns_dep_:
1324 flag_sched_stalled_insns_dep = value;
1325 break;
在上面
profile_flag(-fprofile,-p)如果非0,包括额外的代码,这些代码将输出适合概要程序prof分析的信息。这个选项必须同时用于源文件及链接目标文件。
profile_arc_flag(-fprofile-arcs)如果非0,使用这个选项编译程序并运行之,以得到一包含代码中每一块的执行计数的文件。随后程序再以选项重新编译,之前建立文件中所包含的信息用于优化那些最频繁执行的跳转代码。没有这些信息,GCC则只能猜测哪条路径最可能执取而进行优化。这些信息保存在与源文件同名具有.da后缀的文件中。
这个选项的第二个用处是与选项-ftest-coverage同用以支持gcov。这对选项为程序中的每个函数创建流图(flow graph),从而确定图的生成树(a spanning tree for the graph)。每个不在生成树中的函数被插入代码以记录执行次数。对于每个只有一个出入口的块,代码被直接加入块中。对于有多个出入口的块,则创建新的,能追查这些出入口的块。用这些选项编译出并由gcov运行的程序,将比用-a和-ax选项编译出的程序,运行得慢些,但由-a选项产生的计数不能提供足够的信息来估计跳转的概率。
(-fprofile-use)使能执行概要反馈指导优化(profile feedback directed optimizations)所要求的公共选项。
flag_profile_values(–fprofile-values)如果非0,测量值的概要(value profile)。
flag_unroll_loops(-funroll-loops)如果非0,当在编译时刻可以确定循环次数足够小,而且循环的指令数足够少时,循环被展开——循环体被移除,复制指令使其执行正确的次数。循环被确定为足够小,如果循环中的指令数乘以循环次数小于一个常量(目前设为100)。这个选项总是同时设置-fstrength-reduce和-frerun-cse-after-loop。
flag_tracer(-ftracer)如果非0,通过尾复制(tail duplication)执行超级块构造(superblock formation)。
flag_value_profile_transformations(–fvpt)如果非0,使用值直方图优化代码。
flag_random_seed(-frandom-seed[=])是一串随机字符串。
flag_reduce_all_givs(-freduce-all-givs)如果非0,强力简化一般的归纳变量(循环计数)。是否产生更好的代码依赖于源码中循环的结构。除了Fortran,默认选项是-fno-reduce-all-givs。
flag_schedule_interblock(-fsched-interblock)如果非0,表示不限于在基本块内调度指令。
flag_schedule_speculative(-fsched-spec)如果非0,表示允许非加载指令执行一些投机性的动作(speculative motion)。
flag_schedule_speculative_load(-fsched-spec-load)如果非0,表示允许一些加载指令执行一些投机性的动作(speculative motion)。
flag_schedule_speculative_load_dangerous(-fsched-spec-load-dangerous)如果非0,允许更多加载指令执行一些投机性的动作(speculative motion)。
flag_sched2_use_superblocks(-fsched2-use-superblocks)如果非0,当设置了标识符flag_schedule_insns_after_reload,使用EBB(扩展基本块)调度器。
flag_sched2_use_traces(-fsched2-use-traces)如果非0,当设置了标识符flag_schedule_insns_after_reload,构建记录(traces)和EBB (扩展基本块)调度器。
flag_sched_stalled_insns(-fsched-stalled-insns[=])表示指令可以提前(prematurely)从停止指令队列(the queue of stalled instruction)移到就绪队列。
flag_sched_stalled_insns_dep(-fsched-stalled-insns-dep[=])控制在多少指令组中,检查一个停止指令(stalled instruction)的依赖关系。这个指令是能提前从停止指令队列(the queue of stalled instruction)移到就绪队列的一个候选(仅当flag_sched_stalled_insns设置时,才有作用)。
在1285行,选项-fsched-verbose=由fix_sched_param处理。宏INSN_SCHEDULING则由工具genattr产生,只要芯片被描述为功能单元(另一种描述芯片的方法是把它描述为确定有限状态DFA)。
190 void
191 fix_sched_param (const char *param, const char *val) in haifa-sched.c
192 {
193 if (!strcmp (param, "verbose"))
194 sched_verbose_param = atoi (val);
195 else
196 warning ("fix_sched_param: unknown param: %s", param);
197 }
sched_verbose_param控制调度器所打印出的调试信息。他由选项-fsched-verbose=N设定:
N>0及没有使用-dSR(-dS + -dR):输出到stderr。
N>=10:输出到(与-dSR无关)。
N=1:等同于使用-dSR。
N=2:基本块的执行概率,就绪列表的详细信息,单元/指令的信息。
N=3:abort点的RTL结构,控制流(control-flow),域信息(regions info)。
N=5:依赖信息(dependences info)。
common_handle_option (continue)
1327 case OPT_fshared_data:
1328 flag_shared_data = value;
1329 break;
1330
1331 case OPT_fsignaling_nans:
1332 flag_signaling_nans = value;
1333 break;
1334
1335 case OPT_fsingle_precision_constant:
1336 flag_single_precision_constant = value;
1337 break;
1338
1339 case OPT_fstack_check:
1340 flag_stack_check = value;
1341 break;
1342
1343 case OPT_fstack_limit:
1344 /* The real switch is -fno-stack-limit. */
1345 if (value)
1346 return 0;
1347 stack_limit_rtx = NULL_RTX;
1348 break;
1349
1350 case OPT_fstack_limit_register_:
1351 {
1352 int reg = decode_reg_name (arg);
1353 if (reg < 0)
1354 error ("unrecognized register name /"%s/"", arg);
1355 else
1356 stack_limit_rtx = gen_rtx_REG (Pmode, reg);
1357 }
1358 break;
1359
1360 case OPT_fstack_limit_symbol_:
1361 stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
1362 break;
1363
1364 case OPT_fstrength_reduce:
1365 flag_strength_reduce = value;
1366 break;
1367
1368 case OPT_fstrict_aliasing:
1369 flag_strict_aliasing = value;
1370 break;
1371
1372 case OPT_fsyntax_only:
1373 flag_syntax_only = value;
1374 break;
1375
1376 case OPT_ftest_coverage:
1377 flag_test_coverage = value;
1378 break;
1379
1380 case OPT_fthread_jumps:
1381 flag_thread_jumps = value;
1382 break;
1383
1384 case OPT_ftime_report:
1385 time_report = value;
1386 break;
1387
1388 case OPT_ftls_model_:
1389 if (!strcmp (arg, "global-dynamic"))
1390 flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
1391 else if (!strcmp (arg, "local-dynamic"))
1392 flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
1393 else if (!strcmp (arg, "initial-exec"))
1394 flag_tls_default = TLS_MODEL_INITIAL_EXEC;
1395 else if (!strcmp (arg, "local-exec"))
1396 flag_tls_default = TLS_MODEL_LOCAL_EXEC;
1397 else
1398 warning ("unknown tls-model /"%s/"", arg);
1399 break;
1400
1401 case OPT_ftracer:
1402 flag_tracer_set = true;
1403 flag_tracer = value;
1404 break;
1405
1406 case OPT_ftrapping_math:
1407 flag_trapping_math = value;
1408 break;
1409
1410 case OPT_ftrapv:
1411 flag_trapv = value;
1412 break;
1413
1414 case OPT_funit_at_a_time:
1415 flag_unit_at_a_time = value;
1416 break;
1417
1418 case OPT_funroll_all_loops:
1419 flag_unroll_all_loops = value;
1420 break;
1421
1422 case OPT_funroll_loops:
1423 flag_unroll_loops_set = true;
1424 flag_unroll_loops = value;
1425 break;
1426
1427 case OPT_funsafe_math_optimizations:
1428 flag_unsafe_math_optimizations = value;
1429 break;
1430
1431 case OPT_funswitch_loops:
1432 flag_unswitch_loops = value;
1433 break;
1434
1435 case OPT_funwind_tables:
1436 flag_unwind_tables = value;
1437 break;
1438
1439 case OPT_fverbose_asm:
1440 flag_verbose_asm = value;
1441 break;
1442
1443 case OPT_fweb:
1444 flag_web = value;
1445 break;
1446
1447 case OPT_fwrapv:
1448 flag_wrapv = value;
1449 break;
1450
1451 case OPT_fwritable_strings:
1452 flag_writable_strings = value;
1453 if (flag_writable_strings)
1454 inform ("-fwritable-strings is deprecated; "
1455 "see documentation for details");
1456 break;
1457
1458 case OPT_fzero_initialized_in_bss:
1459 flag_zero_initialized_in_bss = value;
1460 break;
1461
1462 case OPT_g:
1463 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
1464 break;
1465
1466 case OPT_gcoff:
1467 set_debug_level (SDB_DEBUG, false, arg);
1468 break;
1469
1470 case OPT_gdwarf_2:
1471 set_debug_level (DWARF2_DEBUG, false, arg);
1472 break;
1473
1474 case OPT_ggdb:
1475 set_debug_level (NO_DEBUG, 2, arg);
1476 break;
1477
1478 case OPT_gstabs:
1479 case OPT_gstabs_:
1480 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
1481 break;
1482
1483 case OPT_gvms:
1484 set_debug_level (VMS_DEBUG, false, arg);
1485 break;
1486
1487 case OPT_gxcoff:
1488 case OPT_gxcoff_:
1489 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
1490 break;
1491
1492 case OPT_m:
1493 set_target_switch (arg);
1494 break;
1495
1496 case OPT_o:
1497 asm_file_name = arg;
1498 break;
1499
1500 case OPT_p:
1501 profile_flag = 1;
1502 break;
1503
1504 case OPT_pedantic:
1505 pedantic = 1;
1506 break;
1507
1508 case OPT_pedantic_errors:
1509 flag_pedantic_errors = pedantic = 1;
1510 break;
1511
1512 case OPT_quiet:
1513 quiet_flag = 1;
1514 break;
1515
1516 case OPT_version:
1517 version_flag = 1;
1518 break;
1519
1520 case OPT_w:
1521 inhibit_warnings = true;
1522 break;
1523 }
1524
1525 return 1;
1526 }
上面,涉及的选项有:
flag_shared_data(-fshared-data)这个选项要求数据被共享而不是私有。这仅在那些,共享数据能被同个程序的多个进程所访问,而且每个进程有自己的私有数据拷贝的,操作系统上有意义。
flag_single_precision_constant(-fsingle-precision-constant)如果非0,浮点数值的常量声明被保存为单精度浮点数而不是双精度数。
flag_stack_check(-fstack-check)如果非0,产生能执行防止程序栈溢出的测试代码。所产生的代码不进行真正的检查,但它会使得操作系统在栈扩展时做如此检测。当程序在多线程环境下运行时,这可能是需要的,但在单线程程序中,栈溢出会被自动检测。
stack_limit_rtx(-fstack-limit,-fstack-limit-register=register,-fstack-limit-symbol=symbol),指明包含了限制栈大小的地址的具名寄存器。这个选项仅能被用于减少栈大小,它不能用于将栈扩展超出操作系统指明的大小。
这个变量,当不为NULL时,表示任何时候在栈上分配空间,所得到的栈指针不能越过该地址。也就是说,对于向下生长的栈,栈指针必须永远大于等于这个地址,而对于向上生长的栈,栈指针必须小于该地址。目前,rtx对象可能是一个REG或者一个SYMBOL_REF,不过这依赖于后端的支持。
flag_syntax_only(-fsyntax-only)如果非0,表示只做语法检查,不产生任何输出。
flag_test_coverage(-ftest-coverage)如果非0,编译器将生成包含gcov所需信息的文件。该输出文件与源文件同名,但具有不同的后缀以表明其内容。具有.bb后缀的文件包含执行代码中基本块到源文件行号的映射。这个信息被gcov使用以将执行次数关联到行号。具有.bbg后缀的文件包含程序流图(flow graph)中的弧(arc)的列表。这个信息被gcov使用来构建流图,并且根据由-fprofile-arcs选项产生的.da后缀文件中数据,计算执行次数。
time_report(-ftime-report)如果非0,当编译完成时,编译器将打印出编译所使用时间的统计。打印的时间计为,用户,系统,及每个遍,并在最后汇总。
flag_tls_default(-ftls-model=)设置默认使用的线程局部储存(tls)模式。
flag_trapv(-ftrapv)如果非0,产生代码用于陷入(trap)有符号加减法及乘法的溢出。这个选项可用于软件测试,一旦一个整数发生溢出即产生一个core文件,而这个溢出通常是不被检测的。默认的选项是-fno-trapv。
flag_unroll_all_loops(-funroll-all-loops)如果非0,这个选项设置-funroll-loops并去除对于被展开(unroll)循环大小的限制,而且亦将展开那些循环次数不能确定的循环。这个选项通常会产生更慢更大的代码。
为了展开循环次数不能确定的循环,循环将通过测试每个代码块结尾的退出条件,被展开一定的次数。这产生更大的包含自己多个拷贝的循环,因而减少这个循环的重复次数。
flag_unwind_tables(-funwind-tables),这个选项类似于-fexceptions,除了仅产生必需的静态数据,而且对生成的代码没有其他影响。这个选项为内部使用而设计,不应用在命令行中。如果该变量为非0,表示如果支持,产生栈框回退信息表。
flag_verbose_asm(-fverbose-asm)如果非0,导致在生成的汇编代码中,产生额外的注释信息(以使得它更具可读性)。这个选项通常对于那些真正需要阅读生成的汇编代码的人有用(可能在调试编译器时)。-fno-verbose-asm,是默认选项,导致这些额外的信息被忽略,对于比较2个汇编文件有用。
flag_wrapv(-fwrapv)如果非0,有符号算术计算的溢出将被回绕(wrap around)。
flag_zero_initialized_in_bss(-fzero-initialized-in-bss)如果非0,表示将0初始化数据放入bss段。
-g[level],输出将包括一种gdb可以使用的形式的调试信息。其格式和内容依赖于编译器产生的目标格式(stabs,COFF,XCOFF或DWARF)。
级别设置是可选的。级别值指明了所包含的调试信息量。默认值是级别2。级别1产生回溯所要求的全局信息,但不包括局部变量及行号。级别2包括级别1的所有信息加上局部变量及行号。级别3包括级别2的信息及诸如宏定义等额外信息。
在使用stabs格式的系统上,这个选项将产生只能被gdb使用的调试信息格式。
有可能将这个选项与-O一起使用来产生优化的代码。在优化条件下,调试的过程会困难些,因为优化会改变产生的代码,因此不再具有源文件和产生代码间的一一对应。一些目标代码将被重定位(relocated),而一些源代码可能不产生任何执行代码。
-gcoff[level],如果支持,产生COFF格式的调试信息。这个选项最常用于SVR4之前的System V上的SDB。级别设定也是可选的。
-gdwarf-2[level],如果支持,产生DWARF版本2格式的调试信息。级别设定是可选的。它是IRIX 6上DBX所使用的格式。
-ggdb[level],产生专用于gdb格式的调试信息,包括所有可用的gdb扩展。级别设定是可选的。
-gstabs[level],-gstabs+[level],如果支持,产生stabs格式的调试信息。级别设定是可选的。仅当级别设为+才会包含gdb的扩展。这个选项可在大多数BSD系统上,由DBX使用,但在MIPS,Alpha或SVR4 上的DBX中不能工作。而且在SVR4,需要GNU的汇编器。
-gvms[level],如果支持,产生VMS调试格式的调试信息。级别设定是可选的。这个格式由VMS上的DEBUG使用。
-gxcoff[level],-gxcoff+[level],如果支持,产生XCOFF格式的调试信息。级别设定是可选的。仅当级别设为+ 才会包含gdb的扩展,这可能会使得其他调试器不能使用,及可能导致非GNU汇编器产生问题。这是RS/6000上DBX使用的格式。
对于这些产生调试信息的选项,调用set_debug_level进行处理。注意到参数arg援引选项的级别。
1616 static void
1617 set_debug_level (enum debug_info_type type, int extended, const char *arg) in opts.c
1618 {
1619 static bool type_explicit;
1620
1621 use_gnu_debug_info_extensions = extended;
1622
1623 if (type == NO_DEBUG)
1624 {
1625 if (write_symbols == NO_DEBUG)
1626 {
1627 write_symbols = PREFERRED_DEBUGGING_TYPE;
1628
1629 if (extended == 2)
1630 {
1631 #ifdef DWARF2_DEBUGGING_INFO
1632 write_symbols = DWARF2_DEBUG;
1633 #elif defined DBX_DEBUGGING_INFO
1634 write_symbols = DBX_DEBUG;
1635 #endif
1636 }
1637
1638 if (write_symbols == NO_DEBUG)
1639 warning ("target system does not support debug output");
1640 }
1641 }
1642 else
1643 {
1644 /* Does it conflict with an already selected type? */
1645 if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
1646 error ("debug format /"%s/" conflicts with prior selection",
1647 debug_type_names[type]);
1648 write_symbols = type;
1649 type_explicit = true;
1650 }
1651
1652 /* A debug flag without a level defaults to level 2. */
1653 if (*arg == '/0')
1654 {
1655 if (!debug_info_level)
1656 debug_info_level = 2;
1657 }
1658 else
1659 {
1660 debug_info_level = integral_argument (arg);
1661 if (debug_info_level == (unsigned int) -1)
1662 error ("unrecognised debug output level /"%s/"", arg);
1663 else if (debug_info_level > 3)
1664 error ("debug output level %s is too high", arg);
1665 }
1666 }
在1621行,use_gnu_debug_info_extensions如果非0,表示在所产生的符号调试信息中,仅使用GNU扩展。目前,仅当write_symbols被设为DBX_DEBUG,XCOFF_DEBUG或DWARF_DEBUG时,起作用。
26 enum debug_info_type in flags.h
27 {
28 NO_DEBUG, /* Write no debug info. */
29 DBX_DEBUG, /* Write BSD .stabs for DBX (using dbxout.c). */
30 SDB_DEBUG, /* Write COFF for (old) SDB (using sdbout.c). */
31 DWARF_DEBUG, /* Write Dwarf debug info (using dwarfout.c). */
32 DWARF2_DEBUG, /* Write Dwarf v2 debug info (using dwarf2out.c). */
33 XCOFF_DEBUG, /* Write IBM/Xcoff debug info (using dbxout.c). */
34 VMS_DEBUG, /* Write VMS debug info (using vmsdbgout.c). */
35 VMS_AND_DWARF2_DEBUG /* Write VMS debug info (using vmsdbgout.c).
36 and DWARF v2 debug info (using dwarf2out.c). */
37 };
而对于1655行的debug_info_level,它是debug_info_level类型,这个类型表示产生的信息的级别。
45 enum debug_info_level in flags.h
46 {
47 DINFO_LEVEL_NONE, /* Write no debugging info. */
48 DINFO_LEVEL_TERSE, /* Write minimal info to support tracebacks only. */
49 DINFO_LEVEL_NORMAL, /* Write info for all declarations (and line table). */
50 DINFO_LEVEL_VERBOSE /* Write normal info plus #define/#undef info. */
51 };