Browse Source

`ODIN_ENDIAN` changed to an enum constant; `ODIN_ENUM_STRING` is the new string version of the old constant

gingerBill 3 years ago
parent
commit
f0529535e0

+ 2 - 2
core/crypto/_sha3/_sha3.odin

@@ -52,7 +52,7 @@ keccakf :: proc "contextless" (st: ^[25]u64) {
     t: u64       = ---
     t: u64       = ---
     bc: [5]u64   = ---
     bc: [5]u64   = ---
 
 
-    when ODIN_ENDIAN != "little" {
+    when ODIN_ENDIAN != .Little {
         v: uintptr = ---
         v: uintptr = ---
         for i = 0; i < 25; i += 1 {
         for i = 0; i < 25; i += 1 {
             v := uintptr(&st[i])
             v := uintptr(&st[i])
@@ -98,7 +98,7 @@ keccakf :: proc "contextless" (st: ^[25]u64) {
         st[0] ~= keccakf_rndc[r]
         st[0] ~= keccakf_rndc[r]
     }
     }
 
 
-    when ODIN_ENDIAN != "little" {
+    when ODIN_ENDIAN != .Little {
         for i = 0; i < 25; i += 1 {
         for i = 0; i < 25; i += 1 {
             v = uintptr(&st[i])
             v = uintptr(&st[i])
             t = st[i]
             t = st[i]

+ 1 - 1
core/crypto/haval/haval.odin

@@ -1332,7 +1332,7 @@ update :: proc(ctx: ^Haval_Context, data: []byte) {
     }
     }
     ctx.count[1] += str_len >> 29
     ctx.count[1] += str_len >> 29
 
 
-    when ODIN_ENDIAN == "little" {
+    when ODIN_ENDIAN == .Little {
         if rmd_len + str_len >= 128 {
         if rmd_len + str_len >= 128 {
             copy(util.slice_to_bytes(ctx.block[:])[rmd_len:], data[:fill_len])
             copy(util.slice_to_bytes(ctx.block[:])[rmd_len:], data[:fill_len])
             block(ctx, ctx.rounds)
             block(ctx, ctx.rounds)

+ 2 - 2
core/encoding/json/marshal.odin

@@ -285,8 +285,8 @@ marshal_to_writer :: proc(w: io.Writer, v: any) -> (err: Marshal_Error) {
 			case runtime.Type_Info_Integer:
 			case runtime.Type_Info_Integer:
 				switch info.endianness {
 				switch info.endianness {
 				case .Platform: return false
 				case .Platform: return false
-				case .Little:   return ODIN_ENDIAN != "little"
-				case .Big:      return ODIN_ENDIAN != "big"
+				case .Little:   return ODIN_ENDIAN != .Little
+				case .Big:      return ODIN_ENDIAN != .Big
 				}
 				}
 			}
 			}
 			return false
 			return false

+ 2 - 2
core/fmt/fmt.odin

@@ -1092,8 +1092,8 @@ fmt_bit_set :: proc(fi: ^Info, v: any, name: string = "") {
 		case runtime.Type_Info_Integer:
 		case runtime.Type_Info_Integer:
 			switch info.endianness {
 			switch info.endianness {
 			case .Platform: return false
 			case .Platform: return false
-			case .Little:   return ODIN_ENDIAN != "little"
-			case .Big:      return ODIN_ENDIAN != "big"
+			case .Little:   return ODIN_ENDIAN != .Little
+			case .Big:      return ODIN_ENDIAN != .Big
 			}
 			}
 		}
 		}
 		return false
 		return false

+ 1 - 1
core/hash/xxhash/streaming.odin

@@ -96,7 +96,7 @@ XXH3_128_canonical_from_hash :: proc(hash: XXH128_hash_t) -> (canonical: XXH128_
 	#assert(size_of(XXH128_canonical) == size_of(XXH128_hash_t))
 	#assert(size_of(XXH128_canonical) == size_of(XXH128_hash_t))
 
 
 	t := hash
 	t := hash
-	when ODIN_ENDIAN == "little" {
+	when ODIN_ENDIAN == .Little {
 		t.high = byte_swap(t.high)
 		t.high = byte_swap(t.high)
 		t.low  = byte_swap(t.low)
 		t.low  = byte_swap(t.low)
 	}
 	}

+ 1 - 1
core/image/png/example.odin

@@ -189,7 +189,7 @@ write_image_as_ppm :: proc(filename: string, image: ^image.Image) -> (success: b
 	img := image
 	img := image
 
 
 	// PBM 16-bit images are big endian
 	// PBM 16-bit images are big endian
-	when ODIN_ENDIAN == "little" {
+	when ODIN_ENDIAN == .Little {
 		if img.depth == 16 {
 		if img.depth == 16 {
 			// The pixel components are in Big Endian. Let's byteswap back.
 			// The pixel components are in Big Endian. Let's byteswap back.
 			input  := mem.slice_data_cast([]u16,   img.pixels.buf[:])
 			input  := mem.slice_data_cast([]u16,   img.pixels.buf[:])

+ 1 - 1
core/image/png/png.odin

@@ -1611,7 +1611,7 @@ defilter :: proc(img: ^Image, filter_bytes: ^bytes.Buffer, header: ^image.PNG_IH
 			}
 			}
 		}
 		}
 	}
 	}
-	when ODIN_ENDIAN == "little" {
+	when ODIN_ENDIAN == .Little {
 		if img.depth == 16 {
 		if img.depth == 16 {
 			// The pixel components are in Big Endian. Let's byteswap.
 			// The pixel components are in Big Endian. Let's byteswap.
 			input  := mem.slice_data_cast([]u16be, img.pixels.buf[:])
 			input  := mem.slice_data_cast([]u16be, img.pixels.buf[:])

+ 16 - 16
core/math/bits/bits.odin

@@ -69,29 +69,29 @@ rotate_left :: proc(x: uint, k: int) -> uint {
 }
 }
 
 
 from_be_u8   :: proc(i:   u8) ->   u8 { return i }
 from_be_u8   :: proc(i:   u8) ->   u8 { return i }
-from_be_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == "big" { return i } else { return byte_swap(i) } }
-from_be_u32  :: proc(i:  u32) ->  u32 { when ODIN_ENDIAN == "big" { return i } else { return byte_swap(i) } }
-from_be_u64  :: proc(i:  u64) ->  u64 { when ODIN_ENDIAN == "big" { return i } else { return byte_swap(i) } }
-from_be_uint :: proc(i: uint) -> uint { when ODIN_ENDIAN == "big" { return i } else { return byte_swap(i) } }
+from_be_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == .Big { return i } else { return byte_swap(i) } }
+from_be_u32  :: proc(i:  u32) ->  u32 { when ODIN_ENDIAN == .Big { return i } else { return byte_swap(i) } }
+from_be_u64  :: proc(i:  u64) ->  u64 { when ODIN_ENDIAN == .Big { return i } else { return byte_swap(i) } }
+from_be_uint :: proc(i: uint) -> uint { when ODIN_ENDIAN == .Big { return i } else { return byte_swap(i) } }
 
 
 from_le_u8   :: proc(i:   u8) ->   u8 { return i }
 from_le_u8   :: proc(i:   u8) ->   u8 { return i }
-from_le_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == "little" { return i } else { return byte_swap(i) } }
-from_le_u32  :: proc(i:  u32) ->  u32 { when ODIN_ENDIAN == "little" { return i } else { return byte_swap(i) } }
-from_le_u64  :: proc(i:  u64) ->  u64 { when ODIN_ENDIAN == "little" { return i } else { return byte_swap(i) } }
-from_le_uint :: proc(i: uint) -> uint { when ODIN_ENDIAN == "little" { return i } else { return byte_swap(i) } }
+from_le_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == .Little { return i } else { return byte_swap(i) } }
+from_le_u32  :: proc(i:  u32) ->  u32 { when ODIN_ENDIAN == .Little { return i } else { return byte_swap(i) } }
+from_le_u64  :: proc(i:  u64) ->  u64 { when ODIN_ENDIAN == .Little { return i } else { return byte_swap(i) } }
+from_le_uint :: proc(i: uint) -> uint { when ODIN_ENDIAN == .Little { return i } else { return byte_swap(i) } }
 
 
 to_be_u8   :: proc(i:   u8) ->   u8 { return i }
 to_be_u8   :: proc(i:   u8) ->   u8 { return i }
-to_be_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == "big" { return i } else { return byte_swap(i) } }
-to_be_u32  :: proc(i:  u32) ->  u32 { when ODIN_ENDIAN == "big" { return i } else { return byte_swap(i) } }
-to_be_u64  :: proc(i:  u64) ->  u64 { when ODIN_ENDIAN == "big" { return i } else { return byte_swap(i) } }
-to_be_uint :: proc(i: uint) -> uint { when ODIN_ENDIAN == "big" { return i } else { return byte_swap(i) } }
+to_be_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == .Big { return i } else { return byte_swap(i) } }
+to_be_u32  :: proc(i:  u32) ->  u32 { when ODIN_ENDIAN == .Big { return i } else { return byte_swap(i) } }
+to_be_u64  :: proc(i:  u64) ->  u64 { when ODIN_ENDIAN == .Big { return i } else { return byte_swap(i) } }
+to_be_uint :: proc(i: uint) -> uint { when ODIN_ENDIAN == .Big { return i } else { return byte_swap(i) } }
 
 
 
 
 to_le_u8   :: proc(i:   u8) ->   u8 { return i }
 to_le_u8   :: proc(i:   u8) ->   u8 { return i }
-to_le_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == "little" { return i } else { return byte_swap(i) } }
-to_le_u32  :: proc(i:  u32) ->  u32 { when ODIN_ENDIAN == "little" { return i } else { return byte_swap(i) } }
-to_le_u64  :: proc(i:  u64) ->  u64 { when ODIN_ENDIAN == "little" { return i } else { return byte_swap(i) } }
-to_le_uint :: proc(i: uint) -> uint { when ODIN_ENDIAN == "little" { return i } else { return byte_swap(i) } }
+to_le_u16  :: proc(i:  u16) ->  u16 { when ODIN_ENDIAN == .Little { return i } else { return byte_swap(i) } }
+to_le_u32  :: proc(i:  u32) ->  u32 { when ODIN_ENDIAN == .Little { return i } else { return byte_swap(i) } }
+to_le_u64  :: proc(i:  u64) ->  u64 { when ODIN_ENDIAN == .Little { return i } else { return byte_swap(i) } }
+to_le_uint :: proc(i: uint) -> uint { when ODIN_ENDIAN == .Little { return i } else { return byte_swap(i) } }
 
 
 
 
 
 

+ 10 - 0
core/runtime/core.odin

@@ -398,6 +398,16 @@ Raw_Cstring :: struct {
 */
 */
 Odin_Build_Mode_Type :: type_of(ODIN_BUILD_MODE)
 Odin_Build_Mode_Type :: type_of(ODIN_BUILD_MODE)
 
 
+/*
+	// Defined internally by the compiler
+	Odin_Endian_Type :: enum int {
+		Unknown,
+		Little,
+		Big,
+	}
+*/
+Odin_Endian_Type :: type_of(ODIN_ENDIAN)
+
 
 
 /////////////////////////////
 /////////////////////////////
 // Init Startup Procedures //
 // Init Startup Procedures //

+ 1 - 1
core/runtime/udivmod128.odin

@@ -11,7 +11,7 @@ udivmod128 :: proc "c" (a, b: u128, rem: ^u128) -> u128 {
 	q, r: [2]u64
 	q, r: [2]u64
 	sr: u32 = 0
 	sr: u32 = 0
 
 
-	low  :: 1 when ODIN_ENDIAN == "big" else 0
+	low  :: 1 when ODIN_ENDIAN == .Big else 0
 	high :: 1 - low
 	high :: 1 - low
 	U64_BITS :: 8*size_of(u64)
 	U64_BITS :: 8*size_of(u64)
 	U128_BITS :: 8*size_of(u128)
 	U128_BITS :: 8*size_of(u128)

+ 9 - 11
src/build_settings.cpp

@@ -170,7 +170,6 @@ struct BuildContext {
 	// Constants
 	// Constants
 	String ODIN_OS;      // target operating system
 	String ODIN_OS;      // target operating system
 	String ODIN_ARCH;    // target architecture
 	String ODIN_ARCH;    // target architecture
-	String ODIN_ENDIAN;  // target endian
 	String ODIN_VENDOR;  // compiler vendor
 	String ODIN_VENDOR;  // compiler vendor
 	String ODIN_VERSION; // compiler version
 	String ODIN_VERSION; // compiler version
 	String ODIN_ROOT;    // Odin ROOT
 	String ODIN_ROOT;    // Odin ROOT
@@ -269,7 +268,7 @@ bool global_ignore_warnings(void) {
 }
 }
 
 
 
 
-gb_global TargetMetrics target_windows_i386 = {
+gb_global TargetMetrics target_windows_386 = {
 	TargetOs_windows,
 	TargetOs_windows,
 	TargetArch_i386,
 	TargetArch_i386,
 	4,
 	4,
@@ -285,7 +284,7 @@ gb_global TargetMetrics target_windows_amd64 = {
 	str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
 	str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
 };
 };
 
 
-gb_global TargetMetrics target_linux_i386 = {
+gb_global TargetMetrics target_linux_386 = {
 	TargetOs_linux,
 	TargetOs_linux,
 	TargetArch_i386,
 	TargetArch_i386,
 	4,
 	4,
@@ -328,7 +327,7 @@ gb_global TargetMetrics target_darwin_arm64 = {
 	str_lit("e-m:o-i64:64-i128:128-n32:64-S128"), // TODO(bill): Is this correct?
 	str_lit("e-m:o-i64:64-i128:128-n32:64-S128"), // TODO(bill): Is this correct?
 };
 };
 
 
-gb_global TargetMetrics target_freebsd_i386 = {
+gb_global TargetMetrics target_freebsd_386 = {
 	TargetOs_freebsd,
 	TargetOs_freebsd,
 	TargetArch_i386,
 	TargetArch_i386,
 	4,
 	4,
@@ -401,12 +400,12 @@ gb_global NamedTargetMetrics named_targets[] = {
 	{ str_lit("darwin_amd64"),        &target_darwin_amd64   },
 	{ str_lit("darwin_amd64"),        &target_darwin_amd64   },
 	{ str_lit("darwin_arm64"),        &target_darwin_arm64   },
 	{ str_lit("darwin_arm64"),        &target_darwin_arm64   },
 	{ str_lit("essence_amd64"),       &target_essence_amd64  },
 	{ str_lit("essence_amd64"),       &target_essence_amd64  },
-	{ str_lit("linux_i386"),           &target_linux_i386      },
+	{ str_lit("linux_386"),           &target_linux_386      },
 	{ str_lit("linux_amd64"),         &target_linux_amd64    },
 	{ str_lit("linux_amd64"),         &target_linux_amd64    },
 	{ str_lit("linux_arm64"),         &target_linux_arm64    },
 	{ str_lit("linux_arm64"),         &target_linux_arm64    },
-	{ str_lit("windows_i386"),         &target_windows_i386    },
+	{ str_lit("windows_386"),         &target_windows_386    },
 	{ str_lit("windows_amd64"),       &target_windows_amd64  },
 	{ str_lit("windows_amd64"),       &target_windows_amd64  },
-	{ str_lit("freebsd_i386"),         &target_freebsd_i386    },
+	{ str_lit("freebsd_386"),         &target_freebsd_386    },
 	{ str_lit("freebsd_amd64"),       &target_freebsd_amd64  },
 	{ str_lit("freebsd_amd64"),       &target_freebsd_amd64  },
 	{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
 	{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
 	{ str_lit("wasi_wasm32"),         &target_wasi_wasm32 },
 	{ str_lit("wasi_wasm32"),         &target_wasi_wasm32 },
@@ -879,13 +878,13 @@ void init_build_context(TargetMetrics *cross_target) {
 		#endif
 		#endif
 	#else
 	#else
 		#if defined(GB_SYSTEM_WINDOWS)
 		#if defined(GB_SYSTEM_WINDOWS)
-			metrics = &target_windows_i386;
+			metrics = &target_windows_386;
 		#elif defined(GB_SYSTEM_OSX)
 		#elif defined(GB_SYSTEM_OSX)
 			#error "Build Error: Unsupported architecture"
 			#error "Build Error: Unsupported architecture"
 		#elif defined(GB_SYSTEM_FREEBSD)
 		#elif defined(GB_SYSTEM_FREEBSD)
-			metrics = &target_freebsd_i386;
+			metrics = &target_freebsd_386;
 		#else
 		#else
-			metrics = &target_linux_i386;
+			metrics = &target_linux_386;
 		#endif
 		#endif
 	#endif
 	#endif
 
 
@@ -904,7 +903,6 @@ void init_build_context(TargetMetrics *cross_target) {
 	bc->metrics = *metrics;
 	bc->metrics = *metrics;
 	bc->ODIN_OS     = target_os_names[metrics->os];
 	bc->ODIN_OS     = target_os_names[metrics->os];
 	bc->ODIN_ARCH   = target_arch_names[metrics->arch];
 	bc->ODIN_ARCH   = target_arch_names[metrics->arch];
-	bc->ODIN_ENDIAN = target_endian_names[target_endians[metrics->arch]];
 	bc->endian_kind = target_endians[metrics->arch];
 	bc->endian_kind = target_endians[metrics->arch];
 	bc->word_size   = metrics->word_size;
 	bc->word_size   = metrics->word_size;
 	bc->max_align   = metrics->max_align;
 	bc->max_align   = metrics->max_align;

+ 13 - 2
src/checker.cpp

@@ -858,7 +858,6 @@ void init_universal(void) {
 	// TODO(bill): Set through flags in the compiler
 	// TODO(bill): Set through flags in the compiler
 	add_global_string_constant("ODIN_OS",      bc->ODIN_OS);
 	add_global_string_constant("ODIN_OS",      bc->ODIN_OS);
 	add_global_string_constant("ODIN_ARCH",    bc->ODIN_ARCH);
 	add_global_string_constant("ODIN_ARCH",    bc->ODIN_ARCH);
-	add_global_string_constant("ODIN_ENDIAN",  bc->ODIN_ENDIAN);
 	add_global_string_constant("ODIN_VENDOR",  bc->ODIN_VENDOR);
 	add_global_string_constant("ODIN_VENDOR",  bc->ODIN_VENDOR);
 	add_global_string_constant("ODIN_VERSION", bc->ODIN_VERSION);
 	add_global_string_constant("ODIN_VERSION", bc->ODIN_VERSION);
 	add_global_string_constant("ODIN_ROOT",    bc->ODIN_ROOT);
 	add_global_string_constant("ODIN_ROOT",    bc->ODIN_ROOT);
@@ -876,7 +875,19 @@ void init_universal(void) {
 		add_global_enum_constant(fields, "ODIN_BUILD_MODE", bc->build_mode);
 		add_global_enum_constant(fields, "ODIN_BUILD_MODE", bc->build_mode);
 	}
 	}
 
 
-	// add_global_string_constant("ODIN_BUILD_MODE", bc->ODIN_BUILD_MODE);
+	add_global_string_constant("ODIN_ENDIAN_STRING", target_endian_names[target_endians[bc->metrics.arch]]);
+	{
+		GlobalEnumValue values[TargetEndian_COUNT] = {
+			{"Unknown", TargetEndian_Invalid},
+
+			{"Little",  TargetEndian_Little},
+			{"Big",     TargetEndian_Big},
+		};
+
+		auto fields = add_global_enum_type(str_lit("Odin_Endian_Type"), values, gb_count_of(values));
+		add_global_enum_constant(fields, "ODIN_ENDIAN", target_endians[bc->metrics.arch]);
+	}
+
 
 
 	add_global_bool_constant("ODIN_DEBUG",                    bc->ODIN_DEBUG);
 	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_DISABLE_ASSERT",           bc->ODIN_DISABLE_ASSERT);

+ 1 - 1
vendor/sdl2/sdl_audio.odin

@@ -59,7 +59,7 @@ AUDIO_F32LSB    :: 0x8120  /**< 32-bit floating point samples */
 AUDIO_F32MSB    :: 0x9120  /**< As above, but big-endian byte order */
 AUDIO_F32MSB    :: 0x9120  /**< As above, but big-endian byte order */
 AUDIO_F32       :: AUDIO_F32LSB
 AUDIO_F32       :: AUDIO_F32LSB
 
 
-when ODIN_ENDIAN == "little"  {
+when ODIN_ENDIAN == .Little {
 	AUDIO_U16SYS :: AUDIO_U16LSB
 	AUDIO_U16SYS :: AUDIO_U16LSB
 	AUDIO_S16SYS :: AUDIO_S16LSB
 	AUDIO_S16SYS :: AUDIO_S16LSB
 	AUDIO_S32SYS :: AUDIO_S32LSB
 	AUDIO_S32SYS :: AUDIO_S32LSB

+ 4 - 4
vendor/sdl2/sdl_pixels.odin

@@ -156,10 +156,10 @@ PixelFormatEnum :: enum u32 {
 	ARGB2101010 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_ARGB<<20 | PACKEDLAYOUT_2101010<<16 | 32<<8 | 4<<0,
 	ARGB2101010 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_ARGB<<20 | PACKEDLAYOUT_2101010<<16 | 32<<8 | 4<<0,
 
 
 	/* Aliases for RGBA byte arrays of color data, for the current platform */
 	/* Aliases for RGBA byte arrays of color data, for the current platform */
-	RGBA32 = RGBA8888 when ODIN_ENDIAN == "big" else ABGR8888,
-	ARGB32 = ARGB8888 when ODIN_ENDIAN == "big" else BGRA8888,
-	BGRA32 = BGRA8888 when ODIN_ENDIAN == "big" else ARGB8888,
-	ABGR32 = ABGR8888 when ODIN_ENDIAN == "big" else RGBA8888,
+	RGBA32 = RGBA8888 when ODIN_ENDIAN == .Big else ABGR8888,
+	ARGB32 = ARGB8888 when ODIN_ENDIAN == .Big else BGRA8888,
+	BGRA32 = BGRA8888 when ODIN_ENDIAN == .Big else ARGB8888,
+	ABGR32 = ABGR8888 when ODIN_ENDIAN == .Big else RGBA8888,
 
 
 	YV12 =      /**< Planar mode: Y + V + U  (3 planes) */
 	YV12 =      /**< Planar mode: Y + V + U  (3 planes) */
 		'Y'<<24 | 'V'<<16 | '1'<<8 | '2'<<0,
 		'Y'<<24 | 'V'<<16 | '1'<<8 | '2'<<0,