From 6bc5584addffa20639d5bc7dcc789f76a298e1e5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 4 Nov 2017 00:16:54 +0000 Subject: [PATCH] Fix fmt printing `uintptr` type --- core/_preload.odin | 7 ++++--- core/bits.odin | 23 +++++++++++---------- core/fmt.odin | 34 +++++++++++++++++-------------- core/math.odin | 5 +++-- core/mem.odin | 6 +++--- core/opengl.odin | 51 +++++++++++++++++++++++----------------------- core/sys/wgl.odin | 2 +- core/thread.odin | 10 +++------ src/ir.cpp | 12 +++++------ 9 files changed, 77 insertions(+), 73 deletions(-) diff --git a/core/_preload.odin b/core/_preload.odin index 7cc2f07e0..92458572d 100644 --- a/core/_preload.odin +++ b/core/_preload.odin @@ -38,6 +38,7 @@ Type_Info_Enum_Value :: union { rune, i8, i16, i32, i64, i128, int, u8, u16, u32, u64, u128, uint, + uintptr, f32, f64, }; @@ -687,13 +688,13 @@ __string_decode_rune :: inline proc "contextless" (s: string) -> (rune, int) { return utf8.decode_rune(s); } -__bounds_check_error_loc :: proc "contextless" (using loc := #caller_location, index, count: int) { +__bounds_check_error_loc :: inline proc "contextless" (using loc := #caller_location, index, count: int) { __bounds_check_error(file_path, int(line), int(column), index, count); } -__slice_expr_error_loc :: proc "contextless" (using loc := #caller_location, low, high, max: int) { +__slice_expr_error_loc :: inline proc "contextless" (using loc := #caller_location, low, high, max: int) { __slice_expr_error(file_path, int(line), int(column), low, high, max); } -__substring_expr_error_loc :: proc "contextless" (using loc := #caller_location, low, high: int) { +__substring_expr_error_loc :: inline proc "contextless" (using loc := #caller_location, low, high: int) { __substring_expr_error(file_path, int(line), int(column), low, high); } diff --git a/core/bits.odin b/core/bits.odin index 225300ffb..774602b8e 100644 --- a/core/bits.odin +++ b/core/bits.odin @@ -4,23 +4,24 @@ U32_MIN :: u32(0); U64_MIN :: u64(0); U128_MIN :: u128(0); -I8_MIN :: i8(-0x80); -I16_MIN :: i16(-0x8000); -I32_MIN :: i32(-0x8000_0000); -I64_MIN :: i64(-0x8000_0000_0000_0000); -I128_MIN :: i128(-0x8000_0000_0000_0000_0000_0000_0000_0000); - U8_MAX :: ~u8(0); U16_MAX :: ~u16(0); U32_MAX :: ~u32(0); U64_MAX :: ~u64(0); U128_MAX :: ~u128(0); -I8_MAX :: i8(0x7f); -I16_MAX :: i16(0x7fff); -I32_MAX :: i32(0x7fff_ffff); -I64_MAX :: i64(0x7fff_ffff_ffff_ffff); -I128_MAX :: i128(0x7fff_ffff_ffff_ffff_ffff_ffff_ffff_ffff); +I8_MIN :: i8( ~u8(0) >> 1); +I16_MIN :: i16( ~u16(0) >> 1); +I32_MIN :: i32( ~u32(0) >> 1); +I64_MIN :: i64( ~u64(0) >> 1); +I128_MIN :: i128(~u128(0) >> 1); + +I8_MAX :: -I8_MIN - 1; +I16_MAX :: -I16_MIN - 1; +I32_MAX :: -I32_MIN - 1; +I64_MAX :: -I64_MIN - 1; +I128_MAX :: -I128_MIN - 1; + count_ones :: proc(i: u8) -> u8 { foreign __llvm_core @(link_name="llvm.ctpop.i8") __llvm_ctpop :: proc(u8) -> u8 ---; return __llvm_ctpop(i); } count_ones :: proc(i: i8) -> i8 { foreign __llvm_core @(link_name="llvm.ctpop.i8") __llvm_ctpop :: proc(i8) -> i8 ---; return __llvm_ctpop(i); } diff --git a/core/fmt.odin b/core/fmt.odin index be6c032ac..084c5f9e2 100644 --- a/core/fmt.odin +++ b/core/fmt.odin @@ -184,8 +184,9 @@ write_type :: proc(buf: ^String_Buffer, ti: ^Type_Info) { write_string(buf, info.name); case Type_Info_Integer: switch { - case ti == type_info_of(int): write_string(buf, "int"); - case ti == type_info_of(uint): write_string(buf, "uint"); + case ti == type_info_of(int): write_string(buf, "int"); + case ti == type_info_of(uint): write_string(buf, "uint"); + case ti == type_info_of(uintptr): write_string(buf, "uintptr"); case: if info.signed do write_byte(buf, 'i'); else do write_byte(buf, 'u'); @@ -674,19 +675,20 @@ enum_value_to_string :: proc(v: any) -> (string, bool) { a := any{v.data, type_info_base(e.base)}; switch v in a { - case rune: return get_str(v, e); - case i8: return get_str(v, e); - case i16: return get_str(v, e); - case i32: return get_str(v, e); - case i64: return get_str(v, e); - case i128: return get_str(v, e); - case int: return get_str(v, e); - case u8: return get_str(v, e); - case u16: return get_str(v, e); - case u32: return get_str(v, e); - case u64: return get_str(v, e); - case u128: return get_str(v, e); - case uint: return get_str(v, e); + case rune: return get_str(v, e); + case i8: return get_str(v, e); + case i16: return get_str(v, e); + case i32: return get_str(v, e); + case i64: return get_str(v, e); + case i128: return get_str(v, e); + case int: return get_str(v, e); + case u8: return get_str(v, e); + case u16: return get_str(v, e); + case u32: return get_str(v, e); + case u64: return get_str(v, e); + case u128: return get_str(v, e); + case uint: return get_str(v, e); + case uintptr: return get_str(v, e); case f32: return get_str(v, e); case f64: return get_str(v, e); @@ -1017,6 +1019,8 @@ fmt_arg :: proc(fi: ^Fmt_Info, arg: any, verb: rune) { case i64: fmt_int(fi, u128(a), true, 64, verb); case i128: fmt_int(fi, u128(a), true, 128, verb); + case uintptr: fmt_int(fi, u128(a), false, 8*size_of(uintptr), verb); + case uint: fmt_int(fi, u128(a), false, 8*size_of(uint), verb); case u8: fmt_int(fi, u128(a), false, 8, verb); case u16: fmt_int(fi, u128(a), false, 16, verb); diff --git a/core/math.odin b/core/math.odin index 0ea41e520..41cd64718 100644 --- a/core/math.odin +++ b/core/math.odin @@ -27,6 +27,7 @@ Mat4 :: [4][4]f32; Complex :: complex64; +@(default_calling_convention="c") foreign __llvm_core { @(link_name="llvm.sqrt.f32") sqrt :: proc(x: f32) -> f32 ---; @@ -54,8 +55,8 @@ foreign __llvm_core { fmuladd :: proc(a, b, c: f64) -> f64 ---; } -tan :: proc(θ: f32) -> f32 do return sin(θ)/cos(θ); -tan :: proc(θ: f64) -> f64 do return sin(θ)/cos(θ); +tan :: proc "c" (θ: f32) -> f32 do return sin(θ)/cos(θ); +tan :: proc "c" (θ: f64) -> f64 do return sin(θ)/cos(θ); lerp :: proc(a, b: $T, t: $E) -> (x: T) do return a*(1-t) + b*t; diff --git a/core/mem.odin b/core/mem.odin index b385555a1..ea13e8a20 100644 --- a/core/mem.odin +++ b/core/mem.odin @@ -1,9 +1,9 @@ import "core:raw.odin" foreign __llvm_core { - @(link_name = "llvm.bswap.i16") swap :: proc(b: u16) -> u16 ---; - @(link_name = "llvm.bswap.i32") swap :: proc(b: u32) -> u32 ---; - @(link_name = "llvm.bswap.i64") swap :: proc(b: u64) -> u64 ---; + @(link_name = "llvm.bswap.i16") swap :: proc(b: u16) -> u16 ---; + @(link_name = "llvm.bswap.i32") swap :: proc(b: u32) -> u32 ---; + @(link_name = "llvm.bswap.i64") swap :: proc(b: u64) -> u64 ---; } set :: proc "contextless" (data: rawptr, value: i32, len: int) -> rawptr { diff --git a/core/opengl.odin b/core/opengl.odin index 6941f8026..0103e36ad 100644 --- a/core/opengl.odin +++ b/core/opengl.odin @@ -10,32 +10,33 @@ export "core:opengl_constants.odin" _ := compile_assert(ODIN_OS != "osx"); +@(default_calling_convention="c", link_prefix="gl") foreign lib { - @(link_name="glClear") Clear :: proc(mask: u32) ---; - @(link_name="glClearColor") ClearColor :: proc(r, g, b, a: f32) ---; - @(link_name="glBegin") Begin :: proc(mode: i32) ---; - @(link_name="glEnd") End :: proc() ---; - @(link_name="glFinish") Finish :: proc() ---; - @(link_name="glBlendFunc") BlendFunc :: proc(sfactor, dfactor: i32) ---; - @(link_name="glEnable") Enable :: proc(cap: i32) ---; - @(link_name="glDisable") Disable :: proc(cap: i32) ---; - @(link_name="glGenTextures") GenTextures :: proc(count: i32, result: ^u32) ---; - @(link_name="glDeleteTextures") DeleteTextures :: proc(count: i32, result: ^u32) ---; - @(link_name="glTexParameteri") TexParameteri :: proc(target, pname, param: i32) ---; - @(link_name="glTexParameterf") TexParameterf :: proc(target: i32, pname: i32, param: f32) ---; - @(link_name="glBindTexture") BindTexture :: proc(target: i32, texture: u32) ---; - @(link_name="glLoadIdentity") LoadIdentity :: proc() ---; - @(link_name="glViewport") Viewport :: proc(x, y, width, height: i32) ---; - @(link_name="glOrtho") Ortho :: proc(left, right, bottom, top, near, far: f64) ---; - @(link_name="glColor3f") Color3f :: proc(r, g, b: f32) ---; - @(link_name="glVertex3f") Vertex3f :: proc(x, y, z: f32) ---; - @(link_name="glGetError") GetError :: proc() -> i32 ---; - @(link_name="glGetString") GetString :: proc(name: i32) -> ^u8 ---; - @(link_name="glGetIntegerv") GetIntegerv :: proc(name: i32, v: ^i32) ---; - @(link_name="glTexCoord2f") TexCoord2f :: proc(x, y: f32) ---; - @(link_name="glTexImage2D") TexImage2D :: proc(target, level, internal_format, - width, height, border, - format, type_: i32, pixels: rawptr) ---; + Clear :: proc(mask: u32) ---; + ClearColor :: proc(r, g, b, a: f32) ---; + Begin :: proc(mode: i32) ---; + End :: proc() ---; + Finish :: proc() ---; + BlendFunc :: proc(sfactor, dfactor: i32) ---; + Enable :: proc(cap: i32) ---; + Disable :: proc(cap: i32) ---; + GenTextures :: proc(count: i32, result: ^u32) ---; + DeleteTextures :: proc(count: i32, result: ^u32) ---; + TexParameteri :: proc(target, pname, param: i32) ---; + TexParameterf :: proc(target: i32, pname: i32, param: f32) ---; + BindTexture :: proc(target: i32, texture: u32) ---; + LoadIdentity :: proc() ---; + Viewport :: proc(x, y, width, height: i32) ---; + Ortho :: proc(left, right, bottom, top, near, far: f64) ---; + Color3f :: proc(r, g, b: f32) ---; + Vertex3f :: proc(x, y, z: f32) ---; + GetError :: proc() -> i32 ---; + GetString :: proc(name: i32) -> ^u8 ---; + GetIntegerv :: proc(name: i32, v: ^i32) ---; + TexCoord2f :: proc(x, y: f32) ---; + TexImage2D :: proc(target, level, internal_format: i32, + width, height, border: i32, + format, type_: i32, pixels: rawptr) ---; } diff --git a/core/sys/wgl.odin b/core/sys/wgl.odin index 1de6790dc..4f8aa29e7 100644 --- a/core/sys/wgl.odin +++ b/core/sys/wgl.odin @@ -1,7 +1,7 @@ when ODIN_OS == "windows" { foreign import "system:opengl32.lib" + using import "core:sys/windows.odin" } -using import "core:sys/windows.odin" CONTEXT_MAJOR_VERSION_ARB :: 0x2091; diff --git a/core/thread.odin b/core/thread.odin index 113c0f3a2..bd24e66e1 100644 --- a/core/thread.odin +++ b/core/thread.odin @@ -25,11 +25,7 @@ Thread :: struct { create :: proc(procedure: Thread_Proc) -> ^Thread { win32_thread_id: u32; - __windows_thread_entry_proc :: proc "c" (data: rawptr) -> i32 { - if data == nil do return 0; - - t := cast(^Thread)data; - + __windows_thread_entry_proc :: proc "c" (t: ^Thread) -> i32 { c := context; if t.use_init_context { c = t.init_context; @@ -40,11 +36,11 @@ create :: proc(procedure: Thread_Proc) -> ^Thread { exit = t.procedure(t); } - return cast(i32)exit; + return i32(exit); } - win32_thread_proc := cast(rawptr)__windows_thread_entry_proc; + win32_thread_proc := rawptr(__windows_thread_entry_proc); thread := new(Thread); win32_thread := win32.create_thread(nil, 0, win32_thread_proc, thread, win32.CREATE_SUSPENDED, &win32_thread_id); diff --git a/src/ir.cpp b/src/ir.cpp index 4056dc88f..e015a7056 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -376,12 +376,12 @@ enum irParamPasskind { }; struct irValueParam { - irParamPasskind kind; - irProcedure * parent; - Entity * entity; - Type * type; - Type * original_type; - Array referrers; + irParamPasskind kind; + irProcedure * parent; + Entity * entity; + Type * type; + Type * original_type; + Array referrers; }; struct irValue {