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 {...@@ -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,
914914
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;
917920
...@@ -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();
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
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 }
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
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;
11291153
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_UnknownArch1157 .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
257LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type);257LLVMTypeRef get_llvm_type(CodeGen *g, ZigType *type);
258ZigLLVMDIType *get_llvm_di_type(CodeGen *g, ZigType *type);258ZigLLVMDIType *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
262void src_assert(bool ok, AstNode *source_node);268void src_assert(bool ok, AstNode *source_node);
263bool is_container(ZigType *type_entry);269bool 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}
91569156
9157// does not add the "cc" arg9157// 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{
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 }
91639165
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 }
91779179
9178 if (translate_c) {9180 if (translate_c) {
9179 // this gives us access to preprocessing entities, presumably at9181 if (source_kind == CSourceKindC) {
9180 // the cost of performance9182 // 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 }
92149218
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));
92229221
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 }
92369243
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 }
93789385
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);
93819388
9382 clang_argv.append(buf_ptr(full_path));9389 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) {...@@ -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);
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
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);
97199735
...@@ -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 }
97879803
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);
97909806
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
2512625126
25127 ZigList<const char *> clang_argv = {0};25127 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
25131 clang_argv.append(buf_ptr(&tmp_c_file_path));25131 clang_argv.append(buf_ptr(&tmp_c_file_path));
2513225132
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};
297300
298// ABI warning301// ABI warning