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

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=3abort点的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可以使用的形式的调试信息。其格式和内容依赖于编译器产生的目标格式(stabsCOFFXCOFFDWARF)。

级别设置是可选的。级别值指明了所包含的调试信息量。默认值是级别2。级别1产生回溯所要求的全局信息,但不包括局部变量及行号。级别2包括级别1的所有信息加上局部变量及行号。级别3包括级别2的信息及诸如宏定义等额外信息。

在使用stabs格式的系统上,这个选项将产生只能被gdb使用的调试信息格式。

有可能将这个选项与-O一起使用来产生优化的代码。在优化条件下,调试的过程会困难些,因为优化会改变产生的代码,因此不再具有源文件和产生代码间的一一对应。一些目标代码将被重定位(relocated),而一些源代码可能不产生任何执行代码。

-gcoff[level],如果支持,产生COFF格式的调试信息。这个选项最常用于SVR4之前的System V上的SDB。级别设定也是可选的。

-gdwarf-2[level],如果支持,产生DWARF版本2格式的调试信息。级别设定是可选的。它是IRIX 6DBX所使用的格式。

-ggdb[level],产生专用于gdb格式的调试信息,包括所有可用的gdb扩展。级别设定是可选的。

-gstabs[level]-gstabs+[level],如果支持,产生stabs格式的调试信息。级别设定是可选的。仅当级别设为+才会包含gdb的扩展。这个选项可在大多数BSD系统上,由DBX使用,但在MIPSAlphaSVR4 上的DBX中不能工作。而且在SVR4,需要GNU的汇编器。

-gvms[level],如果支持,产生VMS调试格式的调试信息。级别设定是可选的。这个格式由VMS上的DEBUG使用。

-gxcoff[level]-gxcoff+[level],如果支持,产生XCOFF格式的调试信息。级别设定是可选的。仅当级别设为+ 才会包含gdb的扩展,这可能会使得其他调试器不能使用,及可能导致非GNU汇编器产生问题。这是RS/6000DBX使用的格式。

对于这些产生调试信息的选项,调用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_DEBUGXCOFF_DEBUGDWARF_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    };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值