| ... | ... | @@ -89,126 +89,6 @@ static const char *symbols_that_llvm_depends_on[] = { |
| 89 | 89 | // TODO probably all of compiler-rt needs to go here |
| 90 | 90 | }; |
| 91 | 91 | |
| 92 | | CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget *target, |
| 93 | | OutType out_type, BuildMode build_mode, Buf *override_lib_dir, Buf *override_std_dir, |
| 94 | | ZigLibCInstallation *libc, Buf *cache_dir) |
| 95 | | { |
| 96 | | CodeGen *g = allocate<CodeGen>(1); |
| 97 | | |
| 98 | | codegen_add_time_event(g, "Initialize"); |
| 99 | | |
| 100 | | g->subsystem = TargetSubsystemAuto; |
| 101 | | g->libc = libc; |
| 102 | | g->zig_target = target; |
| 103 | | g->cache_dir = cache_dir; |
| 104 | | |
| 105 | | if (override_lib_dir == nullptr) { |
| 106 | | g->zig_lib_dir = get_zig_lib_dir(); |
| 107 | | } else { |
| 108 | | g->zig_lib_dir = override_lib_dir; |
| 109 | | } |
| 110 | | |
| 111 | | if (override_std_dir == nullptr) { |
| 112 | | g->zig_std_dir = buf_alloc(); |
| 113 | | os_path_join(g->zig_lib_dir, buf_create_from_str("std"), g->zig_std_dir); |
| 114 | | } else { |
| 115 | | g->zig_std_dir = override_std_dir; |
| 116 | | } |
| 117 | | |
| 118 | | g->zig_c_headers_dir = buf_alloc(); |
| 119 | | os_path_join(g->zig_lib_dir, buf_create_from_str("include"), g->zig_c_headers_dir); |
| 120 | | |
| 121 | | g->build_mode = build_mode; |
| 122 | | g->out_type = out_type; |
| 123 | | g->import_table.init(32); |
| 124 | | g->builtin_fn_table.init(32); |
| 125 | | g->primitive_type_table.init(32); |
| 126 | | g->type_table.init(32); |
| 127 | | g->fn_type_table.init(32); |
| 128 | | g->error_table.init(16); |
| 129 | | g->generic_table.init(16); |
| 130 | | g->llvm_fn_table.init(16); |
| 131 | | g->memoized_fn_eval_table.init(16); |
| 132 | | g->exported_symbol_names.init(8); |
| 133 | | g->external_prototypes.init(8); |
| 134 | | g->string_literals_table.init(16); |
| 135 | | g->type_info_cache.init(32); |
| 136 | | g->is_test_build = false; |
| 137 | | g->is_single_threaded = false; |
| 138 | | buf_resize(&g->global_asm, 0); |
| 139 | | |
| 140 | | for (size_t i = 0; i < array_length(symbols_that_llvm_depends_on); i += 1) { |
| 141 | | g->external_prototypes.put(buf_create_from_str(symbols_that_llvm_depends_on[i]), nullptr); |
| 142 | | } |
| 143 | | |
| 144 | | if (root_src_path) { |
| 145 | | Buf *root_pkg_path; |
| 146 | | Buf *rel_root_src_path; |
| 147 | | if (main_pkg_path == nullptr) { |
| 148 | | Buf *src_basename = buf_alloc(); |
| 149 | | Buf *src_dir = buf_alloc(); |
| 150 | | os_path_split(root_src_path, src_dir, src_basename); |
| 151 | | |
| 152 | | if (buf_len(src_basename) == 0) { |
| 153 | | fprintf(stderr, "Invalid root source path: %s\n", buf_ptr(root_src_path)); |
| 154 | | exit(1); |
| 155 | | } |
| 156 | | root_pkg_path = src_dir; |
| 157 | | rel_root_src_path = src_basename; |
| 158 | | } else { |
| 159 | | Buf resolved_root_src_path = os_path_resolve(&root_src_path, 1); |
| 160 | | Buf resolved_main_pkg_path = os_path_resolve(&main_pkg_path, 1); |
| 161 | | |
| 162 | | if (!buf_starts_with_buf(&resolved_root_src_path, &resolved_main_pkg_path)) { |
| 163 | | fprintf(stderr, "Root source path '%s' outside main package path '%s'", |
| 164 | | buf_ptr(root_src_path), buf_ptr(main_pkg_path)); |
| 165 | | exit(1); |
| 166 | | } |
| 167 | | root_pkg_path = main_pkg_path; |
| 168 | | rel_root_src_path = buf_create_from_mem( |
| 169 | | buf_ptr(&resolved_root_src_path) + buf_len(&resolved_main_pkg_path) + 1, |
| 170 | | buf_len(&resolved_root_src_path) - buf_len(&resolved_main_pkg_path) - 1); |
| 171 | | } |
| 172 | | |
| 173 | | g->root_package = new_package(buf_ptr(root_pkg_path), buf_ptr(rel_root_src_path), ""); |
| 174 | | g->std_package = new_package(buf_ptr(g->zig_std_dir), "std.zig", "std"); |
| 175 | | g->root_package->package_table.put(buf_create_from_str("std"), g->std_package); |
| 176 | | } else { |
| 177 | | g->root_package = new_package(".", "", ""); |
| 178 | | } |
| 179 | | |
| 180 | | g->root_package->package_table.put(buf_create_from_str("root"), g->root_package); |
| 181 | | |
| 182 | | g->zig_std_special_dir = buf_alloc(); |
| 183 | | os_path_join(g->zig_std_dir, buf_sprintf("special"), g->zig_std_special_dir); |
| 184 | | |
| 185 | | assert(target != nullptr); |
| 186 | | if (!target->is_native) { |
| 187 | | g->each_lib_rpath = false; |
| 188 | | } else { |
| 189 | | g->each_lib_rpath = true; |
| 190 | | |
| 191 | | if (target_os_is_darwin(g->zig_target->os)) { |
| 192 | | init_darwin_native(g); |
| 193 | | } |
| 194 | | |
| 195 | | } |
| 196 | | |
| 197 | | if (target_os_requires_libc(g->zig_target->os)) { |
| 198 | | g->libc_link_lib = create_link_lib(buf_create_from_str("c")); |
| 199 | | g->link_libs_list.append(g->libc_link_lib); |
| 200 | | } |
| 201 | | |
| 202 | | target_triple_llvm(&g->llvm_triple_str, g->zig_target); |
| 203 | | g->pointer_size_bytes = target_arch_pointer_bit_width(g->zig_target->arch) / 8; |
| 204 | | |
| 205 | | if (!target_has_debug_info(g->zig_target)) { |
| 206 | | g->strip_debug_symbols = true; |
| 207 | | } |
| 208 | | |
| 209 | | return g; |
| 210 | | } |
| 211 | | |
| 212 | 92 | void codegen_set_clang_argv(CodeGen *g, const char **args, size_t len) { |
| 213 | 93 | g->clang_argv = args; |
| 214 | 94 | g->clang_argv_len = len; |
| ... | ... | @@ -233,10 +113,6 @@ void codegen_set_lib_version(CodeGen *g, size_t major, size_t minor, size_t patc |
| 233 | 113 | g->version_patch = patch; |
| 234 | 114 | } |
| 235 | 115 | |
| 236 | | void codegen_set_is_test(CodeGen *g, bool is_test_build) { |
| 237 | | g->is_test_build = is_test_build; |
| 238 | | } |
| 239 | | |
| 240 | 116 | void codegen_set_emit_file_type(CodeGen *g, EmitFileType emit_file_type) { |
| 241 | 117 | g->emit_file_type = emit_file_type; |
| 242 | 118 | } |
| ... | ... | @@ -7459,6 +7335,14 @@ Buf *codegen_generate_builtin_source(CodeGen *g) { |
| 7459 | 7335 | return contents; |
| 7460 | 7336 | } |
| 7461 | 7337 | |
| 7338 | static ZigPackage *create_test_runner_pkg(CodeGen *g) { |
| 7339 | return codegen_create_package(g, buf_ptr(g->zig_std_special_dir), "test_runner.zig", "std.special"); |
| 7340 | } |
| 7341 | |
| 7342 | static ZigPackage *create_panic_pkg(CodeGen *g) { |
| 7343 | return codegen_create_package(g, buf_ptr(g->zig_std_special_dir), "panic.zig", "std.special"); |
| 7344 | } |
| 7345 | |
| 7462 | 7346 | static Error define_builtin_compile_vars(CodeGen *g) { |
| 7463 | 7347 | if (g->std_package == nullptr) |
| 7464 | 7348 | return ErrorNone; |
| ... | ... | @@ -7543,8 +7427,16 @@ static Error define_builtin_compile_vars(CodeGen *g) { |
| 7543 | 7427 | g->root_package->package_table.put(buf_create_from_str("builtin"), g->compile_var_package); |
| 7544 | 7428 | g->std_package->package_table.put(buf_create_from_str("builtin"), g->compile_var_package); |
| 7545 | 7429 | g->std_package->package_table.put(buf_create_from_str("std"), g->std_package); |
| 7546 | | g->std_package->package_table.put(buf_create_from_str("root"), |
| 7547 | | g->is_test_build ? g->test_runner_package : g->root_package); |
| 7430 | ZigPackage *root_pkg; |
| 7431 | if (g->is_test_build) { |
| 7432 | if (g->test_runner_package == nullptr) { |
| 7433 | g->test_runner_package = create_test_runner_pkg(g); |
| 7434 | } |
| 7435 | root_pkg = g->test_runner_package; |
| 7436 | } else { |
| 7437 | root_pkg = g->root_package; |
| 7438 | } |
| 7439 | g->std_package->package_table.put(buf_create_from_str("root"), root_pkg); |
| 7548 | 7440 | g->compile_var_import = add_source_file(g, g->compile_var_package, builtin_zig_path, contents, |
| 7549 | 7441 | SourceKindPkgMain); |
| 7550 | 7442 | |
| ... | ... | @@ -8036,14 +7928,6 @@ static ZigPackage *create_start_pkg(CodeGen *g, ZigPackage *pkg_with_main) { |
| 8036 | 7928 | return package; |
| 8037 | 7929 | } |
| 8038 | 7930 | |
| 8039 | | static ZigPackage *create_test_runner_pkg(CodeGen *g) { |
| 8040 | | return codegen_create_package(g, buf_ptr(g->zig_std_special_dir), "test_runner.zig", "std.special"); |
| 8041 | | } |
| 8042 | | |
| 8043 | | static ZigPackage *create_panic_pkg(CodeGen *g) { |
| 8044 | | return codegen_create_package(g, buf_ptr(g->zig_std_special_dir), "panic.zig", "std.special"); |
| 8045 | | } |
| 8046 | | |
| 8047 | 7931 | static void create_test_compile_var_and_add_test_runner(CodeGen *g) { |
| 8048 | 7932 | Error err; |
| 8049 | 7933 | |
| ... | ... | @@ -8093,7 +7977,7 @@ static void create_test_compile_var_and_add_test_runner(CodeGen *g) { |
| 8093 | 7977 | ConstExprValue *test_fn_slice = create_const_slice(g, test_fn_array, 0, g->test_fns.length, true); |
| 8094 | 7978 | |
| 8095 | 7979 | update_compile_var(g, buf_create_from_str("test_functions"), test_fn_slice); |
| 8096 | | g->test_runner_package = create_test_runner_pkg(g); |
| 7980 | assert(g->test_runner_package != nullptr); |
| 8097 | 7981 | g->test_runner_import = add_special_code(g, g->test_runner_package, "test_runner.zig"); |
| 8098 | 7982 | } |
| 8099 | 7983 | |
| ... | ... | @@ -9207,7 +9091,8 @@ CodeGen *create_child_codegen(CodeGen *parent_gen, Buf *root_src_path, OutType o |
| 9207 | 9091 | ZigLibCInstallation *libc) |
| 9208 | 9092 | { |
| 9209 | 9093 | CodeGen *child_gen = codegen_create(nullptr, root_src_path, parent_gen->zig_target, out_type, |
| 9210 | | parent_gen->build_mode, parent_gen->zig_lib_dir, parent_gen->zig_std_dir, libc, get_stage1_cache_path()); |
| 9094 | parent_gen->build_mode, parent_gen->zig_lib_dir, parent_gen->zig_std_dir, libc, get_stage1_cache_path(), |
| 9095 | false); |
| 9211 | 9096 | child_gen->disable_gen_h = true; |
| 9212 | 9097 | child_gen->want_stack_check = WantStackCheckDisabled; |
| 9213 | 9098 | child_gen->verbose_tokenize = parent_gen->verbose_tokenize; |
| ... | ... | @@ -9234,3 +9119,123 @@ CodeGen *create_child_codegen(CodeGen *parent_gen, Buf *root_src_path, OutType o |
| 9234 | 9119 | return child_gen; |
| 9235 | 9120 | } |
| 9236 | 9121 | |
| 9122 | CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget *target, |
| 9123 | OutType out_type, BuildMode build_mode, Buf *override_lib_dir, Buf *override_std_dir, |
| 9124 | ZigLibCInstallation *libc, Buf *cache_dir, bool is_test_build) |
| 9125 | { |
| 9126 | CodeGen *g = allocate<CodeGen>(1); |
| 9127 | |
| 9128 | codegen_add_time_event(g, "Initialize"); |
| 9129 | |
| 9130 | g->subsystem = TargetSubsystemAuto; |
| 9131 | g->libc = libc; |
| 9132 | g->zig_target = target; |
| 9133 | g->cache_dir = cache_dir; |
| 9134 | |
| 9135 | if (override_lib_dir == nullptr) { |
| 9136 | g->zig_lib_dir = get_zig_lib_dir(); |
| 9137 | } else { |
| 9138 | g->zig_lib_dir = override_lib_dir; |
| 9139 | } |
| 9140 | |
| 9141 | if (override_std_dir == nullptr) { |
| 9142 | g->zig_std_dir = buf_alloc(); |
| 9143 | os_path_join(g->zig_lib_dir, buf_create_from_str("std"), g->zig_std_dir); |
| 9144 | } else { |
| 9145 | g->zig_std_dir = override_std_dir; |
| 9146 | } |
| 9147 | |
| 9148 | g->zig_c_headers_dir = buf_alloc(); |
| 9149 | os_path_join(g->zig_lib_dir, buf_create_from_str("include"), g->zig_c_headers_dir); |
| 9150 | |
| 9151 | g->build_mode = build_mode; |
| 9152 | g->out_type = out_type; |
| 9153 | g->import_table.init(32); |
| 9154 | g->builtin_fn_table.init(32); |
| 9155 | g->primitive_type_table.init(32); |
| 9156 | g->type_table.init(32); |
| 9157 | g->fn_type_table.init(32); |
| 9158 | g->error_table.init(16); |
| 9159 | g->generic_table.init(16); |
| 9160 | g->llvm_fn_table.init(16); |
| 9161 | g->memoized_fn_eval_table.init(16); |
| 9162 | g->exported_symbol_names.init(8); |
| 9163 | g->external_prototypes.init(8); |
| 9164 | g->string_literals_table.init(16); |
| 9165 | g->type_info_cache.init(32); |
| 9166 | g->is_test_build = is_test_build; |
| 9167 | g->is_single_threaded = false; |
| 9168 | buf_resize(&g->global_asm, 0); |
| 9169 | |
| 9170 | for (size_t i = 0; i < array_length(symbols_that_llvm_depends_on); i += 1) { |
| 9171 | g->external_prototypes.put(buf_create_from_str(symbols_that_llvm_depends_on[i]), nullptr); |
| 9172 | } |
| 9173 | |
| 9174 | if (root_src_path) { |
| 9175 | Buf *root_pkg_path; |
| 9176 | Buf *rel_root_src_path; |
| 9177 | if (main_pkg_path == nullptr) { |
| 9178 | Buf *src_basename = buf_alloc(); |
| 9179 | Buf *src_dir = buf_alloc(); |
| 9180 | os_path_split(root_src_path, src_dir, src_basename); |
| 9181 | |
| 9182 | if (buf_len(src_basename) == 0) { |
| 9183 | fprintf(stderr, "Invalid root source path: %s\n", buf_ptr(root_src_path)); |
| 9184 | exit(1); |
| 9185 | } |
| 9186 | root_pkg_path = src_dir; |
| 9187 | rel_root_src_path = src_basename; |
| 9188 | } else { |
| 9189 | Buf resolved_root_src_path = os_path_resolve(&root_src_path, 1); |
| 9190 | Buf resolved_main_pkg_path = os_path_resolve(&main_pkg_path, 1); |
| 9191 | |
| 9192 | if (!buf_starts_with_buf(&resolved_root_src_path, &resolved_main_pkg_path)) { |
| 9193 | fprintf(stderr, "Root source path '%s' outside main package path '%s'", |
| 9194 | buf_ptr(root_src_path), buf_ptr(main_pkg_path)); |
| 9195 | exit(1); |
| 9196 | } |
| 9197 | root_pkg_path = main_pkg_path; |
| 9198 | rel_root_src_path = buf_create_from_mem( |
| 9199 | buf_ptr(&resolved_root_src_path) + buf_len(&resolved_main_pkg_path) + 1, |
| 9200 | buf_len(&resolved_root_src_path) - buf_len(&resolved_main_pkg_path) - 1); |
| 9201 | } |
| 9202 | |
| 9203 | g->root_package = new_package(buf_ptr(root_pkg_path), buf_ptr(rel_root_src_path), ""); |
| 9204 | g->std_package = new_package(buf_ptr(g->zig_std_dir), "std.zig", "std"); |
| 9205 | g->root_package->package_table.put(buf_create_from_str("std"), g->std_package); |
| 9206 | } else { |
| 9207 | g->root_package = new_package(".", "", ""); |
| 9208 | } |
| 9209 | |
| 9210 | g->root_package->package_table.put(buf_create_from_str("root"), g->root_package); |
| 9211 | |
| 9212 | g->zig_std_special_dir = buf_alloc(); |
| 9213 | os_path_join(g->zig_std_dir, buf_sprintf("special"), g->zig_std_special_dir); |
| 9214 | |
| 9215 | assert(target != nullptr); |
| 9216 | if (!target->is_native) { |
| 9217 | g->each_lib_rpath = false; |
| 9218 | } else { |
| 9219 | g->each_lib_rpath = true; |
| 9220 | |
| 9221 | if (target_os_is_darwin(g->zig_target->os)) { |
| 9222 | init_darwin_native(g); |
| 9223 | } |
| 9224 | |
| 9225 | } |
| 9226 | |
| 9227 | if (target_os_requires_libc(g->zig_target->os)) { |
| 9228 | g->libc_link_lib = create_link_lib(buf_create_from_str("c")); |
| 9229 | g->link_libs_list.append(g->libc_link_lib); |
| 9230 | } |
| 9231 | |
| 9232 | target_triple_llvm(&g->llvm_triple_str, g->zig_target); |
| 9233 | g->pointer_size_bytes = target_arch_pointer_bit_width(g->zig_target->arch) / 8; |
| 9234 | |
| 9235 | if (!target_has_debug_info(g->zig_target)) { |
| 9236 | g->strip_debug_symbols = true; |
| 9237 | } |
| 9238 | |
| 9239 | return g; |
| 9240 | } |
| 9241 | |