authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-22 21:47:19-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-22 21:47:19-04:00
log94f7c560015f7cb7ed8046339e2d0724dc86fcd6
treebad85a37163d2ce03dff950dc467d93d45d4778b
parente5e5196d8e0bd9209bce0879d7749340fccde5fd
signaturelock-open Commit is signed but in an unrecognized format.

riscv: add -mrelax arg for C to work around upstream issue

See #4485

5 files changed, 81 insertions(+), 29 deletions(-)

src-self-hosted/stage2.zig+27
......@@ -912,6 +912,9 @@ const Stage2Target = extern struct {
912912 dynamic_linker: ?[*:0]const u8,
913913 standard_dynamic_linker_path: ?[*:0]const u8,
914914
915 llvm_cpu_features_asm_ptr: [*]const [*:0]const u8,
916 llvm_cpu_features_asm_len: usize,
917
915918 fn fromTarget(self: *Stage2Target, cross_target: CrossTarget) !void {
916919 const allocator = std.heap.c_allocator;
917920
......@@ -943,6 +946,12 @@ const Stage2Target = extern struct {
943946 var llvm_features_buffer = try std.Buffer.initSize(allocator, 0);
944947 defer llvm_features_buffer.deinit();
945948
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
946955 for (target.cpu.arch.allFeaturesList()) |feature, index_usize| {
947956 const index = @intCast(Target.Cpu.Feature.Set.Index, index_usize);
948957 const is_enabled = target.cpu.features.isEnabled(index);
......@@ -963,6 +972,21 @@ const Stage2Target = extern struct {
963972 }
964973 }
965974
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
966990 try cpu_builtin_str_buffer.append(
967991 \\ }),
968992 \\};
......@@ -1128,6 +1152,7 @@ const Stage2Target = extern struct {
11281152 null;
11291153
11301154 const cache_hash_slice = cache_hash.toOwnedSlice();
1155 const asm_features = asm_features_list.toOwnedSlice();
11311156 self.* = .{
11321157 .arch = @enumToInt(target.cpu.arch) + 1, // skip over ZigLLVM_UnknownArch
11331158 .vendor = 0,
......@@ -1135,6 +1160,8 @@ const Stage2Target = extern struct {
11351160 .abi = @enumToInt(target.abi),
11361161 .llvm_cpu_name = if (target.cpu.model.llvm_name) |s| s.ptr else null,
11371162 .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,
11381165 .cpu_builtin_str = cpu_builtin_str_buffer.toOwnedSlice().ptr,
11391166 .os_builtin_str = os_builtin_str_buffer.toOwnedSlice().ptr,
11401167 .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
257257LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type);
258258ZigLLVMDIType *get_llvm_di_type(CodeGen *g, ZigType *type);
259259
260void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, bool translate_c);
260enum CSourceKind {
261 CSourceKindAsm,
262 CSourceKindC,
263};
264
265void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, bool translate_c,
266 CSourceKind source_kind);
261267
262268void src_assert(bool ok, AstNode *source_node);
263269bool is_container(ZigType *type_entry);
src/codegen.cpp+43-27
......@@ -9155,13 +9155,15 @@ static void detect_libc(CodeGen *g) {
91559155}
91569156
91579157// does not add the "cc" arg
9158void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path, bool translate_c) {
9158void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_path,
9159 bool translate_c, CSourceKind source_kind)
9160{
91599161 if (translate_c) {
91609162 args.append("-x");
91619163 args.append("c");
91629164 }
91639165
9164 if (out_dep_path != nullptr) {
9166 if (source_kind != CSourceKindAsm && out_dep_path != nullptr) {
91659167 args.append("-MD");
91669168 args.append("-MV");
91679169 args.append("-MF");
......@@ -9176,10 +9178,12 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa
91769178 }
91779179
91789180 if (translate_c) {
9179 // this gives us access to preprocessing entities, presumably at
9180 // the cost of performance
9181 args.append("-Xclang");
9182 args.append("-detailed-preprocessing-record");
9181 if (source_kind == CSourceKindC) {
9182 // this gives us access to preprocessing entities, presumably at
9183 // the cost of performance
9184 args.append("-Xclang");
9185 args.append("-detailed-preprocessing-record");
9186 }
91839187 } else {
91849188 switch (g->err_color) {
91859189 case ErrColorAuto:
......@@ -9212,26 +9216,29 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa
92129216 args.append(include_dir);
92139217 }
92149218
9215 if (g->zig_target->is_native) {
9216 if (target_supports_clang_march_native(g->zig_target)) {
9217 args.append("-march=native");
9218 }
9219 } else {
9220 args.append("-target");
9221 args.append(buf_ptr(&g->llvm_triple_str));
9219 args.append("-target");
9220 args.append(buf_ptr(&g->llvm_triple_str));
92229221
9223 if (g->zig_target->llvm_cpu_name != nullptr) {
9224 args.append("-Xclang");
9225 args.append("-target-cpu");
9226 args.append("-Xclang");
9227 args.append(g->zig_target->llvm_cpu_name);
9228 }
9229 if (g->zig_target->llvm_cpu_features != nullptr) {
9230 args.append("-Xclang");
9231 args.append("-target-feature");
9232 args.append("-Xclang");
9233 args.append(g->zig_target->llvm_cpu_features);
9234 }
9222 switch (source_kind) {
9223 case CSourceKindC:
9224 if (g->zig_target->llvm_cpu_name != nullptr) {
9225 args.append("-Xclang");
9226 args.append("-target-cpu");
9227 args.append("-Xclang");
9228 args.append(g->zig_target->llvm_cpu_name);
9229 }
9230 if (g->zig_target->llvm_cpu_features != nullptr) {
9231 args.append("-Xclang");
9232 args.append("-target-feature");
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]);
92359242 }
92369243
92379244 if (g->zig_target->os == OsFreestanding) {
......@@ -9377,7 +9384,7 @@ void codegen_translate_c(CodeGen *g, Buf *full_path) {
93779384 }
93789385
93799386 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);
93819388
93829389 clang_argv.append(buf_ptr(full_path));
93839390
......@@ -9714,6 +9721,15 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) {
97149721 Buf *c_source_basename = buf_alloc();
97159722 os_path_split(c_source_file, nullptr, c_source_basename);
97169723
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
97179733 Stage2ProgressNode *child_prog_node = stage2_progress_start(g->sub_progress_node, buf_ptr(c_source_basename),
97189734 buf_len(c_source_basename), 0);
97199735
......@@ -9786,7 +9802,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) {
97869802 }
97879803
97889804 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);
97909806
97919807 args.append("-o");
97929808 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
2512625126
2512725127 ZigList<const char *> clang_argv = {0};
2512825128
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);
2513025130
2513125131 clang_argv.append(buf_ptr(&tmp_c_file_path));
2513225132
src/stage2.h+3
......@@ -293,6 +293,9 @@ struct ZigTarget {
293293 const char *os_builtin_str;
294294 const char *dynamic_linker;
295295 const char *standard_dynamic_linker_path;
296
297 const char **llvm_cpu_features_asm_ptr;
298 size_t llvm_cpu_features_asm_len;
296299};
297300
298301// ABI warning