authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-08 17:38:25-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-08 17:38:25-04:00
log54675b060ae6139f60e111521b9a2688f66977a0
treed0e91290608737fbdeca7e9504bd640bc34a2a7a
parent9ca798bc75bddac4d3db05463f1a42cfd7906bd3

add ptrToInt builtin, remove usize(ptr) cast

closes #415

9 files changed, 110 insertions(+), 80 deletions(-)

src/all_types.hpp+1
...@@ -1226,6 +1226,7 @@ enum BuiltinFnId {...@@ -1226,6 +1226,7 @@ enum BuiltinFnId {
1226 BuiltinFnIdPtrCast,1226 BuiltinFnIdPtrCast,
1227 BuiltinFnIdBitCast,1227 BuiltinFnIdBitCast,
1228 BuiltinFnIdIntToPtr,1228 BuiltinFnIdIntToPtr,
1229 BuiltinFnIdPtrToInt,
1229 BuiltinFnIdEnumTagName,1230 BuiltinFnIdEnumTagName,
1230 BuiltinFnIdFieldParentPtr,1231 BuiltinFnIdFieldParentPtr,
1231 BuiltinFnIdOffsetOf,1232 BuiltinFnIdOffsetOf,
src/codegen.cpp+1
...@@ -4545,6 +4545,7 @@ static void define_builtin_fns(CodeGen *g) {...@@ -4545,6 +4545,7 @@ static void define_builtin_fns(CodeGen *g) {
4545 create_builtin_fn(g, BuiltinFnIdPtrCast, "ptrCast", 2);4545 create_builtin_fn(g, BuiltinFnIdPtrCast, "ptrCast", 2);
4546 create_builtin_fn(g, BuiltinFnIdBitCast, "bitCast", 2);4546 create_builtin_fn(g, BuiltinFnIdBitCast, "bitCast", 2);
4547 create_builtin_fn(g, BuiltinFnIdIntToPtr, "intToPtr", 2);4547 create_builtin_fn(g, BuiltinFnIdIntToPtr, "intToPtr", 2);
4548 create_builtin_fn(g, BuiltinFnIdPtrToInt, "ptrToInt", 1);
4548 create_builtin_fn(g, BuiltinFnIdEnumTagName, "enumTagName", 1);4549 create_builtin_fn(g, BuiltinFnIdEnumTagName, "enumTagName", 1);
4549 create_builtin_fn(g, BuiltinFnIdFieldParentPtr, "fieldParentPtr", 3);4550 create_builtin_fn(g, BuiltinFnIdFieldParentPtr, "fieldParentPtr", 3);
4550 create_builtin_fn(g, BuiltinFnIdOffsetOf, "offsetOf", 2);4551 create_builtin_fn(g, BuiltinFnIdOffsetOf, "offsetOf", 2);
src/ir.cpp+52-31
...@@ -4372,6 +4372,15 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo...@@ -4372,6 +4372,15 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
43724372
4373 return ir_build_int_to_ptr(irb, scope, node, arg0_value, arg1_value);4373 return ir_build_int_to_ptr(irb, scope, node, arg0_value, arg1_value);
4374 }4374 }
4375 case BuiltinFnIdPtrToInt:
4376 {
4377 AstNode *arg0_node = node->data.fn_call_expr.params.at(0);
4378 IrInstruction *arg0_value = ir_gen_node(irb, arg0_node, scope);
4379 if (arg0_value == irb->codegen->invalid_instruction)
4380 return arg0_value;
4381
4382 return ir_build_ptr_to_int(irb, scope, node, arg0_value);
4383 }
4375 case BuiltinFnIdEnumTagName:4384 case BuiltinFnIdEnumTagName:
4376 {4385 {
4377 AstNode *arg0_node = node->data.fn_call_expr.params.at(0);4386 AstNode *arg0_node = node->data.fn_call_expr.params.at(0);
...@@ -7336,30 +7345,6 @@ static IrInstruction *ir_analyze_widen_or_shorten(IrAnalyze *ira, IrInstruction...@@ -7336,30 +7345,6 @@ static IrInstruction *ir_analyze_widen_or_shorten(IrAnalyze *ira, IrInstruction
7336 return result;7345 return result;
7337}7346}
73387347
7339static IrInstruction *ir_analyze_ptr_to_int(IrAnalyze *ira, IrInstruction *source_instr,
7340 IrInstruction *target, TypeTableEntry *wanted_type)
7341{
7342 assert(wanted_type->id == TypeTableEntryIdInt);
7343
7344 if (instr_is_comptime(target)) {
7345 ConstExprValue *val = ir_resolve_const(ira, target, UndefBad);
7346 if (!val)
7347 return ira->codegen->invalid_instruction;
7348 if (val->data.x_ptr.special == ConstPtrSpecialHardCodedAddr) {
7349 IrInstruction *result = ir_create_const(&ira->new_irb, source_instr->scope,
7350 source_instr->source_node, wanted_type);
7351 bigint_init_unsigned(&result->value.data.x_bigint, val->data.x_ptr.data.hard_coded_addr.addr);
7352 return result;
7353 }
7354 }
7355
7356 IrInstruction *result = ir_build_ptr_to_int(&ira->new_irb, source_instr->scope,
7357 source_instr->source_node, target);
7358 result->value.type = wanted_type;
7359 return result;
7360}
7361
7362
7363static IrInstruction *ir_analyze_int_to_enum(IrAnalyze *ira, IrInstruction *source_instr,7348static IrInstruction *ir_analyze_int_to_enum(IrAnalyze *ira, IrInstruction *source_instr,
7364 IrInstruction *target, TypeTableEntry *wanted_type)7349 IrInstruction *target, TypeTableEntry *wanted_type)
7365{7350{
...@@ -7500,7 +7485,6 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst...@@ -7500,7 +7485,6 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst
7500 TypeTableEntry *wanted_type, IrInstruction *value)7485 TypeTableEntry *wanted_type, IrInstruction *value)
7501{7486{
7502 TypeTableEntry *actual_type = value->value.type;7487 TypeTableEntry *actual_type = value->value.type;
7503 TypeTableEntry *usize_type = ira->codegen->builtin_types.entry_usize;
75047488
7505 if (type_is_invalid(wanted_type) || type_is_invalid(actual_type)) {7489 if (type_is_invalid(wanted_type) || type_is_invalid(actual_type)) {
7506 return ira->codegen->invalid_instruction;7490 return ira->codegen->invalid_instruction;
...@@ -7521,11 +7505,6 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst...@@ -7521,11 +7505,6 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst
7521 return ir_resolve_cast(ira, source_instr, value, wanted_type, CastOpBoolToInt, false);7505 return ir_resolve_cast(ira, source_instr, value, wanted_type, CastOpBoolToInt, false);
7522 }7506 }
75237507
7524 // explicit cast from pointer to usize
7525 if (wanted_type == usize_type && type_is_codegen_pointer(actual_type)) {
7526 return ir_analyze_ptr_to_int(ira, source_instr, value, wanted_type);
7527 }
7528
7529 // explicit widening or shortening cast7508 // explicit widening or shortening cast
7530 if ((wanted_type->id == TypeTableEntryIdInt &&7509 if ((wanted_type->id == TypeTableEntryIdInt &&
7531 actual_type->id == TypeTableEntryIdInt) ||7510 actual_type->id == TypeTableEntryIdInt) ||
...@@ -13937,6 +13916,47 @@ static TypeTableEntry *ir_analyze_instruction_decl_ref(IrAnalyze *ira,...@@ -13937,6 +13916,47 @@ static TypeTableEntry *ir_analyze_instruction_decl_ref(IrAnalyze *ira,
13937 zig_unreachable();13916 zig_unreachable();
13938}13917}
1393913918
13919static TypeTableEntry *ir_analyze_instruction_ptr_to_int(IrAnalyze *ira, IrInstructionPtrToInt *instruction) {
13920 IrInstruction *target = instruction->target->other;
13921 if (type_is_invalid(target->value.type))
13922 return ira->codegen->builtin_types.entry_invalid;
13923
13924 TypeTableEntry *usize = ira->codegen->builtin_types.entry_usize;
13925
13926 if (!(target->value.type->id == TypeTableEntryIdPointer ||
13927 target->value.type->id == TypeTableEntryIdFn ||
13928 (target->value.type->id == TypeTableEntryIdMaybe &&
13929 (target->value.type->data.maybe.child_type->id == TypeTableEntryIdPointer ||
13930 target->value.type->data.maybe.child_type->id == TypeTableEntryIdFn))))
13931 {
13932 ir_add_error(ira, target,
13933 buf_sprintf("expected pointer, found '%s'", buf_ptr(&target->value.type->name)));
13934 return ira->codegen->builtin_types.entry_invalid;
13935 }
13936
13937 if (instr_is_comptime(target)) {
13938 ConstExprValue *val = ir_resolve_const(ira, target, UndefBad);
13939 if (!val)
13940 return ira->codegen->builtin_types.entry_invalid;
13941 if (target->value.type->id == TypeTableEntryIdMaybe) {
13942 val = val->data.x_maybe;
13943 }
13944 if (val->type->id == TypeTableEntryIdPointer && val->data.x_ptr.special == ConstPtrSpecialHardCodedAddr) {
13945 IrInstruction *result = ir_create_const(&ira->new_irb, instruction->base.scope,
13946 instruction->base.source_node, usize);
13947 bigint_init_unsigned(&result->value.data.x_bigint, val->data.x_ptr.data.hard_coded_addr.addr);
13948 ir_link_new_instruction(result, &instruction->base);
13949 return usize;
13950 }
13951 }
13952
13953 IrInstruction *result = ir_build_ptr_to_int(&ira->new_irb, instruction->base.scope,
13954 instruction->base.source_node, target);
13955 result->value.type = usize;
13956 ir_link_new_instruction(result, &instruction->base);
13957 return usize;
13958}
13959
13940static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstruction *instruction) {13960static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstruction *instruction) {
13941 switch (instruction->id) {13961 switch (instruction->id) {
13942 case IrInstructionIdInvalid:13962 case IrInstructionIdInvalid:
...@@ -13948,7 +13968,6 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi...@@ -13948,7 +13968,6 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi
13948 case IrInstructionIdStructFieldPtr:13968 case IrInstructionIdStructFieldPtr:
13949 case IrInstructionIdEnumFieldPtr:13969 case IrInstructionIdEnumFieldPtr:
13950 case IrInstructionIdInitEnum:13970 case IrInstructionIdInitEnum:
13951 case IrInstructionIdPtrToInt:
13952 zig_unreachable();13971 zig_unreachable();
13953 case IrInstructionIdReturn:13972 case IrInstructionIdReturn:
13954 return ir_analyze_instruction_return(ira, (IrInstructionReturn *)instruction);13973 return ir_analyze_instruction_return(ira, (IrInstructionReturn *)instruction);
...@@ -14106,6 +14125,8 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi...@@ -14106,6 +14125,8 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi
14106 return ir_analyze_instruction_bit_cast(ira, (IrInstructionBitCast *)instruction);14125 return ir_analyze_instruction_bit_cast(ira, (IrInstructionBitCast *)instruction);
14107 case IrInstructionIdIntToPtr:14126 case IrInstructionIdIntToPtr:
14108 return ir_analyze_instruction_int_to_ptr(ira, (IrInstructionIntToPtr *)instruction);14127 return ir_analyze_instruction_int_to_ptr(ira, (IrInstructionIntToPtr *)instruction);
14128 case IrInstructionIdPtrToInt:
14129 return ir_analyze_instruction_ptr_to_int(ira, (IrInstructionPtrToInt *)instruction);
14109 case IrInstructionIdEnumTagName:14130 case IrInstructionIdEnumTagName:
14110 return ir_analyze_instruction_enum_tag_name(ira, (IrInstructionEnumTagName *)instruction);14131 return ir_analyze_instruction_enum_tag_name(ira, (IrInstructionEnumTagName *)instruction);
14111 case IrInstructionIdFieldParentPtr:14132 case IrInstructionIdFieldParentPtr:
std/debug.zig+1-1
...@@ -83,7 +83,7 @@ pub fn writeStackTrace(out_stream: &io.OutStream, allocator: &mem.Allocator, tty...@@ -83,7 +83,7 @@ pub fn writeStackTrace(out_stream: &io.OutStream, allocator: &mem.Allocator, tty
8383
84 var ignored_count: usize = 0;84 var ignored_count: usize = 0;
8585
86 var fp = usize(@frameAddress());86 var fp = @ptrToInt(@frameAddress());
87 while (fp != 0) : (fp = *@intToPtr(&const usize, fp)) {87 while (fp != 0) : (fp = *@intToPtr(&const usize, fp)) {
88 if (ignored_count < ignore_frame_count) {88 if (ignored_count < ignore_frame_count) {
89 ignored_count += 1;89 ignored_count += 1;
std/os/linux.zig+39-39
...@@ -337,11 +337,11 @@ pub fn dup2(old: i32, new: i32) -> usize {...@@ -337,11 +337,11 @@ pub fn dup2(old: i32, new: i32) -> usize {
337}337}
338338
339pub fn chdir(path: &const u8) -> usize {339pub fn chdir(path: &const u8) -> usize {
340 arch.syscall1(arch.SYS_chdir, usize(path))340 arch.syscall1(arch.SYS_chdir, @ptrToInt(path))
341}341}
342342
343pub fn execve(path: &const u8, argv: &const ?&const u8, envp: &const ?&const u8) -> usize {343pub fn execve(path: &const u8, argv: &const ?&const u8, envp: &const ?&const u8) -> usize {
344 arch.syscall3(arch.SYS_execve, usize(path), usize(argv), usize(envp))344 arch.syscall3(arch.SYS_execve, @ptrToInt(path), @ptrToInt(argv), @ptrToInt(envp))
345}345}
346346
347pub fn fork() -> usize {347pub fn fork() -> usize {
...@@ -349,50 +349,50 @@ pub fn fork() -> usize {...@@ -349,50 +349,50 @@ pub fn fork() -> usize {
349}349}
350350
351pub fn getcwd(buf: &u8, size: usize) -> usize {351pub fn getcwd(buf: &u8, size: usize) -> usize {
352 arch.syscall2(arch.SYS_getcwd, usize(buf), size)352 arch.syscall2(arch.SYS_getcwd, @ptrToInt(buf), size)
353}353}
354354
355pub fn getdents(fd: i32, dirp: &u8, count: usize) -> usize {355pub fn getdents(fd: i32, dirp: &u8, count: usize) -> usize {
356 arch.syscall3(arch.SYS_getdents, usize(fd), usize(dirp), usize(count))356 arch.syscall3(arch.SYS_getdents, usize(fd), @ptrToInt(dirp), usize(count))
357}357}
358358
359pub fn isatty(fd: i32) -> bool {359pub fn isatty(fd: i32) -> bool {
360 var wsz: winsize = undefined;360 var wsz: winsize = undefined;
361 return arch.syscall3(arch.SYS_ioctl, usize(fd), TIOCGWINSZ, usize(&wsz)) == 0;361 return arch.syscall3(arch.SYS_ioctl, usize(fd), TIOCGWINSZ, @ptrToInt(&wsz)) == 0;
362}362}
363363
364pub fn readlink(noalias path: &const u8, noalias buf_ptr: &u8, buf_len: usize) -> usize {364pub fn readlink(noalias path: &const u8, noalias buf_ptr: &u8, buf_len: usize) -> usize {
365 arch.syscall3(arch.SYS_readlink, usize(path), usize(buf_ptr), buf_len)365 arch.syscall3(arch.SYS_readlink, @ptrToInt(path), @ptrToInt(buf_ptr), buf_len)
366}366}
367367
368pub fn mkdir(path: &const u8, mode: usize) -> usize {368pub fn mkdir(path: &const u8, mode: usize) -> usize {
369 arch.syscall2(arch.SYS_mkdir, usize(path), mode)369 arch.syscall2(arch.SYS_mkdir, @ptrToInt(path), mode)
370}370}
371371
372pub fn mmap(address: ?&u8, length: usize, prot: usize, flags: usize, fd: i32, offset: usize)372pub fn mmap(address: ?&u8, length: usize, prot: usize, flags: usize, fd: i32, offset: usize)
373 -> usize373 -> usize
374{374{
375 arch.syscall6(arch.SYS_mmap, usize(address), length, prot, flags, usize(fd), offset)375 arch.syscall6(arch.SYS_mmap, @ptrToInt(address), length, prot, flags, usize(fd), offset)
376}376}
377377
378pub fn munmap(address: &u8, length: usize) -> usize {378pub fn munmap(address: &u8, length: usize) -> usize {
379 arch.syscall2(arch.SYS_munmap, usize(address), length)379 arch.syscall2(arch.SYS_munmap, @ptrToInt(address), length)
380}380}
381381
382pub fn read(fd: i32, buf: &u8, count: usize) -> usize {382pub fn read(fd: i32, buf: &u8, count: usize) -> usize {
383 arch.syscall3(arch.SYS_read, usize(fd), usize(buf), count)383 arch.syscall3(arch.SYS_read, usize(fd), @ptrToInt(buf), count)
384}384}
385385
386pub fn rmdir(path: &const u8) -> usize {386pub fn rmdir(path: &const u8) -> usize {
387 arch.syscall1(arch.SYS_rmdir, usize(path))387 arch.syscall1(arch.SYS_rmdir, @ptrToInt(path))
388}388}
389389
390pub fn symlink(existing: &const u8, new: &const u8) -> usize {390pub fn symlink(existing: &const u8, new: &const u8) -> usize {
391 arch.syscall2(arch.SYS_symlink, usize(existing), usize(new))391 arch.syscall2(arch.SYS_symlink, @ptrToInt(existing), @ptrToInt(new))
392}392}
393393
394pub fn pread(fd: i32, buf: &u8, count: usize, offset: usize) -> usize {394pub fn pread(fd: i32, buf: &u8, count: usize, offset: usize) -> usize {
395 arch.syscall4(arch.SYS_pread, usize(fd), usize(buf), count, offset)395 arch.syscall4(arch.SYS_pread, usize(fd), @ptrToInt(buf), count, offset)
396}396}
397397
398pub fn pipe(fd: &[2]i32) -> usize {398pub fn pipe(fd: &[2]i32) -> usize {
...@@ -400,31 +400,31 @@ pub fn pipe(fd: &[2]i32) -> usize {...@@ -400,31 +400,31 @@ pub fn pipe(fd: &[2]i32) -> usize {
400}400}
401401
402pub fn pipe2(fd: &[2]i32, flags: usize) -> usize {402pub fn pipe2(fd: &[2]i32, flags: usize) -> usize {
403 arch.syscall2(arch.SYS_pipe2, usize(fd), flags)403 arch.syscall2(arch.SYS_pipe2, @ptrToInt(fd), flags)
404}404}
405405
406pub fn write(fd: i32, buf: &const u8, count: usize) -> usize {406pub fn write(fd: i32, buf: &const u8, count: usize) -> usize {
407 arch.syscall3(arch.SYS_write, usize(fd), usize(buf), count)407 arch.syscall3(arch.SYS_write, usize(fd), @ptrToInt(buf), count)
408}408}
409409
410pub fn pwrite(fd: i32, buf: &const u8, count: usize, offset: usize) -> usize {410pub fn pwrite(fd: i32, buf: &const u8, count: usize, offset: usize) -> usize {
411 arch.syscall4(arch.SYS_pwrite, usize(fd), usize(buf), count, offset)411 arch.syscall4(arch.SYS_pwrite, usize(fd), @ptrToInt(buf), count, offset)
412}412}
413413
414pub fn rename(old: &const u8, new: &const u8) -> usize {414pub fn rename(old: &const u8, new: &const u8) -> usize {
415 arch.syscall2(arch.SYS_rename, usize(old), usize(new))415 arch.syscall2(arch.SYS_rename, @ptrToInt(old), @ptrToInt(new))
416}416}
417417
418pub fn open(path: &const u8, flags: usize, perm: usize) -> usize {418pub fn open(path: &const u8, flags: usize, perm: usize) -> usize {
419 arch.syscall3(arch.SYS_open, usize(path), flags, perm)419 arch.syscall3(arch.SYS_open, @ptrToInt(path), flags, perm)
420}420}
421421
422pub fn create(path: &const u8, perm: usize) -> usize {422pub fn create(path: &const u8, perm: usize) -> usize {
423 arch.syscall2(arch.SYS_creat, usize(path), perm)423 arch.syscall2(arch.SYS_creat, @ptrToInt(path), perm)
424}424}
425425
426pub fn openat(dirfd: i32, path: &const u8, flags: usize, mode: usize) -> usize {426pub fn openat(dirfd: i32, path: &const u8, flags: usize, mode: usize) -> usize {
427 arch.syscall4(arch.SYS_openat, usize(dirfd), usize(path), flags, mode)427 arch.syscall4(arch.SYS_openat, usize(dirfd), @ptrToInt(path), flags, mode)
428}428}
429429
430pub fn close(fd: i32) -> usize {430pub fn close(fd: i32) -> usize {
...@@ -441,7 +441,7 @@ pub fn exit(status: i32) -> noreturn {...@@ -441,7 +441,7 @@ pub fn exit(status: i32) -> noreturn {
441}441}
442442
443pub fn getrandom(buf: &u8, count: usize, flags: u32) -> usize {443pub fn getrandom(buf: &u8, count: usize, flags: u32) -> usize {
444 arch.syscall3(arch.SYS_getrandom, usize(buf), count, usize(flags))444 arch.syscall3(arch.SYS_getrandom, @ptrToInt(buf), count, usize(flags))
445}445}
446446
447pub fn kill(pid: i32, sig: i32) -> usize {447pub fn kill(pid: i32, sig: i32) -> usize {
...@@ -449,11 +449,11 @@ pub fn kill(pid: i32, sig: i32) -> usize {...@@ -449,11 +449,11 @@ pub fn kill(pid: i32, sig: i32) -> usize {
449}449}
450450
451pub fn unlink(path: &const u8) -> usize {451pub fn unlink(path: &const u8) -> usize {
452 arch.syscall1(arch.SYS_unlink, usize(path))452 arch.syscall1(arch.SYS_unlink, @ptrToInt(path))
453}453}
454454
455pub fn waitpid(pid: i32, status: &i32, options: i32) -> usize {455pub fn waitpid(pid: i32, status: &i32, options: i32) -> usize {
456 arch.syscall4(arch.SYS_wait4, usize(pid), usize(status), usize(options), 0)456 arch.syscall4(arch.SYS_wait4, usize(pid), @ptrToInt(status), usize(options), 0)
457}457}
458458
459const NSIG = 65;459const NSIG = 65;
...@@ -471,15 +471,15 @@ pub fn raise(sig: i32) -> i32 {...@@ -471,15 +471,15 @@ pub fn raise(sig: i32) -> i32 {
471}471}
472472
473fn blockAllSignals(set: &sigset_t) {473fn blockAllSignals(set: &sigset_t) {
474 _ = arch.syscall4(arch.SYS_rt_sigprocmask, SIG_BLOCK, usize(&all_mask), usize(set), NSIG/8);474 _ = arch.syscall4(arch.SYS_rt_sigprocmask, SIG_BLOCK, @ptrToInt(&all_mask), @ptrToInt(set), NSIG/8);
475}475}
476476
477fn blockAppSignals(set: &sigset_t) {477fn blockAppSignals(set: &sigset_t) {
478 _ = arch.syscall4(arch.SYS_rt_sigprocmask, SIG_BLOCK, usize(&app_mask), usize(set), NSIG/8);478 _ = arch.syscall4(arch.SYS_rt_sigprocmask, SIG_BLOCK, @ptrToInt(&app_mask), @ptrToInt(set), NSIG/8);
479}479}
480480
481fn restoreSignals(set: &sigset_t) {481fn restoreSignals(set: &sigset_t) {
482 _ = arch.syscall4(arch.SYS_rt_sigprocmask, SIG_SETMASK, usize(set), 0, NSIG/8);482 _ = arch.syscall4(arch.SYS_rt_sigprocmask, SIG_SETMASK, @ptrToInt(set), 0, NSIG/8);
483}483}
484484
485485
...@@ -537,11 +537,11 @@ pub const iovec = extern struct {...@@ -537,11 +537,11 @@ pub const iovec = extern struct {
537//537//
538538
539pub fn getsockname(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t) -> usize {539pub fn getsockname(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t) -> usize {
540 arch.syscall3(arch.SYS_getsockname, usize(fd), usize(addr), usize(len))540 arch.syscall3(arch.SYS_getsockname, usize(fd), @ptrToInt(addr), @ptrToInt(len))
541}541}
542542
543pub fn getpeername(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t) -> usize {543pub fn getpeername(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t) -> usize {
544 arch.syscall3(arch.SYS_getpeername, usize(fd), usize(addr), usize(len))544 arch.syscall3(arch.SYS_getpeername, usize(fd), @ptrToInt(addr), @ptrToInt(len))
545}545}
546546
547pub fn socket(domain: i32, socket_type: i32, protocol: i32) -> usize {547pub fn socket(domain: i32, socket_type: i32, protocol: i32) -> usize {
...@@ -549,29 +549,29 @@ pub fn socket(domain: i32, socket_type: i32, protocol: i32) -> usize {...@@ -549,29 +549,29 @@ pub fn socket(domain: i32, socket_type: i32, protocol: i32) -> usize {
549}549}
550550
551pub fn setsockopt(fd: i32, level: i32, optname: i32, optval: &const u8, optlen: socklen_t) -> usize {551pub fn setsockopt(fd: i32, level: i32, optname: i32, optval: &const u8, optlen: socklen_t) -> usize {
552 arch.syscall5(arch.SYS_setsockopt, usize(fd), usize(level), usize(optname), usize(optval), usize(optlen))552 arch.syscall5(arch.SYS_setsockopt, usize(fd), usize(level), usize(optname), usize(optval), @ptrToInt(optlen))
553}553}
554554
555pub fn getsockopt(fd: i32, level: i32, optname: i32, noalias optval: &u8, noalias optlen: &socklen_t) -> usize {555pub fn getsockopt(fd: i32, level: i32, optname: i32, noalias optval: &u8, noalias optlen: &socklen_t) -> usize {
556 arch.syscall5(arch.SYS_getsockopt, usize(fd), usize(level), usize(optname), usize(optval), usize(optlen))556 arch.syscall5(arch.SYS_getsockopt, usize(fd), usize(level), usize(optname), @ptrToInt(optval), @ptrToInt(optlen))
557}557}
558558
559pub fn sendmsg(fd: i32, msg: &const arch.msghdr, flags: u32) -> usize {559pub fn sendmsg(fd: i32, msg: &const arch.msghdr, flags: u32) -> usize {
560 arch.syscall3(arch.SYS_sendmsg, usize(fd), usize(msg), flags)560 arch.syscall3(arch.SYS_sendmsg, usize(fd), @ptrToInt(msg), flags)
561}561}
562562
563pub fn connect(fd: i32, addr: &const sockaddr, len: socklen_t) -> usize {563pub fn connect(fd: i32, addr: &const sockaddr, len: socklen_t) -> usize {
564 arch.syscall3(arch.SYS_connect, usize(fd), usize(addr), usize(len))564 arch.syscall3(arch.SYS_connect, usize(fd), @ptrToInt(addr), usize(len))
565}565}
566566
567pub fn recvmsg(fd: i32, msg: &arch.msghdr, flags: u32) -> usize {567pub fn recvmsg(fd: i32, msg: &arch.msghdr, flags: u32) -> usize {
568 arch.syscall3(arch.SYS_recvmsg, usize(fd), usize(msg), flags)568 arch.syscall3(arch.SYS_recvmsg, usize(fd), @ptrToInt(msg), flags)
569}569}
570570
571pub fn recvfrom(fd: i32, noalias buf: &u8, len: usize, flags: u32,571pub fn recvfrom(fd: i32, noalias buf: &u8, len: usize, flags: u32,
572 noalias addr: ?&sockaddr, noalias alen: ?&socklen_t) -> usize572 noalias addr: ?&sockaddr, noalias alen: ?&socklen_t) -> usize
573{573{
574 arch.syscall6(arch.SYS_recvfrom, usize(fd), usize(buf), len, flags, usize(addr), usize(alen))574 arch.syscall6(arch.SYS_recvfrom, usize(fd), @ptrToInt(buf), len, flags, @ptrToInt(addr), @ptrToInt(alen))
575}575}
576576
577pub fn shutdown(fd: i32, how: i32) -> usize {577pub fn shutdown(fd: i32, how: i32) -> usize {
...@@ -579,7 +579,7 @@ pub fn shutdown(fd: i32, how: i32) -> usize {...@@ -579,7 +579,7 @@ pub fn shutdown(fd: i32, how: i32) -> usize {
579}579}
580580
581pub fn bind(fd: i32, addr: &const sockaddr, len: socklen_t) -> usize {581pub fn bind(fd: i32, addr: &const sockaddr, len: socklen_t) -> usize {
582 arch.syscall3(arch.SYS_bind, usize(fd), usize(addr), usize(len))582 arch.syscall3(arch.SYS_bind, usize(fd), @ptrToInt(addr), usize(len))
583}583}
584584
585pub fn listen(fd: i32, backlog: i32) -> usize {585pub fn listen(fd: i32, backlog: i32) -> usize {
...@@ -587,11 +587,11 @@ pub fn listen(fd: i32, backlog: i32) -> usize {...@@ -587,11 +587,11 @@ pub fn listen(fd: i32, backlog: i32) -> usize {
587}587}
588588
589pub fn sendto(fd: i32, buf: &const u8, len: usize, flags: u32, addr: ?&const sockaddr, alen: socklen_t) -> usize {589pub fn sendto(fd: i32, buf: &const u8, len: usize, flags: u32, addr: ?&const sockaddr, alen: socklen_t) -> usize {
590 arch.syscall6(arch.SYS_sendto, usize(fd), usize(buf), len, flags, usize(addr), usize(alen))590 arch.syscall6(arch.SYS_sendto, usize(fd), @ptrToInt(buf), len, flags, @ptrToInt(addr), usize(alen))
591}591}
592592
593pub fn socketpair(domain: i32, socket_type: i32, protocol: i32, fd: [2]i32) -> usize {593pub fn socketpair(domain: i32, socket_type: i32, protocol: i32, fd: [2]i32) -> usize {
594 arch.syscall4(arch.SYS_socketpair, usize(domain), usize(socket_type), usize(protocol), usize(&fd[0]))594 arch.syscall4(arch.SYS_socketpair, usize(domain), usize(socket_type), usize(protocol), @ptrToInt(&fd[0]))
595}595}
596596
597pub fn accept(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t) -> usize {597pub fn accept(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t) -> usize {
...@@ -599,7 +599,7 @@ pub fn accept(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t) -> usiz...@@ -599,7 +599,7 @@ pub fn accept(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t) -> usiz
599}599}
600600
601pub fn accept4(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t, flags: u32) -> usize {601pub fn accept4(fd: i32, noalias addr: &sockaddr, noalias len: &socklen_t, flags: u32) -> usize {
602 arch.syscall4(arch.SYS_accept4, usize(fd), usize(addr), usize(len), flags)602 arch.syscall4(arch.SYS_accept4, usize(fd), @ptrToInt(addr), @ptrToInt(len), flags)
603}603}
604604
605// error NameTooLong;605// error NameTooLong;
...@@ -634,5 +634,5 @@ pub const stat = arch.stat;...@@ -634,5 +634,5 @@ pub const stat = arch.stat;
634pub const timespec = arch.timespec;634pub const timespec = arch.timespec;
635635
636pub fn fstat(fd: i32, stat_buf: &stat) -> usize {636pub fn fstat(fd: i32, stat_buf: &stat) -> usize {
637 arch.syscall2(arch.SYS_fstat, usize(fd), usize(stat_buf))637 arch.syscall2(arch.SYS_fstat, usize(fd), @ptrToInt(stat_buf))
638}638}
test/cases/cast.zig+2-2
...@@ -4,13 +4,13 @@ const mem = @import("std").mem;...@@ -4,13 +4,13 @@ const mem = @import("std").mem;
4test "int to ptr cast" {4test "int to ptr cast" {
5 const x = usize(13);5 const x = usize(13);
6 const y = @intToPtr(&u8, x);6 const y = @intToPtr(&u8, x);
7 const z = usize(y);7 const z = @ptrToInt(y);
8 assert(z == 13);8 assert(z == 13);
9}9}
1010
11test "integer literal to pointer cast" {11test "integer literal to pointer cast" {
12 const vga_mem = @intToPtr(&u16, 0xB8000);12 const vga_mem = @intToPtr(&u16, 0xB8000);
13 assert(usize(vga_mem) == 0xB8000);13 assert(@ptrToInt(vga_mem) == 0xB8000);
14}14}
1515
16test "pointer reinterpret const float to int" {16test "pointer reinterpret const float to int" {
test/cases/sizeof_and_typeof.zig+4-4
...@@ -28,7 +28,7 @@ test "offsetOf" {...@@ -28,7 +28,7 @@ test "offsetOf" {
2828
29 // Non-packed struct fields can be moved/padded29 // Non-packed struct fields can be moved/padded
30 const a: A = undefined;30 const a: A = undefined;
31 assert(usize(&a.a) - usize(&a) == @offsetOf(A, "a"));
32 assert(usize(&a.b) - usize(&a) == @offsetOf(@typeOf(a), "b"));
33 assert(usize(&a.c) - usize(&a) == @offsetOf(@typeOf(a), "c"));
34}
\ No newline at end of file
31 assert(@ptrToInt(&a.a) - @ptrToInt(&a) == @offsetOf(A, "a"));
32 assert(@ptrToInt(&a.b) - @ptrToInt(&a) == @offsetOf(@typeOf(a), "b"));
33 assert(@ptrToInt(&a.c) - @ptrToInt(&a) == @offsetOf(@typeOf(a), "c"));
34}
test/cases/slice.zig+2-2
...@@ -3,9 +3,9 @@ const assert = @import("std").debug.assert;...@@ -3,9 +3,9 @@ const assert = @import("std").debug.assert;
3const x = @intToPtr(&i32, 0x1000)[0..0x500];3const x = @intToPtr(&i32, 0x1000)[0..0x500];
4const y = x[0x100..];4const y = x[0x100..];
5test "compile time slice of pointer to hard coded address" {5test "compile time slice of pointer to hard coded address" {
6 assert(usize(x.ptr) == 0x1000);6 assert(@ptrToInt(x.ptr) == 0x1000);
7 assert(x.len == 0x500);7 assert(x.len == 0x500);
88
9 assert(usize(y.ptr) == 0x1100);9 assert(@ptrToInt(y.ptr) == 0x1100);
10 assert(y.len == 0x400);10 assert(y.len == 0x400);
11}11}
test/compile_errors.zig+8-1
...@@ -1769,7 +1769,7 @@ pub fn addCases(cases: &tests.CompileErrorContext) {...@@ -1769,7 +1769,7 @@ pub fn addCases(cases: &tests.CompileErrorContext) {
17691769
1770 cases.add("save reference to inline function",1770 cases.add("save reference to inline function",
1771 \\export fn foo() {1771 \\export fn foo() {
1772 \\ quux(usize(bar));1772 \\ quux(@ptrToInt(bar));
1773 \\}1773 \\}
1774 \\inline fn bar() { }1774 \\inline fn bar() { }
1775 \\extern fn quux(usize);1775 \\extern fn quux(usize);
...@@ -1952,4 +1952,11 @@ pub fn addCases(cases: &tests.CompileErrorContext) {...@@ -1952,4 +1952,11 @@ pub fn addCases(cases: &tests.CompileErrorContext) {
1952 \\}1952 \\}
1953 ,1953 ,
1954 ".tmp_source.zig:2:9: error: fractional component prevents float value 12.340000 from being casted to type 'i32'");1954 ".tmp_source.zig:2:9: error: fractional component prevents float value 12.340000 from being casted to type 'i32'");
1955
1956 cases.add("non pointer given to @ptrToInt",
1957 \\export fn entry(x: i32) -> usize {
1958 \\ @ptrToInt(x)
1959 \\}
1960 ,
1961 ".tmp_source.zig:2:15: error: expected pointer, found 'i32'");
1955}1962}