aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorValentin Anger <syrupthinker@gryphno.de>2020-01-29 13:22:11 +0100
committerAndrew Kelley <andrew@ziglang.org>2020-01-29 16:09:07 -0500
commitd448c3d38af9f8f70daaa2817a5834e30da4b8ca (patch)
tree647e1885ea02bbe9557338d0edb818f17abaae21 /src/codegen.cpp
parent59bc1d272120bd860cc3cd1f894a2a4e08fc1f3f (diff)
downloadzig-d448c3d38af9f8f70daaa2817a5834e30da4b8ca.tar.gz
zig-d448c3d38af9f8f70daaa2817a5834e30da4b8ca.zip
Add support for code model selection
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp53
1 files changed, 52 insertions, 1 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index f749b21008..03417f01e5 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -8365,6 +8365,25 @@ static bool detect_err_ret_tracing(CodeGen *g) {
g->build_mode != BuildModeSmallRelease;
}
+static LLVMCodeModel to_llvm_code_model(CodeGen *g) {
+ switch (g->code_model) {
+ case CodeModelDefault:
+ return LLVMCodeModelDefault;
+ case CodeModelTiny:
+ return LLVMCodeModelTiny;
+ case CodeModelSmall:
+ return LLVMCodeModelSmall;
+ case CodeModelKernel:
+ return LLVMCodeModelKernel;
+ case CodeModelMedium:
+ return LLVMCodeModelMedium;
+ case CodeModelLarge:
+ return LLVMCodeModelLarge;
+ }
+
+ zig_unreachable();
+}
+
Buf *codegen_generate_builtin_source(CodeGen *g) {
g->have_dynamic_link = detect_dynamic_link(g);
g->have_pic = detect_pic(g);
@@ -8545,6 +8564,34 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
buf_appendf(contents, "pub const strip_debug_info = %s;\n", bool_to_str(g->strip_debug_symbols));
{
+ const char *code_model;
+ switch (g->code_model) {
+ case CodeModelDefault:
+ code_model = "default";
+ break;
+ case CodeModelTiny:
+ code_model = "tiny";
+ break;
+ case CodeModelSmall:
+ code_model = "small";
+ break;
+ case CodeModelKernel:
+ code_model = "kernel";
+ break;
+ case CodeModelMedium:
+ code_model = "medium";
+ break;
+ case CodeModelLarge:
+ code_model = "large";
+ break;
+ default:
+ zig_unreachable();
+ }
+
+ buf_appendf(contents, "pub const code_model = CodeModel.%s;\n", code_model);
+ }
+
+ {
TargetSubsystem detected_subsystem = detect_subsystem(g);
if (detected_subsystem != TargetSubsystemAuto) {
buf_appendf(contents, "pub const explicit_subsystem = SubSystem.%s;\n", subsystem_to_str(detected_subsystem));
@@ -8588,6 +8635,7 @@ static Error define_builtin_compile_vars(CodeGen *g) {
cache_bool(&cache_hash, g->is_dynamic);
cache_bool(&cache_hash, g->is_test_build);
cache_bool(&cache_hash, g->is_single_threaded);
+ cache_int(&cache_hash, g->code_model);
cache_int(&cache_hash, g->zig_target->is_native);
cache_int(&cache_hash, g->zig_target->arch);
cache_int(&cache_hash, g->zig_target->sub_arch);
@@ -8745,7 +8793,7 @@ static void init(CodeGen *g) {
g->target_machine = ZigLLVMCreateTargetMachine(target_ref, buf_ptr(&g->llvm_triple_str),
target_specific_cpu_args, target_specific_features, opt_level, reloc_mode,
- LLVMCodeModelDefault, g->function_sections);
+ to_llvm_code_model(g), g->function_sections);
g->target_data_ref = LLVMCreateTargetDataLayout(g->target_machine);
@@ -9527,6 +9575,8 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose
cache_bool(cache_hash, g->have_sanitize_c);
cache_bool(cache_hash, want_valgrind_support(g));
cache_bool(cache_hash, g->function_sections);
+ cache_int(cache_hash, g->code_model);
+
for (size_t arg_i = 0; arg_i < g->clang_argv_len; arg_i += 1) {
cache_str(cache_hash, g->clang_argv[arg_i]);
}
@@ -10696,6 +10746,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
g->one_possible_values.init(32);
g->is_test_build = is_test_build;
g->is_single_threaded = false;
+ g->code_model = CodeModelDefault;
buf_resize(&g->global_asm, 0);
for (size_t i = 0; i < array_length(symbols_that_llvm_depends_on); i += 1) {