| author | |
| committer | |
| log | 94f7c560015f7cb7ed8046339e2d0724dc86fcd6 |
| tree | bad85a37163d2ce03dff950dc467d93d45d4778b |
| parent | e5e5196d8e0bd9209bce0879d7749340fccde5fd |
| signature |
See #44855 files changed, 81 insertions(+), 29 deletions(-)
src-self-hosted/stage2.zig+27| ... | @@ -912,6 +912,9 @@ const Stage2Target = extern struct { | ... | @@ -912,6 +912,9 @@ const Stage2Target = extern struct { |
| 912 | dynamic_linker: ?[*:0]const u8, | 912 | dynamic_linker: ?[*:0]const u8, |
| 913 | standard_dynamic_linker_path: ?[*:0]const u8, | 913 | standard_dynamic_linker_path: ?[*:0]const u8, |
| 914 | 914 | ||
| 915 | llvm_cpu_features_asm_ptr: [*]const [*:0]const u8, | ||
| 916 | llvm_cpu_features_asm_len: usize, | ||
| 917 | |||
| 915 | fn fromTarget(self: *Stage2Target, cross_target: CrossTarget) !void { | 918 | fn fromTarget(self: *Stage2Target, cross_target: CrossTarget) !void { |
| 916 | const allocator = std.heap.c_allocator; | 919 | const allocator = std.heap.c_allocator; |
| 917 | 920 | ||
| ... | @@ -943,6 +946,12 @@ const Stage2Target = extern struct { | ... | @@ -943,6 +946,12 @@ const Stage2Target = extern struct { |
| 943 | var llvm_features_buffer = try std.Buffer.initSize(allocator, 0); | 946 | var llvm_features_buffer = try std.Buffer.initSize(allocator, 0); |
| 944 | defer llvm_features_buffer.deinit(); | 947 | defer llvm_features_buffer.deinit(); |
| 945 | 948 | ||
| 949 | // Unfortunately we have to do the work twice, because Clang does not support | ||
| 950 | // the same command line parameters for CPU features when assembling code as it does | ||
| 951 | // when compiling C code. | ||
| 952 | var asm_features_list = std.ArrayList([*:0]const u8).init(allocator); | ||
| 953 | defer asm_features_list.deinit(); | ||
| 954 | |||
| 946 | for (target.cpu.arch.allFeaturesList()) |feature, index_usize| { | 955 | for (target.cpu.arch.allFeaturesList()) |feature, index_usize| { |
| 947 | const index = @intCast(Target.Cpu.Feature.Set.Index, index_usize); | 956 | const index = @intCast(Target.Cpu.Feature.Set.Index, index_usize); |
| 948 | const is_enabled = target.cpu.features.isEnabled(index); | 957 | const is_enabled = target.cpu.features.isEnabled(index); |
| ... | @@ -963,6 +972,21 @@ const Stage2Target = extern struct { | ... | @@ -963,6 +972,21 @@ const Stage2Target = extern struct { |
| 963 | } | 972 | } |
| 964 | } | 973 | } |
| 965 | 974 | ||
| 975 | switch (target.cpu.arch) { | ||
| 976 | .riscv32, .riscv64 => { | ||
| 977 | if (std.Target.riscv.featureSetHas(target.cpu.features, .relax)) { | ||
| 978 | try asm_features_list.append("-mrelax"); | ||
| 979 | } else { | ||
| 980 | try asm_features_list.append("-mno-relax"); | ||
| 981 | } | ||
| 982 | }, | ||
| 983 | else => { | ||
| 984 | // TODO | ||
| 985 | // Argh, why doesn't the assembler accept the list of CPU features?! | ||
| 986 | // I don't see a way to do this other than hard coding everything. | ||
| 987 | }, | ||
| 988 | } | ||
| 989 | |||
| 966 | try cpu_builtin_str_buffer.append( | 990 | try cpu_builtin_str_buffer.append( |
| 967 | \\ }), | 991 | \\ }), |
| 968 | \\}; | 992 | \\}; |
| ... | @@ -1128,6 +1152,7 @@ const Stage2Target = extern struct { | ... | @@ -1128,6 +1152,7 @@ const Stage2Target = extern struct { |
| 1128 | null; | 1152 | null; |
| 1129 | 1153 | ||
| 1130 | const cache_hash_slice = cache_hash.toOwnedSlice(); | 1154 | const cache_hash_slice = cache_hash.toOwnedSlice(); |
| 1155 | const asm_features = asm_features_list.toOwnedSlice(); | ||
| 1131 | self.* = .{ | 1156 | self.* = .{ |
| 1132 | .arch = @enumToInt(target.cpu.arch) + 1, // skip over ZigLLVM_UnknownArch | 1157 | .arch = @enumToInt(target.cpu.arch) + 1, // skip over ZigLLVM_UnknownArch |
| 1133 | .vendor = 0, | 1158 | .vendor = 0, |
| ... | @@ -1135,6 +1160,8 @@ const Stage2Target = extern struct { | ... | @@ -1135,6 +1160,8 @@ const Stage2Target = extern struct { |
| 1135 | .abi = @enumToInt(target.abi), | 1160 | .abi = @enumToInt(target.abi), |
| 1136 | .llvm_cpu_name = if (target.cpu.model.llvm_name) |s| s.ptr else null, | 1161 | .llvm_cpu_name = if (target.cpu.model.llvm_name) |s| s.ptr else null, |
| 1137 | .llvm_cpu_features = llvm_features_buffer.toOwnedSlice().ptr, | 1162 | .llvm_cpu_features = llvm_features_buffer.toOwnedSlice().ptr, |
| 1163 | .llvm_cpu_features_asm_ptr = asm_features.ptr, | ||
| 1164 | .llvm_cpu_features_asm_len = asm_features.len, | ||
| 1138 | .cpu_builtin_str = cpu_builtin_str_buffer.toOwnedSlice().ptr, | 1165 | .cpu_builtin_str = cpu_builtin_str_buffer.toOwnedSlice().ptr, |
| 1139 | .os_builtin_str = os_builtin_str_buffer.toOwnedSlice().ptr, | 1166 | .os_builtin_str = os_builtin_str_buffer.toOwnedSlice().ptr, |
| 1140 | .cache_hash = cache_hash_slice.ptr, | 1167 | .cache_hash = cache_hash_slice.ptr, |
src/analyze.hpp+7-1| ... | @@ -257,7 +257,13 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose | ... | @@ -257,7 +257,13 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose |
| 257 | LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type); | 257 | LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type); |
| 258 | ZigLLVMDIType *get_llvm_di_type(CodeGen *g, ZigType *type); | 258 | ZigLLVMDIType *get_llvm_di_type(CodeGen *g, ZigType *type); |
| 259 | 259 | ||
| 260 | void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, bool translate_c); | 260 | enum CSourceKind { |
| 261 | CSourceKindAsm, | ||
| 262 | CSourceKindC, | ||
| 263 | }; | ||
| 264 | |||
| 265 | void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, bool translate_c, | ||
| 266 | CSourceKind source_kind); | ||
| 261 | 267 | ||
| 262 | void src_assert(bool ok, AstNode *source_node); | 268 | void src_assert(bool ok, AstNode *source_node); |
| 263 | bool is_container(ZigType *type_entry); | 269 | bool is_container(ZigType *type_entry); |
src/codegen.cpp+43-27| ... | @@ -9155,13 +9155,15 @@ static void detect_libc(CodeGen *g) { | ... | @@ -9155,13 +9155,15 @@ static void detect_libc(CodeGen *g) { |
| 9155 | } | 9155 | } |
| 9156 | 9156 | ||
| 9157 | // does not add the "cc" arg | 9157 | // does not add the "cc" arg |
| 9158 | void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, bool translate_c) { | 9158 | void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, |
| 9159 | bool translate_c, CSourceKind source_kind) | ||
| 9160 | { | ||
| 9159 | if (translate_c) { | 9161 | if (translate_c) { |
| 9160 | args.append("-x"); | 9162 | args.append("-x"); |
| 9161 | args.append("c"); | 9163 | args.append("c"); |
| 9162 | } | 9164 | } |
| 9163 | 9165 | ||
| 9164 | if (out_dep_path != nullptr) { | 9166 | if (source_kind != CSourceKindAsm && out_dep_path != nullptr) { |
| 9165 | args.append("-MD"); | 9167 | args.append("-MD"); |
| 9166 | args.append("-MV"); | 9168 | args.append("-MV"); |
| 9167 | args.append("-MF"); | 9169 | args.append("-MF"); |
| ... | @@ -9176,10 +9178,12 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa | ... | @@ -9176,10 +9178,12 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 9176 | } | 9178 | } |
| 9177 | 9179 | ||
| 9178 | if (translate_c) { | 9180 | if (translate_c) { |
| 9179 | // this gives us access to preprocessing entities, presumably at | 9181 | if (source_kind == CSourceKindC) { |
| 9180 | // the cost of performance | 9182 | // this gives us access to preprocessing entities, presumably at |
| 9181 | args.append("-Xclang"); | 9183 | // the cost of performance |
| 9182 | args.append("-detailed-preprocessing-record"); | 9184 | args.append("-Xclang"); |
| 9185 | args.append("-detailed-preprocessing-record"); | ||
| 9186 | } | ||
| 9183 | } else { | 9187 | } else { |
| 9184 | switch (g->err_color) { | 9188 | switch (g->err_color) { |
| 9185 | case ErrColorAuto: | 9189 | case ErrColorAuto: |
| ... | @@ -9212,26 +9216,29 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa | ... | @@ -9212,26 +9216,29 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 9212 | args.append(include_dir); | 9216 | args.append(include_dir); |
| 9213 | } | 9217 | } |
| 9214 | 9218 | ||
| 9215 | if (g->zig_target->is_native) { | 9219 | args.append("-target"); |
| 9216 | if (target_supports_clang_march_native(g->zig_target)) { | 9220 | args.append(buf_ptr(&g->llvm_triple_str)); |
| 9217 | args.append("-march=native"); | ||
| 9218 | } | ||
| 9219 | } else { | ||
| 9220 | args.append("-target"); | ||
| 9221 | args.append(buf_ptr(&g->llvm_triple_str)); | ||
| 9222 | 9221 | ||
| 9223 | if (g->zig_target->llvm_cpu_name != nullptr) { | 9222 | switch (source_kind) { |
| 9224 | args.append("-Xclang"); | 9223 | case CSourceKindC: |
| 9225 | args.append("-target-cpu"); | 9224 | if (g->zig_target->llvm_cpu_name != nullptr) { |
| 9226 | args.append("-Xclang"); | 9225 | args.append("-Xclang"); |
| 9227 | args.append(g->zig_target->llvm_cpu_name); | 9226 | args.append("-target-cpu"); |
| 9228 | } | 9227 | args.append("-Xclang"); |
| 9229 | if (g->zig_target->llvm_cpu_features != nullptr) { | 9228 | args.append(g->zig_target->llvm_cpu_name); |
| 9230 | args.append("-Xclang"); | 9229 | } |
| 9231 | args.append("-target-feature"); | 9230 | if (g->zig_target->llvm_cpu_features != nullptr) { |
| 9232 | args.append("-Xclang"); | 9231 | args.append("-Xclang"); |
| 9233 | args.append(g->zig_target->llvm_cpu_features); | 9232 | args.append("-target-feature"); |
| 9234 | } | 9233 | args.append("-Xclang"); |
| 9234 | args.append(g->zig_target->llvm_cpu_features); | ||
| 9235 | } | ||
| 9236 | break; | ||
| 9237 | case CSourceKindAsm: | ||
| 9238 | break; | ||
| 9239 | } | ||
| 9240 | for (size_t i = 0; i < g->zig_target->llvm_cpu_features_asm_len; i += 1) { | ||
| 9241 | args.append(g->zig_target->llvm_cpu_features_asm_ptr[i]); | ||
| 9235 | } | 9242 | } |
| 9236 | 9243 | ||
| 9237 | if (g->zig_target->os == OsFreestanding) { | 9244 | if (g->zig_target->os == OsFreestanding) { |
| ... | @@ -9377,7 +9384,7 @@ void codegen_translate_c(CodeGen *g, Buf *full_path) { | ... | @@ -9377,7 +9384,7 @@ void codegen_translate_c(CodeGen *g, Buf *full_path) { |
| 9377 | } | 9384 | } |
| 9378 | 9385 | ||
| 9379 | ZigList<const char *> clang_argv = {0}; | 9386 | ZigList<const char *> clang_argv = {0}; |
| 9380 | add_cc_args(g, clang_argv, out_dep_path_cstr, true); | 9387 | add_cc_args(g, clang_argv, out_dep_path_cstr, true, CSourceKindC); |
| 9381 | 9388 | ||
| 9382 | clang_argv.append(buf_ptr(full_path)); | 9389 | clang_argv.append(buf_ptr(full_path)); |
| 9383 | 9390 | ||
| ... | @@ -9714,6 +9721,15 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { | ... | @@ -9714,6 +9721,15 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { |
| 9714 | Buf *c_source_basename = buf_alloc(); | 9721 | Buf *c_source_basename = buf_alloc(); |
| 9715 | os_path_split(c_source_file, nullptr, c_source_basename); | 9722 | os_path_split(c_source_file, nullptr, c_source_basename); |
| 9716 | 9723 | ||
| 9724 | CSourceKind c_source_kind; | ||
| 9725 | if (buf_ends_with_str(c_source_basename, ".s") || | ||
| 9726 | buf_ends_with_str(c_source_basename, ".S")) | ||
| 9727 | { | ||
| 9728 | c_source_kind = CSourceKindAsm; | ||
| 9729 | } else { | ||
| 9730 | c_source_kind = CSourceKindC; | ||
| 9731 | } | ||
| 9732 | |||
| 9717 | Stage2ProgressNode *child_prog_node = stage2_progress_start(g->sub_progress_node, buf_ptr(c_source_basename), | 9733 | Stage2ProgressNode *child_prog_node = stage2_progress_start(g->sub_progress_node, buf_ptr(c_source_basename), |
| 9718 | buf_len(c_source_basename), 0); | 9734 | buf_len(c_source_basename), 0); |
| 9719 | 9735 | ||
| ... | @@ -9786,7 +9802,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { | ... | @@ -9786,7 +9802,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) { |
| 9786 | } | 9802 | } |
| 9787 | 9803 | ||
| 9788 | Buf *out_dep_path = buf_sprintf("%s.d", buf_ptr(out_obj_path)); | 9804 | Buf *out_dep_path = buf_sprintf("%s.d", buf_ptr(out_obj_path)); |
| 9789 | add_cc_args(g, args, buf_ptr(out_dep_path), false); | 9805 | add_cc_args(g, args, buf_ptr(out_dep_path), false, c_source_kind); |
| 9790 | 9806 | ||
| 9791 | args.append("-o"); | 9807 | args.append("-o"); |
| 9792 | args.append(buf_ptr(out_obj_path)); | 9808 | args.append(buf_ptr(out_obj_path)); |
src/ir.cpp+1-1| ... | @@ -25126,7 +25126,7 @@ static IrInstGen *ir_analyze_instruction_c_import(IrAnalyze *ira, IrInstSrcCImpo | ... | @@ -25126,7 +25126,7 @@ static IrInstGen *ir_analyze_instruction_c_import(IrAnalyze *ira, IrInstSrcCImpo |
| 25126 | 25126 | ||
| 25127 | ZigList<const char *> clang_argv = {0}; | 25127 | ZigList<const char *> clang_argv = {0}; |
| 25128 | 25128 | ||
| 25129 | add_cc_args(ira->codegen, clang_argv, buf_ptr(tmp_dep_file), true); | 25129 | add_cc_args(ira->codegen, clang_argv, buf_ptr(tmp_dep_file), true, CSourceKindC); |
| 25130 | 25130 | ||
| 25131 | clang_argv.append(buf_ptr(&tmp_c_file_path)); | 25131 | clang_argv.append(buf_ptr(&tmp_c_file_path)); |
| 25132 | 25132 |
src/stage2.h+3| ... | @@ -293,6 +293,9 @@ struct ZigTarget { | ... | @@ -293,6 +293,9 @@ struct ZigTarget { |
| 293 | const char *os_builtin_str; | 293 | const char *os_builtin_str; |
| 294 | const char *dynamic_linker; | 294 | const char *dynamic_linker; |
| 295 | const char *standard_dynamic_linker_path; | 295 | const char *standard_dynamic_linker_path; |
| 296 | |||
| 297 | const char **llvm_cpu_features_asm_ptr; | ||
| 298 | size_t llvm_cpu_features_asm_len; | ||
| 296 | }; | 299 | }; |
| 297 | 300 | ||
| 298 | // ABI warning | 301 | // ABI warning |