authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-11-10 16:45:01-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-11-10 16:45:01-05:00
logdf89291d1ca04a5891dd48ea5f6d1a99b6006bcb
tree83970de0fdaa7383c11f64efceff7f88d6fd9cd9
parente9d7623e1f0300b1b652373f2e0e7b605eaf13d1
parent019f18058bb74816f8754de63a219347597e06da

Merge remote-tracking branch 'origin/master' into llvm6


19 files changed, 169 insertions(+), 114 deletions(-)

example/cat/main.zig+1-1
......@@ -3,9 +3,9 @@ const io = std.io;
33const mem = std.mem;
44const os = std.os;
55const warn = std.debug.warn;
6const allocator = std.debug.global_allocator;
67
78pub fn main() -> %void {
8 const allocator = &std.debug.global_allocator;
99 var args_it = os.args();
1010 const exe = %return unwrapArg(??args_it.next(allocator));
1111 var catted_anything = false;
src/all_types.hpp+1-5
......@@ -1508,13 +1508,9 @@ struct CodeGen {
15081508 bool linker_rdynamic;
15091509 const char *linker_script;
15101510
1511 // The function definitions this module includes. There must be a corresponding
1512 // fn_protos entry.
1511 // The function definitions this module includes.
15131512 ZigList<FnTableEntry *> fn_defs;
15141513 size_t fn_defs_index;
1515 // The function prototypes this module includes. In the case of external declarations,
1516 // there will not be a corresponding fn_defs entry.
1517 ZigList<FnTableEntry *> fn_protos;
15181514 ZigList<TldVar *> global_vars;
15191515
15201516 OutType out_type;
src/analyze.cpp-3
......@@ -2121,8 +2121,6 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) {
21212121 }
21222122
21232123 if (!fn_table_entry->type_entry->data.fn.is_generic) {
2124 g->fn_protos.append(fn_table_entry);
2125
21262124 if (fn_def_node)
21272125 g->fn_defs.append(fn_table_entry);
21282126
......@@ -2162,7 +2160,6 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) {
21622160 fn_table_entry->body_node = source_node->data.test_decl.body;
21632161 fn_table_entry->is_test = true;
21642162
2165 g->fn_protos.append(fn_table_entry);
21662163 g->fn_defs.append(fn_table_entry);
21672164 g->test_fns.append(fn_table_entry);
21682165
src/codegen.cpp+44-53
......@@ -408,6 +408,7 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
408408 LLVMValueRef existing_llvm_fn = LLVMGetNamedFunction(g->module, buf_ptr(symbol_name));
409409 if (existing_llvm_fn) {
410410 fn_table_entry->llvm_value = LLVMConstBitCast(existing_llvm_fn, LLVMPointerType(fn_llvm_type, 0));
411 return fn_table_entry->llvm_value;
411412 } else {
412413 fn_table_entry->llvm_value = LLVMAddFunction(g->module, buf_ptr(symbol_name), fn_llvm_type);
413414 }
......@@ -493,6 +494,49 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
493494 // use the ABI alignment, which is fine.
494495 }
495496
497 if (!type_has_bits(fn_type->data.fn.fn_type_id.return_type)) {
498 // nothing to do
499 } else if (fn_type->data.fn.fn_type_id.return_type->id == TypeTableEntryIdPointer ||
500 fn_type->data.fn.fn_type_id.return_type->id == TypeTableEntryIdFn)
501 {
502 addLLVMAttr(fn_table_entry->llvm_value, 0, "nonnull");
503 } else if (handle_is_ptr(fn_type->data.fn.fn_type_id.return_type) &&
504 calling_convention_does_first_arg_return(fn_type->data.fn.fn_type_id.cc))
505 {
506 addLLVMArgAttr(fn_table_entry->llvm_value, 0, "sret");
507 addLLVMArgAttr(fn_table_entry->llvm_value, 0, "nonnull");
508 }
509
510
511 // set parameter attributes
512 for (size_t param_i = 0; param_i < fn_type->data.fn.fn_type_id.param_count; param_i += 1) {
513 FnGenParamInfo *gen_info = &fn_type->data.fn.gen_param_info[param_i];
514 size_t gen_index = gen_info->gen_index;
515 bool is_byval = gen_info->is_byval;
516
517 if (gen_index == SIZE_MAX) {
518 continue;
519 }
520
521 FnTypeParamInfo *param_info = &fn_type->data.fn.fn_type_id.param_info[param_i];
522
523 TypeTableEntry *param_type = gen_info->type;
524 if (param_info->is_noalias) {
525 addLLVMArgAttr(fn_table_entry->llvm_value, (unsigned)gen_index, "noalias");
526 }
527 if ((param_type->id == TypeTableEntryIdPointer && param_type->data.pointer.is_const) || is_byval) {
528 addLLVMArgAttr(fn_table_entry->llvm_value, (unsigned)gen_index, "readonly");
529 }
530 if (param_type->id == TypeTableEntryIdPointer) {
531 addLLVMArgAttr(fn_table_entry->llvm_value, (unsigned)gen_index, "nonnull");
532 }
533 // Note: byval is disabled on windows due to an LLVM bug:
534 // https://github.com/zig-lang/zig/issues/536
535 if (is_byval && g->zig_target.os != ZigLLVM_Win32) {
536 addLLVMArgAttr(fn_table_entry->llvm_value, (unsigned)gen_index, "byval");
537 }
538 }
539
496540 return fn_table_entry->llvm_value;
497541}
498542
......@@ -4297,59 +4341,6 @@ static void do_code_gen(CodeGen *g) {
42974341 var->value_ref = global_value;
42984342 }
42994343
4300 // Generate function prototypes
4301 for (size_t fn_proto_i = 0; fn_proto_i < g->fn_protos.length; fn_proto_i += 1) {
4302 FnTableEntry *fn_table_entry = g->fn_protos.at(fn_proto_i);
4303
4304 TypeTableEntry *fn_type = fn_table_entry->type_entry;
4305 FnTypeId *fn_type_id = &fn_type->data.fn.fn_type_id;
4306
4307 LLVMValueRef fn_val = fn_llvm_value(g, fn_table_entry);
4308
4309 if (!type_has_bits(fn_type->data.fn.fn_type_id.return_type)) {
4310 // nothing to do
4311 } else if (fn_type->data.fn.fn_type_id.return_type->id == TypeTableEntryIdPointer ||
4312 fn_type->data.fn.fn_type_id.return_type->id == TypeTableEntryIdFn)
4313 {
4314 addLLVMAttr(fn_val, 0, "nonnull");
4315 } else if (handle_is_ptr(fn_type->data.fn.fn_type_id.return_type) &&
4316 calling_convention_does_first_arg_return(fn_type->data.fn.fn_type_id.cc))
4317 {
4318 addLLVMArgAttr(fn_val, 0, "sret");
4319 addLLVMArgAttr(fn_val, 0, "nonnull");
4320 }
4321
4322
4323 // set parameter attributes
4324 for (size_t param_i = 0; param_i < fn_type_id->param_count; param_i += 1) {
4325 FnGenParamInfo *gen_info = &fn_type->data.fn.gen_param_info[param_i];
4326 size_t gen_index = gen_info->gen_index;
4327 bool is_byval = gen_info->is_byval;
4328
4329 if (gen_index == SIZE_MAX) {
4330 continue;
4331 }
4332
4333 FnTypeParamInfo *param_info = &fn_type_id->param_info[param_i];
4334
4335 TypeTableEntry *param_type = gen_info->type;
4336 if (param_info->is_noalias) {
4337 addLLVMArgAttr(fn_val, (unsigned)gen_index, "noalias");
4338 }
4339 if ((param_type->id == TypeTableEntryIdPointer && param_type->data.pointer.is_const) || is_byval) {
4340 addLLVMArgAttr(fn_val, (unsigned)gen_index, "readonly");
4341 }
4342 if (param_type->id == TypeTableEntryIdPointer) {
4343 addLLVMArgAttr(fn_val, (unsigned)gen_index, "nonnull");
4344 }
4345 // Note: byval is disabled on windows due to an LLVM bug:
4346 // https://github.com/zig-lang/zig/issues/536
4347 if (is_byval && g->zig_target.os != ZigLLVM_Win32) {
4348 addLLVMArgAttr(fn_val, (unsigned)gen_index, "byval");
4349 }
4350 }
4351 }
4352
43534344 // Generate function definitions.
43544345 for (size_t fn_i = 0; fn_i < g->fn_defs.length; fn_i += 1) {
43554346 FnTableEntry *fn_table_entry = g->fn_defs.at(fn_i);
src/ir.cpp-1
......@@ -10584,7 +10584,6 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
1058410584 impl_fn->analyzed_executable.source_node = call_instruction->base.source_node;
1058510585 impl_fn->analyzed_executable.parent_exec = ira->new_irb.exec;
1058610586
10587 ira->codegen->fn_protos.append(impl_fn);
1058810587 ira->codegen->fn_defs.append(impl_fn);
1058910588 }
1059010589
std/array_list.zig+1-1
......@@ -101,7 +101,7 @@ pub fn ArrayList(comptime T: type) -> type{
101101}
102102
103103test "basic ArrayList test" {
104 var list = ArrayList(i32).init(&debug.global_allocator);
104 var list = ArrayList(i32).init(debug.global_allocator);
105105 defer list.deinit();
106106
107107 {var i: usize = 0; while (i < 10) : (i += 1) {
std/buffer.zig+1-1
......@@ -135,7 +135,7 @@ pub const Buffer = struct {
135135test "simple Buffer" {
136136 const cstr = @import("cstr.zig");
137137
138 var buf = %%Buffer.init(&debug.global_allocator, "");
138 var buf = %%Buffer.init(debug.global_allocator, "");
139139 assert(buf.len() == 0);
140140 %%buf.append("hello");
141141 %%buf.appendByte(' ');
std/c/darwin.zig+14-12
......@@ -6,26 +6,28 @@ pub const _errno = __error;
66
77/// Renamed to Stat to not conflict with the stat function.
88pub const Stat = extern struct {
9 dev: u32,
9 dev: i32,
1010 mode: u16,
1111 nlink: u16,
1212 ino: u64,
1313 uid: u32,
1414 gid: u32,
15 rdev: u64,
16
17 atim: timespec,
18 mtim: timespec,
19 ctim: timespec,
20
21 size: u64,
22 blocks: u64,
23 blksize: u32,
15 rdev: i32,
16 atime: usize,
17 atimensec: usize,
18 mtime: usize,
19 mtimensec: usize,
20 ctime: usize,
21 ctimensec: usize,
22 birthtime: usize,
23 birthtimensec: usize,
24 size: i64,
25 blocks: i64,
26 blksize: i32,
2427 flags: u32,
2528 gen: u32,
2629 lspare: i32,
27 qspare: [2]u64,
28
30 qspare: [2]i64,
2931};
3032
3133pub const timespec = extern struct {
std/c/index.zig+1
......@@ -14,6 +14,7 @@ pub extern "c" fn exit(code: c_int) -> noreturn;
1414pub extern "c" fn isatty(fd: c_int) -> c_int;
1515pub extern "c" fn close(fd: c_int) -> c_int;
1616pub extern "c" fn fstat(fd: c_int, buf: &Stat) -> c_int;
17pub extern "c" fn @"fstat$INODE64"(fd: c_int, buf: &Stat) -> c_int;
1718pub extern "c" fn lseek(fd: c_int, offset: isize, whence: c_int) -> isize;
1819pub extern "c" fn open(path: &const u8, oflag: c_int, ...) -> c_int;
1920pub extern "c" fn raise(sig: c_int) -> c_int;
std/debug.zig+4-3
......@@ -38,7 +38,7 @@ fn getStderrStream() -> %&io.OutStream {
3838/// Tries to print a stack trace to stderr, unbuffered, and ignores any error returned.
3939pub fn dumpStackTrace() {
4040 const stderr = getStderrStream() %% return;
41 writeStackTrace(stderr, &global_allocator, stderr_file.isTty(), 1) %% return;
41 writeStackTrace(stderr, global_allocator, stderr_file.isTty(), 1) %% return;
4242}
4343
4444/// This function invokes undefined behavior when `ok` is `false`.
......@@ -86,7 +86,7 @@ pub fn panic(comptime format: []const u8, args: ...) -> noreturn {
8686
8787 const stderr = getStderrStream() %% os.abort();
8888 stderr.print(format ++ "\n", args) %% os.abort();
89 writeStackTrace(stderr, &global_allocator, stderr_file.isTty(), 1) %% os.abort();
89 writeStackTrace(stderr, global_allocator, stderr_file.isTty(), 1) %% os.abort();
9090
9191 os.abort();
9292}
......@@ -967,7 +967,8 @@ fn readILeb128(in_stream: &io.InStream) -> %i64 {
967967 }
968968}
969969
970pub var global_allocator = mem.Allocator {
970pub const global_allocator = &global_allocator_state;
971var global_allocator_state = mem.Allocator {
971972 .allocFn = globalAlloc,
972973 .reallocFn = globalRealloc,
973974 .freeFn = globalFree,
std/hash_map.zig+1-1
......@@ -232,7 +232,7 @@ pub fn HashMap(comptime K: type, comptime V: type,
232232}
233233
234234test "basicHashMapTest" {
235 var map = HashMap(i32, i32, hash_i32, eql_i32).init(&debug.global_allocator);
235 var map = HashMap(i32, i32, hash_i32, eql_i32).init(debug.global_allocator);
236236 defer map.deinit();
237237
238238 assert(%%map.put(1, 11) == null);
std/io.zig+30-9
......@@ -20,6 +20,12 @@ const fmt = std.fmt;
2020const is_posix = builtin.os != builtin.Os.windows;
2121const is_windows = builtin.os == builtin.Os.windows;
2222
23test "import io tests" {
24 comptime {
25 _ = @import("io_test.zig");
26 }
27}
28
2329/// The function received invalid input at runtime. An Invalid error means a
2430/// bug in the program that called the function.
2531error Invalid;
......@@ -247,17 +253,32 @@ pub const File = struct {
247253 }
248254
249255 pub fn getEndPos(self: &File) -> %usize {
250 var stat: system.Stat = undefined;
251 const err = system.getErrno(system.fstat(self.handle, &stat));
252 if (err > 0) {
253 return switch (err) {
254 system.EBADF => error.BadFd,
255 system.ENOMEM => error.OutOfMemory,
256 else => os.unexpectedErrorPosix(err),
256 if (is_posix) {
257 var stat: system.Stat = undefined;
258 const err = system.getErrno(system.fstat(self.handle, &stat));
259 if (err > 0) {
260 return switch (err) {
261 system.EBADF => error.BadFd,
262 system.ENOMEM => error.OutOfMemory,
263 else => os.unexpectedErrorPosix(err),
264 }
257265 }
258 }
259266
260 return usize(stat.size);
267 return usize(stat.size);
268 } else if (is_windows) {
269 var file_size: system.LARGE_INTEGER = undefined;
270 if (system.GetFileSizeEx(self.handle, &file_size) == 0) {
271 const err = system.GetLastError();
272 return switch (err) {
273 else => os.unexpectedErrorWindows(err),
274 };
275 }
276 if (file_size < 0)
277 return error.Overflow;
278 return math.cast(usize, u64(file_size));
279 } else {
280 unreachable;
281 }
261282 }
262283
263284 pub fn read(self: &File, buffer: []u8) -> %usize {
std/io_test.zig created+45
......@@ -0,0 +1,45 @@
1const std = @import("index.zig");
2const io = std.io;
3const allocator = std.debug.global_allocator;
4const Rand = std.rand.Rand;
5const assert = std.debug.assert;
6const mem = std.mem;
7const os = std.os;
8
9test "write a file, read it, then delete it" {
10 var data: [1024]u8 = undefined;
11 var rng = Rand.init(1234);
12 rng.fillBytes(data[0..]);
13 const tmp_file_name = "temp_test_file.txt";
14 {
15 var file = %%io.File.openWrite(tmp_file_name, allocator);
16 defer file.close();
17
18 var file_out_stream = io.FileOutStream.init(&file);
19 var buf_stream = io.BufferedOutStream.init(&file_out_stream.stream);
20 const st = &buf_stream.stream;
21 %%st.print("begin");
22 %%st.write(data[0..]);
23 %%st.print("end");
24 %%buf_stream.flush();
25 }
26 {
27 var file = %%io.File.openRead(tmp_file_name, allocator);
28 defer file.close();
29
30 const file_size = %%file.getEndPos();
31 const expected_file_size = "begin".len + data.len + "end".len;
32 assert(file_size == expected_file_size);
33
34 var file_in_stream = io.FileInStream.init(&file);
35 var buf_stream = io.BufferedInStream.init(&file_in_stream.stream);
36 const st = &buf_stream.stream;
37 const contents = %%st.readAllAlloc(allocator, 2 * 1024);
38 defer allocator.free(contents);
39
40 assert(mem.eql(u8, contents[0.."begin".len], "begin"));
41 assert(mem.eql(u8, contents["begin".len..contents.len - "end".len], data));
42 assert(mem.eql(u8, contents[contents.len - "end".len ..], "end"));
43 }
44 %%os.deleteFile(allocator, tmp_file_name);
45}
std/linked_list.zig+1-1
......@@ -195,7 +195,7 @@ pub fn LinkedList(comptime T: type) -> type {
195195}
196196
197197test "basic linked list test" {
198 const allocator = &debug.global_allocator;
198 const allocator = debug.global_allocator;
199199 var list = LinkedList(u32).init();
200200
201201 var one = %%list.createNode(1, allocator);
std/mem.zig+2-2
......@@ -331,8 +331,8 @@ pub fn join(allocator: &Allocator, sep: u8, strings: ...) -> %[]u8 {
331331}
332332
333333test "mem.join" {
334 assert(eql(u8, %%join(&debug.global_allocator, ',', "a", "b", "c"), "a,b,c"));
335 assert(eql(u8, %%join(&debug.global_allocator, ',', "a"), "a"));
334 assert(eql(u8, %%join(debug.global_allocator, ',', "a", "b", "c"), "a,b,c"));
335 assert(eql(u8, %%join(debug.global_allocator, ',', "a"), "a"));
336336}
337337
338338test "testStringEquality" {
std/os/darwin.zig+1-1
......@@ -129,7 +129,7 @@ pub fn isatty(fd: i32) -> bool {
129129}
130130
131131pub fn fstat(fd: i32, buf: &c.Stat) -> usize {
132 errnoWrap(c.fstat(fd, buf))
132 errnoWrap(c.@"fstat$INODE64"(fd, buf))
133133}
134134
135135pub fn lseek(fd: i32, offset: isize, whence: c_int) -> usize {
std/os/index.zig+3-4
......@@ -562,7 +562,7 @@ pub fn getCwd(allocator: &Allocator) -> %[]u8 {
562562
563563test "os.getCwd" {
564564 // at least call it so it gets compiled
565 _ = getCwd(&debug.global_allocator);
565 _ = getCwd(debug.global_allocator);
566566}
567567
568568pub fn symLink(allocator: &Allocator, existing_path: []const u8, new_path: []const u8) -> %void {
......@@ -1432,10 +1432,10 @@ test "windows arg parsing" {
14321432fn testWindowsCmdLine(input_cmd_line: &const u8, expected_args: []const []const u8) {
14331433 var it = ArgIteratorWindows.initWithCmdLine(input_cmd_line);
14341434 for (expected_args) |expected_arg| {
1435 const arg = %%??it.next(&debug.global_allocator);
1435 const arg = %%??it.next(debug.global_allocator);
14361436 assert(mem.eql(u8, arg, expected_arg));
14371437 }
1438 assert(it.next(&debug.global_allocator) == null);
1438 assert(it.next(debug.global_allocator) == null);
14391439}
14401440
14411441test "std.os" {
......@@ -1500,4 +1500,3 @@ pub fn isTty(handle: FileHandle) -> bool {
15001500 }
15011501 }
15021502}
1503
std/os/path.zig+16-16
......@@ -41,23 +41,23 @@ pub fn joinPosix(allocator: &Allocator, paths: ...) -> %[]u8 {
4141}
4242
4343test "os.path.join" {
44 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\b", "c"), "c:\\a\\b\\c"));
45 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\b\\", "c"), "c:\\a\\b\\c"));
44 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\b", "c"), "c:\\a\\b\\c"));
45 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\b\\", "c"), "c:\\a\\b\\c"));
4646
47 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\", "a", "b\\", "c"), "c:\\a\\b\\c"));
48 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\", "b\\", "c"), "c:\\a\\b\\c"));
47 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\", "a", "b\\", "c"), "c:\\a\\b\\c"));
48 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\", "b\\", "c"), "c:\\a\\b\\c"));
4949
50 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator,
50 assert(mem.eql(u8, %%joinWindows(debug.global_allocator,
5151 "c:\\home\\andy\\dev\\zig\\build\\lib\\zig\\std", "io.zig"),
5252 "c:\\home\\andy\\dev\\zig\\build\\lib\\zig\\std\\io.zig"));
5353
54 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/b", "c"), "/a/b/c"));
55 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/b/", "c"), "/a/b/c"));
54 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/b", "c"), "/a/b/c"));
55 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/b/", "c"), "/a/b/c"));
5656
57 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/", "a", "b/", "c"), "/a/b/c"));
58 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/", "b/", "c"), "/a/b/c"));
57 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/", "a", "b/", "c"), "/a/b/c"));
58 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/", "b/", "c"), "/a/b/c"));
5959
60 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/home/andy/dev/zig/build/lib/zig/std", "io.zig"),
60 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/home/andy/dev/zig/build/lib/zig/std", "io.zig"),
6161 "/home/andy/dev/zig/build/lib/zig/std/io.zig"));
6262}
6363
......@@ -453,7 +453,7 @@ pub fn resolvePosix(allocator: &Allocator, paths: []const []const u8) -> %[]u8 {
453453}
454454
455455test "os.path.resolve" {
456 const cwd = %%os.getCwd(&debug.global_allocator);
456 const cwd = %%os.getCwd(debug.global_allocator);
457457 if (is_windows) {
458458 assert(mem.eql(u8, testResolveWindows([][]const u8{"."}), cwd));
459459 } else {
......@@ -492,11 +492,11 @@ test "os.path.resolvePosix" {
492492}
493493
494494fn testResolveWindows(paths: []const []const u8) -> []u8 {
495 return %%resolveWindows(&debug.global_allocator, paths);
495 return %%resolveWindows(debug.global_allocator, paths);
496496}
497497
498498fn testResolvePosix(paths: []const []const u8) -> []u8 {
499 return %%resolvePosix(&debug.global_allocator, paths);
499 return %%resolvePosix(debug.global_allocator, paths);
500500}
501501
502502pub fn dirname(path: []const u8) -> []const u8 {
......@@ -899,12 +899,12 @@ test "os.path.relative" {
899899}
900900
901901fn testRelativePosix(from: []const u8, to: []const u8, expected_output: []const u8) {
902 const result = %%relativePosix(&debug.global_allocator, from, to);
902 const result = %%relativePosix(debug.global_allocator, from, to);
903903 assert(mem.eql(u8, result, expected_output));
904904}
905905
906906fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []const u8) {
907 const result = %%relativeWindows(&debug.global_allocator, from, to);
907 const result = %%relativeWindows(debug.global_allocator, from, to);
908908 assert(mem.eql(u8, result, expected_output));
909909}
910910
......@@ -1022,5 +1022,5 @@ pub fn real(allocator: &Allocator, pathname: []const u8) -> %[]u8 {
10221022
10231023test "os.path.real" {
10241024 // at least call it so it gets compiled
1025 _ = real(&debug.global_allocator, "some_path");
1025 _ = real(debug.global_allocator, "some_path");
10261026}
std/os/windows/index.zig+3
......@@ -46,6 +46,8 @@ pub extern "kernel32" stdcallcc fn GetEnvironmentVariableA(lpName: LPCSTR, lpBuf
4646
4747pub extern "kernel32" stdcallcc fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: &DWORD) -> BOOL;
4848
49pub extern "kernel32" stdcallcc fn GetFileSizeEx(hFile: HANDLE, lpFileSize: &LARGE_INTEGER) -> BOOL;
50
4951pub extern "kernel32" stdcallcc fn GetLastError() -> DWORD;
5052
5153pub extern "kernel32" stdcallcc fn GetFileInformationByHandleEx(in_hFile: HANDLE,
......@@ -115,6 +117,7 @@ pub const ULONG_PTR = usize;
115117pub const UNICODE = false;
116118pub const WCHAR = u16;
117119pub const WORD = u16;
120pub const LARGE_INTEGER = i64;
118121
119122pub const TRUE = 1;
120123pub const FALSE = 0;