| ... | ... | @@ -898,58 +898,7 @@ pub const Object = struct { |
| 898 | 898 | .{ .optimized = comp.root_mod.optimize_mode != .Debug }, |
| 899 | 899 | ); |
| 900 | 900 | |
| 901 | | const i32_2 = try builder.intConst(.i32, 2); |
| 902 | | const i32_3 = try builder.intConst(.i32, 3); |
| 903 | | const debug_info_version = try builder.debugModuleFlag( |
| 904 | | try builder.metadataConstant(i32_2), |
| 905 | | try builder.metadataString("Debug Info Version"), |
| 906 | | try builder.metadataConstant(i32_3), |
| 907 | | ); |
| 908 | | |
| 909 | | switch (comp.config.debug_format) { |
| 910 | | .strip => unreachable, |
| 911 | | .dwarf => |f| { |
| 912 | | const i32_4 = try builder.intConst(.i32, 4); |
| 913 | | const dwarf_version = try builder.debugModuleFlag( |
| 914 | | try builder.metadataConstant(i32_2), |
| 915 | | try builder.metadataString("Dwarf Version"), |
| 916 | | try builder.metadataConstant(i32_4), |
| 917 | | ); |
| 918 | | switch (f) { |
| 919 | | .@"32" => { |
| 920 | | try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{ |
| 921 | | debug_info_version, |
| 922 | | dwarf_version, |
| 923 | | }); |
| 924 | | }, |
| 925 | | .@"64" => { |
| 926 | | const dwarf64 = try builder.debugModuleFlag( |
| 927 | | try builder.metadataConstant(i32_2), |
| 928 | | try builder.metadataString("DWARF64"), |
| 929 | | try builder.metadataConstant(.@"1"), |
| 930 | | ); |
| 931 | | try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{ |
| 932 | | debug_info_version, |
| 933 | | dwarf_version, |
| 934 | | dwarf64, |
| 935 | | }); |
| 936 | | }, |
| 937 | | } |
| 938 | | }, |
| 939 | | .code_view => { |
| 940 | | const code_view = try builder.debugModuleFlag( |
| 941 | | try builder.metadataConstant(i32_2), |
| 942 | | try builder.metadataString("CodeView"), |
| 943 | | try builder.metadataConstant(.@"1"), |
| 944 | | ); |
| 945 | | try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{ |
| 946 | | debug_info_version, |
| 947 | | code_view, |
| 948 | | }); |
| 949 | | }, |
| 950 | | } |
| 951 | | |
| 952 | | try builder.debugNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit}); |
| 901 | try builder.metadataNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit}); |
| 953 | 902 | break :debug_info .{ debug_compile_unit, debug_enums_fwd_ref, debug_globals_fwd_ref }; |
| 954 | 903 | } else .{.none} ** 3; |
| 955 | 904 | |
| ... | ... | @@ -1149,6 +1098,84 @@ pub const Object = struct { |
| 1149 | 1098 | } |
| 1150 | 1099 | } |
| 1151 | 1100 | |
| 1101 | { |
| 1102 | var module_flags = try std.ArrayList(Builder.Metadata).initCapacity(o.gpa, 6); |
| 1103 | defer module_flags.deinit(); |
| 1104 | |
| 1105 | const behavior_error = try o.builder.metadataConstant(try o.builder.intConst(.i32, 1)); |
| 1106 | const behavior_warning = try o.builder.metadataConstant(try o.builder.intConst(.i32, 2)); |
| 1107 | const behavior_max = try o.builder.metadataConstant(try o.builder.intConst(.i32, 7)); |
| 1108 | const behavior_min = try o.builder.metadataConstant(try o.builder.intConst(.i32, 8)); |
| 1109 | |
| 1110 | const pic_level = target_util.picLevel(comp.root_mod.resolved_target.result); |
| 1111 | if (comp.root_mod.pic) { |
| 1112 | module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( |
| 1113 | behavior_min, |
| 1114 | try o.builder.metadataString("PIC Level"), |
| 1115 | try o.builder.metadataConstant(try o.builder.intConst(.i32, pic_level)), |
| 1116 | )); |
| 1117 | } |
| 1118 | |
| 1119 | if (comp.config.pie) { |
| 1120 | module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( |
| 1121 | behavior_max, |
| 1122 | try o.builder.metadataString("PIE Level"), |
| 1123 | try o.builder.metadataConstant(try o.builder.intConst(.i32, pic_level)), |
| 1124 | )); |
| 1125 | } |
| 1126 | |
| 1127 | if (comp.root_mod.code_model != .default) { |
| 1128 | module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( |
| 1129 | behavior_error, |
| 1130 | try o.builder.metadataString("Code Model"), |
| 1131 | try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, switch (comp.root_mod.code_model) { |
| 1132 | .tiny => 0, |
| 1133 | .small => 1, |
| 1134 | .kernel => 2, |
| 1135 | .medium => 3, |
| 1136 | .large => 4, |
| 1137 | else => unreachable, |
| 1138 | }))), |
| 1139 | )); |
| 1140 | } |
| 1141 | |
| 1142 | if (!o.builder.strip) { |
| 1143 | module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( |
| 1144 | behavior_warning, |
| 1145 | try o.builder.metadataString("Debug Info Version"), |
| 1146 | try o.builder.metadataConstant(try o.builder.intConst(.i32, 3)), |
| 1147 | )); |
| 1148 | |
| 1149 | switch (comp.config.debug_format) { |
| 1150 | .strip => unreachable, |
| 1151 | .dwarf => |f| { |
| 1152 | module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( |
| 1153 | behavior_max, |
| 1154 | try o.builder.metadataString("Dwarf Version"), |
| 1155 | try o.builder.metadataConstant(try o.builder.intConst(.i32, 4)), |
| 1156 | )); |
| 1157 | |
| 1158 | if (f == .@"64") { |
| 1159 | module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( |
| 1160 | behavior_max, |
| 1161 | try o.builder.metadataString("DWARF64"), |
| 1162 | try o.builder.metadataConstant(.@"1"), |
| 1163 | )); |
| 1164 | } |
| 1165 | }, |
| 1166 | .code_view => { |
| 1167 | module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag( |
| 1168 | behavior_warning, |
| 1169 | try o.builder.metadataString("CodeView"), |
| 1170 | try o.builder.metadataConstant(.@"1"), |
| 1171 | )); |
| 1172 | }, |
| 1173 | } |
| 1174 | } |
| 1175 | |
| 1176 | try o.builder.metadataNamed(try o.builder.metadataString("llvm.module.flags"), module_flags.items); |
| 1177 | } |
| 1178 | |
| 1152 | 1179 | const target_triple_sentinel = |
| 1153 | 1180 | try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?); |
| 1154 | 1181 | defer o.gpa.free(target_triple_sentinel); |
| ... | ... | @@ -1235,14 +1262,13 @@ pub const Object = struct { |
| 1235 | 1262 | } |
| 1236 | 1263 | |
| 1237 | 1264 | const optimize_mode = comp.root_mod.optimize_mode; |
| 1238 | | const pic = comp.root_mod.pic; |
| 1239 | 1265 | |
| 1240 | 1266 | const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug) |
| 1241 | 1267 | .None |
| 1242 | 1268 | else |
| 1243 | 1269 | .Aggressive; |
| 1244 | 1270 | |
| 1245 | | const reloc_mode: llvm.RelocMode = if (pic) |
| 1271 | const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic) |
| 1246 | 1272 | .PIC |
| 1247 | 1273 | else if (comp.config.link_mode == .dynamic) |
| 1248 | 1274 | llvm.RelocMode.DynamicNoPIC |
| ... | ... | @@ -1276,13 +1302,6 @@ pub const Object = struct { |
| 1276 | 1302 | ); |
| 1277 | 1303 | errdefer target_machine.dispose(); |
| 1278 | 1304 | |
| 1279 | | const large_pic = target_util.usesLargePIC(comp.root_mod.resolved_target.result); |
| 1280 | | |
| 1281 | | if (pic) module.setModulePICLevel(large_pic); |
| 1282 | | if (comp.config.pie) module.setModulePIELevel(large_pic); |
| 1283 | | |
| 1284 | | if (code_model != .Default) module.setModuleCodeModel(code_model); |
| 1285 | | |
| 1286 | 1305 | if (comp.llvm_opt_bisect_limit >= 0) { |
| 1287 | 1306 | context.setOptBisectLimit(comp.llvm_opt_bisect_limit); |
| 1288 | 1307 | } |