From a6ae45145f5814963cfdff4e18c1f984729588b9 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 12 May 2018 17:35:15 -0400 Subject: add @newStackCall builtin function See #1006 --- src/codegen.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 2 deletions(-) (limited to 'src/codegen.cpp') diff --git a/src/codegen.cpp b/src/codegen.cpp index 4e58f86d4b..f1e102392a 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -938,6 +938,53 @@ static LLVMValueRef get_memcpy_fn_val(CodeGen *g) { return g->memcpy_fn_val; } +static LLVMValueRef get_stacksave_fn_val(CodeGen *g) { + if (g->stacksave_fn_val) + return g->stacksave_fn_val; + + // declare i8* @llvm.stacksave() + + LLVMTypeRef fn_type = LLVMFunctionType(LLVMPointerType(LLVMInt8Type(), 0), nullptr, 0, false); + g->stacksave_fn_val = LLVMAddFunction(g->module, "llvm.stacksave", fn_type); + assert(LLVMGetIntrinsicID(g->stacksave_fn_val)); + + return g->stacksave_fn_val; +} + +static LLVMValueRef get_stackrestore_fn_val(CodeGen *g) { + if (g->stackrestore_fn_val) + return g->stackrestore_fn_val; + + // declare void @llvm.stackrestore(i8* %ptr) + + LLVMTypeRef param_type = LLVMPointerType(LLVMInt8Type(), 0); + LLVMTypeRef fn_type = LLVMFunctionType(LLVMVoidType(), ¶m_type, 1, false); + g->stackrestore_fn_val = LLVMAddFunction(g->module, "llvm.stackrestore", fn_type); + assert(LLVMGetIntrinsicID(g->stackrestore_fn_val)); + + return g->stackrestore_fn_val; +} + +static LLVMValueRef get_write_register_fn_val(CodeGen *g) { + if (g->write_register_fn_val) + return g->write_register_fn_val; + + // declare void @llvm.write_register.i64(metadata, i64 @value) + // !0 = !{!"sp\00"} + + LLVMTypeRef param_types[] = { + LLVMMetadataTypeInContext(LLVMGetGlobalContext()), + LLVMIntType(g->pointer_size_bytes * 8), + }; + + LLVMTypeRef fn_type = LLVMFunctionType(LLVMVoidType(), param_types, 2, false); + Buf *name = buf_sprintf("llvm.write_register.i%d", g->pointer_size_bytes * 8); + g->write_register_fn_val = LLVMAddFunction(g->module, buf_ptr(name), fn_type); + assert(LLVMGetIntrinsicID(g->write_register_fn_val)); + + return g->write_register_fn_val; +} + static LLVMValueRef get_coro_destroy_fn_val(CodeGen *g) { if (g->coro_destroy_fn_val) return g->coro_destroy_fn_val; @@ -2901,6 +2948,38 @@ static size_t get_async_err_code_arg_index(CodeGen *g, FnTypeId *fn_type_id) { return 1 + get_async_allocator_arg_index(g, fn_type_id); } + +static LLVMValueRef get_new_stack_addr(CodeGen *g, LLVMValueRef new_stack) { + LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, new_stack, (unsigned)slice_ptr_index, ""); + LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, new_stack, (unsigned)slice_len_index, ""); + + LLVMValueRef ptr_value = gen_load_untyped(g, ptr_field_ptr, 0, false, ""); + LLVMValueRef len_value = gen_load_untyped(g, len_field_ptr, 0, false, ""); + + LLVMValueRef ptr_addr = LLVMBuildPtrToInt(g->builder, ptr_value, LLVMTypeOf(len_value), ""); + LLVMValueRef end_addr = LLVMBuildNUWAdd(g->builder, ptr_addr, len_value, ""); + LLVMValueRef align_amt = LLVMConstInt(LLVMTypeOf(end_addr), get_abi_alignment(g, g->builtin_types.entry_usize), false); + LLVMValueRef align_adj = LLVMBuildURem(g->builder, end_addr, align_amt, ""); + return LLVMBuildNUWSub(g->builder, end_addr, align_adj, ""); +} + +static void gen_set_stack_pointer(CodeGen *g, LLVMValueRef aligned_end_addr) { + LLVMValueRef write_register_fn_val = get_write_register_fn_val(g); + + if (g->sp_md_node == nullptr) { + Buf *sp_reg_name = buf_create_from_str(arch_stack_pointer_register_name(&g->zig_target.arch)); + LLVMValueRef str_node = LLVMMDString(buf_ptr(sp_reg_name), buf_len(sp_reg_name) + 1); + g->sp_md_node = LLVMMDNode(&str_node, 1); + } + + LLVMValueRef params[] = { + g->sp_md_node, + aligned_end_addr, + }; + + LLVMBuildCall(g->builder, write_register_fn_val, params, 2, ""); +} + static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstructionCall *instruction) { LLVMValueRef fn_val; TypeTableEntry *fn_type; @@ -2967,8 +3046,23 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr } LLVMCallConv llvm_cc = get_llvm_cc(g, fn_type->data.fn.fn_type_id.cc); - LLVMValueRef result = ZigLLVMBuildCall(g->builder, fn_val, - gen_param_values, (unsigned)gen_param_index, llvm_cc, fn_inline, ""); + LLVMValueRef result; + + if (instruction->new_stack == nullptr) { + result = ZigLLVMBuildCall(g->builder, fn_val, + gen_param_values, (unsigned)gen_param_index, llvm_cc, fn_inline, ""); + } else { + LLVMValueRef stacksave_fn_val = get_stacksave_fn_val(g); + LLVMValueRef stackrestore_fn_val = get_stackrestore_fn_val(g); + + LLVMValueRef new_stack_addr = get_new_stack_addr(g, ir_llvm_value(g, instruction->new_stack)); + LLVMValueRef old_stack_ref = LLVMBuildCall(g->builder, stacksave_fn_val, nullptr, 0, ""); + gen_set_stack_pointer(g, new_stack_addr); + result = ZigLLVMBuildCall(g->builder, fn_val, + gen_param_values, (unsigned)gen_param_index, llvm_cc, fn_inline, ""); + LLVMBuildCall(g->builder, stackrestore_fn_val, &old_stack_ref, 1, ""); + } + for (size_t param_i = 0; param_i < fn_type_id->param_count; param_i += 1) { FnGenParamInfo *gen_info = &fn_type->data.fn.gen_param_info[param_i]; @@ -6171,6 +6265,7 @@ static void define_builtin_fns(CodeGen *g) { create_builtin_fn(g, BuiltinFnIdSqrt, "sqrt", 2); create_builtin_fn(g, BuiltinFnIdInlineCall, "inlineCall", SIZE_MAX); create_builtin_fn(g, BuiltinFnIdNoInlineCall, "noInlineCall", SIZE_MAX); + create_builtin_fn(g, BuiltinFnIdNewStackCall, "newStackCall", SIZE_MAX); create_builtin_fn(g, BuiltinFnIdTypeId, "typeId", 1); create_builtin_fn(g, BuiltinFnIdShlExact, "shlExact", 2); create_builtin_fn(g, BuiltinFnIdShrExact, "shrExact", 2); -- cgit v1.2.3 From 43085417bec447ab31f3454e180213f102885cc8 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 24 May 2018 21:27:44 -0400 Subject: update github.com/zig-lang to github.com/ziglang --- README.md | 4 ++-- doc/langref.html.in | 8 ++++---- example/hello_world/hello_libc.zig | 2 +- src/analyze.cpp | 4 ++-- src/codegen.cpp | 6 +++--- src/ir.cpp | 8 ++++---- std/atomic/queue.zig | 2 +- std/event.zig | 8 ++++---- std/fmt/index.zig | 2 +- std/mem.zig | 2 +- std/os/index.zig | 6 +++--- std/os/test.zig | 2 +- std/os/time.zig | 2 +- std/special/compiler_rt/comparetf2.zig | 4 ++-- std/zig/ast.zig | 4 ++-- test/build_examples.zig | 2 +- test/cases/coroutines.zig | 2 +- test/cases/misc.zig | 2 +- test/compare_output.zig | 4 ++-- 19 files changed, 37 insertions(+), 37 deletions(-) (limited to 'src/codegen.cpp') diff --git a/README.md b/README.md index cf4d8179c7..b5bf13f095 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ libc. Create demo games using Zig. ## Building -[![Build Status](https://travis-ci.org/zig-lang/zig.svg?branch=master)](https://travis-ci.org/zig-lang/zig) +[![Build Status](https://travis-ci.org/ziglang/zig.svg?branch=master)](https://travis-ci.org/ziglang/zig) [![Build status](https://ci.appveyor.com/api/projects/status/4t80mk2dmucrc38i/branch/master?svg=true)](https://ci.appveyor.com/project/andrewrk/zig-d3l86/branch/master) ### Stage 1: Build Zig from C++ Source Code @@ -161,7 +161,7 @@ bin/zig build --build-file ../build.zig test ##### Windows -See https://github.com/zig-lang/zig/wiki/Building-Zig-on-Windows +See https://github.com/ziglang/zig/wiki/Building-Zig-on-Windows ### Stage 2: Build Self-Hosted Zig from Zig Source Code diff --git a/doc/langref.html.in b/doc/langref.html.in index c3c50b117b..d63c38d0fe 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -96,7 +96,7 @@

If you search for something specific in this documentation and do not find it, - please file an issue or say something on IRC. + please file an issue or say something on IRC.

The code samples in this document are compiled and tested as part of the main test suite of Zig. @@ -2827,7 +2827,7 @@ test "fn reflection" {

The number of unique error values across the entire compilation should determine the size of the error set type. - However right now it is hard coded to be a u16. See #768. + However right now it is hard coded to be a u16. See #768.

You can implicitly cast an error from a subset to its superset: @@ -5958,7 +5958,7 @@ pub fn main() void { {#code_begin|exe#} {#link_libc#} const c = @cImport({ - // See https://github.com/zig-lang/zig/issues/515 + // See https://github.com/ziglang/zig/issues/515 @cDefine("_NO_CRT_STDIO_INLINE", "1"); @cInclude("stdio.h"); }); @@ -6301,7 +6301,7 @@ fn readU32Be() u32 {}

  • Non-Ascii Unicode line endings: U+0085 (NEL), U+2028 (LS), U+2029 (PS).
  • The codepoint U+000a (LF) (which is encoded as the single-byte value 0x0a) is the line terminator character. This character always terminates a line of zig source code (except possbly the last line of the file).

    -

    For some discussion on the rationale behind these design decisions, see issue #663

    +

    For some discussion on the rationale behind these design decisions, see issue #663

    {#header_close#} {#header_open|Grammar#}
    Root = many(TopLevelItem) EOF
    diff --git a/example/hello_world/hello_libc.zig b/example/hello_world/hello_libc.zig
    index 60123c6fd8..4a35e47b15 100644
    --- a/example/hello_world/hello_libc.zig
    +++ b/example/hello_world/hello_libc.zig
    @@ -1,5 +1,5 @@
     const c = @cImport({
    -    // See https://github.com/zig-lang/zig/issues/515
    +    // See https://github.com/ziglang/zig/issues/515
         @cDefine("_NO_CRT_STDIO_INLINE", "1");
         @cInclude("stdio.h");
         @cInclude("string.h");
    diff --git a/src/analyze.cpp b/src/analyze.cpp
    index d6137a4286..c59fde8ef6 100644
    --- a/src/analyze.cpp
    +++ b/src/analyze.cpp
    @@ -1007,7 +1007,7 @@ TypeTableEntry *get_fn_type(CodeGen *g, FnTypeId *fn_type_id) {
         if (fn_type_id->return_type != nullptr) {
             ensure_complete_type(g, fn_type_id->return_type);
         } else {
    -        zig_panic("TODO implement inferred return types https://github.com/zig-lang/zig/issues/447");
    +        zig_panic("TODO implement inferred return types https://github.com/ziglang/zig/issues/447");
         }
     
         TypeTableEntry *fn_type = new_type_table_entry(TypeTableEntryIdFn);
    @@ -1556,7 +1556,7 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c
                 return g->builtin_types.entry_invalid;
             }
             add_node_error(g, proto_node,
    -            buf_sprintf("TODO implement inferred return types https://github.com/zig-lang/zig/issues/447"));
    +            buf_sprintf("TODO implement inferred return types https://github.com/ziglang/zig/issues/447"));
             return g->builtin_types.entry_invalid;
             //return get_generic_fn_type(g, &fn_type_id);
         }
    diff --git a/src/codegen.cpp b/src/codegen.cpp
    index f1e102392a..69542b3e67 100644
    --- a/src/codegen.cpp
    +++ b/src/codegen.cpp
    @@ -582,7 +582,7 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
                 addLLVMArgAttr(fn_table_entry->llvm_value, (unsigned)gen_index, "nonnull");
             }
             // Note: byval is disabled on windows due to an LLVM bug:
    -        // https://github.com/zig-lang/zig/issues/536
    +        // https://github.com/ziglang/zig/issues/536
             if (is_byval && g->zig_target.os != OsWindows) {
                 addLLVMArgAttr(fn_table_entry->llvm_value, (unsigned)gen_index, "byval");
             }
    @@ -3067,7 +3067,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr
         for (size_t param_i = 0; param_i < fn_type_id->param_count; param_i += 1) {
             FnGenParamInfo *gen_info = &fn_type->data.fn.gen_param_info[param_i];
             // Note: byval is disabled on windows due to an LLVM bug:
    -        // https://github.com/zig-lang/zig/issues/536
    +        // https://github.com/ziglang/zig/issues/536
             if (gen_info->is_byval && g->zig_target.os != OsWindows) {
                 addLLVMCallsiteAttr(result, (unsigned)gen_info->gen_index, "byval");
             }
    @@ -6730,7 +6730,7 @@ static void init(CodeGen *g) {
         const char *target_specific_features;
         if (g->is_native_target) {
             // LLVM creates invalid binaries on Windows sometimes.
    -        // See https://github.com/zig-lang/zig/issues/508
    +        // See https://github.com/ziglang/zig/issues/508
             // As a workaround we do not use target native features on Windows.
             if (g->zig_target.os == OsWindows) {
                 target_specific_cpu_args = "";
    diff --git a/src/ir.cpp b/src/ir.cpp
    index e2cbba48a7..440063d58d 100644
    --- a/src/ir.cpp
    +++ b/src/ir.cpp
    @@ -12130,7 +12130,7 @@ static bool ir_analyze_fn_call_generic_arg(IrAnalyze *ira, AstNode *fn_proto_nod
                 casted_arg->value.type->id == TypeTableEntryIdNumLitFloat)
         {
             ir_add_error(ira, casted_arg,
    -            buf_sprintf("compiler bug: integer and float literals in var args function must be casted. https://github.com/zig-lang/zig/issues/557"));
    +            buf_sprintf("compiler bug: integer and float literals in var args function must be casted. https://github.com/ziglang/zig/issues/557"));
             return false;
         }
     
    @@ -12331,7 +12331,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
     
             if (fn_proto_node->data.fn_proto.is_var_args) {
                 ir_add_error(ira, &call_instruction->base,
    -                    buf_sprintf("compiler bug: unable to call var args function at compile time. https://github.com/zig-lang/zig/issues/313"));
    +                    buf_sprintf("compiler bug: unable to call var args function at compile time. https://github.com/ziglang/zig/issues/313"));
                 return ira->codegen->builtin_types.entry_invalid;
             }
     
    @@ -12424,7 +12424,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
             }
             if (call_instruction->is_async && fn_type_id->is_var_args) {
                 ir_add_error(ira, call_instruction->fn_ref,
    -                buf_sprintf("compiler bug: TODO: implement var args async functions. https://github.com/zig-lang/zig/issues/557"));
    +                buf_sprintf("compiler bug: TODO: implement var args async functions. https://github.com/ziglang/zig/issues/557"));
                 return ira->codegen->builtin_types.entry_invalid;
             }
     
    @@ -12507,7 +12507,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
                         VariableTableEntry *arg_var = get_fn_var_by_index(parent_fn_entry, arg_tuple_i);
                         if (arg_var == nullptr) {
                             ir_add_error(ira, arg,
    -                            buf_sprintf("compiler bug: var args can't handle void. https://github.com/zig-lang/zig/issues/557"));
    +                            buf_sprintf("compiler bug: var args can't handle void. https://github.com/ziglang/zig/issues/557"));
                             return ira->codegen->builtin_types.entry_invalid;
                         }
                         IrInstruction *arg_var_ptr_inst = ir_get_var_ptr(ira, arg, arg_var, true, false);
    diff --git a/std/atomic/queue.zig b/std/atomic/queue.zig
    index 288a2b3b48..35180da8d1 100644
    --- a/std/atomic/queue.zig
    +++ b/std/atomic/queue.zig
    @@ -16,7 +16,7 @@ pub fn Queue(comptime T: type) type {
                 data: T,
             };
     
    -        // TODO: well defined copy elision: https://github.com/zig-lang/zig/issues/287
    +        // TODO: well defined copy elision: https://github.com/ziglang/zig/issues/287
             pub fn init(self: &Self) void {
                 self.root.next = null;
                 self.head = &self.root;
    diff --git a/std/event.zig b/std/event.zig
    index b2e7e3ae38..558bd2a188 100644
    --- a/std/event.zig
    +++ b/std/event.zig
    @@ -148,7 +148,7 @@ pub const Loop = struct {
     };
     
     pub async fn connect(loop: &Loop, _address: &const std.net.Address) !std.os.File {
    -    var address = _address.*; // TODO https://github.com/zig-lang/zig/issues/733
    +    var address = _address.*; // TODO https://github.com/ziglang/zig/issues/733
     
         const sockfd = try std.os.posixSocket(posix.AF_INET, posix.SOCK_STREAM | posix.SOCK_CLOEXEC | posix.SOCK_NONBLOCK, posix.PROTO_tcp);
         errdefer std.os.close(sockfd);
    @@ -172,7 +172,7 @@ test "listen on a port, send bytes, receive bytes" {
     
             async<&mem.Allocator> fn handler(tcp_server: &TcpServer, _addr: &const std.net.Address, _socket: &const std.os.File) void {
                 const self = @fieldParentPtr(Self, "tcp_server", tcp_server);
    -            var socket = _socket.*; // TODO https://github.com/zig-lang/zig/issues/733
    +            var socket = _socket.*; // TODO https://github.com/ziglang/zig/issues/733
                 defer socket.close();
                 const next_handler = async errorableHandler(self, _addr, socket) catch |err| switch (err) {
                     error.OutOfMemory => @panic("unable to handle connection: out of memory"),
    @@ -186,8 +186,8 @@ test "listen on a port, send bytes, receive bytes" {
             }
     
             async fn errorableHandler(self: &Self, _addr: &const std.net.Address, _socket: &const std.os.File) !void {
    -            const addr = _addr.*; // TODO https://github.com/zig-lang/zig/issues/733
    -            var socket = _socket.*; // TODO https://github.com/zig-lang/zig/issues/733
    +            const addr = _addr.*; // TODO https://github.com/ziglang/zig/issues/733
    +            var socket = _socket.*; // TODO https://github.com/ziglang/zig/issues/733
     
                 var adapter = std.io.FileOutStream.init(&socket);
                 var stream = &adapter.stream;
    diff --git a/std/fmt/index.zig b/std/fmt/index.zig
    index 0af772b7dc..624751822a 100644
    --- a/std/fmt/index.zig
    +++ b/std/fmt/index.zig
    @@ -824,7 +824,7 @@ test "fmt.format" {
         try testFmt("file size: 63MiB\n", "file size: {Bi}\n", usize(63 * 1024 * 1024));
         try testFmt("file size: 66.06MB\n", "file size: {B2}\n", usize(63 * 1024 * 1024));
         {
    -        // Dummy field because of https://github.com/zig-lang/zig/issues/557.
    +        // Dummy field because of https://github.com/ziglang/zig/issues/557.
             const Struct = struct {
                 unused: u8,
             };
    diff --git a/std/mem.zig b/std/mem.zig
    index 3ca87b35d3..617c1de2f5 100644
    --- a/std/mem.zig
    +++ b/std/mem.zig
    @@ -702,7 +702,7 @@ test "std.mem.rotate" {
         }));
     }
     
    -// TODO: When https://github.com/zig-lang/zig/issues/649 is solved these can be done by
    +// TODO: When https://github.com/ziglang/zig/issues/649 is solved these can be done by
     // endian-casting the pointer and then dereferencing
     
     pub fn endianSwapIfLe(comptime T: type, x: T) T {
    diff --git a/std/os/index.zig b/std/os/index.zig
    index 7d19cd82c6..01e2092e1c 100644
    --- a/std/os/index.zig
    +++ b/std/os/index.zig
    @@ -239,7 +239,7 @@ pub fn close(handle: FileHandle) void {
     /// Calls POSIX read, and keeps trying if it gets interrupted.
     pub fn posixRead(fd: i32, buf: []u8) !void {
         // Linux can return EINVAL when read amount is > 0x7ffff000
    -    // See https://github.com/zig-lang/zig/pull/743#issuecomment-363158274
    +    // See https://github.com/ziglang/zig/pull/743#issuecomment-363158274
         const max_buf_len = 0x7ffff000;
     
         var index: usize = 0;
    @@ -281,7 +281,7 @@ pub const PosixWriteError = error{
     /// Calls POSIX write, and keeps trying if it gets interrupted.
     pub fn posixWrite(fd: i32, bytes: []const u8) !void {
         // Linux can return EINVAL when write amount is > 0x7ffff000
    -    // See https://github.com/zig-lang/zig/pull/743#issuecomment-363165856
    +    // See https://github.com/ziglang/zig/pull/743#issuecomment-363165856
         const max_bytes_len = 0x7ffff000;
     
         var index: usize = 0;
    @@ -2513,7 +2513,7 @@ pub const SpawnThreadError = error{
     /// caller must call wait on the returned thread
     pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!&Thread {
         // TODO compile-time call graph analysis to determine stack upper bound
    -    // https://github.com/zig-lang/zig/issues/157
    +    // https://github.com/ziglang/zig/issues/157
         const default_stack_size = 8 * 1024 * 1024;
     
         const Context = @typeOf(context);
    diff --git a/std/os/test.zig b/std/os/test.zig
    index 56d6e8b309..4dfe76224a 100644
    --- a/std/os/test.zig
    +++ b/std/os/test.zig
    @@ -12,7 +12,7 @@ const AtomicOrder = builtin.AtomicOrder;
     test "makePath, put some files in it, deleteTree" {
         if (builtin.os == builtin.Os.windows) {
             // TODO implement os.Dir for windows
    -        // https://github.com/zig-lang/zig/issues/709
    +        // https://github.com/ziglang/zig/issues/709
             return;
         }
         try os.makePath(a, "os_test_tmp/b/c");
    diff --git a/std/os/time.zig b/std/os/time.zig
    index 4fd2c4e924..3af150ab6a 100644
    --- a/std/os/time.zig
    +++ b/std/os/time.zig
    @@ -135,7 +135,7 @@ pub const Timer = struct {
         
         //At some point we may change our minds on RAW, but for now we're
         //  sticking with posix standard MONOTONIC. For more information, see: 
    -    //  https://github.com/zig-lang/zig/pull/933
    +    //  https://github.com/ziglang/zig/pull/933
         //
         //const monotonic_clock_id = switch(builtin.os) {
         //    Os.linux => linux.CLOCK_MONOTONIC_RAW,
    diff --git a/std/special/compiler_rt/comparetf2.zig b/std/special/compiler_rt/comparetf2.zig
    index c189e5803b..760c3689c0 100644
    --- a/std/special/compiler_rt/comparetf2.zig
    +++ b/std/special/compiler_rt/comparetf2.zig
    @@ -1,4 +1,4 @@
    -// TODO https://github.com/zig-lang/zig/issues/305
    +// TODO https://github.com/ziglang/zig/issues/305
     // and then make the return types of some of these functions the enum instead of c_int
     const LE_LESS = c_int(-1);
     const LE_EQUAL = c_int(0);
    @@ -59,7 +59,7 @@ pub extern fn __letf2(a: f128, b: f128) c_int {
         ;
     }
     
    -// TODO https://github.com/zig-lang/zig/issues/305
    +// TODO https://github.com/ziglang/zig/issues/305
     // and then make the return types of some of these functions the enum instead of c_int
     const GE_LESS = c_int(-1);
     const GE_EQUAL = c_int(0);
    diff --git a/std/zig/ast.zig b/std/zig/ast.zig
    index c1552b0220..1f15046a79 100644
    --- a/std/zig/ast.zig
    +++ b/std/zig/ast.zig
    @@ -113,7 +113,7 @@ pub const Error = union(enum) {
     
         pub fn render(self: &Error, tokens: &Tree.TokenList, stream: var) !void {
             switch (self.*) {
    -            // TODO https://github.com/zig-lang/zig/issues/683
    +            // TODO https://github.com/ziglang/zig/issues/683
                 @TagType(Error).InvalidToken => |*x| return x.render(tokens, stream),
                 @TagType(Error).ExpectedVarDeclOrFn => |*x| return x.render(tokens, stream),
                 @TagType(Error).ExpectedAggregateKw => |*x| return x.render(tokens, stream),
    @@ -137,7 +137,7 @@ pub const Error = union(enum) {
     
         pub fn loc(self: &Error) TokenIndex {
             switch (self.*) {
    -            // TODO https://github.com/zig-lang/zig/issues/683
    +            // TODO https://github.com/ziglang/zig/issues/683
                 @TagType(Error).InvalidToken => |x| return x.token,
                 @TagType(Error).ExpectedVarDeclOrFn => |x| return x.token,
                 @TagType(Error).ExpectedAggregateKw => |x| return x.token,
    diff --git a/test/build_examples.zig b/test/build_examples.zig
    index a3b44b9136..7a4c0f35d9 100644
    --- a/test/build_examples.zig
    +++ b/test/build_examples.zig
    @@ -9,7 +9,7 @@ pub fn addCases(cases: &tests.BuildExamplesContext) void {
         cases.add("example/guess_number/main.zig");
         if (!is_windows) {
             // TODO get this test passing on windows
    -        // See https://github.com/zig-lang/zig/issues/538
    +        // See https://github.com/ziglang/zig/issues/538
             cases.addBuildFile("example/shared_library/build.zig");
             cases.addBuildFile("example/mix_o_files/build.zig");
         }
    diff --git a/test/cases/coroutines.zig b/test/cases/coroutines.zig
    index 4aa97861ac..e983947a4c 100644
    --- a/test/cases/coroutines.zig
    +++ b/test/cases/coroutines.zig
    @@ -204,7 +204,7 @@ test "error return trace across suspend points - async return" {
         cancel p2;
     }
     
    -// TODO https://github.com/zig-lang/zig/issues/760
    +// TODO https://github.com/ziglang/zig/issues/760
     fn nonFailing() (promise->error!void) {
         return async suspendThenFail() catch unreachable;
     }
    diff --git a/test/cases/misc.zig b/test/cases/misc.zig
    index 66487a4946..deeeca8c3a 100644
    --- a/test/cases/misc.zig
    +++ b/test/cases/misc.zig
    @@ -543,7 +543,7 @@ test "@typeName" {
         comptime {
             assert(mem.eql(u8, @typeName(i64), "i64"));
             assert(mem.eql(u8, @typeName(&usize), "&usize"));
    -        // https://github.com/zig-lang/zig/issues/675
    +        // https://github.com/ziglang/zig/issues/675
             assert(mem.eql(u8, @typeName(TypeFromFn(u8)), "TypeFromFn(u8)"));
             assert(mem.eql(u8, @typeName(Struct), "Struct"));
             assert(mem.eql(u8, @typeName(Union), "Union"));
    diff --git a/test/compare_output.zig b/test/compare_output.zig
    index b01e87d4eb..905ffd37a9 100644
    --- a/test/compare_output.zig
    +++ b/test/compare_output.zig
    @@ -131,7 +131,7 @@ pub fn addCases(cases: &tests.CompareOutputContext) void {
             \\const is_windows = builtin.os == builtin.Os.windows;
             \\const c = @cImport({
             \\    if (is_windows) {
    -        \\        // See https://github.com/zig-lang/zig/issues/515
    +        \\        // See https://github.com/ziglang/zig/issues/515
             \\        @cDefine("_NO_CRT_STDIO_INLINE", "1");
             \\        @cInclude("io.h");
             \\        @cInclude("fcntl.h");
    @@ -316,7 +316,7 @@ pub fn addCases(cases: &tests.CompareOutputContext) void {
             \\const is_windows = builtin.os == builtin.Os.windows;
             \\const c = @cImport({
             \\    if (is_windows) {
    -        \\        // See https://github.com/zig-lang/zig/issues/515
    +        \\        // See https://github.com/ziglang/zig/issues/515
             \\        @cDefine("_NO_CRT_STDIO_INLINE", "1");
             \\        @cInclude("io.h");
             \\        @cInclude("fcntl.h");
    -- 
    cgit v1.2.3