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

2019-04-15 15:14发布

4.1.4. 根据目标平台调整选项

c_common_post_options返回,继续process_options。回忆input_filename访问input_locationfile域,这个域记录了当前正在编译的文件。   process_options (continue)   4283   input_filename = main_input_filename; 4284 4285 #ifdef OVERRIDE_OPTIONS 4286   /* Some machines may reject certain combinations of options.  */ 4287   OVERRIDE_OPTIONS; 4288 #endif   如果后端对于与目标平台相关的编译选项有特定的要求,则定义上面4285行的宏OVERRIDER_OPTIONS,提供自己的处理句柄。对于x86目标平台,这个宏被定义为以下的函数。   1050 void 1051 override_options (void)                                                                                    in i386.c 1052 { 1053   int i; 1054   /* Comes from final.c -- no real reason to change it.  */ 1055 #define MAX_CODE_ALIGN 16 1056 1057   static struct ptt 1058   { 1059     const struct processor_costs *cost;      /* Processor costs */ 1060     const int target_enable;               /* Target flags to enable.  */ 1061     const int target_disable;                     /* Target flags to disable.  */ 1062     const int align_loop;                  /* Default alignments.  */ 1063     const int align_loop_max_skip; 1064     const int align_jump; 1065     const int align_jump_max_skip; 1066     const int align_func; 1067   } 1068   const processor_target_table[PROCESSOR_max] = 1069   { 1070     {&i386_cost, 0, 0, 4, 3, 4, 3, 4}, 1071     {&i486_cost, 0, 0, 16, 15, 16, 15, 16}, 1072     {&pentium_cost, 0, 0, 16, 7, 16, 7, 16}, 1073     {&pentiumpro_cost, 0, 0, 16, 15, 16, 7, 16}, 1074     {&k6_cost, 0, 0, 32, 7, 32, 7, 32}, 1075     {&athlon_cost, 0, 0, 16, 7, 16, 7, 16}, 1076     {&pentium4_cost, 0, 0, 0, 0, 0, 0, 0}, 1077     {&k8_cost, 0, 0, 16, 7, 16, 7, 16} 1078   }; 1079 1080   static const char * const cpu_names[] = TARGET_CPU_DEFAULT_NAMES; 1081   static struct pta 1082   { 1083     const char *const name;              /* processor name or nickname.  */ 1084     const enum processor_type processor; 1085     const enum pta_flags 1086     { 1087       PTA_SSE = 1, 1088       PTA_SSE2 = 2, 1089       PTA_SSE3 = 4, 1090       PTA_MMX = 8, 1091       PTA_PREFETCH_SSE = 16, 1092       PTA_3DNOW = 32, 1093       PTA_3DNOW_A = 64, 1094       PTA_64BIT = 128 1095     } flags; 1096   } 1097   const processor_alias_table[] = 1098   { 1099     {"i386", PROCESSOR_I386, 0}, 1100     {"i486", PROCESSOR_I486, 0}, 1101     {"i586", PROCESSOR_PENTIUM, 0}, 1102     {"pentium", PROCESSOR_PENTIUM, 0}, 1103     {"pentium-mmx", PROCESSOR_PENTIUM, PTA_MMX}, 1104     {"winchip-c6", PROCESSOR_I486, PTA_MMX}, 1105     {"winchip2", PROCESSOR_I486, PTA_MMX | PTA_3DNOW}, 1106     {"c3", PROCESSOR_I486, PTA_MMX | PTA_3DNOW}, 1107     {"c3-2", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_PREFETCH_SSE | PTA_SSE}, 1108     {"i686", PROCESSOR_PENTIUMPRO, 0}, 1109     {"pentiumpro", PROCESSOR_PENTIUMPRO, 0}, 1110     {"pentium2", PROCESSOR_PENTIUMPRO, PTA_MMX}, 1111     {"pentium3", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE}, 1112     {"pentium3m", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE}, 1113     {"pentium-m", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE | PTA_SSE2}, 1114     {"pentium4", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 1115                             | PTA_MMX | PTA_PREFETCH_SSE}, 1116     {"pentium4m", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 1117                              | PTA_MMX | PTA_PREFETCH_SSE}, 1118     {"prescott", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 | PTA_SSE3 1119                              | PTA_MMX | PTA_PREFETCH_SSE}, 1120     {"nocona", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 | PTA_SSE3 | PTA_64BIT 1121                         | PTA_MMX | PTA_PREFETCH_SSE}, 1122     {"k6", PROCESSOR_K6, PTA_MMX}, 1123     {"k6-2", PROCESSOR_K6, PTA_MMX | PTA_3DNOW}, 1124     {"k6-3", PROCESSOR_K6, PTA_MMX | PTA_3DNOW}, 1125     {"athlon", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW 1126                        | PTA_3DNOW_A}, 1127     {"athlon-tbird", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE 1128                            | PTA_3DNOW | PTA_3DNOW_A}, 1129     {"athlon-4", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW 1130                         | PTA_3DNOW_A | PTA_SSE}, 1131       {"athlon-xp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW 1132                                   | PTA_3DNOW_A | PTA_SSE}, 1133       {"athlon-mp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW 1134                                   | PTA_3DNOW_A | PTA_SSE}, 1135       {"x86-64", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_64BIT 1136                             | PTA_SSE | PTA_SSE2 }, 1137       {"k8", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT 1138                                   | PTA_3DNOW_A | PTA_SSE | PTA_SSE2}, 1139       {"opteron", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT 1140                                   | PTA_3DNOW_A | PTA_SSE | PTA_SSE2}, 1141       {"athlon64", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT 1142                                   | PTA_3DNOW_A | PTA_SSE | PTA_SSE2}, 1143       {"athlon-fx", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT 1144                                   | PTA_3DNOW_A | PTA_SSE | PTA_SSE2}, 1145     }; 1146   1147     int const pta_size = ARRAY_SIZE (processor_alias_table);   上面,processor_target_tableprocessor_alias_table的类型定义在它们之前,因此这些类型不能用于别处。在1080行的TARGET_CPU_DEFAULT_NAMES定义了CPU族。   710    #define TARGET_CPU_DEFAULT_NAMES {"i386", "i486", "pentium", "pentium-mmx",/ 711                                "pentiumpro", "pentium2", "pentium3", / 712                                "pentium4", "k6", "k6-2", "k6-3",/ 713                                "athlon", "athlon-4", "k8", / 714                                "pentium-m", "prescott", "nocona"}   1085行的pta_flags描述了特定芯片上可用的寄存器集的属性。   override_options (continue)   1149   /* Set the default values for switches whose default depends on TARGET_64BIT 1150     in case they weren't overwritten by command line options.  */ 1151   if (TARGET_64BIT) 1152   { 1153     if (flag_omit_frame_pointer == 2) 1154       flag_omit_frame_pointer = 1; 1155     if (flag_asynchronous_unwind_tables == 2) 1156       flag_asynchronous_unwind_tables = 1; 1157     if (flag_pcc_struct_return == 2) 1158       flag_pcc_struct_return = 0; 1159   } 1160   else 1161   { 1162     if (flag_omit_frame_pointer == 2) 1163       flag_omit_frame_pointer = 0; 1164     if (flag_asynchronous_unwind_tables == 2) 1165       flag_asynchronous_unwind_tables = 0; 1166     if (flag_pcc_struct_return == 2) 1167       flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN; 1168   } 1169 1170 #ifdef SUBTARGET_OVERRIDE_OPTIONS 1171   SUBTARGET_OVERRIDE_OPTIONS; 1172 #endif 1173 1174   if (!ix86_tune_string && ix86_arch_string) 1175     ix86_tune_string = ix86_arch_string; 1176   if (!ix86_tune_string) 1177     ix86_tune_string = cpu_names [TARGET_CPU_DEFAULT]; 1178   if (!ix86_arch_string) 1179     ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386"; 1180 1181   if (ix86_cmodel_string != 0) 1182   { 1183     if (!strcmp (ix86_cmodel_string, "small")) 1184       ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL; 1185     else if (flag_pic) 1186       sorry ("code model %s not supported in PIC mode", ix86_cmodel_string); 1187     else if (!strcmp (ix86_cmodel_string, "32")) 1188       ix86_cmodel = CM_32; 1189     else if (!strcmp (ix86_cmodel_string, "kernel") && ! flag_pic) 1190       ix86_cmodel = CM_KERNEL;