From b2a2aa15c25a93f22c3c22810ade7bfb5651b6da Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 4 Nov 2021 12:49:39 +0000 Subject: [PATCH] Add `ODIN_BUILD_MODE` --- core/runtime/internal.odin | 35 ++++++++++++++++++----------------- src/build_settings.cpp | 19 +++++++++++++++++++ src/checker.cpp | 2 ++ src/main.cpp | 2 +- 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/core/runtime/internal.odin b/core/runtime/internal.odin index 2b8dcd36a..e0cbc8360 100644 --- a/core/runtime/internal.odin +++ b/core/runtime/internal.odin @@ -3,7 +3,8 @@ package runtime import "core:intrinsics" @(private) -RUNTIME_LINKAGE :: "strong" when ODIN_USE_SEPARATE_MODULES else "internal" +RUNTIME_LINKAGE :: "strong" when (ODIN_USE_SEPARATE_MODULES || ODIN_BUILD_MODE == "dynamic_library") else "internal" +RUNTIME_EXPORT :: ODIN_BUILD_MODE == "dynamic" @(private) byte_slice :: #force_inline proc "contextless" (data: rawptr, len: int) -> []byte #no_bounds_check { @@ -649,7 +650,7 @@ quo_quaternion256 :: proc "contextless" (q, r: quaternion256) -> quaternion256 { return quaternion(t0, t1, t2, t3) } -@(link_name="__truncsfhf2", linkage=RUNTIME_LINKAGE, require) +@(link_name="__truncsfhf2", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) truncsfhf2 :: proc "c" (value: f32) -> u16 { v: struct #raw_union { i: u32, f: f32 } i, s, e, m: i32 @@ -707,12 +708,12 @@ truncsfhf2 :: proc "c" (value: f32) -> u16 { } -@(link_name="__truncdfhf2", linkage=RUNTIME_LINKAGE, require) +@(link_name="__truncdfhf2", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) truncdfhf2 :: proc "c" (value: f64) -> u16 { return truncsfhf2(f32(value)) } -@(link_name="__gnu_h2f_ieee", linkage=RUNTIME_LINKAGE, require) +@(link_name="__gnu_h2f_ieee", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) gnu_h2f_ieee :: proc "c" (value: u16) -> f32 { fp32 :: struct #raw_union { u: u32, f: f32 } @@ -731,19 +732,19 @@ gnu_h2f_ieee :: proc "c" (value: u16) -> f32 { } -@(link_name="__gnu_f2h_ieee", linkage=RUNTIME_LINKAGE, require) +@(link_name="__gnu_f2h_ieee", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) gnu_f2h_ieee :: proc "c" (value: f32) -> u16 { return truncsfhf2(value) } -@(link_name="__extendhfsf2", linkage=RUNTIME_LINKAGE, require) +@(link_name="__extendhfsf2", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) extendhfsf2 :: proc "c" (value: u16) -> f32 { return gnu_h2f_ieee(value) } -@(link_name="__floattidf", linkage=RUNTIME_LINKAGE, require) +@(link_name="__floattidf", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) floattidf :: proc "c" (a: i128) -> f64 { DBL_MANT_DIG :: 53 if a == 0 { @@ -786,7 +787,7 @@ floattidf :: proc "c" (a: i128) -> f64 { } -@(link_name="__floattidf_unsigned", linkage=RUNTIME_LINKAGE, require) +@(link_name="__floattidf_unsigned", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) floattidf_unsigned :: proc "c" (a: u128) -> f64 { DBL_MANT_DIG :: 53 if a == 0 { @@ -828,14 +829,14 @@ floattidf_unsigned :: proc "c" (a: u128) -> f64 { -@(link_name="__fixunsdfti", linkage=RUNTIME_LINKAGE, require) +@(link_name="__fixunsdfti", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) fixunsdfti :: #force_no_inline proc "c" (a: f64) -> u128 { // TODO(bill): implement `fixunsdfti` correctly x := u64(a) return u128(x) } -@(link_name="__fixunsdfdi", linkage=RUNTIME_LINKAGE, require) +@(link_name="__fixunsdfdi", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) fixunsdfdi :: #force_no_inline proc "c" (a: f64) -> i128 { // TODO(bill): implement `fixunsdfdi` correctly x := i64(a) @@ -845,7 +846,7 @@ fixunsdfdi :: #force_no_inline proc "c" (a: f64) -> i128 { -@(link_name="__umodti3", linkage=RUNTIME_LINKAGE, require) +@(link_name="__umodti3", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) umodti3 :: proc "c" (a, b: u128) -> u128 { r: u128 = --- _ = udivmod128(a, b, &r) @@ -853,18 +854,18 @@ umodti3 :: proc "c" (a, b: u128) -> u128 { } -@(link_name="__udivmodti4", linkage=RUNTIME_LINKAGE, require) +@(link_name="__udivmodti4", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) udivmodti4 :: proc "c" (a, b: u128, rem: ^u128) -> u128 { return udivmod128(a, b, rem) } -@(link_name="__udivti3", linkage=RUNTIME_LINKAGE, require) +@(link_name="__udivti3", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) udivti3 :: proc "c" (a, b: u128) -> u128 { return udivmodti4(a, b, nil) } -@(link_name="__modti3", linkage=RUNTIME_LINKAGE, require) +@(link_name="__modti3", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) modti3 :: proc "c" (a, b: i128) -> i128 { s_a := a >> (128 - 1) s_b := b >> (128 - 1) @@ -877,20 +878,20 @@ modti3 :: proc "c" (a, b: i128) -> i128 { } -@(link_name="__divmodti4", linkage=RUNTIME_LINKAGE, require) +@(link_name="__divmodti4", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) divmodti4 :: proc "c" (a, b: i128, rem: ^i128) -> i128 { u := udivmod128(transmute(u128)a, transmute(u128)b, cast(^u128)rem) return transmute(i128)u } -@(link_name="__divti3", linkage=RUNTIME_LINKAGE, require) +@(link_name="__divti3", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) divti3 :: proc "c" (a, b: i128) -> i128 { u := udivmodti4(transmute(u128)a, transmute(u128)b, nil) return transmute(i128)u } -@(link_name="__fixdfti", linkage=RUNTIME_LINKAGE, require) +@(link_name="__fixdfti", linkage=RUNTIME_LINKAGE, require, export=RUNTIME_EXPORT) fixdfti :: proc(a: u64) -> i128 { significandBits :: 52 typeWidth :: (size_of(u64)*8) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 63752ce68..fa8922f61 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -166,6 +166,7 @@ struct BuildContext { String ODIN_VENDOR; // compiler vendor String ODIN_VERSION; // compiler version String ODIN_ROOT; // Odin ROOT + String ODIN_BUILD_MODE; bool ODIN_DEBUG; // Odin in debug mode bool ODIN_DISABLE_ASSERT; // Whether the default 'assert' et al is disabled in code or not bool ODIN_DEFAULT_TO_NIL_ALLOCATOR; // Whether the default allocator is a "nil" allocator or not (i.e. it does nothing) @@ -815,6 +816,24 @@ void init_build_context(TargetMetrics *cross_target) { bc->ODIN_VENDOR = str_lit("odin"); bc->ODIN_VERSION = ODIN_VERSION; bc->ODIN_ROOT = odin_root_dir(); + switch (bc->build_mode) { + default: + case BuildMode_Executable: + bc->ODIN_BUILD_MODE = str_lit("executable"); + break; + case BuildMode_DynamicLibrary: + bc->ODIN_BUILD_MODE = str_lit("dynamic"); + break; + case BuildMode_Object: + bc->ODIN_BUILD_MODE = str_lit("object"); + break; + case BuildMode_Assembly: + bc->ODIN_BUILD_MODE = str_lit("assembly"); + break; + case BuildMode_LLVM_IR: + bc->ODIN_BUILD_MODE = str_lit("llvm-ir"); + break; + } bc->copy_file_contents = true; diff --git a/src/checker.cpp b/src/checker.cpp index 591377726..1a92b1c06 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -778,6 +778,8 @@ void init_universal(void) { add_global_string_constant("ODIN_VENDOR", bc->ODIN_VENDOR); add_global_string_constant("ODIN_VERSION", bc->ODIN_VERSION); add_global_string_constant("ODIN_ROOT", bc->ODIN_ROOT); + + add_global_string_constant("ODIN_BUILD_MODE", bc->ODIN_BUILD_MODE); add_global_bool_constant("ODIN_DEBUG", bc->ODIN_DEBUG); add_global_bool_constant("ODIN_DISABLE_ASSERT", bc->ODIN_DISABLE_ASSERT); add_global_bool_constant("ODIN_DEFAULT_TO_NIL_ALLOCATOR", bc->ODIN_DEFAULT_TO_NIL_ALLOCATOR); diff --git a/src/main.cpp b/src/main.cpp index 55439337d..e79e7203d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1185,7 +1185,7 @@ bool parse_build_flags(Array args) { break; } - if (str == "dll" || str == "shared") { + if (str == "dll" || str == "shared" || str == "dynamic") { build_context.build_mode = BuildMode_DynamicLibrary; } else if (str == "obj" || str == "object") { build_context.build_mode = BuildMode_Object;